// Auto-generated BRK JavaScript client // Do not edit manually // Type definitions /** * Bitcoin address string * * @typedef {string} Addr */ /** * Address statistics on the blockchain (confirmed transactions only) * * Based on mempool.space's format with type_index extension. * * @typedef {Object} AddrChainStats * @property {number} fundedTxoCount - Total number of transaction outputs that funded this address * @property {Sats} fundedTxoSum - Total amount in satoshis received by this address across all funded outputs * @property {number} spentTxoCount - Total number of transaction outputs spent from this address * @property {Sats} spentTxoSum - Total amount in satoshis spent from this address * @property {number} txCount - Total number of confirmed transactions involving this address * @property {TypeIndex} typeIndex - Index of this address within its type on the blockchain */ /** * Address statistics in the mempool (unconfirmed transactions only) * * Based on mempool.space's format. * * @typedef {Object} AddrMempoolStats * @property {number} fundedTxoCount - Number of unconfirmed transaction outputs funding this address * @property {Sats} fundedTxoSum - Total amount in satoshis being received in unconfirmed transactions * @property {number} spentTxoCount - Number of unconfirmed transaction inputs spending from this address * @property {Sats} spentTxoSum - Total amount in satoshis being spent in unconfirmed transactions * @property {number} txCount - Number of unconfirmed transactions involving this address */ /** * @typedef {Object} AddrParam * @property {Addr} address */ /** * Address information compatible with mempool.space API format * * @typedef {Object} AddrStats * @property {Addr} address - Bitcoin address string * @property {AddrChainStats} chainStats - Statistics for confirmed transactions on the blockchain * @property {(AddrMempoolStats|null)=} mempoolStats - Statistics for unconfirmed transactions in the mempool */ /** * @typedef {Object} AddrTxidsParam * @property {(Txid|null)=} afterTxid - Txid to paginate from (return transactions before this one) */ /** * Address validation result * * @typedef {Object} AddrValidation * @property {boolean} isvalid - Whether the address is valid * @property {?string=} address - The validated address * @property {?string=} scriptPubKey - The scriptPubKey in hex * @property {?boolean=} isscript - Whether this is a script address (P2SH) * @property {?boolean=} iswitness - Whether this is a witness address * @property {?number=} witnessVersion - Witness version (0 for P2WPKH/P2WSH, 1 for P2TR) * @property {?string=} witnessProgram - Witness program in hex */ /** * Unified index for any address type (funded or empty) * * @typedef {TypeIndex} AnyAddrIndex */ /** * Unsigned basis points stored as u16. * 1 bp = 0.0001. Range: 0–6.5535. * Use for bounded 0–1 ratios (dominance, adoption, liveliness, etc.). * `u16::MAX` is reserved as a NaN sentinel. * * @typedef {number} BasisPoints16 */ /** * Unsigned basis points stored as u32. * 1 bp = 0.0001. Range: 0–429,496.7295. * Use for unbounded unsigned ratios (MVRV, NVT, SOPR, etc.). * `u32::MAX` is reserved as a NaN sentinel. * * @typedef {number} BasisPoints32 */ /** * Signed basis points stored as i16. * 1 bp = 0.0001. Range: -3.2767 to +3.2767. * Use for signed bounded ratios (NUPL, net PnL ratios, etc.). * `i16::MIN` is reserved as a NaN sentinel. * * @typedef {number} BasisPointsSigned16 */ /** * Signed basis points stored as i32. * 1 bp = 0.0001. Range: -214,748.3647 to +214,748.3647. * Use for unbounded signed values (returns, growth rates, volatility, z-scores, etc.). * `i32::MIN` is reserved as a NaN sentinel. * * @typedef {number} BasisPointsSigned32 */ /** * Bitcoin amount as floating point (1 BTC = 100,000,000 satoshis) * * @typedef {number} Bitcoin */ /** * Position within a .blk file, encoding file index and byte offset * * @typedef {number} BlkPosition */ /** * @typedef {Object} BlockCountParam * @property {number} blockCount - Number of recent blocks to include */ /** * A single block fees data point. * * @typedef {Object} BlockFeesEntry * @property {Height} avgHeight * @property {Timestamp} timestamp * @property {Sats} avgFees */ /** * Block hash * * @typedef {string} BlockHash */ /** * @typedef {Object} BlockHashParam * @property {BlockHash} hash */ /** * @typedef {Object} BlockHashStartIndex * @property {BlockHash} hash - Bitcoin block hash * @property {TxIndex} startIndex - Starting transaction index within the block (0-based) */ /** * @typedef {Object} BlockHashTxIndex * @property {BlockHash} hash - Bitcoin block hash * @property {TxIndex} index - Transaction index within the block (0-based) */ /** * Block information returned by the API * * @typedef {Object} BlockInfo * @property {BlockHash} id - Block hash * @property {Height} height - Block height * @property {number} txCount - Number of transactions in the block * @property {number} size - Block size in bytes * @property {Weight} weight - Block weight in weight units * @property {Timestamp} timestamp - Block timestamp (Unix time) * @property {number} difficulty - Block difficulty as a floating point number */ /** * A single block rewards data point. * * @typedef {Object} BlockRewardsEntry * @property {number} avgHeight * @property {number} timestamp * @property {number} avgRewards */ /** * A single block size data point. * * @typedef {Object} BlockSizeEntry * @property {number} avgHeight * @property {number} timestamp * @property {number} avgSize */ /** * Combined block sizes and weights response. * * @typedef {Object} BlockSizesWeights * @property {BlockSizeEntry[]} sizes * @property {BlockWeightEntry[]} weights */ /** * Block status indicating whether block is in the best chain * * @typedef {Object} BlockStatus * @property {boolean} inBestChain - Whether this block is in the best chain * @property {(Height|null)=} height - Block height (only if in best chain) * @property {(BlockHash|null)=} nextBest - Hash of the next block in the best chain (only if in best chain and not tip) */ /** * Block information returned for timestamp queries * * @typedef {Object} BlockTimestamp * @property {Height} height - Block height * @property {BlockHash} hash - Block hash * @property {string} timestamp - Block timestamp in ISO 8601 format */ /** * A single block weight data point. * * @typedef {Object} BlockWeightEntry * @property {number} avgHeight * @property {number} timestamp * @property {number} avgWeight */ /** * Unsigned cents (u64) - for values that should never be negative. * Used for invested capital, realized cap, etc. * * @typedef {number} Cents */ /** * Cents × Sats (u128) - price in cents multiplied by amount in sats. * Uses u128 because large amounts at any price can overflow u64. * * @typedef {number} CentsSats */ /** * Signed cents (i64) - for values that can be negative. * Used for profit/loss calculations, deltas, etc. * * @typedef {number} CentsSigned */ /** * Raw cents squared (u128) - stores cents² × sats without division. * Used for precise accumulation of investor cap values: Σ(price² × sats). * investor_price = investor_cap_raw / realized_cap_raw * * @typedef {number} CentsSquaredSats */ /** * Closing price value for a time period * * @typedef {Dollars} Close */ /** * Cohort identifier for cost basis distribution. * * @typedef {string} Cohort */ /** * Bucket type for cost basis aggregation. * Options: raw (no aggregation), lin200/lin500/lin1000 (linear $200/$500/$1000), * log10/log50/log100/log200 (logarithmic with 10/50/100/200 buckets per decade). * * @typedef {("raw"|"lin200"|"lin500"|"lin1000"|"log10"|"log50"|"log100"|"log200")} CostBasisBucket */ /** * Path parameters for cost basis dates endpoint. * * @typedef {Object} CostBasisCohortParam * @property {Cohort} cohort */ /** * Path parameters for cost basis distribution endpoint. * * @typedef {Object} CostBasisParams * @property {Cohort} cohort * @property {string} date */ /** * Query parameters for cost basis distribution endpoint. * * @typedef {Object} CostBasisQuery * @property {CostBasisBucket=} bucket - Bucket type for aggregation. Default: raw (no aggregation). * @property {CostBasisValue=} value - Value type to return. Default: supply. */ /** * Value type for cost basis distribution. * Options: supply (BTC), realized (USD, price × supply), unrealized (USD, spot × supply). * * @typedef {("supply"|"realized"|"unrealized")} CostBasisValue */ /** * Data range with output format for API query parameters * * @typedef {Object} DataRangeFormat * @property {(RangeIndex|null)=} start - Inclusive start: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `from`, `f`, `s` * @property {(RangeIndex|null)=} end - Exclusive end: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `to`, `t`, `e` * @property {(Limit|null)=} limit - Maximum number of values to return (ignored if `end` is set). Aliases: `count`, `c`, `l` * @property {Format=} format - Format of the output */ /** * Date in YYYYMMDD format stored as u32 * * @typedef {number} Date */ /** @typedef {number} Day1 */ /** @typedef {number} Day3 */ /** * Detailed series count with per-database breakdown * * @typedef {Object} DetailedSeriesCount * @property {number} distinctSeries - Number of unique series available (e.g., realized_price, market_cap) * @property {number} totalEndpoints - Total number of series-index combinations across all timeframes * @property {number} lazyEndpoints - Number of lazy (computed on-the-fly) series-index combinations * @property {number} storedEndpoints - Number of eager (stored on disk) series-index combinations * @property {{ [key: string]: SeriesCount }} byDb - Per-database breakdown of counts */ /** * Difficulty adjustment information. * * @typedef {Object} DifficultyAdjustment * @property {number} progressPercent - Progress through current difficulty epoch (0-100%) * @property {number} difficultyChange - Estimated difficulty change at next retarget (%) * @property {number} estimatedRetargetDate - Estimated Unix timestamp of next retarget * @property {number} remainingBlocks - Blocks remaining until retarget * @property {number} remainingTime - Estimated seconds until retarget * @property {number} previousRetarget - Previous difficulty adjustment (%) * @property {Height} nextRetargetHeight - Height of next retarget * @property {number} timeAvg - Average block time in current epoch (seconds) * @property {number} adjustedTimeAvg - Time-adjusted average (accounting for timestamp manipulation) * @property {number} timeOffset - Time offset from expected schedule (seconds) */ /** * A single difficulty adjustment entry. * Serializes as array: [timestamp, height, difficulty, change_percent] * * @typedef {Object} DifficultyAdjustmentEntry * @property {Timestamp} timestamp * @property {Height} height * @property {number} difficulty * @property {number} changePercent */ /** * A single difficulty data point. * * @typedef {Object} DifficultyEntry * @property {Timestamp} timestamp - Unix timestamp of the difficulty adjustment. * @property {number} difficulty - Difficulty value. * @property {Height} height - Block height of the adjustment. */ /** * Disk usage of the indexed data * * @typedef {Object} DiskUsage * @property {string} brk - Human-readable brk data size (e.g., "48.8 GiB") * @property {number} brkBytes - brk data size in bytes * @property {string} bitcoin - Human-readable Bitcoin blocks directory size * @property {number} bitcoinBytes - Bitcoin blocks directory size in bytes * @property {number} ratio - brk as percentage of Bitcoin data */ /** * US Dollar amount as floating point * * @typedef {number} Dollars */ /** * Data of an empty address * * @typedef {Object} EmptyAddrData * @property {number} txCount - Total transaction count * @property {number} fundedTxoCount - Total funded/spent transaction output count (equal since address is empty) * @property {Sats} transfered - Total satoshis transferred */ /** @typedef {TypeIndex} EmptyAddrIndex */ /** @typedef {TypeIndex} EmptyOutputIndex */ /** @typedef {number} Epoch */ /** * @typedef {Object} ErrorBody * @property {ErrorDetail} error */ /** * @typedef {Object} ErrorDetail * @property {string} type - Error category: "invalid_request", "forbidden", "not_found", "unavailable", or "internal" * @property {string} code - Machine-readable error code (e.g. "invalid_addr", "series_not_found") * @property {string} message - Human-readable description * @property {string} docUrl - Link to API documentation */ /** * Fee rate in sats/vB * * @typedef {number} FeeRate */ /** * Output format for API responses * * @typedef {("json"|"csv")} Format */ /** * Data for a funded (non-empty) address with current balance * * @typedef {Object} FundedAddrData * @property {number} txCount - Total transaction count * @property {number} fundedTxoCount - Number of transaction outputs funded to this address * @property {number} spentTxoCount - Number of transaction outputs spent by this address * @property {Sats} received - Satoshis received by this address * @property {Sats} sent - Satoshis sent by this address * @property {CentsSats} realizedCapRaw - The realized capitalization: Σ(price × sats) * @property {CentsSquaredSats} investorCapRaw - The investor capitalization: Σ(price² × sats) */ /** @typedef {TypeIndex} FundedAddrIndex */ /** @typedef {number} Halving */ /** * A single hashrate data point. * * @typedef {Object} HashrateEntry * @property {Timestamp} timestamp - Unix timestamp. * @property {number} avgHashrate - Average hashrate (H/s). */ /** * Summary of network hashrate and difficulty data. * * @typedef {Object} HashrateSummary * @property {HashrateEntry[]} hashrates - Historical hashrate data points. * @property {DifficultyEntry[]} difficulty - Historical difficulty adjustments. * @property {number} currentHashrate - Current network hashrate (H/s). * @property {number} currentDifficulty - Current network difficulty. */ /** * Server health status * * @typedef {Object} Health * @property {string} status * @property {string} service * @property {string} version * @property {string} timestamp * @property {string} startedAt - Server start time (ISO 8601) * @property {number} uptimeSeconds - Uptime in seconds * @property {Height} indexedHeight - Height of the last indexed block * @property {Height} computedHeight - Height of the last computed block (series) * @property {Height} tipHeight - Height of the chain tip (from Bitcoin node) * @property {Height} blocksBehind - Number of blocks behind the tip * @property {string} lastIndexedAt - Human-readable timestamp of the last indexed block (ISO 8601) * @property {Timestamp} lastIndexedAtUnix - Unix timestamp of the last indexed block */ /** * Block height * * @typedef {number} Height */ /** * @typedef {Object} HeightParam * @property {Height} height */ /** * Hex-encoded string * * @typedef {string} Hex */ /** * Highest price value for a time period * * @typedef {Dollars} High */ /** @typedef {number} Hour1 */ /** @typedef {number} Hour12 */ /** @typedef {number} Hour4 */ /** * Aggregation dimension for querying series. Includes time-based (date, week, month, year), * block-based (height, tx_index), and address/output type indexes. * * @typedef {("minute10"|"minute30"|"hour1"|"hour4"|"hour12"|"day1"|"day3"|"week1"|"month1"|"month3"|"month6"|"year1"|"year10"|"halving"|"epoch"|"height"|"tx_index"|"txin_index"|"txout_index"|"empty_output_index"|"op_return_index"|"p2a_addr_index"|"p2ms_output_index"|"p2pk33_addr_index"|"p2pk65_addr_index"|"p2pkh_addr_index"|"p2sh_addr_index"|"p2tr_addr_index"|"p2wpkh_addr_index"|"p2wsh_addr_index"|"unknown_output_index"|"funded_addr_index"|"empty_addr_index")} Index */ /** * Information about an available index and its query aliases * * @typedef {Object} IndexInfo * @property {Index} index - The canonical index name * @property {string[]} aliases - All Accepted query aliases */ /** * Legacy path parameter for `/api/metric/{metric}` * * @typedef {Object} LegacySeriesParam * @property {SeriesName} metric */ /** * Legacy path parameters for `/api/metric/{metric}/{index}` * * @typedef {Object} LegacySeriesWithIndex * @property {SeriesName} metric * @property {Index} index */ /** * Maximum number of results to return. Defaults to 100 if not specified. * * @typedef {number} Limit */ /** * Lowest price value for a time period * * @typedef {Dollars} Low */ /** * Block info in a mempool.space like format for fee estimation. * * @typedef {Object} MempoolBlock * @property {number} blockSize - Total block size in weight units * @property {number} blockVSize - Total block virtual size in vbytes * @property {number} nTx - Number of transactions in the projected block * @property {Sats} totalFees - Total fees in satoshis * @property {FeeRate} medianFee - Median fee rate in sat/vB * @property {FeeRate[]} feeRange - Fee rate range: [min, 10%, 25%, 50%, 75%, 90%, max] */ /** * Mempool statistics * * @typedef {Object} MempoolInfo * @property {number} count - Number of transactions in the mempool * @property {VSize} vsize - Total virtual size of all transactions in the mempool (vbytes) * @property {Sats} totalFee - Total fees of all transactions in the mempool (satoshis) */ /** @typedef {number} Minute10 */ /** @typedef {number} Minute30 */ /** @typedef {number} Month1 */ /** @typedef {number} Month3 */ /** @typedef {number} Month6 */ /** * OHLC (Open, High, Low, Close) data in cents * * @typedef {Object} OHLCCents * @property {Open} open * @property {High} high * @property {Low} low * @property {Close} close */ /** * OHLC (Open, High, Low, Close) data in dollars * * @typedef {Object} OHLCDollars * @property {Open} open * @property {High} high * @property {Low} low * @property {Close} close */ /** * OHLC (Open, High, Low, Close) data in satoshis * * @typedef {Object} OHLCSats * @property {Open} open * @property {High} high * @property {Low} low * @property {Close} close */ /** @typedef {TypeIndex} OpReturnIndex */ /** * Opening price value for a time period * * @typedef {Dollars} Open */ /** @typedef {number} OutPoint */ /** * Type (P2PKH, P2WPKH, P2SH, P2TR, etc.) * * @typedef {("p2pk65"|"p2pk33"|"p2pkh"|"p2ms"|"p2sh"|"opreturn"|"p2wpkh"|"p2wsh"|"p2tr"|"p2a"|"empty"|"unknown")} OutputType */ /** @typedef {TypeIndex} P2AAddrIndex */ /** @typedef {U8x2} P2ABytes */ /** @typedef {TypeIndex} P2MSOutputIndex */ /** @typedef {TypeIndex} P2PK33AddrIndex */ /** @typedef {U8x33} P2PK33Bytes */ /** @typedef {TypeIndex} P2PK65AddrIndex */ /** @typedef {U8x65} P2PK65Bytes */ /** @typedef {TypeIndex} P2PKHAddrIndex */ /** @typedef {U8x20} P2PKHBytes */ /** @typedef {TypeIndex} P2SHAddrIndex */ /** @typedef {U8x20} P2SHBytes */ /** @typedef {TypeIndex} P2TRAddrIndex */ /** @typedef {U8x32} P2TRBytes */ /** @typedef {TypeIndex} P2WPKHAddrIndex */ /** @typedef {U8x20} P2WPKHBytes */ /** @typedef {TypeIndex} P2WSHAddrIndex */ /** @typedef {U8x32} P2WSHBytes */ /** * A paginated list of available series names (1000 per page) * * @typedef {Object} PaginatedSeries * @property {number} currentPage - Current page number (0-indexed) * @property {number} maxPage - Maximum valid page index (0-indexed) * @property {number} totalCount - Total number of series * @property {number} perPage - Results per page * @property {boolean} hasMore - Whether more pages are available after the current one * @property {string[]} series - List of series names */ /** * Pagination parameters for paginated API endpoints * * @typedef {Object} Pagination * @property {?number=} page - Pagination index * @property {?number=} perPage - Results per page (default: 1000, max: 1000) */ /** * Block counts for different time periods * * @typedef {Object} PoolBlockCounts * @property {number} all - Total blocks mined (all time) * @property {number} _24h - Blocks mined in last 24 hours * @property {number} _1w - Blocks mined in last week */ /** * Pool's share of total blocks for different time periods * * @typedef {Object} PoolBlockShares * @property {number} all - Share of all blocks (0.0 - 1.0) * @property {number} _24h - Share of blocks in last 24 hours * @property {number} _1w - Share of blocks in last week */ /** * Detailed pool information with statistics across time periods * * @typedef {Object} PoolDetail * @property {PoolDetailInfo} pool - Pool information * @property {PoolBlockCounts} blockCount - Block counts for different time periods * @property {PoolBlockShares} blockShare - Pool's share of total blocks for different time periods * @property {number} estimatedHashrate - Estimated hashrate based on blocks mined * @property {?number=} reportedHashrate - Self-reported hashrate (if available) */ /** * Pool information for detail view * * @typedef {Object} PoolDetailInfo * @property {number} id - Unique pool identifier * @property {string} name - Pool name * @property {string} link - Pool website URL * @property {string[]} addrs - Known payout addresses * @property {string[]} regexes - Coinbase tag patterns (regexes) * @property {PoolSlug} slug - URL-friendly pool identifier */ /** * Basic pool information for listing all pools * * @typedef {Object} PoolInfo * @property {string} name - Pool name * @property {PoolSlug} slug - URL-friendly pool identifier * @property {number} uniqueId - Unique numeric pool identifier */ /** @typedef {("unknown"|"blockfills"|"ultimuspool"|"terrapool"|"luxor"|"onethash"|"btccom"|"bitfarms"|"huobipool"|"wayicn"|"canoepool"|"btctop"|"bitcoincom"|"pool175btc"|"gbminers"|"axbt"|"asicminer"|"bitminter"|"bitcoinrussia"|"btcserv"|"simplecoinus"|"btcguild"|"eligius"|"ozcoin"|"eclipsemc"|"maxbtc"|"triplemining"|"coinlab"|"pool50btc"|"ghashio"|"stminingcorp"|"bitparking"|"mmpool"|"polmine"|"kncminer"|"bitalo"|"f2pool"|"hhtt"|"megabigpower"|"mtred"|"nmcbit"|"yourbtcnet"|"givemecoins"|"braiinspool"|"antpool"|"multicoinco"|"bcpoolio"|"cointerra"|"kanopool"|"solock"|"ckpool"|"nicehash"|"bitclub"|"bitcoinaffiliatenetwork"|"btcc"|"bwpool"|"exxbw"|"bitsolo"|"bitfury"|"twentyoneinc"|"digitalbtc"|"eightbaochi"|"mybtccoinpool"|"tbdice"|"hashpool"|"nexious"|"bravomining"|"hotpool"|"okexpool"|"bcmonster"|"onehash"|"bixin"|"tatmaspool"|"viabtc"|"connectbtc"|"batpool"|"waterhole"|"dcexploration"|"dcex"|"btpool"|"fiftyeightcoin"|"bitcoinindia"|"shawnp0wers"|"phashio"|"rigpool"|"haozhuzhu"|"sevenpool"|"miningkings"|"hashbx"|"dpool"|"rawpool"|"haominer"|"helix"|"bitcoinukraine"|"poolin"|"secretsuperstar"|"tigerpoolnet"|"sigmapoolcom"|"okpooltop"|"hummerpool"|"tangpool"|"bytepool"|"spiderpool"|"novablock"|"miningcity"|"binancepool"|"minerium"|"lubiancom"|"okkong"|"aaopool"|"emcdpool"|"foundryusa"|"sbicrypto"|"arkpool"|"purebtccom"|"marapool"|"kucoinpool"|"entrustcharitypool"|"okminer"|"titan"|"pegapool"|"btcnuggets"|"cloudhashing"|"digitalxmintsy"|"telco214"|"btcpoolparty"|"multipool"|"transactioncoinmining"|"btcdig"|"trickysbtcpool"|"btcmp"|"eobot"|"unomp"|"patels"|"gogreenlight"|"bitcoinindiapool"|"ekanembtc"|"canoe"|"tiger"|"onem1x"|"zulupool"|"secpool"|"ocean"|"whitepool"|"wiz"|"wk057"|"futurebitapollosolo"|"carbonnegative"|"portlandhodl"|"phoenix"|"neopool"|"maxipool"|"bitfufupool"|"gdpool"|"miningdutch"|"publicpool"|"miningsquared"|"innopolistech"|"btclab"|"parasite"|"redrockpool"|"est3lar")} PoolSlug */ /** * @typedef {Object} PoolSlugParam * @property {PoolSlug} slug */ /** * Mining pool with block statistics for a time period * * @typedef {Object} PoolStats * @property {number} poolId - Unique pool identifier * @property {string} name - Pool name * @property {string} link - Pool website URL * @property {number} blockCount - Number of blocks mined in the time period * @property {number} rank - Pool ranking by block count (1 = most blocks) * @property {number} emptyBlocks - Number of empty blocks mined * @property {PoolSlug} slug - URL-friendly pool identifier * @property {number} share - Pool's share of total blocks (0.0 - 1.0) */ /** * Mining pools response for a time period * * @typedef {Object} PoolsSummary * @property {PoolStats[]} pools - List of pools sorted by block count descending * @property {number} blockCount - Total blocks in the time period * @property {number} lastEstimatedHashrate - Estimated network hashrate (hashes per second) */ /** * A range boundary: integer index, date, or timestamp. * * @typedef {(number|Date|Timestamp)} RangeIndex */ /** * Transaction locktime * * @typedef {number} RawLockTime */ /** * Recommended fee rates in sat/vB * * @typedef {Object} RecommendedFees * @property {FeeRate} fastestFee - Fee rate for fastest confirmation (next block) * @property {FeeRate} halfHourFee - Fee rate for confirmation within ~30 minutes (3 blocks) * @property {FeeRate} hourFee - Fee rate for confirmation within ~1 hour (6 blocks) * @property {FeeRate} economyFee - Fee rate for economical confirmation * @property {FeeRate} minimumFee - Minimum relay fee rate */ /** * Block reward statistics over a range of blocks * * @typedef {Object} RewardStats * @property {Height} startBlock - First block in the range * @property {Height} endBlock - Last block in the range * @property {Sats} totalReward * @property {Sats} totalFee * @property {number} totalTx */ /** * Satoshis * * @typedef {number} Sats */ /** * Fractional satoshis (f64) - for representing USD prices in sats * * Formula: `sats_fract = usd_value * 100_000_000 / btc_price` * * When BTC is $100,000: * - $1 = 1,000 sats * - $0.001 = 1 sat * - $0.0001 = 0.1 sats (fractional) * * @typedef {number} SatsFract */ /** * Signed satoshis (i64) - for values that can be negative. * Used for changes, deltas, profit/loss calculations, etc. * * @typedef {number} SatsSigned */ /** * @typedef {Object} SearchQuery * @property {SeriesName} q - Search query string * @property {Limit=} limit - Maximum number of results */ /** * Series count statistics - distinct series and total series-index combinations * * @typedef {Object} SeriesCount * @property {number} distinctSeries - Number of unique series available (e.g., realized_price, market_cap) * @property {number} totalEndpoints - Total number of series-index combinations across all timeframes * @property {number} lazyEndpoints - Number of lazy (computed on-the-fly) series-index combinations * @property {number} storedEndpoints - Number of eager (stored on disk) series-index combinations */ /** * Metadata about a series * * @typedef {Object} SeriesInfo * @property {Index[]} indexes - Available indexes * @property {string} type - Value type (e.g. "f32", "u64", "Sats") */ /** * SeriesLeaf with JSON Schema for client generation * * @typedef {Object} SeriesLeafWithSchema * @property {string} name - The series name/identifier * @property {string} kind - The Rust type (e.g., "Sats", "StoredF64") * @property {Index[]} indexes - Available indexes for this series * @property {string} type - JSON Schema type (e.g., "integer", "number", "string", "boolean", "array", "object") */ /** * Comma-separated list of series names * * @typedef {string} SeriesList */ /** * Series name * * @typedef {string} SeriesName */ /** * @typedef {Object} SeriesNameWithIndex * @property {SeriesName} series - Series name * @property {Index} index - Aggregation index */ /** * @typedef {Object} SeriesParam * @property {SeriesName} series */ /** * Selection of series to query * * @typedef {Object} SeriesSelection * @property {SeriesList} series - Requested series * @property {Index} index - Index to query * @property {(RangeIndex|null)=} start - Inclusive start: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `from`, `f`, `s` * @property {(RangeIndex|null)=} end - Exclusive end: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `to`, `t`, `e` * @property {(Limit|null)=} limit - Maximum number of values to return (ignored if `end` is set). Aliases: `count`, `c`, `l` * @property {Format=} format - Format of the output */ /** * Legacy series selection parameters (deprecated) * * @typedef {Object} SeriesSelectionLegacy * @property {Index} index * @property {SeriesList} ids * @property {(RangeIndex|null)=} start - Inclusive start: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `from`, `f`, `s` * @property {(RangeIndex|null)=} end - Exclusive end: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `to`, `t`, `e` * @property {(Limit|null)=} limit - Maximum number of values to return (ignored if `end` is set). Aliases: `count`, `c`, `l` * @property {Format=} format - Format of the output */ /** @typedef {boolean} StoredBool */ /** * Stored 32-bit floating point value * * @typedef {number} StoredF32 */ /** * Fixed-size 64-bit floating point value optimized for on-disk storage * * @typedef {number} StoredF64 */ /** * Fixed-size 64-bit signed integer optimized for on-disk storage * * @typedef {number} StoredI64 */ /** @typedef {number} StoredI8 */ /** @typedef {number} StoredU16 */ /** * Fixed-size 32-bit unsigned integer optimized for on-disk storage * * @typedef {number} StoredU32 */ /** * Fixed-size 64-bit unsigned integer optimized for on-disk storage * * @typedef {number} StoredU64 */ /** * Current supply state tracking UTXO count and total value * * @typedef {Object} SupplyState * @property {number} utxoCount - Number of unspent transaction outputs * @property {Sats} value - Total value in satoshis */ /** * Sync status of the indexer * * @typedef {Object} SyncStatus * @property {Height} indexedHeight - Height of the last indexed block * @property {Height} computedHeight - Height of the last computed block (series) * @property {Height} tipHeight - Height of the chain tip (from Bitcoin node) * @property {Height} blocksBehind - Number of blocks behind the tip * @property {string} lastIndexedAt - Human-readable timestamp of the last indexed block (ISO 8601) * @property {Timestamp} lastIndexedAtUnix - Unix timestamp of the last indexed block */ /** * Time period for mining statistics. * * Used to specify the lookback window for pool statistics, hashrate calculations, * and other time-based mining series. * * @typedef {("24h"|"3d"|"1w"|"1m"|"3m"|"6m"|"1y"|"2y"|"3y")} TimePeriod */ /** * @typedef {Object} TimePeriodParam * @property {TimePeriod} timePeriod */ /** * UNIX timestamp in seconds * * @typedef {number} Timestamp */ /** * @typedef {Object} TimestampParam * @property {Timestamp} timestamp */ /** * Transaction information compatible with mempool.space API format * * @typedef {Object} Transaction * @property {(TxIndex|null)=} index * @property {Txid} txid * @property {TxVersion} version * @property {RawLockTime} locktime * @property {number} size - Transaction size in bytes * @property {Weight} weight - Transaction weight * @property {number} sigops - Number of signature operations * @property {Sats} fee - Transaction fee in satoshis * @property {TxIn[]} vin - Transaction inputs * @property {TxOut[]} vout - Transaction outputs * @property {TxStatus} status */ /** * Hierarchical tree node for organizing series into categories * * @typedef {({ [key: string]: TreeNode }|SeriesLeafWithSchema)} TreeNode */ /** * Transaction input * * @typedef {Object} TxIn * @property {Txid} txid - Transaction ID of the output being spent * @property {Vout} vout * @property {(TxOut|null)=} prevout - Information about the previous output being spent * @property {string} scriptsig - Signature script (for non-SegWit inputs) * @property {string} scriptsigAsm - Signature script in assembly format * @property {boolean} isCoinbase - Whether this input is a coinbase (block reward) input * @property {number} sequence - Input sequence number * @property {?string=} innerRedeemscriptAsm - Inner redeemscript in assembly format (for P2SH-wrapped SegWit) */ /** @typedef {number} TxInIndex */ /** @typedef {number} TxIndex */ /** * Transaction output * * @typedef {Object} TxOut * @property {string} scriptpubkey - Script pubkey (locking script) * @property {Sats} value - Value of the output in satoshis */ /** @typedef {number} TxOutIndex */ /** * Status of an output indicating whether it has been spent * * @typedef {Object} TxOutspend * @property {boolean} spent - Whether the output has been spent * @property {(Txid|null)=} txid - Transaction ID of the spending transaction (only present if spent) * @property {(Vin|null)=} vin - Input index in the spending transaction (only present if spent) * @property {(TxStatus|null)=} status - Status of the spending transaction (only present if spent) */ /** * Transaction confirmation status * * @typedef {Object} TxStatus * @property {boolean} confirmed - Whether the transaction is confirmed * @property {(Height|null)=} blockHeight - Block height (only present if confirmed) * @property {(BlockHash|null)=} blockHash - Block hash (only present if confirmed) * @property {(Timestamp|null)=} blockTime - Block timestamp (only present if confirmed) */ /** * Transaction version number * * @typedef {number} TxVersion */ /** * Transaction ID (hash) * * @typedef {string} Txid */ /** * @typedef {Object} TxidParam * @property {Txid} txid */ /** * Transaction output reference (txid + output index) * * @typedef {Object} TxidVout * @property {Txid} txid - Transaction ID * @property {Vout} vout - Output index */ /** * Index within its type (e.g., 0 for first P2WPKH address) * * @typedef {number} TypeIndex */ /** @typedef {number[]} U8x2 */ /** @typedef {number[]} U8x20 */ /** @typedef {number[]} U8x32 */ /** @typedef {number[]} U8x33 */ /** @typedef {number[]} U8x65 */ /** @typedef {TypeIndex} UnknownOutputIndex */ /** * Unspent transaction output * * @typedef {Object} Utxo * @property {Txid} txid * @property {Vout} vout * @property {TxStatus} status * @property {Sats} value */ /** * Virtual size in vbytes (weight / 4, rounded up) * * @typedef {number} VSize */ /** * @typedef {Object} ValidateAddrParam * @property {string} address - Bitcoin address to validate (can be any string) */ /** * Version tracking for data schema and computed values. * * Used to detect when stored data needs to be recomputed due to changes * in computation logic or source data versions. Supports validation * against persisted versions to ensure compatibility. * * @typedef {number} Version */ /** * Input index in the spending transaction * * @typedef {number} Vin */ /** * Index of the output being spent in the previous transaction * * @typedef {number} Vout */ /** @typedef {number} Week1 */ /** * Transaction or block weight in weight units (WU) * * @typedef {number} Weight */ /** @typedef {number} Year1 */ /** @typedef {number} Year10 */ /** * @typedef {Object} BrkClientOptions * @property {string} baseUrl - Base URL for the API * @property {number} [timeout] - Request timeout in milliseconds * @property {string|boolean} [cache] - Enable browser cache with default name (true), custom name (string), or disable (false). No effect in Node.js. Default: true */ const _isBrowser = typeof window !== 'undefined' && 'caches' in window; const _runIdle = (/** @type {VoidFunction} */ fn) => (globalThis.requestIdleCallback ?? setTimeout)(fn); const _defaultCacheName = '__BRK_CLIENT__'; /** * @param {string|boolean|undefined} cache * @returns {Promise} */ const _openCache = (cache) => { if (!_isBrowser || cache === false) return Promise.resolve(null); const name = typeof cache === 'string' ? cache : _defaultCacheName; return caches.open(name).catch(() => null); }; /** * Custom error class for BRK client errors */ class BrkError extends Error { /** * @param {string} message * @param {number} [status] */ constructor(message, status) { super(message); this.name = 'BrkError'; this.status = status; } } // Date conversion constants and helpers const _GENESIS = new Date(2009, 0, 3); // day1 0, week1 0 const _DAY_ONE = new Date(2009, 0, 9); // day1 1 (6 day gap after genesis) const _MS_PER_DAY = 86400000; const _MS_PER_WEEK = 7 * _MS_PER_DAY; const _EPOCH_MS = 1230768000000; const _DATE_INDEXES = new Set([ 'minute10', 'minute30', 'hour1', 'hour4', 'hour12', 'day1', 'day3', 'week1', 'month1', 'month3', 'month6', 'year1', 'year10', ]); /** @param {number} months @returns {globalThis.Date} */ const _addMonths = (months) => new Date(2009, months, 1); /** * Convert an index value to a Date for date-based indexes. * @param {Index} index - The index type * @param {number} i - The index value * @returns {globalThis.Date} */ function indexToDate(index, i) { switch (index) { case 'minute10': return new Date(_EPOCH_MS + i * 600000); case 'minute30': return new Date(_EPOCH_MS + i * 1800000); case 'hour1': return new Date(_EPOCH_MS + i * 3600000); case 'hour4': return new Date(_EPOCH_MS + i * 14400000); case 'hour12': return new Date(_EPOCH_MS + i * 43200000); case 'day1': return i === 0 ? _GENESIS : new Date(_DAY_ONE.getTime() + (i - 1) * _MS_PER_DAY); case 'day3': return new Date(_EPOCH_MS - 86400000 + i * 259200000); case 'week1': return new Date(_GENESIS.getTime() + i * _MS_PER_WEEK); case 'month1': return _addMonths(i); case 'month3': return _addMonths(i * 3); case 'month6': return _addMonths(i * 6); case 'year1': return new Date(2009 + i, 0, 1); case 'year10': return new Date(2009 + i * 10, 0, 1); default: throw new Error(`${index} is not a date-based index`); } } /** * Convert a Date to an index value for date-based indexes. * Returns the floor index (latest index whose date is <= the given date). * @param {Index} index - The index type * @param {globalThis.Date} d - The date to convert * @returns {number} */ function dateToIndex(index, d) { const ms = d.getTime(); switch (index) { case 'minute10': return Math.floor((ms - _EPOCH_MS) / 600000); case 'minute30': return Math.floor((ms - _EPOCH_MS) / 1800000); case 'hour1': return Math.floor((ms - _EPOCH_MS) / 3600000); case 'hour4': return Math.floor((ms - _EPOCH_MS) / 14400000); case 'hour12': return Math.floor((ms - _EPOCH_MS) / 43200000); case 'day1': { if (ms < _DAY_ONE.getTime()) return 0; return 1 + Math.floor((ms - _DAY_ONE.getTime()) / _MS_PER_DAY); } case 'day3': return Math.floor((ms - _EPOCH_MS + 86400000) / 259200000); case 'week1': return Math.floor((ms - _GENESIS.getTime()) / _MS_PER_WEEK); case 'month1': return (d.getFullYear() - 2009) * 12 + d.getMonth(); case 'month3': return (d.getFullYear() - 2009) * 4 + Math.floor(d.getMonth() / 3); case 'month6': return (d.getFullYear() - 2009) * 2 + Math.floor(d.getMonth() / 6); case 'year1': return d.getFullYear() - 2009; case 'year10': return Math.floor((d.getFullYear() - 2009) / 10); default: throw new Error(`${index} is not a date-based index`); } } /** * Wrap raw series data with helper methods. * @template T * @param {SeriesData} raw - Raw JSON response * @returns {DateSeriesData} */ function _wrapSeriesData(raw) { const { index, start, end, data } = raw; const _dateBased = _DATE_INDEXES.has(index); return /** @type {DateSeriesData} */ ({ ...raw, isDateBased: _dateBased, indexes() { /** @type {number[]} */ const result = []; for (let i = start; i < end; i++) result.push(i); return result; }, keys() { return this.indexes(); }, entries() { /** @type {Array<[number, T]>} */ const result = []; for (let i = 0; i < data.length; i++) result.push([start + i, data[i]]); return result; }, toMap() { /** @type {Map} */ const map = new Map(); for (let i = 0; i < data.length; i++) map.set(start + i, data[i]); return map; }, *[Symbol.iterator]() { for (let i = 0; i < data.length; i++) yield /** @type {[number, T]} */ ([start + i, data[i]]); }, // DateSeriesData methods (only meaningful for date-based indexes) dates() { /** @type {globalThis.Date[]} */ const result = []; for (let i = start; i < end; i++) result.push(indexToDate(index, i)); return result; }, dateEntries() { /** @type {Array<[globalThis.Date, T]>} */ const result = []; for (let i = 0; i < data.length; i++) result.push([indexToDate(index, start + i), data[i]]); return result; }, toDateMap() { /** @type {Map} */ const map = new Map(); for (let i = 0; i < data.length; i++) map.set(indexToDate(index, start + i), data[i]); return map; }, }); } /** * @template T * @typedef {Object} SeriesDataBase * @property {number} version - Version of the series data * @property {Index} index - The index type used for this query * @property {string} type - Value type (e.g. "f32", "u64", "Sats") * @property {number} total - Total number of data points * @property {number} start - Start index (inclusive) * @property {number} end - End index (exclusive) * @property {string} stamp - ISO 8601 timestamp of when the response was generated * @property {T[]} data - The series data * @property {boolean} isDateBased - Whether this series uses a date-based index * @property {() => number[]} indexes - Get index numbers * @property {() => number[]} keys - Get keys as index numbers (alias for indexes) * @property {() => Array<[number, T]>} entries - Get [index, value] pairs * @property {() => Map} toMap - Convert to Map */ /** @template T @typedef {SeriesDataBase & Iterable<[number, T]>} SeriesData */ /** * @template T * @typedef {Object} DateSeriesDataExtras * @property {() => globalThis.Date[]} dates - Get dates for each data point * @property {() => Array<[globalThis.Date, T]>} dateEntries - Get [date, value] pairs * @property {() => Map} toDateMap - Convert to Map */ /** @template T @typedef {SeriesData & DateSeriesDataExtras} DateSeriesData */ /** @typedef {SeriesData} AnySeriesData */ /** @template T @typedef {(onfulfilled?: (value: SeriesData) => any, onrejected?: (reason: Error) => never) => Promise>} Thenable */ /** @template T @typedef {(onfulfilled?: (value: DateSeriesData) => any, onrejected?: (reason: Error) => never) => Promise>} DateThenable */ /** * @template T * @typedef {Object} SeriesEndpoint * @property {(index: number) => SingleItemBuilder} get - Get single item at index * @property {(start?: number, end?: number) => RangeBuilder} slice - Slice by index * @property {(n: number) => RangeBuilder} first - Get first n items * @property {(n: number) => RangeBuilder} last - Get last n items * @property {(n: number) => SkippedBuilder} skip - Skip first n items, chain with take() * @property {(onUpdate?: (value: SeriesData) => void) => Promise>} fetch - Fetch all data * @property {() => Promise} fetchCsv - Fetch all data as CSV * @property {Thenable} then - Thenable (await endpoint) * @property {string} path - The endpoint path */ /** * @template T * @typedef {Object} DateSeriesEndpoint * @property {(index: number | globalThis.Date) => DateSingleItemBuilder} get - Get single item at index or Date * @property {(start?: number | globalThis.Date, end?: number | globalThis.Date) => DateRangeBuilder} slice - Slice by index or Date * @property {(n: number) => DateRangeBuilder} first - Get first n items * @property {(n: number) => DateRangeBuilder} last - Get last n items * @property {(n: number) => DateSkippedBuilder} skip - Skip first n items, chain with take() * @property {(onUpdate?: (value: DateSeriesData) => void) => Promise>} fetch - Fetch all data * @property {() => Promise} fetchCsv - Fetch all data as CSV * @property {DateThenable} then - Thenable (await endpoint) * @property {string} path - The endpoint path */ /** @typedef {SeriesEndpoint} AnySeriesEndpoint */ /** @template T @typedef {Object} SingleItemBuilder * @property {(onUpdate?: (value: SeriesData) => void) => Promise>} fetch - Fetch the item * @property {() => Promise} fetchCsv - Fetch as CSV * @property {Thenable} then - Thenable */ /** @template T @typedef {Object} DateSingleItemBuilder * @property {(onUpdate?: (value: DateSeriesData) => void) => Promise>} fetch - Fetch the item * @property {() => Promise} fetchCsv - Fetch as CSV * @property {DateThenable} then - Thenable */ /** @template T @typedef {Object} SkippedBuilder * @property {(n: number) => RangeBuilder} take - Take n items after skipped position * @property {(onUpdate?: (value: SeriesData) => void) => Promise>} fetch - Fetch from skipped position to end * @property {() => Promise} fetchCsv - Fetch as CSV * @property {Thenable} then - Thenable */ /** @template T @typedef {Object} DateSkippedBuilder * @property {(n: number) => DateRangeBuilder} take - Take n items after skipped position * @property {(onUpdate?: (value: DateSeriesData) => void) => Promise>} fetch - Fetch from skipped position to end * @property {() => Promise} fetchCsv - Fetch as CSV * @property {DateThenable} then - Thenable */ /** @template T @typedef {Object} RangeBuilder * @property {(onUpdate?: (value: SeriesData) => void) => Promise>} fetch - Fetch the range * @property {() => Promise} fetchCsv - Fetch as CSV * @property {Thenable} then - Thenable */ /** @template T @typedef {Object} DateRangeBuilder * @property {(onUpdate?: (value: DateSeriesData) => void) => Promise>} fetch - Fetch the range * @property {() => Promise} fetchCsv - Fetch as CSV * @property {DateThenable} then - Thenable */ /** * @template T * @typedef {Object} SeriesPattern * @property {string} name - The series name * @property {Readonly>>>} by - Index endpoints as lazy getters * @property {() => readonly Index[]} indexes - Get the list of available indexes * @property {(index: Index) => SeriesEndpoint|undefined} get - Get an endpoint for a specific index */ /** @typedef {SeriesPattern} AnySeriesPattern */ /** * Create a series endpoint builder with typestate pattern. * @template T * @param {BrkClientBase} client * @param {string} name - The series vec name * @param {Index} index - The index name * @returns {DateSeriesEndpoint} */ function _endpoint(client, name, index) { const p = `/api/series/${name}/${index}`; /** * @param {number} [start] * @param {number} [end] * @param {string} [format] * @returns {string} */ const buildPath = (start, end, format) => { const params = new URLSearchParams(); if (start !== undefined) params.set('start', String(start)); if (end !== undefined) params.set('end', String(end)); if (format) params.set('format', format); const query = params.toString(); return query ? `${p}?${query}` : p; }; /** * @param {number} [start] * @param {number} [end] * @returns {DateRangeBuilder} */ const rangeBuilder = (start, end) => ({ fetch(onUpdate) { return client._fetchSeriesData(buildPath(start, end), onUpdate); }, fetchCsv() { return client.getText(buildPath(start, end, 'csv')); }, then(resolve, reject) { return this.fetch().then(resolve, reject); }, }); /** * @param {number} idx * @returns {DateSingleItemBuilder} */ const singleItemBuilder = (idx) => ({ fetch(onUpdate) { return client._fetchSeriesData(buildPath(idx, idx + 1), onUpdate); }, fetchCsv() { return client.getText(buildPath(idx, idx + 1, 'csv')); }, then(resolve, reject) { return this.fetch().then(resolve, reject); }, }); /** * @param {number} start * @returns {DateSkippedBuilder} */ const skippedBuilder = (start) => ({ take(n) { return rangeBuilder(start, start + n); }, fetch(onUpdate) { return client._fetchSeriesData(buildPath(start, undefined), onUpdate); }, fetchCsv() { return client.getText(buildPath(start, undefined, 'csv')); }, then(resolve, reject) { return this.fetch().then(resolve, reject); }, }); /** @type {DateSeriesEndpoint} */ const endpoint = { get(idx) { if (idx instanceof Date) idx = dateToIndex(index, idx); return singleItemBuilder(idx); }, slice(start, end) { if (start instanceof Date) start = dateToIndex(index, start); if (end instanceof Date) end = dateToIndex(index, end); return rangeBuilder(start, end); }, first(n) { return rangeBuilder(undefined, n); }, last(n) { return n === 0 ? rangeBuilder(undefined, 0) : rangeBuilder(-n, undefined); }, skip(n) { return skippedBuilder(n); }, fetch(onUpdate) { return client._fetchSeriesData(buildPath(), onUpdate); }, fetchCsv() { return client.getText(buildPath(undefined, undefined, 'csv')); }, then(resolve, reject) { return this.fetch().then(resolve, reject); }, get path() { return p; }, }; return endpoint; } /** * Base HTTP client for making requests with caching support */ class BrkClientBase { /** * @param {BrkClientOptions|string} options */ constructor(options) { const isString = typeof options === 'string'; const rawUrl = isString ? options : options.baseUrl; this.baseUrl = rawUrl.endsWith('/') ? rawUrl.slice(0, -1) : rawUrl; this.timeout = isString ? 5000 : (options.timeout ?? 5000); /** @type {Promise} */ this._cachePromise = _openCache(isString ? undefined : options.cache); /** @type {Cache | null} */ this._cache = null; this._cachePromise.then(c => this._cache = c); } /** * @param {string} path * @returns {Promise} */ async get(path) { const url = `${this.baseUrl}${path}`; const res = await fetch(url, { signal: AbortSignal.timeout(this.timeout) }); if (!res.ok) throw new BrkError(`HTTP ${res.status}: ${url}`, res.status); return res; } /** * Make a GET request - races cache vs network, first to resolve calls onUpdate * @template T * @param {string} path * @param {(value: T) => void} [onUpdate] - Called when data is available (may be called twice: cache then network) * @returns {Promise} */ async getJson(path, onUpdate) { const url = `${this.baseUrl}${path}`; const cache = this._cache ?? await this._cachePromise; let resolved = false; /** @type {Response | null} */ let cachedRes = null; // Race cache vs network - first to resolve calls onUpdate const cachePromise = cache?.match(url).then(async (res) => { cachedRes = res ?? null; if (!res) return null; const json = await res.json(); if (!resolved && onUpdate) { resolved = true; onUpdate(json); } return json; }); const networkPromise = this.get(path).then(async (res) => { const cloned = res.clone(); const json = await res.json(); // Skip update if ETag matches and cache already delivered if (cachedRes?.headers.get('ETag') === res.headers.get('ETag')) { if (!resolved && onUpdate) { resolved = true; onUpdate(json); } return json; } resolved = true; if (onUpdate) { onUpdate(json); } if (cache) _runIdle(() => cache.put(url, cloned)); return json; }); try { return await networkPromise; } catch (e) { // Network failed - wait for cache const cachedJson = await cachePromise?.catch(() => null); if (cachedJson) return cachedJson; throw e; } } /** * Make a GET request and return raw text (for CSV responses) * @param {string} path * @returns {Promise} */ async getText(path) { const res = await this.get(path); return res.text(); } /** * Fetch series data and wrap with helper methods (internal) * @template T * @param {string} path * @param {(value: DateSeriesData) => void} [onUpdate] * @returns {Promise>} */ async _fetchSeriesData(path, onUpdate) { const wrappedOnUpdate = onUpdate ? (/** @type {SeriesData} */ raw) => onUpdate(_wrapSeriesData(raw)) : undefined; const raw = await this.getJson(path, wrappedOnUpdate); return _wrapSeriesData(raw); } } /** * Build series name with suffix. * @param {string} acc - Accumulated prefix * @param {string} s - Series suffix * @returns {string} */ const _m = (acc, s) => s ? (acc ? `${acc}_${s}` : s) : acc; /** * Build series name with prefix. * @param {string} prefix - Prefix to prepend * @param {string} acc - Accumulated name * @returns {string} */ const _p = (prefix, acc) => acc ? `${prefix}_${acc}` : prefix; // Index group constants and factory const _i1 = /** @type {const} */ (["minute10", "minute30", "hour1", "hour4", "hour12", "day1", "day3", "week1", "month1", "month3", "month6", "year1", "year10", "halving", "epoch", "height"]); const _i2 = /** @type {const} */ (["minute10", "minute30", "hour1", "hour4", "hour12", "day1", "day3", "week1", "month1", "month3", "month6", "year1", "year10", "halving", "epoch"]); const _i3 = /** @type {const} */ (["minute10"]); const _i4 = /** @type {const} */ (["minute30"]); const _i5 = /** @type {const} */ (["hour1"]); const _i6 = /** @type {const} */ (["hour4"]); const _i7 = /** @type {const} */ (["hour12"]); const _i8 = /** @type {const} */ (["day1"]); const _i9 = /** @type {const} */ (["day3"]); const _i10 = /** @type {const} */ (["week1"]); const _i11 = /** @type {const} */ (["month1"]); const _i12 = /** @type {const} */ (["month3"]); const _i13 = /** @type {const} */ (["month6"]); const _i14 = /** @type {const} */ (["year1"]); const _i15 = /** @type {const} */ (["year10"]); const _i16 = /** @type {const} */ (["halving"]); const _i17 = /** @type {const} */ (["epoch"]); const _i18 = /** @type {const} */ (["height"]); const _i19 = /** @type {const} */ (["tx_index"]); const _i20 = /** @type {const} */ (["txin_index"]); const _i21 = /** @type {const} */ (["txout_index"]); const _i22 = /** @type {const} */ (["empty_output_index"]); const _i23 = /** @type {const} */ (["op_return_index"]); const _i24 = /** @type {const} */ (["p2a_addr_index"]); const _i25 = /** @type {const} */ (["p2ms_output_index"]); const _i26 = /** @type {const} */ (["p2pk33_addr_index"]); const _i27 = /** @type {const} */ (["p2pk65_addr_index"]); const _i28 = /** @type {const} */ (["p2pkh_addr_index"]); const _i29 = /** @type {const} */ (["p2sh_addr_index"]); const _i30 = /** @type {const} */ (["p2tr_addr_index"]); const _i31 = /** @type {const} */ (["p2wpkh_addr_index"]); const _i32 = /** @type {const} */ (["p2wsh_addr_index"]); const _i33 = /** @type {const} */ (["unknown_output_index"]); const _i34 = /** @type {const} */ (["funded_addr_index"]); const _i35 = /** @type {const} */ (["empty_addr_index"]); /** * Generic series pattern factory. * @template T * @param {BrkClientBase} client * @param {string} name - The series vec name * @param {readonly Index[]} indexes - The supported indexes */ function _mp(client, name, indexes) { const by = {}; for (const idx of indexes) { Object.defineProperty(by, idx, { get() { return _endpoint(client, name, idx); }, enumerable: true, configurable: true }); } return { name, by, /** @returns {readonly Index[]} */ indexes() { return indexes; }, /** @param {Index} index @returns {SeriesEndpoint|undefined} */ get(index) { return indexes.includes(index) ? _endpoint(client, name, index) : undefined; } }; } /** @template T @typedef {{ name: string, by: { readonly minute10: DateSeriesEndpoint, readonly minute30: DateSeriesEndpoint, readonly hour1: DateSeriesEndpoint, readonly hour4: DateSeriesEndpoint, readonly hour12: DateSeriesEndpoint, readonly day1: DateSeriesEndpoint, readonly day3: DateSeriesEndpoint, readonly week1: DateSeriesEndpoint, readonly month1: DateSeriesEndpoint, readonly month3: DateSeriesEndpoint, readonly month6: DateSeriesEndpoint, readonly year1: DateSeriesEndpoint, readonly year10: DateSeriesEndpoint, readonly halving: SeriesEndpoint, readonly epoch: SeriesEndpoint, readonly height: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern1 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern1} */ function createSeriesPattern1(client, name) { return /** @type {SeriesPattern1} */ (_mp(client, name, _i1)); } /** @template T @typedef {{ name: string, by: { readonly minute10: DateSeriesEndpoint, readonly minute30: DateSeriesEndpoint, readonly hour1: DateSeriesEndpoint, readonly hour4: DateSeriesEndpoint, readonly hour12: DateSeriesEndpoint, readonly day1: DateSeriesEndpoint, readonly day3: DateSeriesEndpoint, readonly week1: DateSeriesEndpoint, readonly month1: DateSeriesEndpoint, readonly month3: DateSeriesEndpoint, readonly month6: DateSeriesEndpoint, readonly year1: DateSeriesEndpoint, readonly year10: DateSeriesEndpoint, readonly halving: SeriesEndpoint, readonly epoch: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern2 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern2} */ function createSeriesPattern2(client, name) { return /** @type {SeriesPattern2} */ (_mp(client, name, _i2)); } /** @template T @typedef {{ name: string, by: { readonly minute10: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern3 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern3} */ function createSeriesPattern3(client, name) { return /** @type {SeriesPattern3} */ (_mp(client, name, _i3)); } /** @template T @typedef {{ name: string, by: { readonly minute30: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern4 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern4} */ function createSeriesPattern4(client, name) { return /** @type {SeriesPattern4} */ (_mp(client, name, _i4)); } /** @template T @typedef {{ name: string, by: { readonly hour1: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern5 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern5} */ function createSeriesPattern5(client, name) { return /** @type {SeriesPattern5} */ (_mp(client, name, _i5)); } /** @template T @typedef {{ name: string, by: { readonly hour4: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern6 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern6} */ function createSeriesPattern6(client, name) { return /** @type {SeriesPattern6} */ (_mp(client, name, _i6)); } /** @template T @typedef {{ name: string, by: { readonly hour12: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern7 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern7} */ function createSeriesPattern7(client, name) { return /** @type {SeriesPattern7} */ (_mp(client, name, _i7)); } /** @template T @typedef {{ name: string, by: { readonly day1: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern8 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern8} */ function createSeriesPattern8(client, name) { return /** @type {SeriesPattern8} */ (_mp(client, name, _i8)); } /** @template T @typedef {{ name: string, by: { readonly day3: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern9 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern9} */ function createSeriesPattern9(client, name) { return /** @type {SeriesPattern9} */ (_mp(client, name, _i9)); } /** @template T @typedef {{ name: string, by: { readonly week1: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern10 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern10} */ function createSeriesPattern10(client, name) { return /** @type {SeriesPattern10} */ (_mp(client, name, _i10)); } /** @template T @typedef {{ name: string, by: { readonly month1: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern11 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern11} */ function createSeriesPattern11(client, name) { return /** @type {SeriesPattern11} */ (_mp(client, name, _i11)); } /** @template T @typedef {{ name: string, by: { readonly month3: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern12 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern12} */ function createSeriesPattern12(client, name) { return /** @type {SeriesPattern12} */ (_mp(client, name, _i12)); } /** @template T @typedef {{ name: string, by: { readonly month6: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern13 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern13} */ function createSeriesPattern13(client, name) { return /** @type {SeriesPattern13} */ (_mp(client, name, _i13)); } /** @template T @typedef {{ name: string, by: { readonly year1: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern14 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern14} */ function createSeriesPattern14(client, name) { return /** @type {SeriesPattern14} */ (_mp(client, name, _i14)); } /** @template T @typedef {{ name: string, by: { readonly year10: DateSeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern15 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern15} */ function createSeriesPattern15(client, name) { return /** @type {SeriesPattern15} */ (_mp(client, name, _i15)); } /** @template T @typedef {{ name: string, by: { readonly halving: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern16 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern16} */ function createSeriesPattern16(client, name) { return /** @type {SeriesPattern16} */ (_mp(client, name, _i16)); } /** @template T @typedef {{ name: string, by: { readonly epoch: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern17 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern17} */ function createSeriesPattern17(client, name) { return /** @type {SeriesPattern17} */ (_mp(client, name, _i17)); } /** @template T @typedef {{ name: string, by: { readonly height: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern18 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern18} */ function createSeriesPattern18(client, name) { return /** @type {SeriesPattern18} */ (_mp(client, name, _i18)); } /** @template T @typedef {{ name: string, by: { readonly tx_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern19 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern19} */ function createSeriesPattern19(client, name) { return /** @type {SeriesPattern19} */ (_mp(client, name, _i19)); } /** @template T @typedef {{ name: string, by: { readonly txin_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern20 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern20} */ function createSeriesPattern20(client, name) { return /** @type {SeriesPattern20} */ (_mp(client, name, _i20)); } /** @template T @typedef {{ name: string, by: { readonly txout_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern21 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern21} */ function createSeriesPattern21(client, name) { return /** @type {SeriesPattern21} */ (_mp(client, name, _i21)); } /** @template T @typedef {{ name: string, by: { readonly empty_output_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern22 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern22} */ function createSeriesPattern22(client, name) { return /** @type {SeriesPattern22} */ (_mp(client, name, _i22)); } /** @template T @typedef {{ name: string, by: { readonly op_return_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern23 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern23} */ function createSeriesPattern23(client, name) { return /** @type {SeriesPattern23} */ (_mp(client, name, _i23)); } /** @template T @typedef {{ name: string, by: { readonly p2a_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern24 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern24} */ function createSeriesPattern24(client, name) { return /** @type {SeriesPattern24} */ (_mp(client, name, _i24)); } /** @template T @typedef {{ name: string, by: { readonly p2ms_output_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern25 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern25} */ function createSeriesPattern25(client, name) { return /** @type {SeriesPattern25} */ (_mp(client, name, _i25)); } /** @template T @typedef {{ name: string, by: { readonly p2pk33_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern26 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern26} */ function createSeriesPattern26(client, name) { return /** @type {SeriesPattern26} */ (_mp(client, name, _i26)); } /** @template T @typedef {{ name: string, by: { readonly p2pk65_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern27 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern27} */ function createSeriesPattern27(client, name) { return /** @type {SeriesPattern27} */ (_mp(client, name, _i27)); } /** @template T @typedef {{ name: string, by: { readonly p2pkh_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern28 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern28} */ function createSeriesPattern28(client, name) { return /** @type {SeriesPattern28} */ (_mp(client, name, _i28)); } /** @template T @typedef {{ name: string, by: { readonly p2sh_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern29 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern29} */ function createSeriesPattern29(client, name) { return /** @type {SeriesPattern29} */ (_mp(client, name, _i29)); } /** @template T @typedef {{ name: string, by: { readonly p2tr_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern30 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern30} */ function createSeriesPattern30(client, name) { return /** @type {SeriesPattern30} */ (_mp(client, name, _i30)); } /** @template T @typedef {{ name: string, by: { readonly p2wpkh_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern31 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern31} */ function createSeriesPattern31(client, name) { return /** @type {SeriesPattern31} */ (_mp(client, name, _i31)); } /** @template T @typedef {{ name: string, by: { readonly p2wsh_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern32 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern32} */ function createSeriesPattern32(client, name) { return /** @type {SeriesPattern32} */ (_mp(client, name, _i32)); } /** @template T @typedef {{ name: string, by: { readonly unknown_output_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern33 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern33} */ function createSeriesPattern33(client, name) { return /** @type {SeriesPattern33} */ (_mp(client, name, _i33)); } /** @template T @typedef {{ name: string, by: { readonly funded_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern34 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern34} */ function createSeriesPattern34(client, name) { return /** @type {SeriesPattern34} */ (_mp(client, name, _i34)); } /** @template T @typedef {{ name: string, by: { readonly empty_addr_index: SeriesEndpoint }, indexes: () => readonly Index[], get: (index: Index) => SeriesEndpoint|undefined }} SeriesPattern35 */ /** @template T @param {BrkClientBase} client @param {string} name @returns {SeriesPattern35} */ function createSeriesPattern35(client, name) { return /** @type {SeriesPattern35} */ (_mp(client, name, _i35)); } // Reusable structural pattern factories /** * @typedef {Object} Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern * @property {CentsSatsUsdPattern} pct05 * @property {CentsSatsUsdPattern} pct10 * @property {CentsSatsUsdPattern} pct15 * @property {CentsSatsUsdPattern} pct20 * @property {CentsSatsUsdPattern} pct25 * @property {CentsSatsUsdPattern} pct30 * @property {CentsSatsUsdPattern} pct35 * @property {CentsSatsUsdPattern} pct40 * @property {CentsSatsUsdPattern} pct45 * @property {CentsSatsUsdPattern} pct50 * @property {CentsSatsUsdPattern} pct55 * @property {CentsSatsUsdPattern} pct60 * @property {CentsSatsUsdPattern} pct65 * @property {CentsSatsUsdPattern} pct70 * @property {CentsSatsUsdPattern} pct75 * @property {CentsSatsUsdPattern} pct80 * @property {CentsSatsUsdPattern} pct85 * @property {CentsSatsUsdPattern} pct90 * @property {CentsSatsUsdPattern} pct95 */ /** * Create a Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} */ function createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, acc) { return { pct05: createCentsSatsUsdPattern(client, _m(acc, 'pct05')), pct10: createCentsSatsUsdPattern(client, _m(acc, 'pct10')), pct15: createCentsSatsUsdPattern(client, _m(acc, 'pct15')), pct20: createCentsSatsUsdPattern(client, _m(acc, 'pct20')), pct25: createCentsSatsUsdPattern(client, _m(acc, 'pct25')), pct30: createCentsSatsUsdPattern(client, _m(acc, 'pct30')), pct35: createCentsSatsUsdPattern(client, _m(acc, 'pct35')), pct40: createCentsSatsUsdPattern(client, _m(acc, 'pct40')), pct45: createCentsSatsUsdPattern(client, _m(acc, 'pct45')), pct50: createCentsSatsUsdPattern(client, _m(acc, 'pct50')), pct55: createCentsSatsUsdPattern(client, _m(acc, 'pct55')), pct60: createCentsSatsUsdPattern(client, _m(acc, 'pct60')), pct65: createCentsSatsUsdPattern(client, _m(acc, 'pct65')), pct70: createCentsSatsUsdPattern(client, _m(acc, 'pct70')), pct75: createCentsSatsUsdPattern(client, _m(acc, 'pct75')), pct80: createCentsSatsUsdPattern(client, _m(acc, 'pct80')), pct85: createCentsSatsUsdPattern(client, _m(acc, 'pct85')), pct90: createCentsSatsUsdPattern(client, _m(acc, 'pct90')), pct95: createCentsSatsUsdPattern(client, _m(acc, 'pct95')), }; } /** * @typedef {Object} _0sdM0M1M1sdM2M2sdM3sdP0P1P1sdP2P2sdP3sdSdZscorePattern * @property {CentsSatsUsdPattern} _0sd * @property {PriceRatioPattern} m05sd * @property {PriceRatioPattern} m15sd * @property {PriceRatioPattern} m1sd * @property {PriceRatioPattern} m25sd * @property {PriceRatioPattern} m2sd * @property {PriceRatioPattern} m3sd * @property {PriceRatioPattern} p05sd * @property {PriceRatioPattern} p15sd * @property {PriceRatioPattern} p1sd * @property {PriceRatioPattern} p25sd * @property {PriceRatioPattern} p2sd * @property {PriceRatioPattern} p3sd * @property {SeriesPattern1} sd * @property {SeriesPattern1} zscore */ /** * @typedef {Object} _10y1m1w1y2y3m3y4y5y6m6y8yPattern2 * @property {BpsPercentRatioPattern} _10y * @property {BpsPercentRatioPattern} _1m * @property {BpsPercentRatioPattern} _1w * @property {BpsPercentRatioPattern} _1y * @property {BpsPercentRatioPattern} _2y * @property {BpsPercentRatioPattern} _3m * @property {BpsPercentRatioPattern} _3y * @property {BpsPercentRatioPattern} _4y * @property {BpsPercentRatioPattern} _5y * @property {BpsPercentRatioPattern} _6m * @property {BpsPercentRatioPattern} _6y * @property {BpsPercentRatioPattern} _8y */ /** * Create a _10y1m1w1y2y3m3y4y5y6m6y8yPattern2 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {_10y1m1w1y2y3m3y4y5y6m6y8yPattern2} */ function create_10y1m1w1y2y3m3y4y5y6m6y8yPattern2(client, acc) { return { _10y: createBpsPercentRatioPattern(client, _m(acc, '10y')), _1m: createBpsPercentRatioPattern(client, _m(acc, '1m')), _1w: createBpsPercentRatioPattern(client, _m(acc, '1w')), _1y: createBpsPercentRatioPattern(client, _m(acc, '1y')), _2y: createBpsPercentRatioPattern(client, _m(acc, '2y')), _3m: createBpsPercentRatioPattern(client, _m(acc, '3m')), _3y: createBpsPercentRatioPattern(client, _m(acc, '3y')), _4y: createBpsPercentRatioPattern(client, _m(acc, '4y')), _5y: createBpsPercentRatioPattern(client, _m(acc, '5y')), _6m: createBpsPercentRatioPattern(client, _m(acc, '6m')), _6y: createBpsPercentRatioPattern(client, _m(acc, '6y')), _8y: createBpsPercentRatioPattern(client, _m(acc, '8y')), }; } /** * @typedef {Object} _10y1m1w1y2y3m3y4y5y6m6y8yPattern3 * @property {BtcCentsSatsUsdPattern} _10y * @property {BtcCentsSatsUsdPattern} _1m * @property {BtcCentsSatsUsdPattern} _1w * @property {BtcCentsSatsUsdPattern} _1y * @property {BtcCentsSatsUsdPattern} _2y * @property {BtcCentsSatsUsdPattern} _3m * @property {BtcCentsSatsUsdPattern} _3y * @property {BtcCentsSatsUsdPattern} _4y * @property {BtcCentsSatsUsdPattern} _5y * @property {BtcCentsSatsUsdPattern} _6m * @property {BtcCentsSatsUsdPattern} _6y * @property {BtcCentsSatsUsdPattern} _8y */ /** * Create a _10y1m1w1y2y3m3y4y5y6m6y8yPattern3 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {_10y1m1w1y2y3m3y4y5y6m6y8yPattern3} */ function create_10y1m1w1y2y3m3y4y5y6m6y8yPattern3(client, acc) { return { _10y: createBtcCentsSatsUsdPattern(client, _m(acc, '10y')), _1m: createBtcCentsSatsUsdPattern(client, _m(acc, '1m')), _1w: createBtcCentsSatsUsdPattern(client, _m(acc, '1w')), _1y: createBtcCentsSatsUsdPattern(client, _m(acc, '1y')), _2y: createBtcCentsSatsUsdPattern(client, _m(acc, '2y')), _3m: createBtcCentsSatsUsdPattern(client, _m(acc, '3m')), _3y: createBtcCentsSatsUsdPattern(client, _m(acc, '3y')), _4y: createBtcCentsSatsUsdPattern(client, _m(acc, '4y')), _5y: createBtcCentsSatsUsdPattern(client, _m(acc, '5y')), _6m: createBtcCentsSatsUsdPattern(client, _m(acc, '6m')), _6y: createBtcCentsSatsUsdPattern(client, _m(acc, '6y')), _8y: createBtcCentsSatsUsdPattern(client, _m(acc, '8y')), }; } /** * @typedef {Object} CapGrossInvestorLossMvrvNetPeakPriceProfitSellSoprPattern * @property {CentsDeltaToUsdPattern} cap * @property {BaseCumulativeSumPattern4} grossPnl * @property {PricePattern} investor * @property {BaseCumulativeNegativeSumToPattern} loss * @property {SeriesPattern1} mvrv * @property {BaseChangeCumulativeDeltaSumToPattern} netPnl * @property {BaseCumulativeSumToPattern} peakRegret * @property {BpsCentsPercentilesRatioSatsSmaStdUsdPattern} price * @property {BaseCumulativeSumToPattern} profit * @property {_1m1w1y24hPattern} profitToLossRatio * @property {_1m1w1y24hPattern6} sellSideRiskRatio * @property {AdjustedRatioValuePattern} sopr */ /** * @typedef {Object} AverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern2 * @property {_1m1w1y24hPattern} average * @property {SeriesPattern1} base * @property {SeriesPattern1} cumulative * @property {_1m1w1y24hPattern} max * @property {_1m1w1y24hPattern} median * @property {_1m1w1y24hPattern} min * @property {_1m1w1y24hPattern} pct10 * @property {_1m1w1y24hPattern} pct25 * @property {_1m1w1y24hPattern} pct75 * @property {_1m1w1y24hPattern} pct90 * @property {_1m1w1y24hPattern} sum */ /** * Create a AverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern2 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {AverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern2} */ function createAverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern2(client, acc) { return { average: create_1m1w1y24hPattern(client, _m(acc, 'average')), base: createSeriesPattern1(client, acc), cumulative: createSeriesPattern1(client, _m(acc, 'cumulative')), max: create_1m1w1y24hPattern(client, _m(acc, 'max')), median: create_1m1w1y24hPattern(client, _m(acc, 'median')), min: create_1m1w1y24hPattern(client, _m(acc, 'min')), pct10: create_1m1w1y24hPattern(client, _m(acc, 'pct10')), pct25: create_1m1w1y24hPattern(client, _m(acc, 'pct25')), pct75: create_1m1w1y24hPattern(client, _m(acc, 'pct75')), pct90: create_1m1w1y24hPattern(client, _m(acc, 'pct90')), sum: create_1m1w1y24hPattern(client, _m(acc, 'sum')), }; } /** * @template T * @typedef {Object} AverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern * @property {_1m1w1y24hPattern} average * @property {SeriesPattern18} base * @property {SeriesPattern1} cumulative * @property {_1m1w1y24hPattern} max * @property {_1m1w1y24hPattern} median * @property {_1m1w1y24hPattern} min * @property {_1m1w1y24hPattern} pct10 * @property {_1m1w1y24hPattern} pct25 * @property {_1m1w1y24hPattern} pct75 * @property {_1m1w1y24hPattern} pct90 * @property {_1m1w1y24hPattern} sum */ /** * @typedef {Object} AverageGainsLossesRsiStochPattern * @property {SeriesPattern1} averageGain * @property {SeriesPattern1} averageLoss * @property {SeriesPattern1} gains * @property {SeriesPattern1} losses * @property {BpsPercentRatioPattern3} rsi * @property {BpsPercentRatioPattern3} rsiMax * @property {BpsPercentRatioPattern3} rsiMin * @property {BpsPercentRatioPattern3} stochRsi * @property {BpsPercentRatioPattern3} stochRsiD * @property {BpsPercentRatioPattern3} stochRsiK */ /** * Create a AverageGainsLossesRsiStochPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @param {string} disc - Discriminator suffix * @returns {AverageGainsLossesRsiStochPattern} */ function createAverageGainsLossesRsiStochPattern(client, acc, disc) { return { averageGain: createSeriesPattern1(client, _m(_m(acc, 'average_gain'), disc)), averageLoss: createSeriesPattern1(client, _m(_m(acc, 'average_loss'), disc)), gains: createSeriesPattern1(client, _m(_m(acc, 'gains'), disc)), losses: createSeriesPattern1(client, _m(_m(acc, 'losses'), disc)), rsi: createBpsPercentRatioPattern3(client, _m(acc, disc)), rsiMax: createBpsPercentRatioPattern3(client, _m(_m(acc, 'max'), disc)), rsiMin: createBpsPercentRatioPattern3(client, _m(_m(acc, 'min'), disc)), stochRsi: createBpsPercentRatioPattern3(client, _m(_m(acc, 'stoch'), disc)), stochRsiD: createBpsPercentRatioPattern3(client, _m(_m(acc, 'stoch_d'), disc)), stochRsiK: createBpsPercentRatioPattern3(client, _m(_m(acc, 'stoch_k'), disc)), }; } /** * @typedef {Object} AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3 * @property {SeriesPattern1} all * @property {SeriesPattern1} p2a * @property {SeriesPattern1} p2pk33 * @property {SeriesPattern1} p2pk65 * @property {SeriesPattern1} p2pkh * @property {SeriesPattern1} p2sh * @property {SeriesPattern1} p2tr * @property {SeriesPattern1} p2wpkh * @property {SeriesPattern1} p2wsh */ /** * Create a AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3} */ function createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3(client, acc) { return { all: createSeriesPattern1(client, acc), p2a: createSeriesPattern1(client, _p('p2a', acc)), p2pk33: createSeriesPattern1(client, _p('p2pk33', acc)), p2pk65: createSeriesPattern1(client, _p('p2pk65', acc)), p2pkh: createSeriesPattern1(client, _p('p2pkh', acc)), p2sh: createSeriesPattern1(client, _p('p2sh', acc)), p2tr: createSeriesPattern1(client, _p('p2tr', acc)), p2wpkh: createSeriesPattern1(client, _p('p2wpkh', acc)), p2wsh: createSeriesPattern1(client, _p('p2wsh', acc)), }; } /** * @typedef {Object} AverageMaxMedianMinPct10Pct25Pct75Pct90SumPattern * @property {_1m1w1y24hPattern} average * @property {_1m1w1y24hPattern} max * @property {_1m1w1y24hPattern} median * @property {_1m1w1y24hPattern} min * @property {_1m1w1y24hPattern} pct10 * @property {_1m1w1y24hPattern} pct25 * @property {_1m1w1y24hPattern} pct75 * @property {_1m1w1y24hPattern} pct90 * @property {_1m1w1y24hPattern} sum */ /** * Create a AverageMaxMedianMinPct10Pct25Pct75Pct90SumPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {AverageMaxMedianMinPct10Pct25Pct75Pct90SumPattern} */ function createAverageMaxMedianMinPct10Pct25Pct75Pct90SumPattern(client, acc) { return { average: create_1m1w1y24hPattern(client, _m(acc, 'average')), max: create_1m1w1y24hPattern(client, _m(acc, 'max')), median: create_1m1w1y24hPattern(client, _m(acc, 'median')), min: create_1m1w1y24hPattern(client, _m(acc, 'min')), pct10: create_1m1w1y24hPattern(client, _m(acc, 'pct10')), pct25: create_1m1w1y24hPattern(client, _m(acc, 'pct25')), pct75: create_1m1w1y24hPattern(client, _m(acc, 'pct75')), pct90: create_1m1w1y24hPattern(client, _m(acc, 'pct90')), sum: create_1m1w1y24hPattern(client, _m(acc, 'sum')), }; } /** * @typedef {Object} AverageMaxMedianMinPct10Pct25Pct75Pct90Pattern2 * @property {SeriesPattern18} average * @property {SeriesPattern18} max * @property {SeriesPattern18} median * @property {SeriesPattern18} min * @property {SeriesPattern18} pct10 * @property {SeriesPattern18} pct25 * @property {SeriesPattern18} pct75 * @property {SeriesPattern18} pct90 */ /** * Create a AverageMaxMedianMinPct10Pct25Pct75Pct90Pattern2 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {AverageMaxMedianMinPct10Pct25Pct75Pct90Pattern2} */ function createAverageMaxMedianMinPct10Pct25Pct75Pct90Pattern2(client, acc) { return { average: createSeriesPattern18(client, _m(acc, 'average')), max: createSeriesPattern18(client, _m(acc, 'max')), median: createSeriesPattern18(client, _m(acc, 'median')), min: createSeriesPattern18(client, _m(acc, 'min')), pct10: createSeriesPattern18(client, _m(acc, 'pct10')), pct25: createSeriesPattern18(client, _m(acc, 'pct25')), pct75: createSeriesPattern18(client, _m(acc, 'pct75')), pct90: createSeriesPattern18(client, _m(acc, 'pct90')), }; } /** * @typedef {Object} BpsCentsPercentilesRatioSatsSmaStdUsdPattern * @property {SeriesPattern1} bps * @property {SeriesPattern1} cents * @property {Pct1Pct2Pct5Pct95Pct98Pct99Pattern} percentiles * @property {SeriesPattern1} ratio * @property {SeriesPattern1} sats * @property {_1m1w1y2y4yAllPattern} sma * @property {_1y2y4yAllPattern} stdDev * @property {SeriesPattern1} usd */ /** * @template T * @typedef {Object} AverageMaxMedianMinPct10Pct25Pct75Pct90Pattern * @property {SeriesPattern1} average * @property {SeriesPattern1} max * @property {SeriesPattern1} median * @property {SeriesPattern1} min * @property {SeriesPattern1} pct10 * @property {SeriesPattern1} pct25 * @property {SeriesPattern1} pct75 * @property {SeriesPattern1} pct90 */ /** * Create a AverageMaxMedianMinPct10Pct25Pct75Pct90Pattern pattern node * @template T * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {AverageMaxMedianMinPct10Pct25Pct75Pct90Pattern} */ function createAverageMaxMedianMinPct10Pct25Pct75Pct90Pattern(client, acc) { return { average: createSeriesPattern1(client, _m(acc, 'average')), max: createSeriesPattern1(client, _m(acc, 'max')), median: createSeriesPattern1(client, _m(acc, 'median')), min: createSeriesPattern1(client, _m(acc, 'min')), pct10: createSeriesPattern1(client, _m(acc, 'pct10')), pct25: createSeriesPattern1(client, _m(acc, 'pct25')), pct75: createSeriesPattern1(client, _m(acc, 'pct75')), pct90: createSeriesPattern1(client, _m(acc, 'pct90')), }; } /** * @typedef {Object} _10y2y3y4y5y6y8yPattern * @property {BpsPercentRatioPattern} _10y * @property {BpsPercentRatioPattern} _2y * @property {BpsPercentRatioPattern} _3y * @property {BpsPercentRatioPattern} _4y * @property {BpsPercentRatioPattern} _5y * @property {BpsPercentRatioPattern} _6y * @property {BpsPercentRatioPattern} _8y */ /** * Create a _10y2y3y4y5y6y8yPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {_10y2y3y4y5y6y8yPattern} */ function create_10y2y3y4y5y6y8yPattern(client, acc) { return { _10y: createBpsPercentRatioPattern(client, _m(acc, '10y')), _2y: createBpsPercentRatioPattern(client, _m(acc, '2y')), _3y: createBpsPercentRatioPattern(client, _m(acc, '3y')), _4y: createBpsPercentRatioPattern(client, _m(acc, '4y')), _5y: createBpsPercentRatioPattern(client, _m(acc, '5y')), _6y: createBpsPercentRatioPattern(client, _m(acc, '6y')), _8y: createBpsPercentRatioPattern(client, _m(acc, '8y')), }; } /** * @typedef {Object} _1m1w1y24hBpsPercentRatioPattern * @property {BpsPercentRatioPattern3} _1m * @property {BpsPercentRatioPattern3} _1w * @property {BpsPercentRatioPattern3} _1y * @property {BpsPercentRatioPattern3} _24h * @property {SeriesPattern1} bps * @property {SeriesPattern1} percent * @property {SeriesPattern1} ratio */ /** * Create a _1m1w1y24hBpsPercentRatioPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {_1m1w1y24hBpsPercentRatioPattern} */ function create_1m1w1y24hBpsPercentRatioPattern(client, acc) { return { _1m: createBpsPercentRatioPattern3(client, _m(acc, '1m')), _1w: createBpsPercentRatioPattern3(client, _m(acc, '1w')), _1y: createBpsPercentRatioPattern3(client, _m(acc, '1y')), _24h: createBpsPercentRatioPattern3(client, _m(acc, '24h')), bps: createSeriesPattern1(client, _m(acc, 'bps')), percent: createSeriesPattern1(client, acc), ratio: createSeriesPattern1(client, _m(acc, 'ratio')), }; } /** * @typedef {Object} CapLossMvrvNetPriceProfitSoprPattern * @property {CentsDeltaUsdPattern} cap * @property {BaseCumulativeNegativeSumPattern} loss * @property {SeriesPattern1} mvrv * @property {BaseCumulativeDeltaSumPattern} netPnl * @property {BpsCentsRatioSatsUsdPattern} price * @property {BaseCumulativeSumPattern4} profit * @property {RatioValuePattern} sopr */ /** * Create a CapLossMvrvNetPriceProfitSoprPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {CapLossMvrvNetPriceProfitSoprPattern} */ function createCapLossMvrvNetPriceProfitSoprPattern(client, acc) { return { cap: createCentsDeltaUsdPattern(client, _m(acc, 'realized_cap')), loss: createBaseCumulativeNegativeSumPattern(client, acc), mvrv: createSeriesPattern1(client, _m(acc, 'mvrv')), netPnl: createBaseCumulativeDeltaSumPattern(client, _m(acc, 'net_realized_pnl')), price: createBpsCentsRatioSatsUsdPattern(client, _m(acc, 'realized_price')), profit: createBaseCumulativeSumPattern4(client, _m(acc, 'realized_profit')), sopr: createRatioValuePattern(client, acc), }; } /** * @typedef {Object} GrossInvestedLossNetNuplProfitSentimentPattern2 * @property {CentsUsdPattern2} grossPnl * @property {InPattern} investedCapital * @property {CentsNegativeToUsdPattern2} loss * @property {CentsToUsdPattern3} netPnl * @property {BpsRatioPattern} nupl * @property {CentsToUsdPattern4} profit * @property {GreedNetPainPattern} sentiment */ /** * @typedef {Object} _1m1w1y2y4yAllPattern * @property {BpsRatioPattern2} _1m * @property {BpsRatioPattern2} _1w * @property {BpsRatioPattern2} _1y * @property {BpsRatioPattern2} _2y * @property {BpsRatioPattern2} _4y * @property {BpsRatioPattern2} all */ /** * Create a _1m1w1y2y4yAllPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {_1m1w1y2y4yAllPattern} */ function create_1m1w1y2y4yAllPattern(client, acc) { return { _1m: createBpsRatioPattern2(client, _m(acc, '1m')), _1w: createBpsRatioPattern2(client, _m(acc, '1w')), _1y: createBpsRatioPattern2(client, _m(acc, '1y')), _2y: createBpsRatioPattern2(client, _m(acc, '2y')), _4y: createBpsRatioPattern2(client, _m(acc, '4y')), all: createBpsRatioPattern2(client, _m(acc, 'all')), }; } /** * @typedef {Object} ActivityAddrOutputsRealizedSupplyUnrealizedPattern * @property {TransferPattern} activity * @property {BaseDeltaPattern} addrCount * @property {UnspentPattern} outputs * @property {CapLossMvrvPriceProfitPattern} realized * @property {DeltaHalfTotalPattern} supply * @property {NuplPattern} unrealized */ /** * Create a ActivityAddrOutputsRealizedSupplyUnrealizedPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} */ function createActivityAddrOutputsRealizedSupplyUnrealizedPattern(client, acc) { return { activity: createTransferPattern(client, _m(acc, 'transfer_volume')), addrCount: createBaseDeltaPattern(client, _m(acc, 'addr_count')), outputs: createUnspentPattern(client, _m(acc, 'utxo_count')), realized: createCapLossMvrvPriceProfitPattern(client, acc), supply: createDeltaHalfTotalPattern(client, _m(acc, 'supply')), unrealized: createNuplPattern(client, _m(acc, 'nupl')), }; } /** * @typedef {Object} BaseChangeCumulativeDeltaSumToPattern * @property {CentsUsdPattern} base * @property {ToPattern} change1m * @property {CentsUsdPattern} cumulative * @property {AbsoluteRatePattern2} delta * @property {_1m1w1y24hPattern4} sum * @property {BpsPercentRatioPattern} toRcap */ /** * Create a BaseChangeCumulativeDeltaSumToPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BaseChangeCumulativeDeltaSumToPattern} */ function createBaseChangeCumulativeDeltaSumToPattern(client, acc) { return { base: createCentsUsdPattern(client, _m(acc, 'realized_pnl')), change1m: createToPattern(client, _m(acc, 'pnl_change_1m_to')), cumulative: createCentsUsdPattern(client, _m(acc, 'realized_pnl_cumulative')), delta: createAbsoluteRatePattern2(client, _m(acc, 'realized_pnl_delta')), sum: create_1m1w1y24hPattern4(client, _m(acc, 'realized_pnl_sum')), toRcap: createBpsPercentRatioPattern(client, _m(acc, 'realized_pnl_to_rcap')), }; } /** * @typedef {Object} BpsCentsPercentilesRatioSatsUsdPattern * @property {SeriesPattern1} bps * @property {SeriesPattern1} cents * @property {Pct1Pct2Pct5Pct95Pct98Pct99Pattern} percentiles * @property {SeriesPattern1} ratio * @property {SeriesPattern1} sats * @property {SeriesPattern1} usd */ /** * Create a BpsCentsPercentilesRatioSatsUsdPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BpsCentsPercentilesRatioSatsUsdPattern} */ function createBpsCentsPercentilesRatioSatsUsdPattern(client, acc) { return { bps: createSeriesPattern1(client, _m(acc, 'ratio_bps')), cents: createSeriesPattern1(client, _m(acc, 'cents')), percentiles: createPct1Pct2Pct5Pct95Pct98Pct99Pattern(client, acc), ratio: createSeriesPattern1(client, _m(acc, 'ratio')), sats: createSeriesPattern1(client, _m(acc, 'sats')), usd: createSeriesPattern1(client, acc), }; } /** * @typedef {Object} BtcCentsSatsToUsdPattern3 * @property {SeriesPattern1} btc * @property {SeriesPattern1} cents * @property {SeriesPattern1} sats * @property {BpsPercentRatioPattern3} toCirculating * @property {BpsPercentRatioPattern3} toOwn * @property {SeriesPattern1} usd */ /** * Create a BtcCentsSatsToUsdPattern3 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BtcCentsSatsToUsdPattern3} */ function createBtcCentsSatsToUsdPattern3(client, acc) { return { btc: createSeriesPattern1(client, acc), cents: createSeriesPattern1(client, _m(acc, 'cents')), sats: createSeriesPattern1(client, _m(acc, 'sats')), toCirculating: createBpsPercentRatioPattern3(client, _m(acc, 'to_circulating')), toOwn: createBpsPercentRatioPattern3(client, _m(acc, 'to_own')), usd: createSeriesPattern1(client, _m(acc, 'usd')), }; } /** * @typedef {Object} CentsNegativeToUsdPattern2 * @property {SeriesPattern1} cents * @property {SeriesPattern1} negative * @property {BpsPercentRatioPattern3} toMcap * @property {BpsPercentRatioPattern3} toOwnGrossPnl * @property {BpsPercentRatioPattern4} toOwnMcap * @property {SeriesPattern1} usd */ /** * Create a CentsNegativeToUsdPattern2 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {CentsNegativeToUsdPattern2} */ function createCentsNegativeToUsdPattern2(client, acc) { return { cents: createSeriesPattern1(client, _m(acc, 'unrealized_loss_cents')), negative: createSeriesPattern1(client, _m(acc, 'neg_unrealized_loss')), toMcap: createBpsPercentRatioPattern3(client, _m(acc, 'unrealized_loss_to_mcap')), toOwnGrossPnl: createBpsPercentRatioPattern3(client, _m(acc, 'unrealized_loss_to_own_gross_pnl')), toOwnMcap: createBpsPercentRatioPattern4(client, _m(acc, 'unrealized_loss_to_own_mcap')), usd: createSeriesPattern1(client, _m(acc, 'unrealized_loss')), }; } /** * @typedef {Object} DeltaHalfInToTotalPattern * @property {AbsoluteRatePattern} delta * @property {BtcCentsSatsUsdPattern} half * @property {BtcCentsSatsToUsdPattern} inLoss * @property {BtcCentsSatsToUsdPattern} inProfit * @property {BpsPercentRatioPattern3} toCirculating * @property {BtcCentsSatsUsdPattern} total */ /** * Create a DeltaHalfInToTotalPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {DeltaHalfInToTotalPattern} */ function createDeltaHalfInToTotalPattern(client, acc) { return { delta: createAbsoluteRatePattern(client, _m(acc, 'delta')), half: createBtcCentsSatsUsdPattern(client, _m(acc, 'half')), inLoss: createBtcCentsSatsToUsdPattern(client, _m(acc, 'in_loss')), inProfit: createBtcCentsSatsToUsdPattern(client, _m(acc, 'in_profit')), toCirculating: createBpsPercentRatioPattern3(client, _m(acc, 'to_circulating')), total: createBtcCentsSatsUsdPattern(client, acc), }; } /** * @typedef {Object} DeltaHalfInToTotalPattern2 * @property {AbsoluteRatePattern} delta * @property {BtcCentsSatsUsdPattern} half * @property {BtcCentsSatsToUsdPattern3} inLoss * @property {BtcCentsSatsToUsdPattern3} inProfit * @property {BpsPercentRatioPattern3} toCirculating * @property {BtcCentsSatsUsdPattern} total */ /** * Create a DeltaHalfInToTotalPattern2 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {DeltaHalfInToTotalPattern2} */ function createDeltaHalfInToTotalPattern2(client, acc) { return { delta: createAbsoluteRatePattern(client, _m(acc, 'delta')), half: createBtcCentsSatsUsdPattern(client, _m(acc, 'half')), inLoss: createBtcCentsSatsToUsdPattern3(client, _m(acc, 'in_loss')), inProfit: createBtcCentsSatsToUsdPattern3(client, _m(acc, 'in_profit')), toCirculating: createBpsPercentRatioPattern3(client, _m(acc, 'to_circulating')), total: createBtcCentsSatsUsdPattern(client, acc), }; } /** * @typedef {Object} Pct1Pct2Pct5Pct95Pct98Pct99Pattern * @property {BpsPriceRatioPattern} pct1 * @property {BpsPriceRatioPattern} pct2 * @property {BpsPriceRatioPattern} pct5 * @property {BpsPriceRatioPattern} pct95 * @property {BpsPriceRatioPattern} pct98 * @property {BpsPriceRatioPattern} pct99 */ /** * Create a Pct1Pct2Pct5Pct95Pct98Pct99Pattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {Pct1Pct2Pct5Pct95Pct98Pct99Pattern} */ function createPct1Pct2Pct5Pct95Pct98Pct99Pattern(client, acc) { return { pct1: createBpsPriceRatioPattern(client, acc, 'pct1'), pct2: createBpsPriceRatioPattern(client, acc, 'pct2'), pct5: createBpsPriceRatioPattern(client, acc, 'pct5'), pct95: createBpsPriceRatioPattern(client, acc, 'pct95'), pct98: createBpsPriceRatioPattern(client, acc, 'pct98'), pct99: createBpsPriceRatioPattern(client, acc, 'pct99'), }; } /** * @typedef {Object} ActivityOutputsRealizedSupplyUnrealizedPattern * @property {CoindaysTransferPattern} activity * @property {UnspentPattern} outputs * @property {CapLossMvrvNetPriceProfitSoprPattern} realized * @property {DeltaHalfInToTotalPattern} supply * @property {LossNetNuplProfitPattern} unrealized */ /** * Create a ActivityOutputsRealizedSupplyUnrealizedPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {ActivityOutputsRealizedSupplyUnrealizedPattern} */ function createActivityOutputsRealizedSupplyUnrealizedPattern(client, acc) { return { activity: createCoindaysTransferPattern(client, acc), outputs: createUnspentPattern(client, _m(acc, 'utxo_count')), realized: createCapLossMvrvNetPriceProfitSoprPattern(client, acc), supply: createDeltaHalfInToTotalPattern(client, _m(acc, 'supply')), unrealized: createLossNetNuplProfitPattern(client, acc), }; } /** * @typedef {Object} ActivityOutputsRealizedSupplyUnrealizedPattern3 * @property {TransferPattern} activity * @property {UnspentPattern} outputs * @property {CapLossMvrvPriceProfitPattern} realized * @property {DeltaHalfInTotalPattern2} supply * @property {LossNuplProfitPattern} unrealized */ /** * Create a ActivityOutputsRealizedSupplyUnrealizedPattern3 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {ActivityOutputsRealizedSupplyUnrealizedPattern3} */ function createActivityOutputsRealizedSupplyUnrealizedPattern3(client, acc) { return { activity: createTransferPattern(client, _m(acc, 'transfer_volume')), outputs: createUnspentPattern(client, _m(acc, 'utxo_count')), realized: createCapLossMvrvPriceProfitPattern(client, acc), supply: createDeltaHalfInTotalPattern2(client, _m(acc, 'supply')), unrealized: createLossNuplProfitPattern(client, acc), }; } /** * @typedef {Object} ActivityOutputsRealizedSupplyUnrealizedPattern2 * @property {TransferPattern} activity * @property {UnspentPattern} outputs * @property {CapLossMvrvPriceProfitPattern} realized * @property {DeltaHalfTotalPattern} supply * @property {NuplPattern} unrealized */ /** * Create a ActivityOutputsRealizedSupplyUnrealizedPattern2 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {ActivityOutputsRealizedSupplyUnrealizedPattern2} */ function createActivityOutputsRealizedSupplyUnrealizedPattern2(client, acc) { return { activity: createTransferPattern(client, _m(acc, 'transfer_volume')), outputs: createUnspentPattern(client, _m(acc, 'utxo_count')), realized: createCapLossMvrvPriceProfitPattern(client, acc), supply: createDeltaHalfTotalPattern(client, _m(acc, 'supply')), unrealized: createNuplPattern(client, _m(acc, 'nupl')), }; } /** * @typedef {Object} BaseCumulativeInSumPattern * @property {BtcCentsSatsUsdPattern} base * @property {BtcCentsSatsUsdPattern} cumulative * @property {BaseCumulativeSumPattern3} inLoss * @property {BaseCumulativeSumPattern3} inProfit * @property {_1m1w1y24hPattern3} sum */ /** * Create a BaseCumulativeInSumPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BaseCumulativeInSumPattern} */ function createBaseCumulativeInSumPattern(client, acc) { return { base: createBtcCentsSatsUsdPattern(client, acc), cumulative: createBtcCentsSatsUsdPattern(client, _m(acc, 'cumulative')), inLoss: createBaseCumulativeSumPattern3(client, _m(acc, 'in_loss')), inProfit: createBaseCumulativeSumPattern3(client, _m(acc, 'in_profit')), sum: create_1m1w1y24hPattern3(client, _m(acc, 'sum')), }; } /** * @typedef {Object} BaseCumulativeNegativeSumToPattern * @property {CentsUsdPattern2} base * @property {CentsUsdPattern2} cumulative * @property {BaseSumPattern} negative * @property {_1m1w1y24hPattern5} sum * @property {BpsPercentRatioPattern4} toRcap */ /** * @typedef {Object} BpsCentsRatioSatsUsdPattern * @property {SeriesPattern1} bps * @property {SeriesPattern1} cents * @property {SeriesPattern1} ratio * @property {SeriesPattern1} sats * @property {SeriesPattern1} usd */ /** * Create a BpsCentsRatioSatsUsdPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BpsCentsRatioSatsUsdPattern} */ function createBpsCentsRatioSatsUsdPattern(client, acc) { return { bps: createSeriesPattern1(client, _m(acc, 'ratio_bps')), cents: createSeriesPattern1(client, _m(acc, 'cents')), ratio: createSeriesPattern1(client, _m(acc, 'ratio')), sats: createSeriesPattern1(client, _m(acc, 'sats')), usd: createSeriesPattern1(client, acc), }; } /** * @typedef {Object} BtcCentsDeltaSatsUsdPattern * @property {SeriesPattern1} btc * @property {SeriesPattern1} cents * @property {AbsoluteRatePattern} delta * @property {SeriesPattern1} sats * @property {SeriesPattern1} usd */ /** * Create a BtcCentsDeltaSatsUsdPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BtcCentsDeltaSatsUsdPattern} */ function createBtcCentsDeltaSatsUsdPattern(client, acc) { return { btc: createSeriesPattern1(client, acc), cents: createSeriesPattern1(client, _m(acc, 'cents')), delta: createAbsoluteRatePattern(client, _m(acc, 'delta')), sats: createSeriesPattern1(client, _m(acc, 'sats')), usd: createSeriesPattern1(client, _m(acc, 'usd')), }; } /** * @typedef {Object} BtcCentsSatsToUsdPattern * @property {SeriesPattern1} btc * @property {SeriesPattern1} cents * @property {SeriesPattern1} sats * @property {BpsPercentRatioPattern3} toCirculating * @property {SeriesPattern1} usd */ /** * Create a BtcCentsSatsToUsdPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BtcCentsSatsToUsdPattern} */ function createBtcCentsSatsToUsdPattern(client, acc) { return { btc: createSeriesPattern1(client, acc), cents: createSeriesPattern1(client, _m(acc, 'cents')), sats: createSeriesPattern1(client, _m(acc, 'sats')), toCirculating: createBpsPercentRatioPattern3(client, _m(acc, 'to_circulating')), usd: createSeriesPattern1(client, _m(acc, 'usd')), }; } /** * @typedef {Object} BtcCentsSatsToUsdPattern2 * @property {SeriesPattern1} btc * @property {SeriesPattern1} cents * @property {SeriesPattern1} sats * @property {BpsPercentRatioPattern3} toOwn * @property {SeriesPattern1} usd */ /** * Create a BtcCentsSatsToUsdPattern2 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BtcCentsSatsToUsdPattern2} */ function createBtcCentsSatsToUsdPattern2(client, acc) { return { btc: createSeriesPattern1(client, acc), cents: createSeriesPattern1(client, _m(acc, 'cents')), sats: createSeriesPattern1(client, _m(acc, 'sats')), toOwn: createBpsPercentRatioPattern3(client, _m(acc, 'to_own')), usd: createSeriesPattern1(client, _m(acc, 'usd')), }; } /** * @typedef {Object} CapLossMvrvPriceProfitPattern * @property {CentsDeltaUsdPattern} cap * @property {BaseCumulativeSumPattern4} loss * @property {SeriesPattern1} mvrv * @property {BpsCentsRatioSatsUsdPattern} price * @property {BaseCumulativeSumPattern4} profit */ /** * Create a CapLossMvrvPriceProfitPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {CapLossMvrvPriceProfitPattern} */ function createCapLossMvrvPriceProfitPattern(client, acc) { return { cap: createCentsDeltaUsdPattern(client, _m(acc, 'realized_cap')), loss: createBaseCumulativeSumPattern4(client, _m(acc, 'realized_loss')), mvrv: createSeriesPattern1(client, _m(acc, 'mvrv')), price: createBpsCentsRatioSatsUsdPattern(client, _m(acc, 'realized_price')), profit: createBaseCumulativeSumPattern4(client, _m(acc, 'realized_profit')), }; } /** * @typedef {Object} CentsToUsdPattern4 * @property {SeriesPattern1} cents * @property {BpsPercentRatioPattern3} toMcap * @property {BpsPercentRatioPattern3} toOwnGrossPnl * @property {BpsPercentRatioPattern3} toOwnMcap * @property {SeriesPattern1} usd */ /** * Create a CentsToUsdPattern4 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {CentsToUsdPattern4} */ function createCentsToUsdPattern4(client, acc) { return { cents: createSeriesPattern1(client, _m(acc, 'cents')), toMcap: createBpsPercentRatioPattern3(client, _m(acc, 'to_mcap')), toOwnGrossPnl: createBpsPercentRatioPattern3(client, _m(acc, 'to_own_gross_pnl')), toOwnMcap: createBpsPercentRatioPattern3(client, _m(acc, 'to_own_mcap')), usd: createSeriesPattern1(client, acc), }; } /** * @typedef {Object} DeltaHalfInTotalPattern2 * @property {AbsoluteRatePattern} delta * @property {BtcCentsSatsUsdPattern} half * @property {BtcCentsSatsUsdPattern} inLoss * @property {BtcCentsSatsUsdPattern} inProfit * @property {BtcCentsSatsUsdPattern} total */ /** * Create a DeltaHalfInTotalPattern2 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {DeltaHalfInTotalPattern2} */ function createDeltaHalfInTotalPattern2(client, acc) { return { delta: createAbsoluteRatePattern(client, _m(acc, 'delta')), half: createBtcCentsSatsUsdPattern(client, _m(acc, 'half')), inLoss: createBtcCentsSatsUsdPattern(client, _m(acc, 'in_loss')), inProfit: createBtcCentsSatsUsdPattern(client, _m(acc, 'in_profit')), total: createBtcCentsSatsUsdPattern(client, acc), }; } /** * @typedef {Object} EmaHistogramLineSignalPattern * @property {SeriesPattern1} emaFast * @property {SeriesPattern1} emaSlow * @property {SeriesPattern1} histogram * @property {SeriesPattern1} line * @property {SeriesPattern1} signal */ /** * @typedef {Object} InvestedMaxMinPercentilesSupplyPattern * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} investedCapital * @property {CentsSatsUsdPattern} max * @property {CentsSatsUsdPattern} min * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} percentiles * @property {BpsPercentRatioPattern3} supplyDensity */ /** * @typedef {Object} PhsReboundThsPattern * @property {SeriesPattern1} phs * @property {SeriesPattern1} phsMin * @property {BpsPercentRatioPattern} rebound * @property {SeriesPattern1} ths * @property {SeriesPattern1} thsMin */ /** * Create a PhsReboundThsPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {PhsReboundThsPattern} */ function createPhsReboundThsPattern(client, acc) { return { phs: createSeriesPattern1(client, _m(acc, 'phs')), phsMin: createSeriesPattern1(client, _m(acc, 'phs_min')), rebound: createBpsPercentRatioPattern(client, _m(acc, 'rebound')), ths: createSeriesPattern1(client, _m(acc, 'ths')), thsMin: createSeriesPattern1(client, _m(acc, 'ths_min')), }; } /** * @template T * @typedef {Object} _1m1w1y24hBasePattern * @property {SeriesPattern1} _1m * @property {SeriesPattern1} _1w * @property {SeriesPattern1} _1y * @property {SeriesPattern1} _24h * @property {SeriesPattern18} base */ /** * Create a _1m1w1y24hBasePattern pattern node * @template T * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {_1m1w1y24hBasePattern} */ function create_1m1w1y24hBasePattern(client, acc) { return { _1m: createSeriesPattern1(client, _m(acc, 'average_1m')), _1w: createSeriesPattern1(client, _m(acc, 'average_1w')), _1y: createSeriesPattern1(client, _m(acc, 'average_1y')), _24h: createSeriesPattern1(client, _m(acc, 'average_24h')), base: createSeriesPattern18(client, acc), }; } /** * @typedef {Object} _1m1w1y24hPattern2 * @property {BpsPercentRatioPattern} _1m * @property {BpsPercentRatioPattern} _1w * @property {BpsPercentRatioPattern} _1y * @property {BpsPercentRatioPattern} _24h */ /** * Create a _1m1w1y24hPattern2 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {_1m1w1y24hPattern2} */ function create_1m1w1y24hPattern2(client, acc) { return { _1m: createBpsPercentRatioPattern(client, _m(acc, '1m_rate')), _1w: createBpsPercentRatioPattern(client, _m(acc, '1w_rate')), _1y: createBpsPercentRatioPattern(client, _m(acc, '1y_rate')), _24h: createBpsPercentRatioPattern(client, _m(acc, '24h_rate')), }; } /** * @typedef {Object} _1m1w1y24hPattern6 * @property {BpsPercentRatioPattern4} _1m * @property {BpsPercentRatioPattern4} _1w * @property {BpsPercentRatioPattern4} _1y * @property {BpsPercentRatioPattern4} _24h */ /** * Create a _1m1w1y24hPattern6 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {_1m1w1y24hPattern6} */ function create_1m1w1y24hPattern6(client, acc) { return { _1m: createBpsPercentRatioPattern4(client, _m(acc, '1m')), _1w: createBpsPercentRatioPattern4(client, _m(acc, '1w')), _1y: createBpsPercentRatioPattern4(client, _m(acc, '1y')), _24h: createBpsPercentRatioPattern4(client, _m(acc, '24h')), }; } /** * @typedef {Object} _1m1w1y24hPattern3 * @property {BtcCentsSatsUsdPattern} _1m * @property {BtcCentsSatsUsdPattern} _1w * @property {BtcCentsSatsUsdPattern} _1y * @property {BtcCentsSatsUsdPattern} _24h */ /** * Create a _1m1w1y24hPattern3 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {_1m1w1y24hPattern3} */ function create_1m1w1y24hPattern3(client, acc) { return { _1m: createBtcCentsSatsUsdPattern(client, _m(acc, '1m')), _1w: createBtcCentsSatsUsdPattern(client, _m(acc, '1w')), _1y: createBtcCentsSatsUsdPattern(client, _m(acc, '1y')), _24h: createBtcCentsSatsUsdPattern(client, _m(acc, '24h')), }; } /** * @typedef {Object} _1m1w1y2wPattern * @property {CentsSatsUsdPattern} _1m * @property {CentsSatsUsdPattern} _1w * @property {CentsSatsUsdPattern} _1y * @property {CentsSatsUsdPattern} _2w */ /** * Create a _1m1w1y2wPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {_1m1w1y2wPattern} */ function create_1m1w1y2wPattern(client, acc) { return { _1m: createCentsSatsUsdPattern(client, _m(acc, '1m')), _1w: createCentsSatsUsdPattern(client, _m(acc, '1w')), _1y: createCentsSatsUsdPattern(client, _m(acc, '1y')), _2w: createCentsSatsUsdPattern(client, _m(acc, '2w')), }; } /** * @typedef {Object} _1m1w1y24hPattern4 * @property {CentsUsdPattern} _1m * @property {CentsUsdPattern} _1w * @property {CentsUsdPattern} _1y * @property {CentsUsdPattern} _24h */ /** * Create a _1m1w1y24hPattern4 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {_1m1w1y24hPattern4} */ function create_1m1w1y24hPattern4(client, acc) { return { _1m: createCentsUsdPattern(client, _m(acc, '1m')), _1w: createCentsUsdPattern(client, _m(acc, '1w')), _1y: createCentsUsdPattern(client, _m(acc, '1y')), _24h: createCentsUsdPattern(client, _m(acc, '24h')), }; } /** * @typedef {Object} _1m1w1y24hPattern5 * @property {CentsUsdPattern2} _1m * @property {CentsUsdPattern2} _1w * @property {CentsUsdPattern2} _1y * @property {CentsUsdPattern2} _24h */ /** * Create a _1m1w1y24hPattern5 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {_1m1w1y24hPattern5} */ function create_1m1w1y24hPattern5(client, acc) { return { _1m: createCentsUsdPattern2(client, _m(acc, '1m')), _1w: createCentsUsdPattern2(client, _m(acc, '1w')), _1y: createCentsUsdPattern2(client, _m(acc, '1y')), _24h: createCentsUsdPattern2(client, _m(acc, '24h')), }; } /** * @typedef {Object} _1y2y4yAllPattern * @property {_0sdM0M1M1sdM2M2sdM3sdP0P1P1sdP2P2sdP3sdSdZscorePattern} _1y * @property {_0sdM0M1M1sdM2M2sdM3sdP0P1P1sdP2P2sdP3sdSdZscorePattern} _2y * @property {_0sdM0M1M1sdM2M2sdM3sdP0P1P1sdP2P2sdP3sdSdZscorePattern} _4y * @property {_0sdM0M1M1sdM2M2sdM3sdP0P1P1sdP2P2sdP3sdSdZscorePattern} all */ /** * @typedef {Object} BaseCumulativeDeltaSumPattern * @property {CentsUsdPattern} base * @property {CentsUsdPattern} cumulative * @property {AbsoluteRatePattern2} delta * @property {_1m1w1y24hPattern4} sum */ /** * Create a BaseCumulativeDeltaSumPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BaseCumulativeDeltaSumPattern} */ function createBaseCumulativeDeltaSumPattern(client, acc) { return { base: createCentsUsdPattern(client, acc), cumulative: createCentsUsdPattern(client, _m(acc, 'cumulative')), delta: createAbsoluteRatePattern2(client, _m(acc, 'delta')), sum: create_1m1w1y24hPattern4(client, _m(acc, 'sum')), }; } /** * @typedef {Object} BaseCumulativeNegativeSumPattern * @property {CentsUsdPattern2} base * @property {CentsUsdPattern2} cumulative * @property {BaseSumPattern} negative * @property {_1m1w1y24hPattern5} sum */ /** * Create a BaseCumulativeNegativeSumPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BaseCumulativeNegativeSumPattern} */ function createBaseCumulativeNegativeSumPattern(client, acc) { return { base: createCentsUsdPattern2(client, _m(acc, 'realized_loss')), cumulative: createCentsUsdPattern2(client, _m(acc, 'realized_loss_cumulative')), negative: createBaseSumPattern(client, _m(acc, 'neg_realized_loss')), sum: create_1m1w1y24hPattern5(client, _m(acc, 'realized_loss_sum')), }; } /** * @typedef {Object} BaseCumulativeSumToPattern * @property {CentsUsdPattern2} base * @property {CentsUsdPattern2} cumulative * @property {_1m1w1y24hPattern5} sum * @property {BpsPercentRatioPattern4} toRcap */ /** * Create a BaseCumulativeSumToPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BaseCumulativeSumToPattern} */ function createBaseCumulativeSumToPattern(client, acc) { return { base: createCentsUsdPattern2(client, acc), cumulative: createCentsUsdPattern2(client, _m(acc, 'cumulative')), sum: create_1m1w1y24hPattern5(client, _m(acc, 'sum')), toRcap: createBpsPercentRatioPattern4(client, _m(acc, 'to_rcap')), }; } /** * @typedef {Object} BothReactivatedReceivingSendingPattern * @property {_1m1w1y24hBasePattern} both * @property {_1m1w1y24hBasePattern} reactivated * @property {_1m1w1y24hBasePattern} receiving * @property {_1m1w1y24hBasePattern} sending */ /** * Create a BothReactivatedReceivingSendingPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BothReactivatedReceivingSendingPattern} */ function createBothReactivatedReceivingSendingPattern(client, acc) { return { both: create_1m1w1y24hBasePattern(client, _m(acc, 'both')), reactivated: create_1m1w1y24hBasePattern(client, _m(acc, 'reactivated')), receiving: create_1m1w1y24hBasePattern(client, _m(acc, 'receiving')), sending: create_1m1w1y24hBasePattern(client, _m(acc, 'sending')), }; } /** * @typedef {Object} BtcCentsSatsUsdPattern * @property {SeriesPattern1} btc * @property {SeriesPattern1} cents * @property {SeriesPattern1} sats * @property {SeriesPattern1} usd */ /** * Create a BtcCentsSatsUsdPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BtcCentsSatsUsdPattern} */ function createBtcCentsSatsUsdPattern(client, acc) { return { btc: createSeriesPattern1(client, acc), cents: createSeriesPattern1(client, _m(acc, 'cents')), sats: createSeriesPattern1(client, _m(acc, 'sats')), usd: createSeriesPattern1(client, _m(acc, 'usd')), }; } /** * @typedef {Object} CentsDeltaToUsdPattern * @property {SeriesPattern1} cents * @property {AbsoluteRatePattern2} delta * @property {BpsPercentRatioPattern4} toOwnMcap * @property {SeriesPattern1} usd */ /** * Create a CentsDeltaToUsdPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {CentsDeltaToUsdPattern} */ function createCentsDeltaToUsdPattern(client, acc) { return { cents: createSeriesPattern1(client, _m(acc, 'cents')), delta: createAbsoluteRatePattern2(client, _m(acc, 'delta')), toOwnMcap: createBpsPercentRatioPattern4(client, _m(acc, 'to_own_mcap')), usd: createSeriesPattern1(client, acc), }; } /** * @typedef {Object} CentsToUsdPattern3 * @property {SeriesPattern1} cents * @property {BpsPercentRatioPattern} toOwnGrossPnl * @property {BpsPercentRatioPattern} toOwnMcap * @property {SeriesPattern1} usd */ /** * Create a CentsToUsdPattern3 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {CentsToUsdPattern3} */ function createCentsToUsdPattern3(client, acc) { return { cents: createSeriesPattern1(client, _m(acc, 'cents')), toOwnGrossPnl: createBpsPercentRatioPattern(client, _m(acc, 'to_own_gross_pnl')), toOwnMcap: createBpsPercentRatioPattern(client, _m(acc, 'to_own_mcap')), usd: createSeriesPattern1(client, acc), }; } /** * @typedef {Object} CoindaysCoinyearsDormancyTransferPattern * @property {BaseCumulativeSumPattern} coindaysDestroyed * @property {SeriesPattern1} coinyearsDestroyed * @property {_1m1w1y24hPattern} dormancy * @property {BaseCumulativeInSumPattern} transferVolume */ /** * @typedef {Object} LossNetNuplProfitPattern * @property {CentsNegativeUsdPattern} loss * @property {CentsUsdPattern} netPnl * @property {BpsRatioPattern} nupl * @property {CentsUsdPattern2} profit */ /** * Create a LossNetNuplProfitPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {LossNetNuplProfitPattern} */ function createLossNetNuplProfitPattern(client, acc) { return { loss: createCentsNegativeUsdPattern(client, acc), netPnl: createCentsUsdPattern(client, _m(acc, 'net_unrealized_pnl')), nupl: createBpsRatioPattern(client, _m(acc, 'nupl')), profit: createCentsUsdPattern2(client, _m(acc, 'unrealized_profit')), }; } /** * @template T * @typedef {Object} _1m1w1y24hPattern * @property {SeriesPattern1} _1m * @property {SeriesPattern1} _1w * @property {SeriesPattern1} _1y * @property {SeriesPattern1} _24h */ /** * Create a _1m1w1y24hPattern pattern node * @template T * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {_1m1w1y24hPattern} */ function create_1m1w1y24hPattern(client, acc) { return { _1m: createSeriesPattern1(client, _m(acc, '1m')), _1w: createSeriesPattern1(client, _m(acc, '1w')), _1y: createSeriesPattern1(client, _m(acc, '1y')), _24h: createSeriesPattern1(client, _m(acc, '24h')), }; } /** * @typedef {Object} AdjustedRatioValuePattern * @property {RatioTransferValuePattern} adjusted * @property {_1m1w1y24hPattern} ratio * @property {BaseCumulativeSumPattern} valueDestroyed */ /** * @typedef {Object} BaseCumulativeSumPattern3 * @property {BtcCentsSatsUsdPattern} base * @property {BtcCentsSatsUsdPattern} cumulative * @property {_1m1w1y24hPattern3} sum */ /** * Create a BaseCumulativeSumPattern3 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BaseCumulativeSumPattern3} */ function createBaseCumulativeSumPattern3(client, acc) { return { base: createBtcCentsSatsUsdPattern(client, acc), cumulative: createBtcCentsSatsUsdPattern(client, _m(acc, 'cumulative')), sum: create_1m1w1y24hPattern3(client, _m(acc, 'sum')), }; } /** * @typedef {Object} BaseCumulativeSumPattern4 * @property {CentsUsdPattern2} base * @property {CentsUsdPattern2} cumulative * @property {_1m1w1y24hPattern5} sum */ /** * Create a BaseCumulativeSumPattern4 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BaseCumulativeSumPattern4} */ function createBaseCumulativeSumPattern4(client, acc) { return { base: createCentsUsdPattern2(client, acc), cumulative: createCentsUsdPattern2(client, _m(acc, 'cumulative')), sum: create_1m1w1y24hPattern5(client, _m(acc, 'sum')), }; } /** * @typedef {Object} BaseCumulativeSumPattern2 * @property {SeriesPattern1} base * @property {SeriesPattern1} cumulative * @property {_1m1w1y24hPattern} sum */ /** * Create a BaseCumulativeSumPattern2 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BaseCumulativeSumPattern2} */ function createBaseCumulativeSumPattern2(client, acc) { return { base: createSeriesPattern1(client, acc), cumulative: createSeriesPattern1(client, _m(acc, 'cumulative')), sum: create_1m1w1y24hPattern(client, _m(acc, 'sum')), }; } /** * @typedef {Object} BlocksDominanceRewardsPattern * @property {BaseCumulativeSumPattern2} blocksMined * @property {_1m1w1y24hBpsPercentRatioPattern} dominance * @property {BaseCumulativeSumPattern3} rewards */ /** * Create a BlocksDominanceRewardsPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BlocksDominanceRewardsPattern} */ function createBlocksDominanceRewardsPattern(client, acc) { return { blocksMined: createBaseCumulativeSumPattern2(client, _m(acc, 'blocks_mined')), dominance: create_1m1w1y24hBpsPercentRatioPattern(client, _m(acc, 'dominance')), rewards: createBaseCumulativeSumPattern3(client, _m(acc, 'rewards')), }; } /** * @typedef {Object} BpsPercentRatioPattern3 * @property {SeriesPattern1} bps * @property {SeriesPattern1} percent * @property {SeriesPattern1} ratio */ /** * Create a BpsPercentRatioPattern3 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BpsPercentRatioPattern3} */ function createBpsPercentRatioPattern3(client, acc) { return { bps: createSeriesPattern1(client, _m(acc, 'bps')), percent: createSeriesPattern1(client, acc), ratio: createSeriesPattern1(client, _m(acc, 'ratio')), }; } /** * @typedef {Object} BpsPercentRatioPattern4 * @property {SeriesPattern1} bps * @property {SeriesPattern1} percent * @property {SeriesPattern1} ratio */ /** * Create a BpsPercentRatioPattern4 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BpsPercentRatioPattern4} */ function createBpsPercentRatioPattern4(client, acc) { return { bps: createSeriesPattern1(client, _m(acc, 'bps')), percent: createSeriesPattern1(client, acc), ratio: createSeriesPattern1(client, _m(acc, 'ratio')), }; } /** * @typedef {Object} BpsPriceRatioPattern * @property {SeriesPattern1} bps * @property {CentsSatsUsdPattern} price * @property {SeriesPattern1} ratio */ /** * Create a BpsPriceRatioPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @param {string} disc - Discriminator suffix * @returns {BpsPriceRatioPattern} */ function createBpsPriceRatioPattern(client, acc, disc) { return { bps: createSeriesPattern1(client, _m(acc, `ratio_${disc}_bps`)), price: createCentsSatsUsdPattern(client, _m(acc, disc)), ratio: createSeriesPattern1(client, _m(_m(acc, 'ratio'), disc)), }; } /** * @typedef {Object} BpsPercentRatioPattern5 * @property {SeriesPattern1} bps * @property {SeriesPattern1} percent * @property {SeriesPattern1} ratio */ /** * Create a BpsPercentRatioPattern5 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BpsPercentRatioPattern5} */ function createBpsPercentRatioPattern5(client, acc) { return { bps: createSeriesPattern1(client, _m(acc, 'bps')), percent: createSeriesPattern1(client, acc), ratio: createSeriesPattern1(client, _m(acc, 'ratio')), }; } /** * @typedef {Object} BpsPercentRatioPattern * @property {SeriesPattern1} bps * @property {SeriesPattern1} percent * @property {SeriesPattern1} ratio */ /** * Create a BpsPercentRatioPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BpsPercentRatioPattern} */ function createBpsPercentRatioPattern(client, acc) { return { bps: createSeriesPattern1(client, _m(acc, 'bps')), percent: createSeriesPattern1(client, acc), ratio: createSeriesPattern1(client, _m(acc, 'ratio')), }; } /** * @typedef {Object} CentsSatsUsdPattern3 * @property {SeriesPattern2} cents * @property {SeriesPattern2} sats * @property {SeriesPattern2} usd */ /** * Create a CentsSatsUsdPattern3 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {CentsSatsUsdPattern3} */ function createCentsSatsUsdPattern3(client, acc) { return { cents: createSeriesPattern2(client, _m(acc, 'cents')), sats: createSeriesPattern2(client, _m(acc, 'sats')), usd: createSeriesPattern2(client, acc), }; } /** * @typedef {Object} CentsDeltaUsdPattern * @property {SeriesPattern1} cents * @property {AbsoluteRatePattern2} delta * @property {SeriesPattern1} usd */ /** * Create a CentsDeltaUsdPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {CentsDeltaUsdPattern} */ function createCentsDeltaUsdPattern(client, acc) { return { cents: createSeriesPattern1(client, _m(acc, 'cents')), delta: createAbsoluteRatePattern2(client, _m(acc, 'delta')), usd: createSeriesPattern1(client, acc), }; } /** * @typedef {Object} CentsNegativeUsdPattern * @property {SeriesPattern1} cents * @property {SeriesPattern1} negative * @property {SeriesPattern1} usd */ /** * Create a CentsNegativeUsdPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {CentsNegativeUsdPattern} */ function createCentsNegativeUsdPattern(client, acc) { return { cents: createSeriesPattern1(client, _m(acc, 'unrealized_loss_cents')), negative: createSeriesPattern1(client, _m(acc, 'neg_unrealized_loss')), usd: createSeriesPattern1(client, _m(acc, 'unrealized_loss')), }; } /** * @typedef {Object} CentsSatsUsdPattern * @property {SeriesPattern1} cents * @property {SeriesPattern1} sats * @property {SeriesPattern1} usd */ /** * Create a CentsSatsUsdPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {CentsSatsUsdPattern} */ function createCentsSatsUsdPattern(client, acc) { return { cents: createSeriesPattern1(client, _m(acc, 'cents')), sats: createSeriesPattern1(client, _m(acc, 'sats')), usd: createSeriesPattern1(client, acc), }; } /** * @typedef {Object} CumulativeRollingSumPattern * @property {SeriesPattern1} cumulative * @property {AverageMaxMedianMinPct10Pct25Pct75Pct90SumPattern} rolling * @property {SeriesPattern1} sum */ /** * Create a CumulativeRollingSumPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {CumulativeRollingSumPattern} */ function createCumulativeRollingSumPattern(client, acc) { return { cumulative: createSeriesPattern1(client, _m(acc, 'cumulative')), rolling: createAverageMaxMedianMinPct10Pct25Pct75Pct90SumPattern(client, acc), sum: createSeriesPattern1(client, _m(acc, 'sum')), }; } /** * @typedef {Object} DeltaHalfTotalPattern * @property {AbsoluteRatePattern} delta * @property {BtcCentsSatsUsdPattern} half * @property {BtcCentsSatsUsdPattern} total */ /** * Create a DeltaHalfTotalPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {DeltaHalfTotalPattern} */ function createDeltaHalfTotalPattern(client, acc) { return { delta: createAbsoluteRatePattern(client, _m(acc, 'delta')), half: createBtcCentsSatsUsdPattern(client, _m(acc, 'half')), total: createBtcCentsSatsUsdPattern(client, acc), }; } /** * @typedef {Object} GreedNetPainPattern * @property {CentsUsdPattern2} greedIndex * @property {CentsUsdPattern} net * @property {CentsUsdPattern2} painIndex */ /** * @typedef {Object} LossNuplProfitPattern * @property {CentsNegativeUsdPattern} loss * @property {BpsRatioPattern} nupl * @property {CentsUsdPattern2} profit */ /** * Create a LossNuplProfitPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {LossNuplProfitPattern} */ function createLossNuplProfitPattern(client, acc) { return { loss: createCentsNegativeUsdPattern(client, acc), nupl: createBpsRatioPattern(client, _m(acc, 'nupl')), profit: createCentsUsdPattern2(client, _m(acc, 'unrealized_profit')), }; } /** * @typedef {Object} NuplRealizedSupplyPattern * @property {BpsRatioPattern} nupl * @property {AllSthPattern} realizedCap * @property {AllSthPattern2} supply */ /** * Create a NuplRealizedSupplyPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {NuplRealizedSupplyPattern} */ function createNuplRealizedSupplyPattern(client, acc) { return { nupl: createBpsRatioPattern(client, _m(acc, 'nupl')), realizedCap: createAllSthPattern(client, acc), supply: createAllSthPattern2(client, acc), }; } /** * @typedef {Object} RatioTransferValuePattern * @property {_1m1w1y24hPattern} ratio * @property {BaseCumulativeSumPattern} transferVolume * @property {BaseCumulativeSumPattern} valueDestroyed */ /** * @template T * @typedef {Object} _6bBlockTxPattern * @property {AverageMaxMedianMinPct10Pct25Pct75Pct90Pattern} _6b * @property {AverageMaxMedianMinPct10Pct25Pct75Pct90Pattern} block * @property {SeriesPattern19} txIndex */ /** * Create a _6bBlockTxPattern pattern node * @template T * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {_6bBlockTxPattern} */ function create_6bBlockTxPattern(client, acc) { return { _6b: createAverageMaxMedianMinPct10Pct25Pct75Pct90Pattern(client, _m(acc, '6b')), block: createAverageMaxMedianMinPct10Pct25Pct75Pct90Pattern(client, acc), txIndex: createSeriesPattern19(client, acc), }; } /** * @template T * @typedef {Object} BaseCumulativeSumPattern * @property {SeriesPattern1} base * @property {SeriesPattern1} cumulative * @property {_1m1w1y24hPattern} sum */ /** * Create a BaseCumulativeSumPattern pattern node * @template T * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BaseCumulativeSumPattern} */ function createBaseCumulativeSumPattern(client, acc) { return { base: createSeriesPattern1(client, acc), cumulative: createSeriesPattern1(client, _m(acc, 'cumulative')), sum: create_1m1w1y24hPattern(client, _m(acc, 'sum')), }; } /** * @typedef {Object} AbsoluteRatePattern * @property {_1m1w1y24hPattern} absolute * @property {_1m1w1y24hPattern2} rate */ /** * Create a AbsoluteRatePattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {AbsoluteRatePattern} */ function createAbsoluteRatePattern(client, acc) { return { absolute: create_1m1w1y24hPattern(client, acc), rate: create_1m1w1y24hPattern2(client, acc), }; } /** * @typedef {Object} AbsoluteRatePattern2 * @property {_1m1w1y24hPattern4} absolute * @property {_1m1w1y24hPattern2} rate */ /** * Create a AbsoluteRatePattern2 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {AbsoluteRatePattern2} */ function createAbsoluteRatePattern2(client, acc) { return { absolute: create_1m1w1y24hPattern4(client, acc), rate: create_1m1w1y24hPattern2(client, acc), }; } /** * @typedef {Object} AllSthPattern2 * @property {BtcCentsDeltaSatsUsdPattern} all * @property {BtcCentsSatsUsdPattern} sth */ /** * Create a AllSthPattern2 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {AllSthPattern2} */ function createAllSthPattern2(client, acc) { return { all: createBtcCentsDeltaSatsUsdPattern(client, _m(acc, 'supply')), sth: createBtcCentsSatsUsdPattern(client, _m(acc, 'sth_supply')), }; } /** * @typedef {Object} AllSthPattern * @property {SeriesPattern1} all * @property {SeriesPattern1} sth */ /** * Create a AllSthPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {AllSthPattern} */ function createAllSthPattern(client, acc) { return { all: createSeriesPattern1(client, _m(acc, 'realized_cap')), sth: createSeriesPattern1(client, _m(acc, 'sth_realized_cap')), }; } /** * @typedef {Object} BaseSumPattern * @property {SeriesPattern1} base * @property {_1m1w1y24hPattern} sum */ /** * Create a BaseSumPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BaseSumPattern} */ function createBaseSumPattern(client, acc) { return { base: createSeriesPattern1(client, acc), sum: create_1m1w1y24hPattern(client, _m(acc, 'sum')), }; } /** * @typedef {Object} BaseDeltaPattern * @property {SeriesPattern1} base * @property {AbsoluteRatePattern} delta */ /** * Create a BaseDeltaPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BaseDeltaPattern} */ function createBaseDeltaPattern(client, acc) { return { base: createSeriesPattern1(client, acc), delta: createAbsoluteRatePattern(client, _m(acc, 'delta')), }; } /** * @typedef {Object} BlocksDominancePattern * @property {BaseCumulativeSumPattern2} blocksMined * @property {BpsPercentRatioPattern3} dominance */ /** * Create a BlocksDominancePattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BlocksDominancePattern} */ function createBlocksDominancePattern(client, acc) { return { blocksMined: createBaseCumulativeSumPattern2(client, _m(acc, 'blocks_mined')), dominance: createBpsPercentRatioPattern3(client, _m(acc, 'dominance')), }; } /** * @typedef {Object} BpsRatioPattern2 * @property {SeriesPattern1} bps * @property {SeriesPattern1} ratio */ /** * Create a BpsRatioPattern2 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BpsRatioPattern2} */ function createBpsRatioPattern2(client, acc) { return { bps: createSeriesPattern1(client, _m(acc, 'bps')), ratio: createSeriesPattern1(client, acc), }; } /** * @typedef {Object} BpsRatioPattern * @property {SeriesPattern1} bps * @property {SeriesPattern1} ratio */ /** * Create a BpsRatioPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {BpsRatioPattern} */ function createBpsRatioPattern(client, acc) { return { bps: createSeriesPattern1(client, _m(acc, 'bps')), ratio: createSeriesPattern1(client, acc), }; } /** * @typedef {Object} CentsUsdPattern2 * @property {SeriesPattern1} cents * @property {SeriesPattern1} usd */ /** * Create a CentsUsdPattern2 pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {CentsUsdPattern2} */ function createCentsUsdPattern2(client, acc) { return { cents: createSeriesPattern1(client, _m(acc, 'cents')), usd: createSeriesPattern1(client, acc), }; } /** * @typedef {Object} CentsUsdPattern * @property {SeriesPattern1} cents * @property {SeriesPattern1} usd */ /** * Create a CentsUsdPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {CentsUsdPattern} */ function createCentsUsdPattern(client, acc) { return { cents: createSeriesPattern1(client, _m(acc, 'cents')), usd: createSeriesPattern1(client, acc), }; } /** * @typedef {Object} CoindaysTransferPattern * @property {BaseCumulativeSumPattern} coindaysDestroyed * @property {BaseCumulativeInSumPattern} transferVolume */ /** * Create a CoindaysTransferPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {CoindaysTransferPattern} */ function createCoindaysTransferPattern(client, acc) { return { coindaysDestroyed: createBaseCumulativeSumPattern(client, _m(acc, 'coindays_destroyed')), transferVolume: createBaseCumulativeInSumPattern(client, _m(acc, 'transfer_volume')), }; } /** * @typedef {Object} InPattern * @property {CentsUsdPattern2} inLoss * @property {CentsUsdPattern2} inProfit */ /** * Create a InPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {InPattern} */ function createInPattern(client, acc) { return { inLoss: createCentsUsdPattern2(client, _m(acc, 'loss')), inProfit: createCentsUsdPattern2(client, _m(acc, 'profit')), }; } /** * @typedef {Object} PriceRatioPattern * @property {CentsSatsUsdPattern} price * @property {SeriesPattern1} ratio */ /** * Create a PriceRatioPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @param {string} disc - Discriminator suffix * @returns {PriceRatioPattern} */ function createPriceRatioPattern(client, acc, disc) { return { price: createCentsSatsUsdPattern(client, _m(acc, disc)), ratio: createSeriesPattern1(client, _m(_m(acc, 'ratio'), disc)), }; } /** * @typedef {Object} RatioValuePattern * @property {_24hPattern} ratio * @property {BaseCumulativeSumPattern} valueDestroyed */ /** * Create a RatioValuePattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {RatioValuePattern} */ function createRatioValuePattern(client, acc) { return { ratio: create_24hPattern(client, _m(acc, 'sopr_24h')), valueDestroyed: createBaseCumulativeSumPattern(client, _m(acc, 'value_destroyed')), }; } /** * @typedef {Object} SdSmaPattern * @property {SeriesPattern1} sd * @property {SeriesPattern1} sma */ /** * @typedef {Object} ToPattern * @property {BpsPercentRatioPattern} toMcap * @property {BpsPercentRatioPattern} toRcap */ /** * Create a ToPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {ToPattern} */ function createToPattern(client, acc) { return { toMcap: createBpsPercentRatioPattern(client, _m(acc, 'mcap')), toRcap: createBpsPercentRatioPattern(client, _m(acc, 'rcap')), }; } /** * @typedef {Object} _24hPattern * @property {SeriesPattern1} _24h */ /** * Create a _24hPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {_24hPattern} */ function create_24hPattern(client, acc) { return { _24h: createSeriesPattern1(client, acc), }; } /** * @typedef {Object} NuplPattern * @property {BpsRatioPattern} nupl */ /** * Create a NuplPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {NuplPattern} */ function createNuplPattern(client, acc) { return { nupl: createBpsRatioPattern(client, acc), }; } /** * @typedef {Object} PricePattern * @property {BpsCentsPercentilesRatioSatsUsdPattern} price */ /** * Create a PricePattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {PricePattern} */ function createPricePattern(client, acc) { return { price: createBpsCentsPercentilesRatioSatsUsdPattern(client, acc), }; } /** * @typedef {Object} TransferPattern * @property {BaseCumulativeSumPattern3} transferVolume */ /** * Create a TransferPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {TransferPattern} */ function createTransferPattern(client, acc) { return { transferVolume: createBaseCumulativeSumPattern3(client, acc), }; } /** * @typedef {Object} UnspentPattern * @property {BaseDeltaPattern} unspentCount */ /** * Create a UnspentPattern pattern node * @param {BrkClientBase} client * @param {string} acc - Accumulated series name * @returns {UnspentPattern} */ function createUnspentPattern(client, acc) { return { unspentCount: createBaseDeltaPattern(client, acc), }; } // Catalog tree typedefs /** * @typedef {Object} SeriesTree * @property {SeriesTree_Blocks} blocks * @property {SeriesTree_Transactions} transactions * @property {SeriesTree_Inputs} inputs * @property {SeriesTree_Outputs} outputs * @property {SeriesTree_Addrs} addrs * @property {SeriesTree_Scripts} scripts * @property {SeriesTree_Mining} mining * @property {SeriesTree_Positions} positions * @property {SeriesTree_Cointime} cointime * @property {SeriesTree_Constants} constants * @property {SeriesTree_Indexes} indexes * @property {SeriesTree_Indicators} indicators * @property {SeriesTree_Market} market * @property {SeriesTree_Pools} pools * @property {SeriesTree_Prices} prices * @property {SeriesTree_Supply} supply * @property {SeriesTree_Cohorts} cohorts */ /** * @typedef {Object} SeriesTree_Blocks * @property {SeriesPattern18} blockhash * @property {SeriesTree_Blocks_Difficulty} difficulty * @property {SeriesTree_Blocks_Time} time * @property {SeriesTree_Blocks_Size} size * @property {SeriesTree_Blocks_Weight} weight * @property {SeriesTree_Blocks_Count} count * @property {SeriesTree_Blocks_Lookback} lookback * @property {_1m1w1y24hBasePattern} interval * @property {AverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern2} vbytes * @property {SeriesTree_Blocks_Fullness} fullness * @property {SeriesTree_Blocks_Halving} halving */ /** * @typedef {Object} SeriesTree_Blocks_Difficulty * @property {SeriesPattern1} value * @property {SeriesPattern1} hashrate * @property {BpsPercentRatioPattern} adjustment * @property {SeriesPattern1} epoch * @property {SeriesPattern1} blocksToRetarget * @property {SeriesPattern1} daysToRetarget */ /** * @typedef {Object} SeriesTree_Blocks_Time * @property {SeriesPattern1} timestamp * @property {SeriesPattern18} date * @property {SeriesPattern18} timestampMonotonic */ /** * @typedef {Object} SeriesTree_Blocks_Size * @property {SeriesPattern18} base * @property {SeriesPattern1} cumulative * @property {_1m1w1y24hPattern} sum * @property {_1m1w1y24hPattern} average * @property {_1m1w1y24hPattern} min * @property {_1m1w1y24hPattern} max * @property {_1m1w1y24hPattern} pct10 * @property {_1m1w1y24hPattern} pct25 * @property {_1m1w1y24hPattern} median * @property {_1m1w1y24hPattern} pct75 * @property {_1m1w1y24hPattern} pct90 */ /** * @typedef {Object} SeriesTree_Blocks_Weight * @property {SeriesPattern18} base * @property {SeriesPattern1} cumulative * @property {_1m1w1y24hPattern} sum * @property {_1m1w1y24hPattern} average * @property {_1m1w1y24hPattern} min * @property {_1m1w1y24hPattern} max * @property {_1m1w1y24hPattern} pct10 * @property {_1m1w1y24hPattern} pct25 * @property {_1m1w1y24hPattern} median * @property {_1m1w1y24hPattern} pct75 * @property {_1m1w1y24hPattern} pct90 */ /** * @typedef {Object} SeriesTree_Blocks_Count * @property {_1m1w1y24hPattern} target * @property {BaseCumulativeSumPattern2} total */ /** * @typedef {Object} SeriesTree_Blocks_Lookback * @property {SeriesPattern18} _1h * @property {SeriesPattern18} _24h * @property {SeriesPattern18} _3d * @property {SeriesPattern18} _1w * @property {SeriesPattern18} _8d * @property {SeriesPattern18} _9d * @property {SeriesPattern18} _12d * @property {SeriesPattern18} _13d * @property {SeriesPattern18} _2w * @property {SeriesPattern18} _21d * @property {SeriesPattern18} _26d * @property {SeriesPattern18} _1m * @property {SeriesPattern18} _34d * @property {SeriesPattern18} _55d * @property {SeriesPattern18} _2m * @property {SeriesPattern18} _9w * @property {SeriesPattern18} _12w * @property {SeriesPattern18} _89d * @property {SeriesPattern18} _3m * @property {SeriesPattern18} _14w * @property {SeriesPattern18} _111d * @property {SeriesPattern18} _144d * @property {SeriesPattern18} _6m * @property {SeriesPattern18} _26w * @property {SeriesPattern18} _200d * @property {SeriesPattern18} _9m * @property {SeriesPattern18} _350d * @property {SeriesPattern18} _12m * @property {SeriesPattern18} _1y * @property {SeriesPattern18} _14m * @property {SeriesPattern18} _2y * @property {SeriesPattern18} _26m * @property {SeriesPattern18} _3y * @property {SeriesPattern18} _200w * @property {SeriesPattern18} _4y * @property {SeriesPattern18} _5y * @property {SeriesPattern18} _6y * @property {SeriesPattern18} _8y * @property {SeriesPattern18} _9y * @property {SeriesPattern18} _10y * @property {SeriesPattern18} _12y * @property {SeriesPattern18} _14y * @property {SeriesPattern18} _26y */ /** * @typedef {Object} SeriesTree_Blocks_Fullness * @property {SeriesPattern18} bps * @property {SeriesPattern18} ratio * @property {SeriesPattern18} percent */ /** * @typedef {Object} SeriesTree_Blocks_Halving * @property {SeriesPattern1} epoch * @property {SeriesPattern1} blocksToHalving * @property {SeriesPattern1} daysToHalving */ /** * @typedef {Object} SeriesTree_Transactions * @property {SeriesTree_Transactions_Raw} raw * @property {SeriesTree_Transactions_Count} count * @property {SeriesTree_Transactions_Size} size * @property {SeriesTree_Transactions_Fees} fees * @property {SeriesTree_Transactions_Versions} versions * @property {SeriesTree_Transactions_Volume} volume */ /** * @typedef {Object} SeriesTree_Transactions_Raw * @property {SeriesPattern18} firstTxIndex * @property {SeriesPattern19} height * @property {SeriesPattern19} txid * @property {SeriesPattern19} txVersion * @property {SeriesPattern19} rawLocktime * @property {SeriesPattern19} baseSize * @property {SeriesPattern19} totalSize * @property {SeriesPattern19} isExplicitlyRbf * @property {SeriesPattern19} firstTxinIndex * @property {SeriesPattern19} firstTxoutIndex */ /** * @typedef {Object} SeriesTree_Transactions_Count * @property {AverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern2} total * @property {SeriesPattern19} isCoinbase */ /** * @typedef {Object} SeriesTree_Transactions_Size * @property {_6bBlockTxPattern} vsize * @property {SeriesTree_Transactions_Size_Weight} weight */ /** * @typedef {Object} SeriesTree_Transactions_Size_Weight * @property {SeriesPattern19} txIndex * @property {AverageMaxMedianMinPct10Pct25Pct75Pct90Pattern2} block * @property {AverageMaxMedianMinPct10Pct25Pct75Pct90Pattern2} _6b */ /** * @typedef {Object} SeriesTree_Transactions_Fees * @property {SeriesPattern19} inputValue * @property {SeriesPattern19} outputValue * @property {_6bBlockTxPattern} fee * @property {_6bBlockTxPattern} feeRate */ /** * @typedef {Object} SeriesTree_Transactions_Versions * @property {BaseCumulativeSumPattern} v1 * @property {BaseCumulativeSumPattern} v2 * @property {BaseCumulativeSumPattern} v3 */ /** * @typedef {Object} SeriesTree_Transactions_Volume * @property {BaseCumulativeSumPattern3} transferVolume * @property {_1m1w1y24hPattern} txPerSec * @property {_1m1w1y24hPattern} outputsPerSec * @property {_1m1w1y24hPattern} inputsPerSec */ /** * @typedef {Object} SeriesTree_Inputs * @property {SeriesTree_Inputs_Raw} raw * @property {SeriesTree_Inputs_Spent} spent * @property {CumulativeRollingSumPattern} count */ /** * @typedef {Object} SeriesTree_Inputs_Raw * @property {SeriesPattern18} firstTxinIndex * @property {SeriesPattern20} outpoint * @property {SeriesPattern20} txIndex * @property {SeriesPattern20} outputType * @property {SeriesPattern20} typeIndex */ /** * @typedef {Object} SeriesTree_Inputs_Spent * @property {SeriesPattern20} txoutIndex * @property {SeriesPattern20} value */ /** * @typedef {Object} SeriesTree_Outputs * @property {SeriesTree_Outputs_Raw} raw * @property {SeriesTree_Outputs_Spent} spent * @property {SeriesTree_Outputs_Count} count */ /** * @typedef {Object} SeriesTree_Outputs_Raw * @property {SeriesPattern18} firstTxoutIndex * @property {SeriesPattern21} value * @property {SeriesPattern21} outputType * @property {SeriesPattern21} typeIndex * @property {SeriesPattern21} txIndex */ /** * @typedef {Object} SeriesTree_Outputs_Spent * @property {SeriesPattern21} txinIndex */ /** * @typedef {Object} SeriesTree_Outputs_Count * @property {CumulativeRollingSumPattern} total * @property {SeriesPattern1} unspent */ /** * @typedef {Object} SeriesTree_Addrs * @property {SeriesTree_Addrs_Raw} raw * @property {SeriesTree_Addrs_Indexes} indexes * @property {SeriesTree_Addrs_Data} data * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3} funded * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3} empty * @property {SeriesTree_Addrs_Activity} activity * @property {AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3} total * @property {SeriesTree_Addrs_New} new * @property {SeriesTree_Addrs_Delta} delta */ /** * @typedef {Object} SeriesTree_Addrs_Raw * @property {SeriesTree_Addrs_Raw_P2pk65} p2pk65 * @property {SeriesTree_Addrs_Raw_P2pk33} p2pk33 * @property {SeriesTree_Addrs_Raw_P2pkh} p2pkh * @property {SeriesTree_Addrs_Raw_P2sh} p2sh * @property {SeriesTree_Addrs_Raw_P2wpkh} p2wpkh * @property {SeriesTree_Addrs_Raw_P2wsh} p2wsh * @property {SeriesTree_Addrs_Raw_P2tr} p2tr * @property {SeriesTree_Addrs_Raw_P2a} p2a */ /** * @typedef {Object} SeriesTree_Addrs_Raw_P2pk65 * @property {SeriesPattern18} firstIndex * @property {SeriesPattern27} bytes */ /** * @typedef {Object} SeriesTree_Addrs_Raw_P2pk33 * @property {SeriesPattern18} firstIndex * @property {SeriesPattern26} bytes */ /** * @typedef {Object} SeriesTree_Addrs_Raw_P2pkh * @property {SeriesPattern18} firstIndex * @property {SeriesPattern28} bytes */ /** * @typedef {Object} SeriesTree_Addrs_Raw_P2sh * @property {SeriesPattern18} firstIndex * @property {SeriesPattern29} bytes */ /** * @typedef {Object} SeriesTree_Addrs_Raw_P2wpkh * @property {SeriesPattern18} firstIndex * @property {SeriesPattern31} bytes */ /** * @typedef {Object} SeriesTree_Addrs_Raw_P2wsh * @property {SeriesPattern18} firstIndex * @property {SeriesPattern32} bytes */ /** * @typedef {Object} SeriesTree_Addrs_Raw_P2tr * @property {SeriesPattern18} firstIndex * @property {SeriesPattern30} bytes */ /** * @typedef {Object} SeriesTree_Addrs_Raw_P2a * @property {SeriesPattern18} firstIndex * @property {SeriesPattern24} bytes */ /** * @typedef {Object} SeriesTree_Addrs_Indexes * @property {SeriesPattern24} p2a * @property {SeriesPattern26} p2pk33 * @property {SeriesPattern27} p2pk65 * @property {SeriesPattern28} p2pkh * @property {SeriesPattern29} p2sh * @property {SeriesPattern30} p2tr * @property {SeriesPattern31} p2wpkh * @property {SeriesPattern32} p2wsh * @property {SeriesPattern34} funded * @property {SeriesPattern35} empty */ /** * @typedef {Object} SeriesTree_Addrs_Data * @property {SeriesPattern34} funded * @property {SeriesPattern35} empty */ /** * @typedef {Object} SeriesTree_Addrs_Activity * @property {BothReactivatedReceivingSendingPattern} all * @property {BothReactivatedReceivingSendingPattern} p2pk65 * @property {BothReactivatedReceivingSendingPattern} p2pk33 * @property {BothReactivatedReceivingSendingPattern} p2pkh * @property {BothReactivatedReceivingSendingPattern} p2sh * @property {BothReactivatedReceivingSendingPattern} p2wpkh * @property {BothReactivatedReceivingSendingPattern} p2wsh * @property {BothReactivatedReceivingSendingPattern} p2tr * @property {BothReactivatedReceivingSendingPattern} p2a */ /** * @typedef {Object} SeriesTree_Addrs_New * @property {BaseCumulativeSumPattern} all * @property {BaseCumulativeSumPattern} p2pk65 * @property {BaseCumulativeSumPattern} p2pk33 * @property {BaseCumulativeSumPattern} p2pkh * @property {BaseCumulativeSumPattern} p2sh * @property {BaseCumulativeSumPattern} p2wpkh * @property {BaseCumulativeSumPattern} p2wsh * @property {BaseCumulativeSumPattern} p2tr * @property {BaseCumulativeSumPattern} p2a */ /** * @typedef {Object} SeriesTree_Addrs_Delta * @property {AbsoluteRatePattern} all * @property {AbsoluteRatePattern} p2pk65 * @property {AbsoluteRatePattern} p2pk33 * @property {AbsoluteRatePattern} p2pkh * @property {AbsoluteRatePattern} p2sh * @property {AbsoluteRatePattern} p2wpkh * @property {AbsoluteRatePattern} p2wsh * @property {AbsoluteRatePattern} p2tr * @property {AbsoluteRatePattern} p2a */ /** * @typedef {Object} SeriesTree_Scripts * @property {SeriesTree_Scripts_Raw} raw * @property {SeriesTree_Scripts_Count} count * @property {SeriesTree_Scripts_Value} value */ /** * @typedef {Object} SeriesTree_Scripts_Raw * @property {SeriesTree_Scripts_Raw_Empty} empty * @property {SeriesTree_Scripts_Raw_OpReturn} opReturn * @property {SeriesTree_Scripts_Raw_P2ms} p2ms * @property {SeriesTree_Scripts_Raw_Unknown} unknown */ /** * @typedef {Object} SeriesTree_Scripts_Raw_Empty * @property {SeriesPattern18} firstIndex * @property {SeriesPattern22} toTxIndex */ /** * @typedef {Object} SeriesTree_Scripts_Raw_OpReturn * @property {SeriesPattern18} firstIndex * @property {SeriesPattern23} toTxIndex */ /** * @typedef {Object} SeriesTree_Scripts_Raw_P2ms * @property {SeriesPattern18} firstIndex * @property {SeriesPattern25} toTxIndex */ /** * @typedef {Object} SeriesTree_Scripts_Raw_Unknown * @property {SeriesPattern18} firstIndex * @property {SeriesPattern33} toTxIndex */ /** * @typedef {Object} SeriesTree_Scripts_Count * @property {BaseCumulativeSumPattern} p2a * @property {BaseCumulativeSumPattern} p2ms * @property {BaseCumulativeSumPattern} p2pk33 * @property {BaseCumulativeSumPattern} p2pk65 * @property {BaseCumulativeSumPattern} p2pkh * @property {BaseCumulativeSumPattern} p2sh * @property {BaseCumulativeSumPattern} p2tr * @property {BaseCumulativeSumPattern} p2wpkh * @property {BaseCumulativeSumPattern} p2wsh * @property {BaseCumulativeSumPattern} opReturn * @property {BaseCumulativeSumPattern} emptyOutput * @property {BaseCumulativeSumPattern} unknownOutput */ /** * @typedef {Object} SeriesTree_Scripts_Value * @property {BaseCumulativeSumPattern3} opReturn */ /** * @typedef {Object} SeriesTree_Mining * @property {SeriesTree_Mining_Rewards} rewards * @property {SeriesTree_Mining_Hashrate} hashrate */ /** * @typedef {Object} SeriesTree_Mining_Rewards * @property {BaseCumulativeSumPattern3} coinbase * @property {SeriesTree_Mining_Rewards_Subsidy} subsidy * @property {SeriesTree_Mining_Rewards_Fees} fees * @property {SeriesTree_Mining_Rewards_Unclaimed} unclaimed */ /** * @typedef {Object} SeriesTree_Mining_Rewards_Subsidy * @property {BtcCentsSatsUsdPattern} base * @property {BtcCentsSatsUsdPattern} cumulative * @property {_1m1w1y24hBpsPercentRatioPattern} dominance * @property {CentsUsdPattern2} sma1y */ /** * @typedef {Object} SeriesTree_Mining_Rewards_Fees * @property {BtcCentsSatsUsdPattern} base * @property {BtcCentsSatsUsdPattern} cumulative * @property {_1m1w1y24hPattern3} sum * @property {_1m1w1y24hPattern3} average * @property {_1m1w1y24hPattern3} min * @property {_1m1w1y24hPattern3} max * @property {_1m1w1y24hPattern3} pct10 * @property {_1m1w1y24hPattern3} pct25 * @property {_1m1w1y24hPattern3} median * @property {_1m1w1y24hPattern3} pct75 * @property {_1m1w1y24hPattern3} pct90 * @property {_1m1w1y24hBpsPercentRatioPattern} dominance * @property {SeriesTree_Mining_Rewards_Fees_ToSubsidyRatio} toSubsidyRatio */ /** * @typedef {Object} SeriesTree_Mining_Rewards_Fees_ToSubsidyRatio * @property {BpsRatioPattern2} _24h * @property {BpsRatioPattern2} _1w * @property {BpsRatioPattern2} _1m * @property {BpsRatioPattern2} _1y */ /** * @typedef {Object} SeriesTree_Mining_Rewards_Unclaimed * @property {BtcCentsSatsUsdPattern} base * @property {BtcCentsSatsUsdPattern} cumulative */ /** * @typedef {Object} SeriesTree_Mining_Hashrate * @property {SeriesTree_Mining_Hashrate_Rate} rate * @property {PhsReboundThsPattern} price * @property {PhsReboundThsPattern} value */ /** * @typedef {Object} SeriesTree_Mining_Hashrate_Rate * @property {SeriesPattern1} base * @property {SeriesTree_Mining_Hashrate_Rate_Sma} sma * @property {SeriesPattern1} ath * @property {BpsPercentRatioPattern5} drawdown */ /** * @typedef {Object} SeriesTree_Mining_Hashrate_Rate_Sma * @property {SeriesPattern1} _1w * @property {SeriesPattern1} _1m * @property {SeriesPattern1} _2m * @property {SeriesPattern1} _1y */ /** * @typedef {Object} SeriesTree_Positions * @property {SeriesPattern18} block * @property {SeriesPattern19} tx */ /** * @typedef {Object} SeriesTree_Cointime * @property {SeriesTree_Cointime_Activity} activity * @property {SeriesTree_Cointime_Supply} supply * @property {SeriesTree_Cointime_Value} value * @property {SeriesTree_Cointime_Cap} cap * @property {SeriesTree_Cointime_Prices} prices * @property {SeriesTree_Cointime_Adjusted} adjusted * @property {SeriesTree_Cointime_ReserveRisk} reserveRisk */ /** * @typedef {Object} SeriesTree_Cointime_Activity * @property {BaseCumulativeSumPattern} coinblocksCreated * @property {BaseCumulativeSumPattern} coinblocksStored * @property {SeriesPattern1} liveliness * @property {SeriesPattern1} vaultedness * @property {SeriesPattern1} ratio * @property {BaseCumulativeSumPattern} coinblocksDestroyed */ /** * @typedef {Object} SeriesTree_Cointime_Supply * @property {BtcCentsSatsUsdPattern} vaulted * @property {BtcCentsSatsUsdPattern} active */ /** * @typedef {Object} SeriesTree_Cointime_Value * @property {BaseCumulativeSumPattern} destroyed * @property {BaseCumulativeSumPattern} created * @property {BaseCumulativeSumPattern} stored * @property {BaseCumulativeSumPattern} vocdd */ /** * @typedef {Object} SeriesTree_Cointime_Cap * @property {CentsUsdPattern2} thermo * @property {CentsUsdPattern2} investor * @property {CentsUsdPattern2} vaulted * @property {CentsUsdPattern2} active * @property {CentsUsdPattern2} cointime * @property {BpsRatioPattern2} aviv */ /** * @typedef {Object} SeriesTree_Cointime_Prices * @property {BpsCentsPercentilesRatioSatsUsdPattern} vaulted * @property {BpsCentsPercentilesRatioSatsUsdPattern} active * @property {BpsCentsPercentilesRatioSatsUsdPattern} trueMarketMean * @property {BpsCentsPercentilesRatioSatsUsdPattern} cointime */ /** * @typedef {Object} SeriesTree_Cointime_Adjusted * @property {BpsPercentRatioPattern} inflationRate * @property {SeriesPattern1} txVelocityNative * @property {SeriesPattern1} txVelocityFiat */ /** * @typedef {Object} SeriesTree_Cointime_ReserveRisk * @property {SeriesPattern1} value * @property {SeriesPattern18} vocddMedian1y * @property {SeriesPattern18} hodlBank */ /** * @typedef {Object} SeriesTree_Constants * @property {SeriesPattern1} _0 * @property {SeriesPattern1} _1 * @property {SeriesPattern1} _2 * @property {SeriesPattern1} _3 * @property {SeriesPattern1} _4 * @property {SeriesPattern1} _20 * @property {SeriesPattern1} _30 * @property {SeriesPattern1} _382 * @property {SeriesPattern1} _50 * @property {SeriesPattern1} _618 * @property {SeriesPattern1} _70 * @property {SeriesPattern1} _80 * @property {SeriesPattern1} _100 * @property {SeriesPattern1} _600 * @property {SeriesPattern1} minus1 * @property {SeriesPattern1} minus2 * @property {SeriesPattern1} minus3 * @property {SeriesPattern1} minus4 */ /** * @typedef {Object} SeriesTree_Indexes * @property {SeriesTree_Indexes_Addr} addr * @property {SeriesTree_Indexes_Height} height * @property {SeriesTree_Indexes_Epoch} epoch * @property {SeriesTree_Indexes_Halving} halving * @property {SeriesTree_Indexes_Minute10} minute10 * @property {SeriesTree_Indexes_Minute30} minute30 * @property {SeriesTree_Indexes_Hour1} hour1 * @property {SeriesTree_Indexes_Hour4} hour4 * @property {SeriesTree_Indexes_Hour12} hour12 * @property {SeriesTree_Indexes_Day1} day1 * @property {SeriesTree_Indexes_Day3} day3 * @property {SeriesTree_Indexes_Week1} week1 * @property {SeriesTree_Indexes_Month1} month1 * @property {SeriesTree_Indexes_Month3} month3 * @property {SeriesTree_Indexes_Month6} month6 * @property {SeriesTree_Indexes_Year1} year1 * @property {SeriesTree_Indexes_Year10} year10 * @property {SeriesTree_Indexes_TxIndex} txIndex * @property {SeriesTree_Indexes_TxinIndex} txinIndex * @property {SeriesTree_Indexes_TxoutIndex} txoutIndex */ /** * @typedef {Object} SeriesTree_Indexes_Addr * @property {SeriesTree_Indexes_Addr_P2pk33} p2pk33 * @property {SeriesTree_Indexes_Addr_P2pk65} p2pk65 * @property {SeriesTree_Indexes_Addr_P2pkh} p2pkh * @property {SeriesTree_Indexes_Addr_P2sh} p2sh * @property {SeriesTree_Indexes_Addr_P2tr} p2tr * @property {SeriesTree_Indexes_Addr_P2wpkh} p2wpkh * @property {SeriesTree_Indexes_Addr_P2wsh} p2wsh * @property {SeriesTree_Indexes_Addr_P2a} p2a * @property {SeriesTree_Indexes_Addr_P2ms} p2ms * @property {SeriesTree_Indexes_Addr_Empty} empty * @property {SeriesTree_Indexes_Addr_Unknown} unknown * @property {SeriesTree_Indexes_Addr_OpReturn} opReturn */ /** * @typedef {Object} SeriesTree_Indexes_Addr_P2pk33 * @property {SeriesPattern26} identity * @property {SeriesPattern26} addr */ /** * @typedef {Object} SeriesTree_Indexes_Addr_P2pk65 * @property {SeriesPattern27} identity * @property {SeriesPattern27} addr */ /** * @typedef {Object} SeriesTree_Indexes_Addr_P2pkh * @property {SeriesPattern28} identity * @property {SeriesPattern28} addr */ /** * @typedef {Object} SeriesTree_Indexes_Addr_P2sh * @property {SeriesPattern29} identity * @property {SeriesPattern29} addr */ /** * @typedef {Object} SeriesTree_Indexes_Addr_P2tr * @property {SeriesPattern30} identity * @property {SeriesPattern30} addr */ /** * @typedef {Object} SeriesTree_Indexes_Addr_P2wpkh * @property {SeriesPattern31} identity * @property {SeriesPattern31} addr */ /** * @typedef {Object} SeriesTree_Indexes_Addr_P2wsh * @property {SeriesPattern32} identity * @property {SeriesPattern32} addr */ /** * @typedef {Object} SeriesTree_Indexes_Addr_P2a * @property {SeriesPattern24} identity * @property {SeriesPattern24} addr */ /** * @typedef {Object} SeriesTree_Indexes_Addr_P2ms * @property {SeriesPattern25} identity */ /** * @typedef {Object} SeriesTree_Indexes_Addr_Empty * @property {SeriesPattern22} identity */ /** * @typedef {Object} SeriesTree_Indexes_Addr_Unknown * @property {SeriesPattern33} identity */ /** * @typedef {Object} SeriesTree_Indexes_Addr_OpReturn * @property {SeriesPattern23} identity */ /** * @typedef {Object} SeriesTree_Indexes_Height * @property {SeriesPattern18} identity * @property {SeriesPattern18} minute10 * @property {SeriesPattern18} minute30 * @property {SeriesPattern18} hour1 * @property {SeriesPattern18} hour4 * @property {SeriesPattern18} hour12 * @property {SeriesPattern18} day1 * @property {SeriesPattern18} day3 * @property {SeriesPattern18} epoch * @property {SeriesPattern18} halving * @property {SeriesPattern18} week1 * @property {SeriesPattern18} month1 * @property {SeriesPattern18} month3 * @property {SeriesPattern18} month6 * @property {SeriesPattern18} year1 * @property {SeriesPattern18} year10 * @property {SeriesPattern18} txIndexCount */ /** * @typedef {Object} SeriesTree_Indexes_Epoch * @property {SeriesPattern17} identity * @property {SeriesPattern17} firstHeight * @property {SeriesPattern17} heightCount */ /** * @typedef {Object} SeriesTree_Indexes_Halving * @property {SeriesPattern16} identity * @property {SeriesPattern16} firstHeight */ /** * @typedef {Object} SeriesTree_Indexes_Minute10 * @property {SeriesPattern3} identity * @property {SeriesPattern3} firstHeight */ /** * @typedef {Object} SeriesTree_Indexes_Minute30 * @property {SeriesPattern4} identity * @property {SeriesPattern4} firstHeight */ /** * @typedef {Object} SeriesTree_Indexes_Hour1 * @property {SeriesPattern5} identity * @property {SeriesPattern5} firstHeight */ /** * @typedef {Object} SeriesTree_Indexes_Hour4 * @property {SeriesPattern6} identity * @property {SeriesPattern6} firstHeight */ /** * @typedef {Object} SeriesTree_Indexes_Hour12 * @property {SeriesPattern7} identity * @property {SeriesPattern7} firstHeight */ /** * @typedef {Object} SeriesTree_Indexes_Day1 * @property {SeriesPattern8} identity * @property {SeriesPattern8} date * @property {SeriesPattern8} firstHeight * @property {SeriesPattern8} heightCount */ /** * @typedef {Object} SeriesTree_Indexes_Day3 * @property {SeriesPattern9} identity * @property {SeriesPattern9} firstHeight */ /** * @typedef {Object} SeriesTree_Indexes_Week1 * @property {SeriesPattern10} identity * @property {SeriesPattern10} date * @property {SeriesPattern10} firstHeight */ /** * @typedef {Object} SeriesTree_Indexes_Month1 * @property {SeriesPattern11} identity * @property {SeriesPattern11} date * @property {SeriesPattern11} firstHeight */ /** * @typedef {Object} SeriesTree_Indexes_Month3 * @property {SeriesPattern12} identity * @property {SeriesPattern12} date * @property {SeriesPattern12} firstHeight */ /** * @typedef {Object} SeriesTree_Indexes_Month6 * @property {SeriesPattern13} identity * @property {SeriesPattern13} date * @property {SeriesPattern13} firstHeight */ /** * @typedef {Object} SeriesTree_Indexes_Year1 * @property {SeriesPattern14} identity * @property {SeriesPattern14} date * @property {SeriesPattern14} firstHeight */ /** * @typedef {Object} SeriesTree_Indexes_Year10 * @property {SeriesPattern15} identity * @property {SeriesPattern15} date * @property {SeriesPattern15} firstHeight */ /** * @typedef {Object} SeriesTree_Indexes_TxIndex * @property {SeriesPattern19} identity * @property {SeriesPattern19} inputCount * @property {SeriesPattern19} outputCount */ /** * @typedef {Object} SeriesTree_Indexes_TxinIndex * @property {SeriesPattern20} identity */ /** * @typedef {Object} SeriesTree_Indexes_TxoutIndex * @property {SeriesPattern21} identity */ /** * @typedef {Object} SeriesTree_Indicators * @property {BpsRatioPattern2} puellMultiple * @property {BpsRatioPattern2} nvt * @property {BpsPercentRatioPattern3} gini * @property {BpsRatioPattern2} rhodlRatio * @property {BpsRatioPattern2} thermoCapMultiple * @property {SeriesPattern1} coindaysDestroyedSupplyAdjusted * @property {SeriesPattern1} coinyearsDestroyedSupplyAdjusted * @property {SeriesTree_Indicators_Dormancy} dormancy * @property {SeriesPattern1} stockToFlow * @property {SeriesPattern1} sellerExhaustion */ /** * @typedef {Object} SeriesTree_Indicators_Dormancy * @property {SeriesPattern1} supplyAdjusted * @property {SeriesPattern1} flow */ /** * @typedef {Object} SeriesTree_Market * @property {SeriesTree_Market_Ath} ath * @property {SeriesTree_Market_Lookback} lookback * @property {SeriesTree_Market_Returns} returns * @property {_1m1w1y24hPattern} volatility * @property {SeriesTree_Market_Range} range * @property {SeriesTree_Market_MovingAverage} movingAverage * @property {SeriesTree_Market_Dca} dca * @property {SeriesTree_Market_Technical} technical */ /** * @typedef {Object} SeriesTree_Market_Ath * @property {CentsSatsUsdPattern} high * @property {BpsPercentRatioPattern5} drawdown * @property {SeriesPattern1} daysSince * @property {SeriesPattern1} yearsSince * @property {SeriesPattern1} maxDaysBetween * @property {SeriesPattern1} maxYearsBetween */ /** * @typedef {Object} SeriesTree_Market_Lookback * @property {CentsSatsUsdPattern} _24h * @property {CentsSatsUsdPattern} _1w * @property {CentsSatsUsdPattern} _1m * @property {CentsSatsUsdPattern} _3m * @property {CentsSatsUsdPattern} _6m * @property {CentsSatsUsdPattern} _1y * @property {CentsSatsUsdPattern} _2y * @property {CentsSatsUsdPattern} _3y * @property {CentsSatsUsdPattern} _4y * @property {CentsSatsUsdPattern} _5y * @property {CentsSatsUsdPattern} _6y * @property {CentsSatsUsdPattern} _8y * @property {CentsSatsUsdPattern} _10y */ /** * @typedef {Object} SeriesTree_Market_Returns * @property {SeriesTree_Market_Returns_Periods} periods * @property {_10y2y3y4y5y6y8yPattern} cagr * @property {SeriesTree_Market_Returns_Sd24h} sd24h */ /** * @typedef {Object} SeriesTree_Market_Returns_Periods * @property {BpsPercentRatioPattern} _24h * @property {BpsPercentRatioPattern} _1w * @property {BpsPercentRatioPattern} _1m * @property {BpsPercentRatioPattern} _3m * @property {BpsPercentRatioPattern} _6m * @property {BpsPercentRatioPattern} _1y * @property {BpsPercentRatioPattern} _2y * @property {BpsPercentRatioPattern} _3y * @property {BpsPercentRatioPattern} _4y * @property {BpsPercentRatioPattern} _5y * @property {BpsPercentRatioPattern} _6y * @property {BpsPercentRatioPattern} _8y * @property {BpsPercentRatioPattern} _10y */ /** * @typedef {Object} SeriesTree_Market_Returns_Sd24h * @property {SeriesTree_Market_Returns_Sd24h_24h} _24h * @property {SeriesTree_Market_Returns_Sd24h_1w} _1w * @property {SeriesTree_Market_Returns_Sd24h_1m} _1m * @property {SeriesTree_Market_Returns_Sd24h_1y} _1y */ /** * @typedef {Object} SeriesTree_Market_Returns_Sd24h_24h * @property {SeriesPattern1} sma * @property {SeriesPattern1} sd */ /** * @typedef {Object} SeriesTree_Market_Returns_Sd24h_1w * @property {SeriesPattern1} sma * @property {SeriesPattern1} sd */ /** * @typedef {Object} SeriesTree_Market_Returns_Sd24h_1m * @property {SeriesPattern1} sma * @property {SeriesPattern1} sd */ /** * @typedef {Object} SeriesTree_Market_Returns_Sd24h_1y * @property {SeriesPattern1} sma * @property {SeriesPattern1} sd */ /** * @typedef {Object} SeriesTree_Market_Range * @property {_1m1w1y2wPattern} min * @property {_1m1w1y2wPattern} max * @property {SeriesPattern1} trueRange * @property {SeriesPattern1} trueRangeSum2w * @property {BpsPercentRatioPattern3} choppinessIndex2w */ /** * @typedef {Object} SeriesTree_Market_MovingAverage * @property {SeriesTree_Market_MovingAverage_Sma} sma * @property {SeriesTree_Market_MovingAverage_Ema} ema */ /** * @typedef {Object} SeriesTree_Market_MovingAverage_Sma * @property {BpsCentsRatioSatsUsdPattern} _1w * @property {BpsCentsRatioSatsUsdPattern} _8d * @property {BpsCentsRatioSatsUsdPattern} _13d * @property {BpsCentsRatioSatsUsdPattern} _21d * @property {BpsCentsRatioSatsUsdPattern} _1m * @property {BpsCentsRatioSatsUsdPattern} _34d * @property {BpsCentsRatioSatsUsdPattern} _55d * @property {BpsCentsRatioSatsUsdPattern} _89d * @property {BpsCentsRatioSatsUsdPattern} _111d * @property {BpsCentsRatioSatsUsdPattern} _144d * @property {SeriesTree_Market_MovingAverage_Sma_200d} _200d * @property {SeriesTree_Market_MovingAverage_Sma_350d} _350d * @property {BpsCentsRatioSatsUsdPattern} _1y * @property {BpsCentsRatioSatsUsdPattern} _2y * @property {BpsCentsRatioSatsUsdPattern} _200w * @property {BpsCentsRatioSatsUsdPattern} _4y */ /** * @typedef {Object} SeriesTree_Market_MovingAverage_Sma_200d * @property {SeriesPattern1} usd * @property {SeriesPattern1} cents * @property {SeriesPattern1} sats * @property {SeriesPattern1} bps * @property {SeriesPattern1} ratio * @property {CentsSatsUsdPattern} x24 * @property {CentsSatsUsdPattern} x08 */ /** * @typedef {Object} SeriesTree_Market_MovingAverage_Sma_350d * @property {SeriesPattern1} usd * @property {SeriesPattern1} cents * @property {SeriesPattern1} sats * @property {SeriesPattern1} bps * @property {SeriesPattern1} ratio * @property {CentsSatsUsdPattern} x2 */ /** * @typedef {Object} SeriesTree_Market_MovingAverage_Ema * @property {BpsCentsRatioSatsUsdPattern} _1w * @property {BpsCentsRatioSatsUsdPattern} _8d * @property {BpsCentsRatioSatsUsdPattern} _12d * @property {BpsCentsRatioSatsUsdPattern} _13d * @property {BpsCentsRatioSatsUsdPattern} _21d * @property {BpsCentsRatioSatsUsdPattern} _26d * @property {BpsCentsRatioSatsUsdPattern} _1m * @property {BpsCentsRatioSatsUsdPattern} _34d * @property {BpsCentsRatioSatsUsdPattern} _55d * @property {BpsCentsRatioSatsUsdPattern} _89d * @property {BpsCentsRatioSatsUsdPattern} _144d * @property {BpsCentsRatioSatsUsdPattern} _200d * @property {BpsCentsRatioSatsUsdPattern} _1y * @property {BpsCentsRatioSatsUsdPattern} _2y * @property {BpsCentsRatioSatsUsdPattern} _200w * @property {BpsCentsRatioSatsUsdPattern} _4y */ /** * @typedef {Object} SeriesTree_Market_Dca * @property {SeriesPattern18} satsPerDay * @property {SeriesTree_Market_Dca_Period} period * @property {SeriesTree_Market_Dca_Class} class */ /** * @typedef {Object} SeriesTree_Market_Dca_Period * @property {_10y1m1w1y2y3m3y4y5y6m6y8yPattern3} stack * @property {SeriesTree_Market_Dca_Period_CostBasis} costBasis * @property {_10y1m1w1y2y3m3y4y5y6m6y8yPattern2} return * @property {_10y2y3y4y5y6y8yPattern} cagr * @property {_10y1m1w1y2y3m3y4y5y6m6y8yPattern3} lumpSumStack * @property {_10y1m1w1y2y3m3y4y5y6m6y8yPattern2} lumpSumReturn */ /** * @typedef {Object} SeriesTree_Market_Dca_Period_CostBasis * @property {CentsSatsUsdPattern} _1w * @property {CentsSatsUsdPattern} _1m * @property {CentsSatsUsdPattern} _3m * @property {CentsSatsUsdPattern} _6m * @property {CentsSatsUsdPattern} _1y * @property {CentsSatsUsdPattern} _2y * @property {CentsSatsUsdPattern} _3y * @property {CentsSatsUsdPattern} _4y * @property {CentsSatsUsdPattern} _5y * @property {CentsSatsUsdPattern} _6y * @property {CentsSatsUsdPattern} _8y * @property {CentsSatsUsdPattern} _10y */ /** * @typedef {Object} SeriesTree_Market_Dca_Class * @property {SeriesTree_Market_Dca_Class_Stack} stack * @property {SeriesTree_Market_Dca_Class_CostBasis} costBasis * @property {SeriesTree_Market_Dca_Class_Return} return */ /** * @typedef {Object} SeriesTree_Market_Dca_Class_Stack * @property {BtcCentsSatsUsdPattern} from2015 * @property {BtcCentsSatsUsdPattern} from2016 * @property {BtcCentsSatsUsdPattern} from2017 * @property {BtcCentsSatsUsdPattern} from2018 * @property {BtcCentsSatsUsdPattern} from2019 * @property {BtcCentsSatsUsdPattern} from2020 * @property {BtcCentsSatsUsdPattern} from2021 * @property {BtcCentsSatsUsdPattern} from2022 * @property {BtcCentsSatsUsdPattern} from2023 * @property {BtcCentsSatsUsdPattern} from2024 * @property {BtcCentsSatsUsdPattern} from2025 * @property {BtcCentsSatsUsdPattern} from2026 */ /** * @typedef {Object} SeriesTree_Market_Dca_Class_CostBasis * @property {CentsSatsUsdPattern} from2015 * @property {CentsSatsUsdPattern} from2016 * @property {CentsSatsUsdPattern} from2017 * @property {CentsSatsUsdPattern} from2018 * @property {CentsSatsUsdPattern} from2019 * @property {CentsSatsUsdPattern} from2020 * @property {CentsSatsUsdPattern} from2021 * @property {CentsSatsUsdPattern} from2022 * @property {CentsSatsUsdPattern} from2023 * @property {CentsSatsUsdPattern} from2024 * @property {CentsSatsUsdPattern} from2025 * @property {CentsSatsUsdPattern} from2026 */ /** * @typedef {Object} SeriesTree_Market_Dca_Class_Return * @property {BpsPercentRatioPattern} from2015 * @property {BpsPercentRatioPattern} from2016 * @property {BpsPercentRatioPattern} from2017 * @property {BpsPercentRatioPattern} from2018 * @property {BpsPercentRatioPattern} from2019 * @property {BpsPercentRatioPattern} from2020 * @property {BpsPercentRatioPattern} from2021 * @property {BpsPercentRatioPattern} from2022 * @property {BpsPercentRatioPattern} from2023 * @property {BpsPercentRatioPattern} from2024 * @property {BpsPercentRatioPattern} from2025 * @property {BpsPercentRatioPattern} from2026 */ /** * @typedef {Object} SeriesTree_Market_Technical * @property {SeriesTree_Market_Technical_Rsi} rsi * @property {BpsPercentRatioPattern3} stochK * @property {BpsPercentRatioPattern3} stochD * @property {BpsRatioPattern2} piCycle * @property {SeriesTree_Market_Technical_Macd} macd */ /** * @typedef {Object} SeriesTree_Market_Technical_Rsi * @property {AverageGainsLossesRsiStochPattern} _24h * @property {AverageGainsLossesRsiStochPattern} _1w * @property {AverageGainsLossesRsiStochPattern} _1m */ /** * @typedef {Object} SeriesTree_Market_Technical_Macd * @property {SeriesTree_Market_Technical_Macd_24h} _24h * @property {SeriesTree_Market_Technical_Macd_1w} _1w * @property {SeriesTree_Market_Technical_Macd_1m} _1m */ /** * @typedef {Object} SeriesTree_Market_Technical_Macd_24h * @property {SeriesPattern1} emaFast * @property {SeriesPattern1} emaSlow * @property {SeriesPattern1} line * @property {SeriesPattern1} signal * @property {SeriesPattern1} histogram */ /** * @typedef {Object} SeriesTree_Market_Technical_Macd_1w * @property {SeriesPattern1} emaFast * @property {SeriesPattern1} emaSlow * @property {SeriesPattern1} line * @property {SeriesPattern1} signal * @property {SeriesPattern1} histogram */ /** * @typedef {Object} SeriesTree_Market_Technical_Macd_1m * @property {SeriesPattern1} emaFast * @property {SeriesPattern1} emaSlow * @property {SeriesPattern1} line * @property {SeriesPattern1} signal * @property {SeriesPattern1} histogram */ /** * @typedef {Object} SeriesTree_Pools * @property {SeriesPattern18} pool * @property {SeriesTree_Pools_Major} major * @property {SeriesTree_Pools_Minor} minor */ /** * @typedef {Object} SeriesTree_Pools_Major * @property {BlocksDominanceRewardsPattern} unknown * @property {BlocksDominanceRewardsPattern} luxor * @property {BlocksDominanceRewardsPattern} btccom * @property {BlocksDominanceRewardsPattern} btctop * @property {BlocksDominanceRewardsPattern} btcguild * @property {BlocksDominanceRewardsPattern} eligius * @property {BlocksDominanceRewardsPattern} f2pool * @property {BlocksDominanceRewardsPattern} braiinspool * @property {BlocksDominanceRewardsPattern} antpool * @property {BlocksDominanceRewardsPattern} btcc * @property {BlocksDominanceRewardsPattern} bwpool * @property {BlocksDominanceRewardsPattern} bitfury * @property {BlocksDominanceRewardsPattern} viabtc * @property {BlocksDominanceRewardsPattern} poolin * @property {BlocksDominanceRewardsPattern} spiderpool * @property {BlocksDominanceRewardsPattern} binancepool * @property {BlocksDominanceRewardsPattern} foundryusa * @property {BlocksDominanceRewardsPattern} sbicrypto * @property {BlocksDominanceRewardsPattern} marapool * @property {BlocksDominanceRewardsPattern} secpool * @property {BlocksDominanceRewardsPattern} ocean * @property {BlocksDominanceRewardsPattern} whitepool */ /** * @typedef {Object} SeriesTree_Pools_Minor * @property {BlocksDominancePattern} blockfills * @property {BlocksDominancePattern} ultimuspool * @property {BlocksDominancePattern} terrapool * @property {BlocksDominancePattern} onethash * @property {BlocksDominancePattern} bitfarms * @property {BlocksDominancePattern} huobipool * @property {BlocksDominancePattern} wayicn * @property {BlocksDominancePattern} canoepool * @property {BlocksDominancePattern} bitcoincom * @property {BlocksDominancePattern} pool175btc * @property {BlocksDominancePattern} gbminers * @property {BlocksDominancePattern} axbt * @property {BlocksDominancePattern} asicminer * @property {BlocksDominancePattern} bitminter * @property {BlocksDominancePattern} bitcoinrussia * @property {BlocksDominancePattern} btcserv * @property {BlocksDominancePattern} simplecoinus * @property {BlocksDominancePattern} ozcoin * @property {BlocksDominancePattern} eclipsemc * @property {BlocksDominancePattern} maxbtc * @property {BlocksDominancePattern} triplemining * @property {BlocksDominancePattern} coinlab * @property {BlocksDominancePattern} pool50btc * @property {BlocksDominancePattern} ghashio * @property {BlocksDominancePattern} stminingcorp * @property {BlocksDominancePattern} bitparking * @property {BlocksDominancePattern} mmpool * @property {BlocksDominancePattern} polmine * @property {BlocksDominancePattern} kncminer * @property {BlocksDominancePattern} bitalo * @property {BlocksDominancePattern} hhtt * @property {BlocksDominancePattern} megabigpower * @property {BlocksDominancePattern} mtred * @property {BlocksDominancePattern} nmcbit * @property {BlocksDominancePattern} yourbtcnet * @property {BlocksDominancePattern} givemecoins * @property {BlocksDominancePattern} multicoinco * @property {BlocksDominancePattern} bcpoolio * @property {BlocksDominancePattern} cointerra * @property {BlocksDominancePattern} kanopool * @property {BlocksDominancePattern} solock * @property {BlocksDominancePattern} ckpool * @property {BlocksDominancePattern} nicehash * @property {BlocksDominancePattern} bitclub * @property {BlocksDominancePattern} bitcoinaffiliatenetwork * @property {BlocksDominancePattern} exxbw * @property {BlocksDominancePattern} bitsolo * @property {BlocksDominancePattern} twentyoneinc * @property {BlocksDominancePattern} digitalbtc * @property {BlocksDominancePattern} eightbaochi * @property {BlocksDominancePattern} mybtccoinpool * @property {BlocksDominancePattern} tbdice * @property {BlocksDominancePattern} hashpool * @property {BlocksDominancePattern} nexious * @property {BlocksDominancePattern} bravomining * @property {BlocksDominancePattern} hotpool * @property {BlocksDominancePattern} okexpool * @property {BlocksDominancePattern} bcmonster * @property {BlocksDominancePattern} onehash * @property {BlocksDominancePattern} bixin * @property {BlocksDominancePattern} tatmaspool * @property {BlocksDominancePattern} connectbtc * @property {BlocksDominancePattern} batpool * @property {BlocksDominancePattern} waterhole * @property {BlocksDominancePattern} dcexploration * @property {BlocksDominancePattern} dcex * @property {BlocksDominancePattern} btpool * @property {BlocksDominancePattern} fiftyeightcoin * @property {BlocksDominancePattern} bitcoinindia * @property {BlocksDominancePattern} shawnp0wers * @property {BlocksDominancePattern} phashio * @property {BlocksDominancePattern} rigpool * @property {BlocksDominancePattern} haozhuzhu * @property {BlocksDominancePattern} sevenpool * @property {BlocksDominancePattern} miningkings * @property {BlocksDominancePattern} hashbx * @property {BlocksDominancePattern} dpool * @property {BlocksDominancePattern} rawpool * @property {BlocksDominancePattern} haominer * @property {BlocksDominancePattern} helix * @property {BlocksDominancePattern} bitcoinukraine * @property {BlocksDominancePattern} secretsuperstar * @property {BlocksDominancePattern} tigerpoolnet * @property {BlocksDominancePattern} sigmapoolcom * @property {BlocksDominancePattern} okpooltop * @property {BlocksDominancePattern} hummerpool * @property {BlocksDominancePattern} tangpool * @property {BlocksDominancePattern} bytepool * @property {BlocksDominancePattern} novablock * @property {BlocksDominancePattern} miningcity * @property {BlocksDominancePattern} minerium * @property {BlocksDominancePattern} lubiancom * @property {BlocksDominancePattern} okkong * @property {BlocksDominancePattern} aaopool * @property {BlocksDominancePattern} emcdpool * @property {BlocksDominancePattern} arkpool * @property {BlocksDominancePattern} purebtccom * @property {BlocksDominancePattern} kucoinpool * @property {BlocksDominancePattern} entrustcharitypool * @property {BlocksDominancePattern} okminer * @property {BlocksDominancePattern} titan * @property {BlocksDominancePattern} pegapool * @property {BlocksDominancePattern} btcnuggets * @property {BlocksDominancePattern} cloudhashing * @property {BlocksDominancePattern} digitalxmintsy * @property {BlocksDominancePattern} telco214 * @property {BlocksDominancePattern} btcpoolparty * @property {BlocksDominancePattern} multipool * @property {BlocksDominancePattern} transactioncoinmining * @property {BlocksDominancePattern} btcdig * @property {BlocksDominancePattern} trickysbtcpool * @property {BlocksDominancePattern} btcmp * @property {BlocksDominancePattern} eobot * @property {BlocksDominancePattern} unomp * @property {BlocksDominancePattern} patels * @property {BlocksDominancePattern} gogreenlight * @property {BlocksDominancePattern} bitcoinindiapool * @property {BlocksDominancePattern} ekanembtc * @property {BlocksDominancePattern} canoe * @property {BlocksDominancePattern} tiger * @property {BlocksDominancePattern} onem1x * @property {BlocksDominancePattern} zulupool * @property {BlocksDominancePattern} wiz * @property {BlocksDominancePattern} wk057 * @property {BlocksDominancePattern} futurebitapollosolo * @property {BlocksDominancePattern} carbonnegative * @property {BlocksDominancePattern} portlandhodl * @property {BlocksDominancePattern} phoenix * @property {BlocksDominancePattern} neopool * @property {BlocksDominancePattern} maxipool * @property {BlocksDominancePattern} bitfufupool * @property {BlocksDominancePattern} gdpool * @property {BlocksDominancePattern} miningdutch * @property {BlocksDominancePattern} publicpool * @property {BlocksDominancePattern} miningsquared * @property {BlocksDominancePattern} innopolistech * @property {BlocksDominancePattern} btclab * @property {BlocksDominancePattern} parasite * @property {BlocksDominancePattern} redrockpool * @property {BlocksDominancePattern} est3lar */ /** * @typedef {Object} SeriesTree_Prices * @property {SeriesTree_Prices_Split} split * @property {SeriesTree_Prices_Ohlc} ohlc * @property {SeriesTree_Prices_Spot} spot */ /** * @typedef {Object} SeriesTree_Prices_Split * @property {CentsSatsUsdPattern3} open * @property {CentsSatsUsdPattern3} high * @property {CentsSatsUsdPattern3} low * @property {CentsSatsUsdPattern3} close */ /** * @typedef {Object} SeriesTree_Prices_Ohlc * @property {SeriesPattern2} usd * @property {SeriesPattern2} cents * @property {SeriesPattern2} sats */ /** * @typedef {Object} SeriesTree_Prices_Spot * @property {SeriesPattern1} usd * @property {SeriesPattern1} cents * @property {SeriesPattern1} sats */ /** * @typedef {Object} SeriesTree_Supply * @property {SeriesPattern18} state * @property {BtcCentsSatsUsdPattern} circulating * @property {BaseCumulativeSumPattern3} burned * @property {BpsPercentRatioPattern} inflationRate * @property {SeriesTree_Supply_Velocity} velocity * @property {CentsDeltaUsdPattern} marketCap * @property {_1m1w1y24hPattern} marketMinusRealizedCapGrowthRate * @property {BtcCentsSatsUsdPattern} hodledOrLost */ /** * @typedef {Object} SeriesTree_Supply_Velocity * @property {SeriesPattern1} native * @property {SeriesPattern1} fiat */ /** * @typedef {Object} SeriesTree_Cohorts * @property {SeriesTree_Cohorts_Utxo} utxo * @property {SeriesTree_Cohorts_Addr} addr */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo * @property {SeriesTree_Cohorts_Utxo_All} all * @property {SeriesTree_Cohorts_Utxo_Sth} sth * @property {SeriesTree_Cohorts_Utxo_Lth} lth * @property {SeriesTree_Cohorts_Utxo_AgeRange} ageRange * @property {SeriesTree_Cohorts_Utxo_UnderAge} underAge * @property {SeriesTree_Cohorts_Utxo_OverAge} overAge * @property {SeriesTree_Cohorts_Utxo_Epoch} epoch * @property {SeriesTree_Cohorts_Utxo_Class} class * @property {SeriesTree_Cohorts_Utxo_OverAmount} overAmount * @property {SeriesTree_Cohorts_Utxo_AmountRange} amountRange * @property {SeriesTree_Cohorts_Utxo_UnderAmount} underAmount * @property {SeriesTree_Cohorts_Utxo_Type} type * @property {SeriesTree_Cohorts_Utxo_Profitability} profitability * @property {SeriesTree_Cohorts_Utxo_Matured} matured */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All * @property {SeriesTree_Cohorts_Utxo_All_Supply} supply * @property {UnspentPattern} outputs * @property {SeriesTree_Cohorts_Utxo_All_Activity} activity * @property {SeriesTree_Cohorts_Utxo_All_Realized} realized * @property {SeriesTree_Cohorts_Utxo_All_CostBasis} costBasis * @property {SeriesTree_Cohorts_Utxo_All_Unrealized} unrealized */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Supply * @property {BtcCentsSatsUsdPattern} total * @property {BtcCentsSatsUsdPattern} half * @property {AbsoluteRatePattern} delta * @property {BtcCentsSatsToUsdPattern2} inProfit * @property {BtcCentsSatsToUsdPattern2} inLoss */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Activity * @property {BaseCumulativeInSumPattern} transferVolume * @property {BaseCumulativeSumPattern} coindaysDestroyed * @property {SeriesPattern1} coinyearsDestroyed * @property {_1m1w1y24hPattern} dormancy */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized * @property {CentsDeltaToUsdPattern} cap * @property {BaseCumulativeSumToPattern} profit * @property {SeriesTree_Cohorts_Utxo_All_Realized_Loss} loss * @property {SeriesTree_Cohorts_Utxo_All_Realized_Price} price * @property {SeriesPattern1} mvrv * @property {BaseChangeCumulativeDeltaSumToPattern} netPnl * @property {SeriesTree_Cohorts_Utxo_All_Realized_Sopr} sopr * @property {BaseCumulativeSumPattern4} grossPnl * @property {_1m1w1y24hPattern6} sellSideRiskRatio * @property {BaseCumulativeSumToPattern} peakRegret * @property {PricePattern} investor * @property {_1m1w1y24hPattern} profitToLossRatio */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Loss * @property {CentsUsdPattern2} base * @property {CentsUsdPattern2} cumulative * @property {_1m1w1y24hPattern5} sum * @property {BaseSumPattern} negative * @property {BpsPercentRatioPattern4} toRcap */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Price * @property {SeriesPattern1} usd * @property {SeriesPattern1} cents * @property {SeriesPattern1} sats * @property {SeriesPattern1} bps * @property {SeriesPattern1} ratio * @property {Pct1Pct2Pct5Pct95Pct98Pct99Pattern} percentiles * @property {_1m1w1y2y4yAllPattern} sma * @property {SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev} stdDev */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev * @property {SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_All} all * @property {SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_4y} _4y * @property {SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_2y} _2y * @property {SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_1y} _1y */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_All * @property {SeriesPattern1} sd * @property {SeriesPattern1} zscore * @property {CentsSatsUsdPattern} _0sd * @property {PriceRatioPattern} p05sd * @property {PriceRatioPattern} p1sd * @property {PriceRatioPattern} p15sd * @property {PriceRatioPattern} p2sd * @property {PriceRatioPattern} p25sd * @property {PriceRatioPattern} p3sd * @property {PriceRatioPattern} m05sd * @property {PriceRatioPattern} m1sd * @property {PriceRatioPattern} m15sd * @property {PriceRatioPattern} m2sd * @property {PriceRatioPattern} m25sd * @property {PriceRatioPattern} m3sd */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_4y * @property {SeriesPattern1} sd * @property {SeriesPattern1} zscore * @property {CentsSatsUsdPattern} _0sd * @property {PriceRatioPattern} p05sd * @property {PriceRatioPattern} p1sd * @property {PriceRatioPattern} p15sd * @property {PriceRatioPattern} p2sd * @property {PriceRatioPattern} p25sd * @property {PriceRatioPattern} p3sd * @property {PriceRatioPattern} m05sd * @property {PriceRatioPattern} m1sd * @property {PriceRatioPattern} m15sd * @property {PriceRatioPattern} m2sd * @property {PriceRatioPattern} m25sd * @property {PriceRatioPattern} m3sd */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_2y * @property {SeriesPattern1} sd * @property {SeriesPattern1} zscore * @property {CentsSatsUsdPattern} _0sd * @property {PriceRatioPattern} p05sd * @property {PriceRatioPattern} p1sd * @property {PriceRatioPattern} p15sd * @property {PriceRatioPattern} p2sd * @property {PriceRatioPattern} p25sd * @property {PriceRatioPattern} p3sd * @property {PriceRatioPattern} m05sd * @property {PriceRatioPattern} m1sd * @property {PriceRatioPattern} m15sd * @property {PriceRatioPattern} m2sd * @property {PriceRatioPattern} m25sd * @property {PriceRatioPattern} m3sd */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_1y * @property {SeriesPattern1} sd * @property {SeriesPattern1} zscore * @property {CentsSatsUsdPattern} _0sd * @property {PriceRatioPattern} p05sd * @property {PriceRatioPattern} p1sd * @property {PriceRatioPattern} p15sd * @property {PriceRatioPattern} p2sd * @property {PriceRatioPattern} p25sd * @property {PriceRatioPattern} p3sd * @property {PriceRatioPattern} m05sd * @property {PriceRatioPattern} m1sd * @property {PriceRatioPattern} m15sd * @property {PriceRatioPattern} m2sd * @property {PriceRatioPattern} m25sd * @property {PriceRatioPattern} m3sd */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Sopr * @property {BaseCumulativeSumPattern} valueDestroyed * @property {_1m1w1y24hPattern} ratio * @property {SeriesTree_Cohorts_Utxo_All_Realized_Sopr_Adjusted} adjusted */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Realized_Sopr_Adjusted * @property {_1m1w1y24hPattern} ratio * @property {BaseCumulativeSumPattern} transferVolume * @property {BaseCumulativeSumPattern} valueDestroyed */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_CostBasis * @property {CentsSatsUsdPattern} min * @property {CentsSatsUsdPattern} max * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} percentiles * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} investedCapital * @property {BpsPercentRatioPattern3} supplyDensity */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Unrealized * @property {BpsRatioPattern} nupl * @property {SeriesTree_Cohorts_Utxo_All_Unrealized_Profit} profit * @property {SeriesTree_Cohorts_Utxo_All_Unrealized_Loss} loss * @property {SeriesTree_Cohorts_Utxo_All_Unrealized_NetPnl} netPnl * @property {CentsUsdPattern2} grossPnl * @property {InPattern} investedCapital * @property {SeriesTree_Cohorts_Utxo_All_Unrealized_Sentiment} sentiment */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Unrealized_Profit * @property {SeriesPattern1} usd * @property {SeriesPattern1} cents * @property {BpsPercentRatioPattern3} toMcap * @property {BpsPercentRatioPattern3} toOwnGrossPnl */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Unrealized_Loss * @property {SeriesPattern1} usd * @property {SeriesPattern1} cents * @property {SeriesPattern1} negative * @property {BpsPercentRatioPattern3} toMcap * @property {BpsPercentRatioPattern3} toOwnGrossPnl */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Unrealized_NetPnl * @property {SeriesPattern1} usd * @property {SeriesPattern1} cents * @property {BpsPercentRatioPattern} toOwnGrossPnl */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_All_Unrealized_Sentiment * @property {CentsUsdPattern2} painIndex * @property {CentsUsdPattern2} greedIndex * @property {CentsUsdPattern} net */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth * @property {DeltaHalfInToTotalPattern2} supply * @property {UnspentPattern} outputs * @property {SeriesTree_Cohorts_Utxo_Sth_Activity} activity * @property {SeriesTree_Cohorts_Utxo_Sth_Realized} realized * @property {SeriesTree_Cohorts_Utxo_Sth_CostBasis} costBasis * @property {SeriesTree_Cohorts_Utxo_Sth_Unrealized} unrealized */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Activity * @property {BaseCumulativeInSumPattern} transferVolume * @property {BaseCumulativeSumPattern} coindaysDestroyed * @property {SeriesPattern1} coinyearsDestroyed * @property {_1m1w1y24hPattern} dormancy */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized * @property {CentsDeltaToUsdPattern} cap * @property {BaseCumulativeSumToPattern} profit * @property {SeriesTree_Cohorts_Utxo_Sth_Realized_Loss} loss * @property {SeriesTree_Cohorts_Utxo_Sth_Realized_Price} price * @property {SeriesPattern1} mvrv * @property {BaseChangeCumulativeDeltaSumToPattern} netPnl * @property {SeriesTree_Cohorts_Utxo_Sth_Realized_Sopr} sopr * @property {BaseCumulativeSumPattern4} grossPnl * @property {_1m1w1y24hPattern6} sellSideRiskRatio * @property {BaseCumulativeSumToPattern} peakRegret * @property {PricePattern} investor * @property {_1m1w1y24hPattern} profitToLossRatio */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized_Loss * @property {CentsUsdPattern2} base * @property {CentsUsdPattern2} cumulative * @property {_1m1w1y24hPattern5} sum * @property {BaseSumPattern} negative * @property {BpsPercentRatioPattern4} toRcap */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized_Price * @property {SeriesPattern1} usd * @property {SeriesPattern1} cents * @property {SeriesPattern1} sats * @property {SeriesPattern1} bps * @property {SeriesPattern1} ratio * @property {Pct1Pct2Pct5Pct95Pct98Pct99Pattern} percentiles * @property {_1m1w1y2y4yAllPattern} sma * @property {SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev} stdDev */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev * @property {SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_All} all * @property {SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_4y} _4y * @property {SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_2y} _2y * @property {SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_1y} _1y */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_All * @property {SeriesPattern1} sd * @property {SeriesPattern1} zscore * @property {CentsSatsUsdPattern} _0sd * @property {PriceRatioPattern} p05sd * @property {PriceRatioPattern} p1sd * @property {PriceRatioPattern} p15sd * @property {PriceRatioPattern} p2sd * @property {PriceRatioPattern} p25sd * @property {PriceRatioPattern} p3sd * @property {PriceRatioPattern} m05sd * @property {PriceRatioPattern} m1sd * @property {PriceRatioPattern} m15sd * @property {PriceRatioPattern} m2sd * @property {PriceRatioPattern} m25sd * @property {PriceRatioPattern} m3sd */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_4y * @property {SeriesPattern1} sd * @property {SeriesPattern1} zscore * @property {CentsSatsUsdPattern} _0sd * @property {PriceRatioPattern} p05sd * @property {PriceRatioPattern} p1sd * @property {PriceRatioPattern} p15sd * @property {PriceRatioPattern} p2sd * @property {PriceRatioPattern} p25sd * @property {PriceRatioPattern} p3sd * @property {PriceRatioPattern} m05sd * @property {PriceRatioPattern} m1sd * @property {PriceRatioPattern} m15sd * @property {PriceRatioPattern} m2sd * @property {PriceRatioPattern} m25sd * @property {PriceRatioPattern} m3sd */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_2y * @property {SeriesPattern1} sd * @property {SeriesPattern1} zscore * @property {CentsSatsUsdPattern} _0sd * @property {PriceRatioPattern} p05sd * @property {PriceRatioPattern} p1sd * @property {PriceRatioPattern} p15sd * @property {PriceRatioPattern} p2sd * @property {PriceRatioPattern} p25sd * @property {PriceRatioPattern} p3sd * @property {PriceRatioPattern} m05sd * @property {PriceRatioPattern} m1sd * @property {PriceRatioPattern} m15sd * @property {PriceRatioPattern} m2sd * @property {PriceRatioPattern} m25sd * @property {PriceRatioPattern} m3sd */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_1y * @property {SeriesPattern1} sd * @property {SeriesPattern1} zscore * @property {CentsSatsUsdPattern} _0sd * @property {PriceRatioPattern} p05sd * @property {PriceRatioPattern} p1sd * @property {PriceRatioPattern} p15sd * @property {PriceRatioPattern} p2sd * @property {PriceRatioPattern} p25sd * @property {PriceRatioPattern} p3sd * @property {PriceRatioPattern} m05sd * @property {PriceRatioPattern} m1sd * @property {PriceRatioPattern} m15sd * @property {PriceRatioPattern} m2sd * @property {PriceRatioPattern} m25sd * @property {PriceRatioPattern} m3sd */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized_Sopr * @property {BaseCumulativeSumPattern} valueDestroyed * @property {_1m1w1y24hPattern} ratio * @property {SeriesTree_Cohorts_Utxo_Sth_Realized_Sopr_Adjusted} adjusted */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Realized_Sopr_Adjusted * @property {_1m1w1y24hPattern} ratio * @property {BaseCumulativeSumPattern} transferVolume * @property {BaseCumulativeSumPattern} valueDestroyed */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_CostBasis * @property {CentsSatsUsdPattern} min * @property {CentsSatsUsdPattern} max * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} percentiles * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} investedCapital * @property {BpsPercentRatioPattern3} supplyDensity */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Unrealized * @property {BpsRatioPattern} nupl * @property {CentsToUsdPattern4} profit * @property {CentsNegativeToUsdPattern2} loss * @property {CentsToUsdPattern3} netPnl * @property {CentsUsdPattern2} grossPnl * @property {InPattern} investedCapital * @property {SeriesTree_Cohorts_Utxo_Sth_Unrealized_Sentiment} sentiment */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Sth_Unrealized_Sentiment * @property {CentsUsdPattern2} painIndex * @property {CentsUsdPattern2} greedIndex * @property {CentsUsdPattern} net */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth * @property {DeltaHalfInToTotalPattern2} supply * @property {UnspentPattern} outputs * @property {SeriesTree_Cohorts_Utxo_Lth_Activity} activity * @property {SeriesTree_Cohorts_Utxo_Lth_Realized} realized * @property {SeriesTree_Cohorts_Utxo_Lth_CostBasis} costBasis * @property {SeriesTree_Cohorts_Utxo_Lth_Unrealized} unrealized */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Activity * @property {BaseCumulativeInSumPattern} transferVolume * @property {BaseCumulativeSumPattern} coindaysDestroyed * @property {SeriesPattern1} coinyearsDestroyed * @property {_1m1w1y24hPattern} dormancy */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized * @property {CentsDeltaToUsdPattern} cap * @property {BaseCumulativeSumToPattern} profit * @property {SeriesTree_Cohorts_Utxo_Lth_Realized_Loss} loss * @property {SeriesTree_Cohorts_Utxo_Lth_Realized_Price} price * @property {SeriesPattern1} mvrv * @property {BaseChangeCumulativeDeltaSumToPattern} netPnl * @property {SeriesTree_Cohorts_Utxo_Lth_Realized_Sopr} sopr * @property {BaseCumulativeSumPattern4} grossPnl * @property {_1m1w1y24hPattern6} sellSideRiskRatio * @property {BaseCumulativeSumToPattern} peakRegret * @property {PricePattern} investor * @property {_1m1w1y24hPattern} profitToLossRatio */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized_Loss * @property {CentsUsdPattern2} base * @property {CentsUsdPattern2} cumulative * @property {_1m1w1y24hPattern5} sum * @property {BaseSumPattern} negative * @property {BpsPercentRatioPattern4} toRcap */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized_Price * @property {SeriesPattern1} usd * @property {SeriesPattern1} cents * @property {SeriesPattern1} sats * @property {SeriesPattern1} bps * @property {SeriesPattern1} ratio * @property {Pct1Pct2Pct5Pct95Pct98Pct99Pattern} percentiles * @property {_1m1w1y2y4yAllPattern} sma * @property {SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev} stdDev */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev * @property {SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_All} all * @property {SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_4y} _4y * @property {SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_2y} _2y * @property {SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_1y} _1y */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_All * @property {SeriesPattern1} sd * @property {SeriesPattern1} zscore * @property {CentsSatsUsdPattern} _0sd * @property {PriceRatioPattern} p05sd * @property {PriceRatioPattern} p1sd * @property {PriceRatioPattern} p15sd * @property {PriceRatioPattern} p2sd * @property {PriceRatioPattern} p25sd * @property {PriceRatioPattern} p3sd * @property {PriceRatioPattern} m05sd * @property {PriceRatioPattern} m1sd * @property {PriceRatioPattern} m15sd * @property {PriceRatioPattern} m2sd * @property {PriceRatioPattern} m25sd * @property {PriceRatioPattern} m3sd */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_4y * @property {SeriesPattern1} sd * @property {SeriesPattern1} zscore * @property {CentsSatsUsdPattern} _0sd * @property {PriceRatioPattern} p05sd * @property {PriceRatioPattern} p1sd * @property {PriceRatioPattern} p15sd * @property {PriceRatioPattern} p2sd * @property {PriceRatioPattern} p25sd * @property {PriceRatioPattern} p3sd * @property {PriceRatioPattern} m05sd * @property {PriceRatioPattern} m1sd * @property {PriceRatioPattern} m15sd * @property {PriceRatioPattern} m2sd * @property {PriceRatioPattern} m25sd * @property {PriceRatioPattern} m3sd */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_2y * @property {SeriesPattern1} sd * @property {SeriesPattern1} zscore * @property {CentsSatsUsdPattern} _0sd * @property {PriceRatioPattern} p05sd * @property {PriceRatioPattern} p1sd * @property {PriceRatioPattern} p15sd * @property {PriceRatioPattern} p2sd * @property {PriceRatioPattern} p25sd * @property {PriceRatioPattern} p3sd * @property {PriceRatioPattern} m05sd * @property {PriceRatioPattern} m1sd * @property {PriceRatioPattern} m15sd * @property {PriceRatioPattern} m2sd * @property {PriceRatioPattern} m25sd * @property {PriceRatioPattern} m3sd */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_1y * @property {SeriesPattern1} sd * @property {SeriesPattern1} zscore * @property {CentsSatsUsdPattern} _0sd * @property {PriceRatioPattern} p05sd * @property {PriceRatioPattern} p1sd * @property {PriceRatioPattern} p15sd * @property {PriceRatioPattern} p2sd * @property {PriceRatioPattern} p25sd * @property {PriceRatioPattern} p3sd * @property {PriceRatioPattern} m05sd * @property {PriceRatioPattern} m1sd * @property {PriceRatioPattern} m15sd * @property {PriceRatioPattern} m2sd * @property {PriceRatioPattern} m25sd * @property {PriceRatioPattern} m3sd */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Realized_Sopr * @property {BaseCumulativeSumPattern} valueDestroyed * @property {_1m1w1y24hPattern} ratio */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_CostBasis * @property {CentsSatsUsdPattern} min * @property {CentsSatsUsdPattern} max * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} percentiles * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} investedCapital * @property {BpsPercentRatioPattern3} supplyDensity */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Unrealized * @property {BpsRatioPattern} nupl * @property {CentsToUsdPattern4} profit * @property {CentsNegativeToUsdPattern2} loss * @property {CentsToUsdPattern3} netPnl * @property {CentsUsdPattern2} grossPnl * @property {InPattern} investedCapital * @property {SeriesTree_Cohorts_Utxo_Lth_Unrealized_Sentiment} sentiment */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Lth_Unrealized_Sentiment * @property {CentsUsdPattern2} painIndex * @property {CentsUsdPattern2} greedIndex * @property {CentsUsdPattern} net */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_AgeRange * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} under1h * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1hTo1d * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1dTo1w * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1wTo1m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1mTo2m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2mTo3m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _3mTo4m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _4mTo5m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _5mTo6m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _6mTo1y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1yTo2y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2yTo3y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _3yTo4y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _4yTo5y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _5yTo6y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _6yTo7y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _7yTo8y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _8yTo10y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _10yTo12y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _12yTo15y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} over15y */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_UnderAge * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1w * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _3m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _4m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _5m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _6m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _3y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _4y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _5y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _6y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _7y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _8y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _10y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _12y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _15y */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_OverAge * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1d * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1w * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _3m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _4m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _5m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _6m * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _3y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _4y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _5y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _6y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _7y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _8y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _10y * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _12y */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Epoch * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _0 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _1 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _3 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _4 */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Class * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2009 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2010 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2011 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2012 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2013 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2014 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2015 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2016 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2017 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2018 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2019 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2020 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2021 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2022 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2023 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2024 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2025 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern} _2026 */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_OverAmount * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1sat * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10sats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100sats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1kSats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10kSats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100kSats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1mSats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10mSats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1btc * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10btc * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100btc * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1kBtc * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10kBtc */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_AmountRange * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _0sats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1satTo10sats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10satsTo100sats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100satsTo1kSats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1kSatsTo10kSats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10kSatsTo100kSats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100kSatsTo1mSats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1mSatsTo10mSats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10mSatsTo1btc * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1btcTo10btc * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10btcTo100btc * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100btcTo1kBtc * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1kBtcTo10kBtc * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10kBtcTo100kBtc * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} over100kBtc */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_UnderAmount * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10sats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100sats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1kSats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10kSats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100kSats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1mSats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10mSats * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1btc * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10btc * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100btc * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _1kBtc * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _10kBtc * @property {ActivityOutputsRealizedSupplyUnrealizedPattern2} _100kBtc */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Type * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2pk65 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2pk33 * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2pkh * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2ms * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2sh * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2wpkh * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2wsh * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2tr * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} p2a * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} unknown * @property {ActivityOutputsRealizedSupplyUnrealizedPattern3} empty */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Profitability * @property {SeriesTree_Cohorts_Utxo_Profitability_Range} range * @property {SeriesTree_Cohorts_Utxo_Profitability_Profit} profit * @property {SeriesTree_Cohorts_Utxo_Profitability_Loss} loss */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Profitability_Range * @property {NuplRealizedSupplyPattern} over1000pctInProfit * @property {NuplRealizedSupplyPattern} _500pctTo1000pctInProfit * @property {NuplRealizedSupplyPattern} _300pctTo500pctInProfit * @property {NuplRealizedSupplyPattern} _200pctTo300pctInProfit * @property {NuplRealizedSupplyPattern} _100pctTo200pctInProfit * @property {NuplRealizedSupplyPattern} _90pctTo100pctInProfit * @property {NuplRealizedSupplyPattern} _80pctTo90pctInProfit * @property {NuplRealizedSupplyPattern} _70pctTo80pctInProfit * @property {NuplRealizedSupplyPattern} _60pctTo70pctInProfit * @property {NuplRealizedSupplyPattern} _50pctTo60pctInProfit * @property {NuplRealizedSupplyPattern} _40pctTo50pctInProfit * @property {NuplRealizedSupplyPattern} _30pctTo40pctInProfit * @property {NuplRealizedSupplyPattern} _20pctTo30pctInProfit * @property {NuplRealizedSupplyPattern} _10pctTo20pctInProfit * @property {NuplRealizedSupplyPattern} _0pctTo10pctInProfit * @property {NuplRealizedSupplyPattern} _0pctTo10pctInLoss * @property {NuplRealizedSupplyPattern} _10pctTo20pctInLoss * @property {NuplRealizedSupplyPattern} _20pctTo30pctInLoss * @property {NuplRealizedSupplyPattern} _30pctTo40pctInLoss * @property {NuplRealizedSupplyPattern} _40pctTo50pctInLoss * @property {NuplRealizedSupplyPattern} _50pctTo60pctInLoss * @property {NuplRealizedSupplyPattern} _60pctTo70pctInLoss * @property {NuplRealizedSupplyPattern} _70pctTo80pctInLoss * @property {NuplRealizedSupplyPattern} _80pctTo90pctInLoss * @property {NuplRealizedSupplyPattern} _90pctTo100pctInLoss */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Profitability_Profit * @property {NuplRealizedSupplyPattern} all * @property {NuplRealizedSupplyPattern} _10pct * @property {NuplRealizedSupplyPattern} _20pct * @property {NuplRealizedSupplyPattern} _30pct * @property {NuplRealizedSupplyPattern} _40pct * @property {NuplRealizedSupplyPattern} _50pct * @property {NuplRealizedSupplyPattern} _60pct * @property {NuplRealizedSupplyPattern} _70pct * @property {NuplRealizedSupplyPattern} _80pct * @property {NuplRealizedSupplyPattern} _90pct * @property {NuplRealizedSupplyPattern} _100pct * @property {NuplRealizedSupplyPattern} _200pct * @property {NuplRealizedSupplyPattern} _300pct * @property {NuplRealizedSupplyPattern} _500pct */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Profitability_Loss * @property {NuplRealizedSupplyPattern} all * @property {NuplRealizedSupplyPattern} _10pct * @property {NuplRealizedSupplyPattern} _20pct * @property {NuplRealizedSupplyPattern} _30pct * @property {NuplRealizedSupplyPattern} _40pct * @property {NuplRealizedSupplyPattern} _50pct * @property {NuplRealizedSupplyPattern} _60pct * @property {NuplRealizedSupplyPattern} _70pct * @property {NuplRealizedSupplyPattern} _80pct */ /** * @typedef {Object} SeriesTree_Cohorts_Utxo_Matured * @property {BaseCumulativeSumPattern3} under1h * @property {BaseCumulativeSumPattern3} _1hTo1d * @property {BaseCumulativeSumPattern3} _1dTo1w * @property {BaseCumulativeSumPattern3} _1wTo1m * @property {BaseCumulativeSumPattern3} _1mTo2m * @property {BaseCumulativeSumPattern3} _2mTo3m * @property {BaseCumulativeSumPattern3} _3mTo4m * @property {BaseCumulativeSumPattern3} _4mTo5m * @property {BaseCumulativeSumPattern3} _5mTo6m * @property {BaseCumulativeSumPattern3} _6mTo1y * @property {BaseCumulativeSumPattern3} _1yTo2y * @property {BaseCumulativeSumPattern3} _2yTo3y * @property {BaseCumulativeSumPattern3} _3yTo4y * @property {BaseCumulativeSumPattern3} _4yTo5y * @property {BaseCumulativeSumPattern3} _5yTo6y * @property {BaseCumulativeSumPattern3} _6yTo7y * @property {BaseCumulativeSumPattern3} _7yTo8y * @property {BaseCumulativeSumPattern3} _8yTo10y * @property {BaseCumulativeSumPattern3} _10yTo12y * @property {BaseCumulativeSumPattern3} _12yTo15y * @property {BaseCumulativeSumPattern3} over15y */ /** * @typedef {Object} SeriesTree_Cohorts_Addr * @property {SeriesTree_Cohorts_Addr_OverAmount} overAmount * @property {SeriesTree_Cohorts_Addr_AmountRange} amountRange * @property {SeriesTree_Cohorts_Addr_UnderAmount} underAmount */ /** * @typedef {Object} SeriesTree_Cohorts_Addr_OverAmount * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1sat * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10sats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100sats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1kSats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10kSats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100kSats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1mSats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10mSats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1btc * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10btc * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100btc * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1kBtc * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10kBtc */ /** * @typedef {Object} SeriesTree_Cohorts_Addr_AmountRange * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _0sats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1satTo10sats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10satsTo100sats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100satsTo1kSats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1kSatsTo10kSats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10kSatsTo100kSats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100kSatsTo1mSats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1mSatsTo10mSats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10mSatsTo1btc * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1btcTo10btc * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10btcTo100btc * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100btcTo1kBtc * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1kBtcTo10kBtc * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10kBtcTo100kBtc * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} over100kBtc */ /** * @typedef {Object} SeriesTree_Cohorts_Addr_UnderAmount * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10sats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100sats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1kSats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10kSats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100kSats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1mSats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10mSats * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1btc * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10btc * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100btc * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _1kBtc * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _10kBtc * @property {ActivityAddrOutputsRealizedSupplyUnrealizedPattern} _100kBtc */ /** * Main BRK client with series tree and API methods * @extends BrkClientBase */ class BrkClient extends BrkClientBase { VERSION = "v0.1.9"; INDEXES = /** @type {const} */ ([ "minute10", "minute30", "hour1", "hour4", "hour12", "day1", "day3", "week1", "month1", "month3", "month6", "year1", "year10", "halving", "epoch", "height", "tx_index", "txin_index", "txout_index", "empty_output_index", "op_return_index", "p2a_addr_index", "p2ms_output_index", "p2pk33_addr_index", "p2pk65_addr_index", "p2pkh_addr_index", "p2sh_addr_index", "p2tr_addr_index", "p2wpkh_addr_index", "p2wsh_addr_index", "unknown_output_index", "funded_addr_index", "empty_addr_index" ]); POOL_ID_TO_POOL_NAME = /** @type {const} */ ({ "unknown": "Unknown", "blockfills": "BlockFills", "ultimuspool": "ULTIMUSPOOL", "terrapool": "Terra Pool", "luxor": "Luxor", "onethash": "1THash", "btccom": "BTC.com", "bitfarms": "Bitfarms", "huobipool": "Huobi.pool", "wayicn": "WAYI.CN", "canoepool": "CanoePool", "btctop": "BTC.TOP", "bitcoincom": "Bitcoin.com", "pool175btc": "175btc", "gbminers": "GBMiners", "axbt": "A-XBT", "asicminer": "ASICMiner", "bitminter": "BitMinter", "bitcoinrussia": "BitcoinRussia", "btcserv": "BTCServ", "simplecoinus": "simplecoin.us", "btcguild": "BTC Guild", "eligius": "Eligius", "ozcoin": "OzCoin", "eclipsemc": "EclipseMC", "maxbtc": "MaxBTC", "triplemining": "TripleMining", "coinlab": "CoinLab", "pool50btc": "50BTC", "ghashio": "GHash.IO", "stminingcorp": "ST Mining Corp", "bitparking": "Bitparking", "mmpool": "mmpool", "polmine": "Polmine", "kncminer": "KnCMiner", "bitalo": "Bitalo", "f2pool": "F2Pool", "hhtt": "HHTT", "megabigpower": "MegaBigPower", "mtred": "Mt Red", "nmcbit": "NMCbit", "yourbtcnet": "Yourbtc.net", "givemecoins": "Give Me Coins", "braiinspool": "Braiins Pool", "antpool": "AntPool", "multicoinco": "MultiCoin.co", "bcpoolio": "bcpool.io", "cointerra": "Cointerra", "kanopool": "KanoPool", "solock": "Solo CK", "ckpool": "CKPool", "nicehash": "NiceHash", "bitclub": "BitClub", "bitcoinaffiliatenetwork": "Bitcoin Affiliate Network", "btcc": "BTCC", "bwpool": "BWPool", "exxbw": "EXX&BW", "bitsolo": "Bitsolo", "bitfury": "BitFury", "twentyoneinc": "21 Inc.", "digitalbtc": "digitalBTC", "eightbaochi": "8baochi", "mybtccoinpool": "myBTCcoin Pool", "tbdice": "TBDice", "hashpool": "HASHPOOL", "nexious": "Nexious", "bravomining": "Bravo Mining", "hotpool": "HotPool", "okexpool": "OKExPool", "bcmonster": "BCMonster", "onehash": "1Hash", "bixin": "Bixin", "tatmaspool": "TATMAS Pool", "viabtc": "ViaBTC", "connectbtc": "ConnectBTC", "batpool": "BATPOOL", "waterhole": "Waterhole", "dcexploration": "DCExploration", "dcex": "DCEX", "btpool": "BTPOOL", "fiftyeightcoin": "58COIN", "bitcoinindia": "Bitcoin India", "shawnp0wers": "shawnp0wers", "phashio": "PHash.IO", "rigpool": "RigPool", "haozhuzhu": "HAOZHUZHU", "sevenpool": "7pool", "miningkings": "MiningKings", "hashbx": "HashBX", "dpool": "DPOOL", "rawpool": "Rawpool", "haominer": "haominer", "helix": "Helix", "bitcoinukraine": "Bitcoin-Ukraine", "poolin": "Poolin", "secretsuperstar": "SecretSuperstar", "tigerpoolnet": "tigerpool.net", "sigmapoolcom": "Sigmapool.com", "okpooltop": "okpool.top", "hummerpool": "Hummerpool", "tangpool": "Tangpool", "bytepool": "BytePool", "spiderpool": "SpiderPool", "novablock": "NovaBlock", "miningcity": "MiningCity", "binancepool": "Binance Pool", "minerium": "Minerium", "lubiancom": "Lubian.com", "okkong": "OKKONG", "aaopool": "AAO Pool", "emcdpool": "EMCDPool", "foundryusa": "Foundry USA", "sbicrypto": "SBI Crypto", "arkpool": "ArkPool", "purebtccom": "PureBTC.COM", "marapool": "MARA Pool", "kucoinpool": "KuCoinPool", "entrustcharitypool": "Entrust Charity Pool", "okminer": "OKMINER", "titan": "Titan", "pegapool": "PEGA Pool", "btcnuggets": "BTC Nuggets", "cloudhashing": "CloudHashing", "digitalxmintsy": "digitalX Mintsy", "telco214": "Telco 214", "btcpoolparty": "BTC Pool Party", "multipool": "Multipool", "transactioncoinmining": "transactioncoinmining", "btcdig": "BTCDig", "trickysbtcpool": "Tricky's BTC Pool", "btcmp": "BTCMP", "eobot": "Eobot", "unomp": "UNOMP", "patels": "Patels", "gogreenlight": "GoGreenLight", "bitcoinindiapool": "BitcoinIndia", "ekanembtc": "EkanemBTC", "canoe": "CANOE", "tiger": "tiger", "onem1x": "1M1X", "zulupool": "Zulupool", "secpool": "SECPOOL", "ocean": "OCEAN", "whitepool": "WhitePool", "wiz": "wiz", "wk057": "wk057", "futurebitapollosolo": "FutureBit Apollo Solo", "carbonnegative": "Carbon Negative", "portlandhodl": "Portland.HODL", "phoenix": "Phoenix", "neopool": "Neopool", "maxipool": "MaxiPool", "bitfufupool": "BitFuFuPool", "gdpool": "GDPool", "miningdutch": "Mining-Dutch", "publicpool": "Public Pool", "miningsquared": "Mining Squared", "innopolistech": "Innopolis Tech", "btclab": "BTCLab", "parasite": "Parasite", "redrockpool": "RedRock Pool", "est3lar": "Est3lar" }); TERM_NAMES = /** @type {const} */ ({ "short": { "id": "sth", "short": "STH", "long": "Short Term Holders" }, "long": { "id": "lth", "short": "LTH", "long": "Long Term Holders" } }); EPOCH_NAMES = /** @type {const} */ ({ "_0": { "id": "epoch_0", "short": "0", "long": "Epoch 0" }, "_1": { "id": "epoch_1", "short": "1", "long": "Epoch 1" }, "_2": { "id": "epoch_2", "short": "2", "long": "Epoch 2" }, "_3": { "id": "epoch_3", "short": "3", "long": "Epoch 3" }, "_4": { "id": "epoch_4", "short": "4", "long": "Epoch 4" } }); CLASS_NAMES = /** @type {const} */ ({ "_2009": { "id": "class_2009", "short": "2009", "long": "Class 2009" }, "_2010": { "id": "class_2010", "short": "2010", "long": "Class 2010" }, "_2011": { "id": "class_2011", "short": "2011", "long": "Class 2011" }, "_2012": { "id": "class_2012", "short": "2012", "long": "Class 2012" }, "_2013": { "id": "class_2013", "short": "2013", "long": "Class 2013" }, "_2014": { "id": "class_2014", "short": "2014", "long": "Class 2014" }, "_2015": { "id": "class_2015", "short": "2015", "long": "Class 2015" }, "_2016": { "id": "class_2016", "short": "2016", "long": "Class 2016" }, "_2017": { "id": "class_2017", "short": "2017", "long": "Class 2017" }, "_2018": { "id": "class_2018", "short": "2018", "long": "Class 2018" }, "_2019": { "id": "class_2019", "short": "2019", "long": "Class 2019" }, "_2020": { "id": "class_2020", "short": "2020", "long": "Class 2020" }, "_2021": { "id": "class_2021", "short": "2021", "long": "Class 2021" }, "_2022": { "id": "class_2022", "short": "2022", "long": "Class 2022" }, "_2023": { "id": "class_2023", "short": "2023", "long": "Class 2023" }, "_2024": { "id": "class_2024", "short": "2024", "long": "Class 2024" }, "_2025": { "id": "class_2025", "short": "2025", "long": "Class 2025" }, "_2026": { "id": "class_2026", "short": "2026", "long": "Class 2026" } }); SPENDABLE_TYPE_NAMES = /** @type {const} */ ({ "p2pk65": { "id": "p2pk65", "short": "P2PK65", "long": "Pay to Public Key (65 bytes)" }, "p2pk33": { "id": "p2pk33", "short": "P2PK33", "long": "Pay to Public Key (33 bytes)" }, "p2pkh": { "id": "p2pkh", "short": "P2PKH", "long": "Pay to Public Key Hash" }, "p2ms": { "id": "p2ms", "short": "P2MS", "long": "Pay to Multisig" }, "p2sh": { "id": "p2sh", "short": "P2SH", "long": "Pay to Script Hash" }, "p2wpkh": { "id": "p2wpkh", "short": "P2WPKH", "long": "Pay to Witness Public Key Hash" }, "p2wsh": { "id": "p2wsh", "short": "P2WSH", "long": "Pay to Witness Script Hash" }, "p2tr": { "id": "p2tr", "short": "P2TR", "long": "Pay to Taproot" }, "p2a": { "id": "p2a", "short": "P2A", "long": "Pay to Anchor" }, "unknown": { "id": "unknown_outputs", "short": "Unknown", "long": "Unknown Output Type" }, "empty": { "id": "empty_outputs", "short": "Empty", "long": "Empty Output" } }); AGE_RANGE_NAMES = /** @type {const} */ ({ "under1h": { "id": "under_1h_old", "short": "<1h", "long": "Under 1 Hour Old" }, "_1hTo1d": { "id": "1h_to_1d_old", "short": "1h-1d", "long": "1 Hour to 1 Day Old" }, "_1dTo1w": { "id": "1d_to_1w_old", "short": "1d-1w", "long": "1 Day to 1 Week Old" }, "_1wTo1m": { "id": "1w_to_1m_old", "short": "1w-1m", "long": "1 Week to 1 Month Old" }, "_1mTo2m": { "id": "1m_to_2m_old", "short": "1m-2m", "long": "1 to 2 Months Old" }, "_2mTo3m": { "id": "2m_to_3m_old", "short": "2m-3m", "long": "2 to 3 Months Old" }, "_3mTo4m": { "id": "3m_to_4m_old", "short": "3m-4m", "long": "3 to 4 Months Old" }, "_4mTo5m": { "id": "4m_to_5m_old", "short": "4m-5m", "long": "4 to 5 Months Old" }, "_5mTo6m": { "id": "5m_to_6m_old", "short": "5m-6m", "long": "5 to 6 Months Old" }, "_6mTo1y": { "id": "6m_to_1y_old", "short": "6m-1y", "long": "6 Months to 1 Year Old" }, "_1yTo2y": { "id": "1y_to_2y_old", "short": "1y-2y", "long": "1 to 2 Years Old" }, "_2yTo3y": { "id": "2y_to_3y_old", "short": "2y-3y", "long": "2 to 3 Years Old" }, "_3yTo4y": { "id": "3y_to_4y_old", "short": "3y-4y", "long": "3 to 4 Years Old" }, "_4yTo5y": { "id": "4y_to_5y_old", "short": "4y-5y", "long": "4 to 5 Years Old" }, "_5yTo6y": { "id": "5y_to_6y_old", "short": "5y-6y", "long": "5 to 6 Years Old" }, "_6yTo7y": { "id": "6y_to_7y_old", "short": "6y-7y", "long": "6 to 7 Years Old" }, "_7yTo8y": { "id": "7y_to_8y_old", "short": "7y-8y", "long": "7 to 8 Years Old" }, "_8yTo10y": { "id": "8y_to_10y_old", "short": "8y-10y", "long": "8 to 10 Years Old" }, "_10yTo12y": { "id": "10y_to_12y_old", "short": "10y-12y", "long": "10 to 12 Years Old" }, "_12yTo15y": { "id": "12y_to_15y_old", "short": "12y-15y", "long": "12 to 15 Years Old" }, "over15y": { "id": "over_15y_old", "short": "15y+", "long": "15+ Years Old" } }); UNDER_AGE_NAMES = /** @type {const} */ ({ "_1w": { "id": "under_1w_old", "short": "<1w", "long": "Under 1 Week Old" }, "_1m": { "id": "under_1m_old", "short": "<1m", "long": "Under 1 Month Old" }, "_2m": { "id": "under_2m_old", "short": "<2m", "long": "Under 2 Months Old" }, "_3m": { "id": "under_3m_old", "short": "<3m", "long": "Under 3 Months Old" }, "_4m": { "id": "under_4m_old", "short": "<4m", "long": "Under 4 Months Old" }, "_5m": { "id": "under_5m_old", "short": "<5m", "long": "Under 5 Months Old" }, "_6m": { "id": "under_6m_old", "short": "<6m", "long": "Under 6 Months Old" }, "_1y": { "id": "under_1y_old", "short": "<1y", "long": "Under 1 Year Old" }, "_2y": { "id": "under_2y_old", "short": "<2y", "long": "Under 2 Years Old" }, "_3y": { "id": "under_3y_old", "short": "<3y", "long": "Under 3 Years Old" }, "_4y": { "id": "under_4y_old", "short": "<4y", "long": "Under 4 Years Old" }, "_5y": { "id": "under_5y_old", "short": "<5y", "long": "Under 5 Years Old" }, "_6y": { "id": "under_6y_old", "short": "<6y", "long": "Under 6 Years Old" }, "_7y": { "id": "under_7y_old", "short": "<7y", "long": "Under 7 Years Old" }, "_8y": { "id": "under_8y_old", "short": "<8y", "long": "Under 8 Years Old" }, "_10y": { "id": "under_10y_old", "short": "<10y", "long": "Under 10 Years Old" }, "_12y": { "id": "under_12y_old", "short": "<12y", "long": "Under 12 Years Old" }, "_15y": { "id": "under_15y_old", "short": "<15y", "long": "Under 15 Years Old" } }); OVER_AGE_NAMES = /** @type {const} */ ({ "_1d": { "id": "over_1d_old", "short": "1d+", "long": "Over 1 Day Old" }, "_1w": { "id": "over_1w_old", "short": "1w+", "long": "Over 1 Week Old" }, "_1m": { "id": "over_1m_old", "short": "1m+", "long": "Over 1 Month Old" }, "_2m": { "id": "over_2m_old", "short": "2m+", "long": "Over 2 Months Old" }, "_3m": { "id": "over_3m_old", "short": "3m+", "long": "Over 3 Months Old" }, "_4m": { "id": "over_4m_old", "short": "4m+", "long": "Over 4 Months Old" }, "_5m": { "id": "over_5m_old", "short": "5m+", "long": "Over 5 Months Old" }, "_6m": { "id": "over_6m_old", "short": "6m+", "long": "Over 6 Months Old" }, "_1y": { "id": "over_1y_old", "short": "1y+", "long": "Over 1 Year Old" }, "_2y": { "id": "over_2y_old", "short": "2y+", "long": "Over 2 Years Old" }, "_3y": { "id": "over_3y_old", "short": "3y+", "long": "Over 3 Years Old" }, "_4y": { "id": "over_4y_old", "short": "4y+", "long": "Over 4 Years Old" }, "_5y": { "id": "over_5y_old", "short": "5y+", "long": "Over 5 Years Old" }, "_6y": { "id": "over_6y_old", "short": "6y+", "long": "Over 6 Years Old" }, "_7y": { "id": "over_7y_old", "short": "7y+", "long": "Over 7 Years Old" }, "_8y": { "id": "over_8y_old", "short": "8y+", "long": "Over 8 Years Old" }, "_10y": { "id": "over_10y_old", "short": "10y+", "long": "Over 10 Years Old" }, "_12y": { "id": "over_12y_old", "short": "12y+", "long": "Over 12 Years Old" } }); AMOUNT_RANGE_NAMES = /** @type {const} */ ({ "_0sats": { "id": "0sats", "short": "0 sats", "long": "0 Sats" }, "_1satTo10sats": { "id": "1sat_to_10sats", "short": "1-10 sats", "long": "1-10 Sats" }, "_10satsTo100sats": { "id": "10sats_to_100sats", "short": "10-100 sats", "long": "10-100 Sats" }, "_100satsTo1kSats": { "id": "100sats_to_1k_sats", "short": "100-1k sats", "long": "100-1K Sats" }, "_1kSatsTo10kSats": { "id": "1k_sats_to_10k_sats", "short": "1k-10k sats", "long": "1K-10K Sats" }, "_10kSatsTo100kSats": { "id": "10k_sats_to_100k_sats", "short": "10k-100k sats", "long": "10K-100K Sats" }, "_100kSatsTo1mSats": { "id": "100k_sats_to_1m_sats", "short": "100k-1M sats", "long": "100K-1M Sats" }, "_1mSatsTo10mSats": { "id": "1m_sats_to_10m_sats", "short": "1M-10M sats", "long": "1M-10M Sats" }, "_10mSatsTo1btc": { "id": "10m_sats_to_1btc", "short": "0.1-1 BTC", "long": "0.1-1 BTC" }, "_1btcTo10btc": { "id": "1btc_to_10btc", "short": "1-10 BTC", "long": "1-10 BTC" }, "_10btcTo100btc": { "id": "10btc_to_100btc", "short": "10-100 BTC", "long": "10-100 BTC" }, "_100btcTo1kBtc": { "id": "100btc_to_1k_btc", "short": "100-1k BTC", "long": "100-1K BTC" }, "_1kBtcTo10kBtc": { "id": "1k_btc_to_10k_btc", "short": "1k-10k BTC", "long": "1K-10K BTC" }, "_10kBtcTo100kBtc": { "id": "10k_btc_to_100k_btc", "short": "10k-100k BTC", "long": "10K-100K BTC" }, "over100kBtc": { "id": "over_100k_btc", "short": "100k+ BTC", "long": "100K+ BTC" } }); OVER_AMOUNT_NAMES = /** @type {const} */ ({ "_1sat": { "id": "over_1sat", "short": "1+ sats", "long": "Over 1 Sat" }, "_10sats": { "id": "over_10sats", "short": "10+ sats", "long": "Over 10 Sats" }, "_100sats": { "id": "over_100sats", "short": "100+ sats", "long": "Over 100 Sats" }, "_1kSats": { "id": "over_1k_sats", "short": "1k+ sats", "long": "Over 1K Sats" }, "_10kSats": { "id": "over_10k_sats", "short": "10k+ sats", "long": "Over 10K Sats" }, "_100kSats": { "id": "over_100k_sats", "short": "100k+ sats", "long": "Over 100K Sats" }, "_1mSats": { "id": "over_1m_sats", "short": "1M+ sats", "long": "Over 1M Sats" }, "_10mSats": { "id": "over_10m_sats", "short": "0.1+ BTC", "long": "Over 0.1 BTC" }, "_1btc": { "id": "over_1btc", "short": "1+ BTC", "long": "Over 1 BTC" }, "_10btc": { "id": "over_10btc", "short": "10+ BTC", "long": "Over 10 BTC" }, "_100btc": { "id": "over_100btc", "short": "100+ BTC", "long": "Over 100 BTC" }, "_1kBtc": { "id": "over_1k_btc", "short": "1k+ BTC", "long": "Over 1K BTC" }, "_10kBtc": { "id": "over_10k_btc", "short": "10k+ BTC", "long": "Over 10K BTC" } }); UNDER_AMOUNT_NAMES = /** @type {const} */ ({ "_10sats": { "id": "under_10sats", "short": "<10 sats", "long": "Under 10 Sats" }, "_100sats": { "id": "under_100sats", "short": "<100 sats", "long": "Under 100 Sats" }, "_1kSats": { "id": "under_1k_sats", "short": "<1k sats", "long": "Under 1K Sats" }, "_10kSats": { "id": "under_10k_sats", "short": "<10k sats", "long": "Under 10K Sats" }, "_100kSats": { "id": "under_100k_sats", "short": "<100k sats", "long": "Under 100K Sats" }, "_1mSats": { "id": "under_1m_sats", "short": "<1M sats", "long": "Under 1M Sats" }, "_10mSats": { "id": "under_10m_sats", "short": "<0.1 BTC", "long": "Under 0.1 BTC" }, "_1btc": { "id": "under_1btc", "short": "<1 BTC", "long": "Under 1 BTC" }, "_10btc": { "id": "under_10btc", "short": "<10 BTC", "long": "Under 10 BTC" }, "_100btc": { "id": "under_100btc", "short": "<100 BTC", "long": "Under 100 BTC" }, "_1kBtc": { "id": "under_1k_btc", "short": "<1k BTC", "long": "Under 1K BTC" }, "_10kBtc": { "id": "under_10k_btc", "short": "<10k BTC", "long": "Under 10K BTC" }, "_100kBtc": { "id": "under_100k_btc", "short": "<100k BTC", "long": "Under 100K BTC" } }); PROFITABILITY_RANGE_NAMES = /** @type {const} */ ({ "over1000pctInProfit": { "id": "utxos_over_1000pct_in_profit", "short": "+>1000%", "long": "Over 1000% in Profit" }, "_500pctTo1000pctInProfit": { "id": "utxos_500pct_to_1000pct_in_profit", "short": "+500-1000%", "long": "500-1000% in Profit" }, "_300pctTo500pctInProfit": { "id": "utxos_300pct_to_500pct_in_profit", "short": "+300-500%", "long": "300-500% in Profit" }, "_200pctTo300pctInProfit": { "id": "utxos_200pct_to_300pct_in_profit", "short": "+200-300%", "long": "200-300% in Profit" }, "_100pctTo200pctInProfit": { "id": "utxos_100pct_to_200pct_in_profit", "short": "+100-200%", "long": "100-200% in Profit" }, "_90pctTo100pctInProfit": { "id": "utxos_90pct_to_100pct_in_profit", "short": "+90-100%", "long": "90-100% in Profit" }, "_80pctTo90pctInProfit": { "id": "utxos_80pct_to_90pct_in_profit", "short": "+80-90%", "long": "80-90% in Profit" }, "_70pctTo80pctInProfit": { "id": "utxos_70pct_to_80pct_in_profit", "short": "+70-80%", "long": "70-80% in Profit" }, "_60pctTo70pctInProfit": { "id": "utxos_60pct_to_70pct_in_profit", "short": "+60-70%", "long": "60-70% in Profit" }, "_50pctTo60pctInProfit": { "id": "utxos_50pct_to_60pct_in_profit", "short": "+50-60%", "long": "50-60% in Profit" }, "_40pctTo50pctInProfit": { "id": "utxos_40pct_to_50pct_in_profit", "short": "+40-50%", "long": "40-50% in Profit" }, "_30pctTo40pctInProfit": { "id": "utxos_30pct_to_40pct_in_profit", "short": "+30-40%", "long": "30-40% in Profit" }, "_20pctTo30pctInProfit": { "id": "utxos_20pct_to_30pct_in_profit", "short": "+20-30%", "long": "20-30% in Profit" }, "_10pctTo20pctInProfit": { "id": "utxos_10pct_to_20pct_in_profit", "short": "+10-20%", "long": "10-20% in Profit" }, "_0pctTo10pctInProfit": { "id": "utxos_0pct_to_10pct_in_profit", "short": "+0-10%", "long": "0-10% in Profit" }, "_0pctTo10pctInLoss": { "id": "utxos_0pct_to_10pct_in_loss", "short": "-0-10%", "long": "0-10% in Loss" }, "_10pctTo20pctInLoss": { "id": "utxos_10pct_to_20pct_in_loss", "short": "-10-20%", "long": "10-20% in Loss" }, "_20pctTo30pctInLoss": { "id": "utxos_20pct_to_30pct_in_loss", "short": "-20-30%", "long": "20-30% in Loss" }, "_30pctTo40pctInLoss": { "id": "utxos_30pct_to_40pct_in_loss", "short": "-30-40%", "long": "30-40% in Loss" }, "_40pctTo50pctInLoss": { "id": "utxos_40pct_to_50pct_in_loss", "short": "-40-50%", "long": "40-50% in Loss" }, "_50pctTo60pctInLoss": { "id": "utxos_50pct_to_60pct_in_loss", "short": "-50-60%", "long": "50-60% in Loss" }, "_60pctTo70pctInLoss": { "id": "utxos_60pct_to_70pct_in_loss", "short": "-60-70%", "long": "60-70% in Loss" }, "_70pctTo80pctInLoss": { "id": "utxos_70pct_to_80pct_in_loss", "short": "-70-80%", "long": "70-80% in Loss" }, "_80pctTo90pctInLoss": { "id": "utxos_80pct_to_90pct_in_loss", "short": "-80-90%", "long": "80-90% in Loss" }, "_90pctTo100pctInLoss": { "id": "utxos_90pct_to_100pct_in_loss", "short": "-90-100%", "long": "90-100% in Loss" } }); PROFIT_NAMES = /** @type {const} */ ({ "all": { "id": "utxos_in_profit", "short": "All", "long": "In Profit" }, "_10pct": { "id": "utxos_over_10pct_in_profit", "short": ">=10%", "long": "Over 10% in Profit" }, "_20pct": { "id": "utxos_over_20pct_in_profit", "short": ">=20%", "long": "Over 20% in Profit" }, "_30pct": { "id": "utxos_over_30pct_in_profit", "short": ">=30%", "long": "Over 30% in Profit" }, "_40pct": { "id": "utxos_over_40pct_in_profit", "short": ">=40%", "long": "Over 40% in Profit" }, "_50pct": { "id": "utxos_over_50pct_in_profit", "short": ">=50%", "long": "Over 50% in Profit" }, "_60pct": { "id": "utxos_over_60pct_in_profit", "short": ">=60%", "long": "Over 60% in Profit" }, "_70pct": { "id": "utxos_over_70pct_in_profit", "short": ">=70%", "long": "Over 70% in Profit" }, "_80pct": { "id": "utxos_over_80pct_in_profit", "short": ">=80%", "long": "Over 80% in Profit" }, "_90pct": { "id": "utxos_over_90pct_in_profit", "short": ">=90%", "long": "Over 90% in Profit" }, "_100pct": { "id": "utxos_over_100pct_in_profit", "short": ">=100%", "long": "Over 100% in Profit" }, "_200pct": { "id": "utxos_over_200pct_in_profit", "short": ">=200%", "long": "Over 200% in Profit" }, "_300pct": { "id": "utxos_over_300pct_in_profit", "short": ">=300%", "long": "Over 300% in Profit" }, "_500pct": { "id": "utxos_over_500pct_in_profit", "short": ">=500%", "long": "Over 500% in Profit" } }); LOSS_NAMES = /** @type {const} */ ({ "all": { "id": "utxos_in_loss", "short": "All", "long": "In Loss" }, "_10pct": { "id": "utxos_over_10pct_in_loss", "short": ">=10%", "long": "Over 10% in Loss" }, "_20pct": { "id": "utxos_over_20pct_in_loss", "short": ">=20%", "long": "Over 20% in Loss" }, "_30pct": { "id": "utxos_over_30pct_in_loss", "short": ">=30%", "long": "Over 30% in Loss" }, "_40pct": { "id": "utxos_over_40pct_in_loss", "short": ">=40%", "long": "Over 40% in Loss" }, "_50pct": { "id": "utxos_over_50pct_in_loss", "short": ">=50%", "long": "Over 50% in Loss" }, "_60pct": { "id": "utxos_over_60pct_in_loss", "short": ">=60%", "long": "Over 60% in Loss" }, "_70pct": { "id": "utxos_over_70pct_in_loss", "short": ">=70%", "long": "Over 70% in Loss" }, "_80pct": { "id": "utxos_over_80pct_in_loss", "short": ">=80%", "long": "Over 80% in Loss" } }); /** * Convert an index value to a Date for date-based indexes. * @param {Index} index - The index type * @param {number} i - The index value * @returns {globalThis.Date} */ indexToDate(index, i) { return indexToDate(index, i); } /** * Convert a Date to an index value for date-based indexes. * @param {Index} index - The index type * @param {globalThis.Date} d - The date to convert * @returns {number} */ dateToIndex(index, d) { return dateToIndex(index, d); } /** * @param {BrkClientOptions|string} options */ constructor(options) { super(options); /** @type {SeriesTree} */ this.series = this._buildTree(''); } /** * @private * @param {string} basePath * @returns {SeriesTree} */ _buildTree(basePath) { return { blocks: { blockhash: createSeriesPattern18(this, 'blockhash'), difficulty: { value: createSeriesPattern1(this, 'difficulty'), hashrate: createSeriesPattern1(this, 'difficulty_hashrate'), adjustment: createBpsPercentRatioPattern(this, 'difficulty_adjustment'), epoch: createSeriesPattern1(this, 'difficulty_epoch'), blocksToRetarget: createSeriesPattern1(this, 'blocks_to_retarget'), daysToRetarget: createSeriesPattern1(this, 'days_to_retarget'), }, time: { timestamp: createSeriesPattern1(this, 'timestamp'), date: createSeriesPattern18(this, 'date'), timestampMonotonic: createSeriesPattern18(this, 'timestamp_monotonic'), }, size: { base: createSeriesPattern18(this, 'total_size'), cumulative: createSeriesPattern1(this, 'block_size_cumulative'), sum: create_1m1w1y24hPattern(this, 'block_size_sum'), average: create_1m1w1y24hPattern(this, 'block_size_average'), min: create_1m1w1y24hPattern(this, 'block_size_min'), max: create_1m1w1y24hPattern(this, 'block_size_max'), pct10: create_1m1w1y24hPattern(this, 'block_size_pct10'), pct25: create_1m1w1y24hPattern(this, 'block_size_pct25'), median: create_1m1w1y24hPattern(this, 'block_size_median'), pct75: create_1m1w1y24hPattern(this, 'block_size_pct75'), pct90: create_1m1w1y24hPattern(this, 'block_size_pct90'), }, weight: { base: createSeriesPattern18(this, 'block_weight'), cumulative: createSeriesPattern1(this, 'block_weight_cumulative'), sum: create_1m1w1y24hPattern(this, 'block_weight_sum'), average: create_1m1w1y24hPattern(this, 'block_weight_average'), min: create_1m1w1y24hPattern(this, 'block_weight_min'), max: create_1m1w1y24hPattern(this, 'block_weight_max'), pct10: create_1m1w1y24hPattern(this, 'block_weight_pct10'), pct25: create_1m1w1y24hPattern(this, 'block_weight_pct25'), median: create_1m1w1y24hPattern(this, 'block_weight_median'), pct75: create_1m1w1y24hPattern(this, 'block_weight_pct75'), pct90: create_1m1w1y24hPattern(this, 'block_weight_pct90'), }, count: { target: create_1m1w1y24hPattern(this, 'block_count_target'), total: createBaseCumulativeSumPattern2(this, 'block_count'), }, lookback: { _1h: createSeriesPattern18(this, 'height_1h_ago'), _24h: createSeriesPattern18(this, 'height_24h_ago'), _3d: createSeriesPattern18(this, 'height_3d_ago'), _1w: createSeriesPattern18(this, 'height_1w_ago'), _8d: createSeriesPattern18(this, 'height_8d_ago'), _9d: createSeriesPattern18(this, 'height_9d_ago'), _12d: createSeriesPattern18(this, 'height_12d_ago'), _13d: createSeriesPattern18(this, 'height_13d_ago'), _2w: createSeriesPattern18(this, 'height_2w_ago'), _21d: createSeriesPattern18(this, 'height_21d_ago'), _26d: createSeriesPattern18(this, 'height_26d_ago'), _1m: createSeriesPattern18(this, 'height_1m_ago'), _34d: createSeriesPattern18(this, 'height_34d_ago'), _55d: createSeriesPattern18(this, 'height_55d_ago'), _2m: createSeriesPattern18(this, 'height_2m_ago'), _9w: createSeriesPattern18(this, 'height_9w_ago'), _12w: createSeriesPattern18(this, 'height_12w_ago'), _89d: createSeriesPattern18(this, 'height_89d_ago'), _3m: createSeriesPattern18(this, 'height_3m_ago'), _14w: createSeriesPattern18(this, 'height_14w_ago'), _111d: createSeriesPattern18(this, 'height_111d_ago'), _144d: createSeriesPattern18(this, 'height_144d_ago'), _6m: createSeriesPattern18(this, 'height_6m_ago'), _26w: createSeriesPattern18(this, 'height_26w_ago'), _200d: createSeriesPattern18(this, 'height_200d_ago'), _9m: createSeriesPattern18(this, 'height_9m_ago'), _350d: createSeriesPattern18(this, 'height_350d_ago'), _12m: createSeriesPattern18(this, 'height_12m_ago'), _1y: createSeriesPattern18(this, 'height_1y_ago'), _14m: createSeriesPattern18(this, 'height_14m_ago'), _2y: createSeriesPattern18(this, 'height_2y_ago'), _26m: createSeriesPattern18(this, 'height_26m_ago'), _3y: createSeriesPattern18(this, 'height_3y_ago'), _200w: createSeriesPattern18(this, 'height_200w_ago'), _4y: createSeriesPattern18(this, 'height_4y_ago'), _5y: createSeriesPattern18(this, 'height_5y_ago'), _6y: createSeriesPattern18(this, 'height_6y_ago'), _8y: createSeriesPattern18(this, 'height_8y_ago'), _9y: createSeriesPattern18(this, 'height_9y_ago'), _10y: createSeriesPattern18(this, 'height_10y_ago'), _12y: createSeriesPattern18(this, 'height_12y_ago'), _14y: createSeriesPattern18(this, 'height_14y_ago'), _26y: createSeriesPattern18(this, 'height_26y_ago'), }, interval: create_1m1w1y24hBasePattern(this, 'block_interval'), vbytes: createAverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern2(this, 'block_vbytes'), fullness: { bps: createSeriesPattern18(this, 'block_fullness_bps'), ratio: createSeriesPattern18(this, 'block_fullness_ratio'), percent: createSeriesPattern18(this, 'block_fullness'), }, halving: { epoch: createSeriesPattern1(this, 'halving_epoch'), blocksToHalving: createSeriesPattern1(this, 'blocks_to_halving'), daysToHalving: createSeriesPattern1(this, 'days_to_halving'), }, }, transactions: { raw: { firstTxIndex: createSeriesPattern18(this, 'first_tx_index'), height: createSeriesPattern19(this, 'height'), txid: createSeriesPattern19(this, 'txid'), txVersion: createSeriesPattern19(this, 'tx_version'), rawLocktime: createSeriesPattern19(this, 'raw_locktime'), baseSize: createSeriesPattern19(this, 'base_size'), totalSize: createSeriesPattern19(this, 'total_size'), isExplicitlyRbf: createSeriesPattern19(this, 'is_explicitly_rbf'), firstTxinIndex: createSeriesPattern19(this, 'first_txin_index'), firstTxoutIndex: createSeriesPattern19(this, 'first_txout_index'), }, count: { total: createAverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern2(this, 'tx_count'), isCoinbase: createSeriesPattern19(this, 'is_coinbase'), }, size: { vsize: create_6bBlockTxPattern(this, 'tx_vsize'), weight: { txIndex: createSeriesPattern19(this, 'tx_weight'), block: createAverageMaxMedianMinPct10Pct25Pct75Pct90Pattern2(this, 'tx_weight'), _6b: createAverageMaxMedianMinPct10Pct25Pct75Pct90Pattern2(this, 'tx_weight_6b'), }, }, fees: { inputValue: createSeriesPattern19(this, 'input_value'), outputValue: createSeriesPattern19(this, 'output_value'), fee: create_6bBlockTxPattern(this, 'fee'), feeRate: create_6bBlockTxPattern(this, 'fee_rate'), }, versions: { v1: createBaseCumulativeSumPattern(this, 'tx_v1'), v2: createBaseCumulativeSumPattern(this, 'tx_v2'), v3: createBaseCumulativeSumPattern(this, 'tx_v3'), }, volume: { transferVolume: createBaseCumulativeSumPattern3(this, 'transfer_volume_bis'), txPerSec: create_1m1w1y24hPattern(this, 'tx_per_sec'), outputsPerSec: create_1m1w1y24hPattern(this, 'outputs_per_sec'), inputsPerSec: create_1m1w1y24hPattern(this, 'inputs_per_sec'), }, }, inputs: { raw: { firstTxinIndex: createSeriesPattern18(this, 'first_txin_index'), outpoint: createSeriesPattern20(this, 'outpoint'), txIndex: createSeriesPattern20(this, 'tx_index'), outputType: createSeriesPattern20(this, 'output_type'), typeIndex: createSeriesPattern20(this, 'type_index'), }, spent: { txoutIndex: createSeriesPattern20(this, 'txout_index'), value: createSeriesPattern20(this, 'value'), }, count: createCumulativeRollingSumPattern(this, 'input_count'), }, outputs: { raw: { firstTxoutIndex: createSeriesPattern18(this, 'first_txout_index'), value: createSeriesPattern21(this, 'value'), outputType: createSeriesPattern21(this, 'output_type'), typeIndex: createSeriesPattern21(this, 'type_index'), txIndex: createSeriesPattern21(this, 'tx_index'), }, spent: { txinIndex: createSeriesPattern21(this, 'txin_index'), }, count: { total: createCumulativeRollingSumPattern(this, 'output_count'), unspent: createSeriesPattern1(this, 'utxo_count_bis'), }, }, addrs: { raw: { p2pk65: { firstIndex: createSeriesPattern18(this, 'first_p2pk65_addr_index'), bytes: createSeriesPattern27(this, 'p2pk65_bytes'), }, p2pk33: { firstIndex: createSeriesPattern18(this, 'first_p2pk33_addr_index'), bytes: createSeriesPattern26(this, 'p2pk33_bytes'), }, p2pkh: { firstIndex: createSeriesPattern18(this, 'first_p2pkh_addr_index'), bytes: createSeriesPattern28(this, 'p2pkh_bytes'), }, p2sh: { firstIndex: createSeriesPattern18(this, 'first_p2sh_addr_index'), bytes: createSeriesPattern29(this, 'p2sh_bytes'), }, p2wpkh: { firstIndex: createSeriesPattern18(this, 'first_p2wpkh_addr_index'), bytes: createSeriesPattern31(this, 'p2wpkh_bytes'), }, p2wsh: { firstIndex: createSeriesPattern18(this, 'first_p2wsh_addr_index'), bytes: createSeriesPattern32(this, 'p2wsh_bytes'), }, p2tr: { firstIndex: createSeriesPattern18(this, 'first_p2tr_addr_index'), bytes: createSeriesPattern30(this, 'p2tr_bytes'), }, p2a: { firstIndex: createSeriesPattern18(this, 'first_p2a_addr_index'), bytes: createSeriesPattern24(this, 'p2a_bytes'), }, }, indexes: { p2a: createSeriesPattern24(this, 'any_addr_index'), p2pk33: createSeriesPattern26(this, 'any_addr_index'), p2pk65: createSeriesPattern27(this, 'any_addr_index'), p2pkh: createSeriesPattern28(this, 'any_addr_index'), p2sh: createSeriesPattern29(this, 'any_addr_index'), p2tr: createSeriesPattern30(this, 'any_addr_index'), p2wpkh: createSeriesPattern31(this, 'any_addr_index'), p2wsh: createSeriesPattern32(this, 'any_addr_index'), funded: createSeriesPattern34(this, 'funded_addr_index'), empty: createSeriesPattern35(this, 'empty_addr_index'), }, data: { funded: createSeriesPattern34(this, 'funded_addr_data'), empty: createSeriesPattern35(this, 'empty_addr_data'), }, funded: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3(this, 'addr_count'), empty: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3(this, 'empty_addr_count'), activity: { all: createBothReactivatedReceivingSendingPattern(this, 'addr_activity'), p2pk65: createBothReactivatedReceivingSendingPattern(this, 'p2pk65_addr_activity'), p2pk33: createBothReactivatedReceivingSendingPattern(this, 'p2pk33_addr_activity'), p2pkh: createBothReactivatedReceivingSendingPattern(this, 'p2pkh_addr_activity'), p2sh: createBothReactivatedReceivingSendingPattern(this, 'p2sh_addr_activity'), p2wpkh: createBothReactivatedReceivingSendingPattern(this, 'p2wpkh_addr_activity'), p2wsh: createBothReactivatedReceivingSendingPattern(this, 'p2wsh_addr_activity'), p2tr: createBothReactivatedReceivingSendingPattern(this, 'p2tr_addr_activity'), p2a: createBothReactivatedReceivingSendingPattern(this, 'p2a_addr_activity'), }, total: createAllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3(this, 'total_addr_count'), new: { all: createBaseCumulativeSumPattern(this, 'new_addr_count'), p2pk65: createBaseCumulativeSumPattern(this, 'p2pk65_new_addr_count'), p2pk33: createBaseCumulativeSumPattern(this, 'p2pk33_new_addr_count'), p2pkh: createBaseCumulativeSumPattern(this, 'p2pkh_new_addr_count'), p2sh: createBaseCumulativeSumPattern(this, 'p2sh_new_addr_count'), p2wpkh: createBaseCumulativeSumPattern(this, 'p2wpkh_new_addr_count'), p2wsh: createBaseCumulativeSumPattern(this, 'p2wsh_new_addr_count'), p2tr: createBaseCumulativeSumPattern(this, 'p2tr_new_addr_count'), p2a: createBaseCumulativeSumPattern(this, 'p2a_new_addr_count'), }, delta: { all: createAbsoluteRatePattern(this, 'addr_count'), p2pk65: createAbsoluteRatePattern(this, 'p2pk65_addr_count'), p2pk33: createAbsoluteRatePattern(this, 'p2pk33_addr_count'), p2pkh: createAbsoluteRatePattern(this, 'p2pkh_addr_count'), p2sh: createAbsoluteRatePattern(this, 'p2sh_addr_count'), p2wpkh: createAbsoluteRatePattern(this, 'p2wpkh_addr_count'), p2wsh: createAbsoluteRatePattern(this, 'p2wsh_addr_count'), p2tr: createAbsoluteRatePattern(this, 'p2tr_addr_count'), p2a: createAbsoluteRatePattern(this, 'p2a_addr_count'), }, }, scripts: { raw: { empty: { firstIndex: createSeriesPattern18(this, 'first_empty_output_index'), toTxIndex: createSeriesPattern22(this, 'tx_index'), }, opReturn: { firstIndex: createSeriesPattern18(this, 'first_op_return_index'), toTxIndex: createSeriesPattern23(this, 'tx_index'), }, p2ms: { firstIndex: createSeriesPattern18(this, 'first_p2ms_output_index'), toTxIndex: createSeriesPattern25(this, 'tx_index'), }, unknown: { firstIndex: createSeriesPattern18(this, 'first_unknown_output_index'), toTxIndex: createSeriesPattern33(this, 'tx_index'), }, }, count: { p2a: createBaseCumulativeSumPattern(this, 'p2a_count'), p2ms: createBaseCumulativeSumPattern(this, 'p2ms_count'), p2pk33: createBaseCumulativeSumPattern(this, 'p2pk33_count'), p2pk65: createBaseCumulativeSumPattern(this, 'p2pk65_count'), p2pkh: createBaseCumulativeSumPattern(this, 'p2pkh_count'), p2sh: createBaseCumulativeSumPattern(this, 'p2sh_count'), p2tr: createBaseCumulativeSumPattern(this, 'p2tr_count'), p2wpkh: createBaseCumulativeSumPattern(this, 'p2wpkh_count'), p2wsh: createBaseCumulativeSumPattern(this, 'p2wsh_count'), opReturn: createBaseCumulativeSumPattern(this, 'op_return_count'), emptyOutput: createBaseCumulativeSumPattern(this, 'empty_output_count'), unknownOutput: createBaseCumulativeSumPattern(this, 'unknown_output_count'), }, value: { opReturn: createBaseCumulativeSumPattern3(this, 'op_return_value'), }, }, mining: { rewards: { coinbase: createBaseCumulativeSumPattern3(this, 'coinbase'), subsidy: { base: createBtcCentsSatsUsdPattern(this, 'subsidy'), cumulative: createBtcCentsSatsUsdPattern(this, 'subsidy_cumulative'), dominance: create_1m1w1y24hBpsPercentRatioPattern(this, 'subsidy_dominance'), sma1y: createCentsUsdPattern2(this, 'subsidy_sma_1y'), }, fees: { base: createBtcCentsSatsUsdPattern(this, 'fees'), cumulative: createBtcCentsSatsUsdPattern(this, 'fees_cumulative'), sum: create_1m1w1y24hPattern3(this, 'fees_sum'), average: create_1m1w1y24hPattern3(this, 'fees_average'), min: create_1m1w1y24hPattern3(this, 'fees_min'), max: create_1m1w1y24hPattern3(this, 'fees_max'), pct10: create_1m1w1y24hPattern3(this, 'fees_pct10'), pct25: create_1m1w1y24hPattern3(this, 'fees_pct25'), median: create_1m1w1y24hPattern3(this, 'fees_median'), pct75: create_1m1w1y24hPattern3(this, 'fees_pct75'), pct90: create_1m1w1y24hPattern3(this, 'fees_pct90'), dominance: create_1m1w1y24hBpsPercentRatioPattern(this, 'fee_dominance'), toSubsidyRatio: { _24h: createBpsRatioPattern2(this, 'fee_to_subsidy_ratio_24h'), _1w: createBpsRatioPattern2(this, 'fee_to_subsidy_ratio_1w'), _1m: createBpsRatioPattern2(this, 'fee_to_subsidy_ratio_1m'), _1y: createBpsRatioPattern2(this, 'fee_to_subsidy_ratio_1y'), }, }, unclaimed: { base: createBtcCentsSatsUsdPattern(this, 'unclaimed_rewards'), cumulative: createBtcCentsSatsUsdPattern(this, 'unclaimed_rewards_cumulative'), }, }, hashrate: { rate: { base: createSeriesPattern1(this, 'hash_rate'), sma: { _1w: createSeriesPattern1(this, 'hash_rate_sma_1w'), _1m: createSeriesPattern1(this, 'hash_rate_sma_1m'), _2m: createSeriesPattern1(this, 'hash_rate_sma_2m'), _1y: createSeriesPattern1(this, 'hash_rate_sma_1y'), }, ath: createSeriesPattern1(this, 'hash_rate_ath'), drawdown: createBpsPercentRatioPattern5(this, 'hash_rate_drawdown'), }, price: createPhsReboundThsPattern(this, 'hash_price'), value: createPhsReboundThsPattern(this, 'hash_value'), }, }, positions: { block: createSeriesPattern18(this, 'position'), tx: createSeriesPattern19(this, 'position'), }, cointime: { activity: { coinblocksCreated: createBaseCumulativeSumPattern(this, 'coinblocks_created'), coinblocksStored: createBaseCumulativeSumPattern(this, 'coinblocks_stored'), liveliness: createSeriesPattern1(this, 'liveliness'), vaultedness: createSeriesPattern1(this, 'vaultedness'), ratio: createSeriesPattern1(this, 'activity_to_vaultedness'), coinblocksDestroyed: createBaseCumulativeSumPattern(this, 'coinblocks_destroyed'), }, supply: { vaulted: createBtcCentsSatsUsdPattern(this, 'vaulted_supply'), active: createBtcCentsSatsUsdPattern(this, 'active_supply'), }, value: { destroyed: createBaseCumulativeSumPattern(this, 'cointime_value_destroyed'), created: createBaseCumulativeSumPattern(this, 'cointime_value_created'), stored: createBaseCumulativeSumPattern(this, 'cointime_value_stored'), vocdd: createBaseCumulativeSumPattern(this, 'vocdd'), }, cap: { thermo: createCentsUsdPattern2(this, 'thermo_cap'), investor: createCentsUsdPattern2(this, 'investor_cap'), vaulted: createCentsUsdPattern2(this, 'vaulted_cap'), active: createCentsUsdPattern2(this, 'active_cap'), cointime: createCentsUsdPattern2(this, 'cointime_cap'), aviv: createBpsRatioPattern2(this, 'aviv_ratio'), }, prices: { vaulted: createBpsCentsPercentilesRatioSatsUsdPattern(this, 'vaulted_price'), active: createBpsCentsPercentilesRatioSatsUsdPattern(this, 'active_price'), trueMarketMean: createBpsCentsPercentilesRatioSatsUsdPattern(this, 'true_market_mean'), cointime: createBpsCentsPercentilesRatioSatsUsdPattern(this, 'cointime_price'), }, adjusted: { inflationRate: createBpsPercentRatioPattern(this, 'cointime_adj_inflation_rate'), txVelocityNative: createSeriesPattern1(this, 'cointime_adj_tx_velocity'), txVelocityFiat: createSeriesPattern1(this, 'cointime_adj_tx_velocity_fiat'), }, reserveRisk: { value: createSeriesPattern1(this, 'reserve_risk'), vocddMedian1y: createSeriesPattern18(this, 'vocdd_median_1y'), hodlBank: createSeriesPattern18(this, 'hodl_bank'), }, }, constants: { _0: createSeriesPattern1(this, 'constant_0'), _1: createSeriesPattern1(this, 'constant_1'), _2: createSeriesPattern1(this, 'constant_2'), _3: createSeriesPattern1(this, 'constant_3'), _4: createSeriesPattern1(this, 'constant_4'), _20: createSeriesPattern1(this, 'constant_20'), _30: createSeriesPattern1(this, 'constant_30'), _382: createSeriesPattern1(this, 'constant_38_2'), _50: createSeriesPattern1(this, 'constant_50'), _618: createSeriesPattern1(this, 'constant_61_8'), _70: createSeriesPattern1(this, 'constant_70'), _80: createSeriesPattern1(this, 'constant_80'), _100: createSeriesPattern1(this, 'constant_100'), _600: createSeriesPattern1(this, 'constant_600'), minus1: createSeriesPattern1(this, 'constant_minus_1'), minus2: createSeriesPattern1(this, 'constant_minus_2'), minus3: createSeriesPattern1(this, 'constant_minus_3'), minus4: createSeriesPattern1(this, 'constant_minus_4'), }, indexes: { addr: { p2pk33: { identity: createSeriesPattern26(this, 'p2pk33_addr_index'), addr: createSeriesPattern26(this, 'p2pk33_addr'), }, p2pk65: { identity: createSeriesPattern27(this, 'p2pk65_addr_index'), addr: createSeriesPattern27(this, 'p2pk65_addr'), }, p2pkh: { identity: createSeriesPattern28(this, 'p2pkh_addr_index'), addr: createSeriesPattern28(this, 'p2pkh_addr'), }, p2sh: { identity: createSeriesPattern29(this, 'p2sh_addr_index'), addr: createSeriesPattern29(this, 'p2sh_addr'), }, p2tr: { identity: createSeriesPattern30(this, 'p2tr_addr_index'), addr: createSeriesPattern30(this, 'p2tr_addr'), }, p2wpkh: { identity: createSeriesPattern31(this, 'p2wpkh_addr_index'), addr: createSeriesPattern31(this, 'p2wpkh_addr'), }, p2wsh: { identity: createSeriesPattern32(this, 'p2wsh_addr_index'), addr: createSeriesPattern32(this, 'p2wsh_addr'), }, p2a: { identity: createSeriesPattern24(this, 'p2a_addr_index'), addr: createSeriesPattern24(this, 'p2a_addr'), }, p2ms: { identity: createSeriesPattern25(this, 'p2ms_output_index'), }, empty: { identity: createSeriesPattern22(this, 'empty_output_index'), }, unknown: { identity: createSeriesPattern33(this, 'unknown_output_index'), }, opReturn: { identity: createSeriesPattern23(this, 'op_return_index'), }, }, height: { identity: createSeriesPattern18(this, 'height'), minute10: createSeriesPattern18(this, 'minute10'), minute30: createSeriesPattern18(this, 'minute30'), hour1: createSeriesPattern18(this, 'hour1'), hour4: createSeriesPattern18(this, 'hour4'), hour12: createSeriesPattern18(this, 'hour12'), day1: createSeriesPattern18(this, 'day1'), day3: createSeriesPattern18(this, 'day3'), epoch: createSeriesPattern18(this, 'epoch'), halving: createSeriesPattern18(this, 'halving'), week1: createSeriesPattern18(this, 'week1'), month1: createSeriesPattern18(this, 'month1'), month3: createSeriesPattern18(this, 'month3'), month6: createSeriesPattern18(this, 'month6'), year1: createSeriesPattern18(this, 'year1'), year10: createSeriesPattern18(this, 'year10'), txIndexCount: createSeriesPattern18(this, 'tx_index_count'), }, epoch: { identity: createSeriesPattern17(this, 'epoch'), firstHeight: createSeriesPattern17(this, 'first_height'), heightCount: createSeriesPattern17(this, 'height_count'), }, halving: { identity: createSeriesPattern16(this, 'halving'), firstHeight: createSeriesPattern16(this, 'first_height'), }, minute10: { identity: createSeriesPattern3(this, 'minute10_index'), firstHeight: createSeriesPattern3(this, 'first_height'), }, minute30: { identity: createSeriesPattern4(this, 'minute30_index'), firstHeight: createSeriesPattern4(this, 'first_height'), }, hour1: { identity: createSeriesPattern5(this, 'hour1_index'), firstHeight: createSeriesPattern5(this, 'first_height'), }, hour4: { identity: createSeriesPattern6(this, 'hour4_index'), firstHeight: createSeriesPattern6(this, 'first_height'), }, hour12: { identity: createSeriesPattern7(this, 'hour12_index'), firstHeight: createSeriesPattern7(this, 'first_height'), }, day1: { identity: createSeriesPattern8(this, 'day1_index'), date: createSeriesPattern8(this, 'date'), firstHeight: createSeriesPattern8(this, 'first_height'), heightCount: createSeriesPattern8(this, 'height_count'), }, day3: { identity: createSeriesPattern9(this, 'day3_index'), firstHeight: createSeriesPattern9(this, 'first_height'), }, week1: { identity: createSeriesPattern10(this, 'week1_index'), date: createSeriesPattern10(this, 'date'), firstHeight: createSeriesPattern10(this, 'first_height'), }, month1: { identity: createSeriesPattern11(this, 'month1_index'), date: createSeriesPattern11(this, 'date'), firstHeight: createSeriesPattern11(this, 'first_height'), }, month3: { identity: createSeriesPattern12(this, 'month3_index'), date: createSeriesPattern12(this, 'date'), firstHeight: createSeriesPattern12(this, 'first_height'), }, month6: { identity: createSeriesPattern13(this, 'month6_index'), date: createSeriesPattern13(this, 'date'), firstHeight: createSeriesPattern13(this, 'first_height'), }, year1: { identity: createSeriesPattern14(this, 'year1_index'), date: createSeriesPattern14(this, 'date'), firstHeight: createSeriesPattern14(this, 'first_height'), }, year10: { identity: createSeriesPattern15(this, 'year10_index'), date: createSeriesPattern15(this, 'date'), firstHeight: createSeriesPattern15(this, 'first_height'), }, txIndex: { identity: createSeriesPattern19(this, 'tx_index'), inputCount: createSeriesPattern19(this, 'input_count'), outputCount: createSeriesPattern19(this, 'output_count'), }, txinIndex: { identity: createSeriesPattern20(this, 'txin_index'), }, txoutIndex: { identity: createSeriesPattern21(this, 'txout_index'), }, }, indicators: { puellMultiple: createBpsRatioPattern2(this, 'puell_multiple'), nvt: createBpsRatioPattern2(this, 'nvt'), gini: createBpsPercentRatioPattern3(this, 'gini'), rhodlRatio: createBpsRatioPattern2(this, 'rhodl_ratio'), thermoCapMultiple: createBpsRatioPattern2(this, 'thermo_cap_multiple'), coindaysDestroyedSupplyAdjusted: createSeriesPattern1(this, 'coindays_destroyed_supply_adjusted'), coinyearsDestroyedSupplyAdjusted: createSeriesPattern1(this, 'coinyears_destroyed_supply_adjusted'), dormancy: { supplyAdjusted: createSeriesPattern1(this, 'dormancy_supply_adjusted'), flow: createSeriesPattern1(this, 'dormancy_flow'), }, stockToFlow: createSeriesPattern1(this, 'stock_to_flow'), sellerExhaustion: createSeriesPattern1(this, 'seller_exhaustion'), }, market: { ath: { high: createCentsSatsUsdPattern(this, 'price_ath'), drawdown: createBpsPercentRatioPattern5(this, 'price_drawdown'), daysSince: createSeriesPattern1(this, 'days_since_price_ath'), yearsSince: createSeriesPattern1(this, 'years_since_price_ath'), maxDaysBetween: createSeriesPattern1(this, 'max_days_between_price_ath'), maxYearsBetween: createSeriesPattern1(this, 'max_years_between_price_ath'), }, lookback: { _24h: createCentsSatsUsdPattern(this, 'price_past_24h'), _1w: createCentsSatsUsdPattern(this, 'price_past_1w'), _1m: createCentsSatsUsdPattern(this, 'price_past_1m'), _3m: createCentsSatsUsdPattern(this, 'price_past_3m'), _6m: createCentsSatsUsdPattern(this, 'price_past_6m'), _1y: createCentsSatsUsdPattern(this, 'price_past_1y'), _2y: createCentsSatsUsdPattern(this, 'price_past_2y'), _3y: createCentsSatsUsdPattern(this, 'price_past_3y'), _4y: createCentsSatsUsdPattern(this, 'price_past_4y'), _5y: createCentsSatsUsdPattern(this, 'price_past_5y'), _6y: createCentsSatsUsdPattern(this, 'price_past_6y'), _8y: createCentsSatsUsdPattern(this, 'price_past_8y'), _10y: createCentsSatsUsdPattern(this, 'price_past_10y'), }, returns: { periods: { _24h: createBpsPercentRatioPattern(this, 'price_return_24h'), _1w: createBpsPercentRatioPattern(this, 'price_return_1w'), _1m: createBpsPercentRatioPattern(this, 'price_return_1m'), _3m: createBpsPercentRatioPattern(this, 'price_return_3m'), _6m: createBpsPercentRatioPattern(this, 'price_return_6m'), _1y: createBpsPercentRatioPattern(this, 'price_return_1y'), _2y: createBpsPercentRatioPattern(this, 'price_return_2y'), _3y: createBpsPercentRatioPattern(this, 'price_return_3y'), _4y: createBpsPercentRatioPattern(this, 'price_return_4y'), _5y: createBpsPercentRatioPattern(this, 'price_return_5y'), _6y: createBpsPercentRatioPattern(this, 'price_return_6y'), _8y: createBpsPercentRatioPattern(this, 'price_return_8y'), _10y: createBpsPercentRatioPattern(this, 'price_return_10y'), }, cagr: create_10y2y3y4y5y6y8yPattern(this, 'price_cagr'), sd24h: { _24h: { sma: createSeriesPattern1(this, 'price_return_24h_sma_24h'), sd: createSeriesPattern1(this, 'price_return_24h_sd_24h'), }, _1w: { sma: createSeriesPattern1(this, 'price_return_24h_sma_1w'), sd: createSeriesPattern1(this, 'price_return_24h_sd_1w'), }, _1m: { sma: createSeriesPattern1(this, 'price_return_24h_sma_1m'), sd: createSeriesPattern1(this, 'price_return_24h_sd_1m'), }, _1y: { sma: createSeriesPattern1(this, 'price_return_24h_sma_1y'), sd: createSeriesPattern1(this, 'price_return_24h_sd_1y'), }, }, }, volatility: create_1m1w1y24hPattern(this, 'price_volatility'), range: { min: create_1m1w1y2wPattern(this, 'price_min'), max: create_1m1w1y2wPattern(this, 'price_max'), trueRange: createSeriesPattern1(this, 'price_true_range'), trueRangeSum2w: createSeriesPattern1(this, 'price_true_range_sum_2w'), choppinessIndex2w: createBpsPercentRatioPattern3(this, 'price_choppiness_index_2w'), }, movingAverage: { sma: { _1w: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_1w'), _8d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_8d'), _13d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_13d'), _21d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_21d'), _1m: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_1m'), _34d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_34d'), _55d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_55d'), _89d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_89d'), _111d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_111d'), _144d: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_144d'), _200d: { usd: createSeriesPattern1(this, 'price_sma_200d'), cents: createSeriesPattern1(this, 'price_sma_200d_cents'), sats: createSeriesPattern1(this, 'price_sma_200d_sats'), bps: createSeriesPattern1(this, 'price_sma_200d_ratio_bps'), ratio: createSeriesPattern1(this, 'price_sma_200d_ratio'), x24: createCentsSatsUsdPattern(this, 'price_sma_200d_x2_4'), x08: createCentsSatsUsdPattern(this, 'price_sma_200d_x0_8'), }, _350d: { usd: createSeriesPattern1(this, 'price_sma_350d'), cents: createSeriesPattern1(this, 'price_sma_350d_cents'), sats: createSeriesPattern1(this, 'price_sma_350d_sats'), bps: createSeriesPattern1(this, 'price_sma_350d_ratio_bps'), ratio: createSeriesPattern1(this, 'price_sma_350d_ratio'), x2: createCentsSatsUsdPattern(this, 'price_sma_350d_x2'), }, _1y: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_1y'), _2y: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_2y'), _200w: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_200w'), _4y: createBpsCentsRatioSatsUsdPattern(this, 'price_sma_4y'), }, ema: { _1w: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_1w'), _8d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_8d'), _12d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_12d'), _13d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_13d'), _21d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_21d'), _26d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_26d'), _1m: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_1m'), _34d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_34d'), _55d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_55d'), _89d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_89d'), _144d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_144d'), _200d: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_200d'), _1y: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_1y'), _2y: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_2y'), _200w: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_200w'), _4y: createBpsCentsRatioSatsUsdPattern(this, 'price_ema_4y'), }, }, dca: { satsPerDay: createSeriesPattern18(this, 'dca_sats_per_day'), period: { stack: create_10y1m1w1y2y3m3y4y5y6m6y8yPattern3(this, 'dca_stack'), costBasis: { _1w: createCentsSatsUsdPattern(this, 'dca_cost_basis_1w'), _1m: createCentsSatsUsdPattern(this, 'dca_cost_basis_1m'), _3m: createCentsSatsUsdPattern(this, 'dca_cost_basis_3m'), _6m: createCentsSatsUsdPattern(this, 'dca_cost_basis_6m'), _1y: createCentsSatsUsdPattern(this, 'dca_cost_basis_1y'), _2y: createCentsSatsUsdPattern(this, 'dca_cost_basis_2y'), _3y: createCentsSatsUsdPattern(this, 'dca_cost_basis_3y'), _4y: createCentsSatsUsdPattern(this, 'dca_cost_basis_4y'), _5y: createCentsSatsUsdPattern(this, 'dca_cost_basis_5y'), _6y: createCentsSatsUsdPattern(this, 'dca_cost_basis_6y'), _8y: createCentsSatsUsdPattern(this, 'dca_cost_basis_8y'), _10y: createCentsSatsUsdPattern(this, 'dca_cost_basis_10y'), }, return: create_10y1m1w1y2y3m3y4y5y6m6y8yPattern2(this, 'dca_return'), cagr: create_10y2y3y4y5y6y8yPattern(this, 'dca_cagr'), lumpSumStack: create_10y1m1w1y2y3m3y4y5y6m6y8yPattern3(this, 'lump_sum_stack'), lumpSumReturn: create_10y1m1w1y2y3m3y4y5y6m6y8yPattern2(this, 'lump_sum_return'), }, class: { stack: { from2015: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2015'), from2016: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2016'), from2017: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2017'), from2018: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2018'), from2019: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2019'), from2020: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2020'), from2021: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2021'), from2022: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2022'), from2023: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2023'), from2024: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2024'), from2025: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2025'), from2026: createBtcCentsSatsUsdPattern(this, 'dca_stack_from_2026'), }, costBasis: { from2015: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2015'), from2016: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2016'), from2017: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2017'), from2018: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2018'), from2019: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2019'), from2020: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2020'), from2021: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2021'), from2022: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2022'), from2023: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2023'), from2024: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2024'), from2025: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2025'), from2026: createCentsSatsUsdPattern(this, 'dca_cost_basis_from_2026'), }, return: { from2015: createBpsPercentRatioPattern(this, 'dca_return_from_2015'), from2016: createBpsPercentRatioPattern(this, 'dca_return_from_2016'), from2017: createBpsPercentRatioPattern(this, 'dca_return_from_2017'), from2018: createBpsPercentRatioPattern(this, 'dca_return_from_2018'), from2019: createBpsPercentRatioPattern(this, 'dca_return_from_2019'), from2020: createBpsPercentRatioPattern(this, 'dca_return_from_2020'), from2021: createBpsPercentRatioPattern(this, 'dca_return_from_2021'), from2022: createBpsPercentRatioPattern(this, 'dca_return_from_2022'), from2023: createBpsPercentRatioPattern(this, 'dca_return_from_2023'), from2024: createBpsPercentRatioPattern(this, 'dca_return_from_2024'), from2025: createBpsPercentRatioPattern(this, 'dca_return_from_2025'), from2026: createBpsPercentRatioPattern(this, 'dca_return_from_2026'), }, }, }, technical: { rsi: { _24h: createAverageGainsLossesRsiStochPattern(this, 'rsi', '24h'), _1w: createAverageGainsLossesRsiStochPattern(this, 'rsi', '1w'), _1m: createAverageGainsLossesRsiStochPattern(this, 'rsi', '1m'), }, stochK: createBpsPercentRatioPattern3(this, 'stoch_k'), stochD: createBpsPercentRatioPattern3(this, 'stoch_d'), piCycle: createBpsRatioPattern2(this, 'pi_cycle'), macd: { _24h: { emaFast: createSeriesPattern1(this, 'macd_ema_fast_24h'), emaSlow: createSeriesPattern1(this, 'macd_ema_slow_24h'), line: createSeriesPattern1(this, 'macd_line_24h'), signal: createSeriesPattern1(this, 'macd_signal_24h'), histogram: createSeriesPattern1(this, 'macd_histogram_24h'), }, _1w: { emaFast: createSeriesPattern1(this, 'macd_ema_fast_1w'), emaSlow: createSeriesPattern1(this, 'macd_ema_slow_1w'), line: createSeriesPattern1(this, 'macd_line_1w'), signal: createSeriesPattern1(this, 'macd_signal_1w'), histogram: createSeriesPattern1(this, 'macd_histogram_1w'), }, _1m: { emaFast: createSeriesPattern1(this, 'macd_ema_fast_1m'), emaSlow: createSeriesPattern1(this, 'macd_ema_slow_1m'), line: createSeriesPattern1(this, 'macd_line_1m'), signal: createSeriesPattern1(this, 'macd_signal_1m'), histogram: createSeriesPattern1(this, 'macd_histogram_1m'), }, }, }, }, pools: { pool: createSeriesPattern18(this, 'pool'), major: { unknown: createBlocksDominanceRewardsPattern(this, 'unknown'), luxor: createBlocksDominanceRewardsPattern(this, 'luxor'), btccom: createBlocksDominanceRewardsPattern(this, 'btccom'), btctop: createBlocksDominanceRewardsPattern(this, 'btctop'), btcguild: createBlocksDominanceRewardsPattern(this, 'btcguild'), eligius: createBlocksDominanceRewardsPattern(this, 'eligius'), f2pool: createBlocksDominanceRewardsPattern(this, 'f2pool'), braiinspool: createBlocksDominanceRewardsPattern(this, 'braiinspool'), antpool: createBlocksDominanceRewardsPattern(this, 'antpool'), btcc: createBlocksDominanceRewardsPattern(this, 'btcc'), bwpool: createBlocksDominanceRewardsPattern(this, 'bwpool'), bitfury: createBlocksDominanceRewardsPattern(this, 'bitfury'), viabtc: createBlocksDominanceRewardsPattern(this, 'viabtc'), poolin: createBlocksDominanceRewardsPattern(this, 'poolin'), spiderpool: createBlocksDominanceRewardsPattern(this, 'spiderpool'), binancepool: createBlocksDominanceRewardsPattern(this, 'binancepool'), foundryusa: createBlocksDominanceRewardsPattern(this, 'foundryusa'), sbicrypto: createBlocksDominanceRewardsPattern(this, 'sbicrypto'), marapool: createBlocksDominanceRewardsPattern(this, 'marapool'), secpool: createBlocksDominanceRewardsPattern(this, 'secpool'), ocean: createBlocksDominanceRewardsPattern(this, 'ocean'), whitepool: createBlocksDominanceRewardsPattern(this, 'whitepool'), }, minor: { blockfills: createBlocksDominancePattern(this, 'blockfills'), ultimuspool: createBlocksDominancePattern(this, 'ultimuspool'), terrapool: createBlocksDominancePattern(this, 'terrapool'), onethash: createBlocksDominancePattern(this, 'onethash'), bitfarms: createBlocksDominancePattern(this, 'bitfarms'), huobipool: createBlocksDominancePattern(this, 'huobipool'), wayicn: createBlocksDominancePattern(this, 'wayicn'), canoepool: createBlocksDominancePattern(this, 'canoepool'), bitcoincom: createBlocksDominancePattern(this, 'bitcoincom'), pool175btc: createBlocksDominancePattern(this, 'pool175btc'), gbminers: createBlocksDominancePattern(this, 'gbminers'), axbt: createBlocksDominancePattern(this, 'axbt'), asicminer: createBlocksDominancePattern(this, 'asicminer'), bitminter: createBlocksDominancePattern(this, 'bitminter'), bitcoinrussia: createBlocksDominancePattern(this, 'bitcoinrussia'), btcserv: createBlocksDominancePattern(this, 'btcserv'), simplecoinus: createBlocksDominancePattern(this, 'simplecoinus'), ozcoin: createBlocksDominancePattern(this, 'ozcoin'), eclipsemc: createBlocksDominancePattern(this, 'eclipsemc'), maxbtc: createBlocksDominancePattern(this, 'maxbtc'), triplemining: createBlocksDominancePattern(this, 'triplemining'), coinlab: createBlocksDominancePattern(this, 'coinlab'), pool50btc: createBlocksDominancePattern(this, 'pool50btc'), ghashio: createBlocksDominancePattern(this, 'ghashio'), stminingcorp: createBlocksDominancePattern(this, 'stminingcorp'), bitparking: createBlocksDominancePattern(this, 'bitparking'), mmpool: createBlocksDominancePattern(this, 'mmpool'), polmine: createBlocksDominancePattern(this, 'polmine'), kncminer: createBlocksDominancePattern(this, 'kncminer'), bitalo: createBlocksDominancePattern(this, 'bitalo'), hhtt: createBlocksDominancePattern(this, 'hhtt'), megabigpower: createBlocksDominancePattern(this, 'megabigpower'), mtred: createBlocksDominancePattern(this, 'mtred'), nmcbit: createBlocksDominancePattern(this, 'nmcbit'), yourbtcnet: createBlocksDominancePattern(this, 'yourbtcnet'), givemecoins: createBlocksDominancePattern(this, 'givemecoins'), multicoinco: createBlocksDominancePattern(this, 'multicoinco'), bcpoolio: createBlocksDominancePattern(this, 'bcpoolio'), cointerra: createBlocksDominancePattern(this, 'cointerra'), kanopool: createBlocksDominancePattern(this, 'kanopool'), solock: createBlocksDominancePattern(this, 'solock'), ckpool: createBlocksDominancePattern(this, 'ckpool'), nicehash: createBlocksDominancePattern(this, 'nicehash'), bitclub: createBlocksDominancePattern(this, 'bitclub'), bitcoinaffiliatenetwork: createBlocksDominancePattern(this, 'bitcoinaffiliatenetwork'), exxbw: createBlocksDominancePattern(this, 'exxbw'), bitsolo: createBlocksDominancePattern(this, 'bitsolo'), twentyoneinc: createBlocksDominancePattern(this, 'twentyoneinc'), digitalbtc: createBlocksDominancePattern(this, 'digitalbtc'), eightbaochi: createBlocksDominancePattern(this, 'eightbaochi'), mybtccoinpool: createBlocksDominancePattern(this, 'mybtccoinpool'), tbdice: createBlocksDominancePattern(this, 'tbdice'), hashpool: createBlocksDominancePattern(this, 'hashpool'), nexious: createBlocksDominancePattern(this, 'nexious'), bravomining: createBlocksDominancePattern(this, 'bravomining'), hotpool: createBlocksDominancePattern(this, 'hotpool'), okexpool: createBlocksDominancePattern(this, 'okexpool'), bcmonster: createBlocksDominancePattern(this, 'bcmonster'), onehash: createBlocksDominancePattern(this, 'onehash'), bixin: createBlocksDominancePattern(this, 'bixin'), tatmaspool: createBlocksDominancePattern(this, 'tatmaspool'), connectbtc: createBlocksDominancePattern(this, 'connectbtc'), batpool: createBlocksDominancePattern(this, 'batpool'), waterhole: createBlocksDominancePattern(this, 'waterhole'), dcexploration: createBlocksDominancePattern(this, 'dcexploration'), dcex: createBlocksDominancePattern(this, 'dcex'), btpool: createBlocksDominancePattern(this, 'btpool'), fiftyeightcoin: createBlocksDominancePattern(this, 'fiftyeightcoin'), bitcoinindia: createBlocksDominancePattern(this, 'bitcoinindia'), shawnp0wers: createBlocksDominancePattern(this, 'shawnp0wers'), phashio: createBlocksDominancePattern(this, 'phashio'), rigpool: createBlocksDominancePattern(this, 'rigpool'), haozhuzhu: createBlocksDominancePattern(this, 'haozhuzhu'), sevenpool: createBlocksDominancePattern(this, 'sevenpool'), miningkings: createBlocksDominancePattern(this, 'miningkings'), hashbx: createBlocksDominancePattern(this, 'hashbx'), dpool: createBlocksDominancePattern(this, 'dpool'), rawpool: createBlocksDominancePattern(this, 'rawpool'), haominer: createBlocksDominancePattern(this, 'haominer'), helix: createBlocksDominancePattern(this, 'helix'), bitcoinukraine: createBlocksDominancePattern(this, 'bitcoinukraine'), secretsuperstar: createBlocksDominancePattern(this, 'secretsuperstar'), tigerpoolnet: createBlocksDominancePattern(this, 'tigerpoolnet'), sigmapoolcom: createBlocksDominancePattern(this, 'sigmapoolcom'), okpooltop: createBlocksDominancePattern(this, 'okpooltop'), hummerpool: createBlocksDominancePattern(this, 'hummerpool'), tangpool: createBlocksDominancePattern(this, 'tangpool'), bytepool: createBlocksDominancePattern(this, 'bytepool'), novablock: createBlocksDominancePattern(this, 'novablock'), miningcity: createBlocksDominancePattern(this, 'miningcity'), minerium: createBlocksDominancePattern(this, 'minerium'), lubiancom: createBlocksDominancePattern(this, 'lubiancom'), okkong: createBlocksDominancePattern(this, 'okkong'), aaopool: createBlocksDominancePattern(this, 'aaopool'), emcdpool: createBlocksDominancePattern(this, 'emcdpool'), arkpool: createBlocksDominancePattern(this, 'arkpool'), purebtccom: createBlocksDominancePattern(this, 'purebtccom'), kucoinpool: createBlocksDominancePattern(this, 'kucoinpool'), entrustcharitypool: createBlocksDominancePattern(this, 'entrustcharitypool'), okminer: createBlocksDominancePattern(this, 'okminer'), titan: createBlocksDominancePattern(this, 'titan'), pegapool: createBlocksDominancePattern(this, 'pegapool'), btcnuggets: createBlocksDominancePattern(this, 'btcnuggets'), cloudhashing: createBlocksDominancePattern(this, 'cloudhashing'), digitalxmintsy: createBlocksDominancePattern(this, 'digitalxmintsy'), telco214: createBlocksDominancePattern(this, 'telco214'), btcpoolparty: createBlocksDominancePattern(this, 'btcpoolparty'), multipool: createBlocksDominancePattern(this, 'multipool'), transactioncoinmining: createBlocksDominancePattern(this, 'transactioncoinmining'), btcdig: createBlocksDominancePattern(this, 'btcdig'), trickysbtcpool: createBlocksDominancePattern(this, 'trickysbtcpool'), btcmp: createBlocksDominancePattern(this, 'btcmp'), eobot: createBlocksDominancePattern(this, 'eobot'), unomp: createBlocksDominancePattern(this, 'unomp'), patels: createBlocksDominancePattern(this, 'patels'), gogreenlight: createBlocksDominancePattern(this, 'gogreenlight'), bitcoinindiapool: createBlocksDominancePattern(this, 'bitcoinindiapool'), ekanembtc: createBlocksDominancePattern(this, 'ekanembtc'), canoe: createBlocksDominancePattern(this, 'canoe'), tiger: createBlocksDominancePattern(this, 'tiger'), onem1x: createBlocksDominancePattern(this, 'onem1x'), zulupool: createBlocksDominancePattern(this, 'zulupool'), wiz: createBlocksDominancePattern(this, 'wiz'), wk057: createBlocksDominancePattern(this, 'wk057'), futurebitapollosolo: createBlocksDominancePattern(this, 'futurebitapollosolo'), carbonnegative: createBlocksDominancePattern(this, 'carbonnegative'), portlandhodl: createBlocksDominancePattern(this, 'portlandhodl'), phoenix: createBlocksDominancePattern(this, 'phoenix'), neopool: createBlocksDominancePattern(this, 'neopool'), maxipool: createBlocksDominancePattern(this, 'maxipool'), bitfufupool: createBlocksDominancePattern(this, 'bitfufupool'), gdpool: createBlocksDominancePattern(this, 'gdpool'), miningdutch: createBlocksDominancePattern(this, 'miningdutch'), publicpool: createBlocksDominancePattern(this, 'publicpool'), miningsquared: createBlocksDominancePattern(this, 'miningsquared'), innopolistech: createBlocksDominancePattern(this, 'innopolistech'), btclab: createBlocksDominancePattern(this, 'btclab'), parasite: createBlocksDominancePattern(this, 'parasite'), redrockpool: createBlocksDominancePattern(this, 'redrockpool'), est3lar: createBlocksDominancePattern(this, 'est3lar'), }, }, prices: { split: { open: createCentsSatsUsdPattern3(this, 'price_open'), high: createCentsSatsUsdPattern3(this, 'price_high'), low: createCentsSatsUsdPattern3(this, 'price_low'), close: createCentsSatsUsdPattern3(this, 'price_close'), }, ohlc: { usd: createSeriesPattern2(this, 'price_ohlc'), cents: createSeriesPattern2(this, 'price_ohlc_cents'), sats: createSeriesPattern2(this, 'price_ohlc_sats'), }, spot: { usd: createSeriesPattern1(this, 'price'), cents: createSeriesPattern1(this, 'price_cents'), sats: createSeriesPattern1(this, 'price_sats'), }, }, supply: { state: createSeriesPattern18(this, 'supply_state'), circulating: createBtcCentsSatsUsdPattern(this, 'circulating_supply'), burned: createBaseCumulativeSumPattern3(this, 'unspendable_supply'), inflationRate: createBpsPercentRatioPattern(this, 'inflation_rate'), velocity: { native: createSeriesPattern1(this, 'velocity'), fiat: createSeriesPattern1(this, 'velocity_fiat'), }, marketCap: createCentsDeltaUsdPattern(this, 'market_cap'), marketMinusRealizedCapGrowthRate: create_1m1w1y24hPattern(this, 'market_minus_realized_cap_growth_rate'), hodledOrLost: createBtcCentsSatsUsdPattern(this, 'hodled_or_lost_supply'), }, cohorts: { utxo: { all: { supply: { total: createBtcCentsSatsUsdPattern(this, 'supply'), half: createBtcCentsSatsUsdPattern(this, 'supply_half'), delta: createAbsoluteRatePattern(this, 'supply_delta'), inProfit: createBtcCentsSatsToUsdPattern2(this, 'supply_in_profit'), inLoss: createBtcCentsSatsToUsdPattern2(this, 'supply_in_loss'), }, outputs: createUnspentPattern(this, 'utxo_count'), activity: { transferVolume: createBaseCumulativeInSumPattern(this, 'transfer_volume'), coindaysDestroyed: createBaseCumulativeSumPattern(this, 'coindays_destroyed'), coinyearsDestroyed: createSeriesPattern1(this, 'coinyears_destroyed'), dormancy: create_1m1w1y24hPattern(this, 'dormancy'), }, realized: { cap: createCentsDeltaToUsdPattern(this, 'realized_cap'), profit: createBaseCumulativeSumToPattern(this, 'realized_profit'), loss: { base: createCentsUsdPattern2(this, 'realized_loss'), cumulative: createCentsUsdPattern2(this, 'realized_loss_cumulative'), sum: create_1m1w1y24hPattern5(this, 'realized_loss_sum'), negative: createBaseSumPattern(this, 'neg_realized_loss'), toRcap: createBpsPercentRatioPattern4(this, 'realized_loss_to_rcap'), }, price: { usd: createSeriesPattern1(this, 'realized_price'), cents: createSeriesPattern1(this, 'realized_price_cents'), sats: createSeriesPattern1(this, 'realized_price_sats'), bps: createSeriesPattern1(this, 'realized_price_ratio_bps'), ratio: createSeriesPattern1(this, 'realized_price_ratio'), percentiles: createPct1Pct2Pct5Pct95Pct98Pct99Pattern(this, 'realized_price'), sma: create_1m1w1y2y4yAllPattern(this, 'realized_price_ratio_sma'), stdDev: { all: { sd: createSeriesPattern1(this, 'realized_price_ratio_sd'), zscore: createSeriesPattern1(this, 'realized_price_ratio_zscore'), _0sd: createCentsSatsUsdPattern(this, 'realized_price_0sd'), p05sd: createPriceRatioPattern(this, 'realized_price', 'p0_5sd'), p1sd: createPriceRatioPattern(this, 'realized_price', 'p1sd'), p15sd: createPriceRatioPattern(this, 'realized_price', 'p1_5sd'), p2sd: createPriceRatioPattern(this, 'realized_price', 'p2sd'), p25sd: createPriceRatioPattern(this, 'realized_price', 'p2_5sd'), p3sd: createPriceRatioPattern(this, 'realized_price', 'p3sd'), m05sd: createPriceRatioPattern(this, 'realized_price', 'm0_5sd'), m1sd: createPriceRatioPattern(this, 'realized_price', 'm1sd'), m15sd: createPriceRatioPattern(this, 'realized_price', 'm1_5sd'), m2sd: createPriceRatioPattern(this, 'realized_price', 'm2sd'), m25sd: createPriceRatioPattern(this, 'realized_price', 'm2_5sd'), m3sd: createPriceRatioPattern(this, 'realized_price', 'm3sd'), }, _4y: { sd: createSeriesPattern1(this, 'realized_price_ratio_sd_4y'), zscore: createSeriesPattern1(this, 'realized_price_ratio_zscore_4y'), _0sd: createCentsSatsUsdPattern(this, 'realized_price_0sd_4y'), p05sd: createPriceRatioPattern(this, 'realized_price', 'p0_5sd_4y'), p1sd: createPriceRatioPattern(this, 'realized_price', 'p1sd_4y'), p15sd: createPriceRatioPattern(this, 'realized_price', 'p1_5sd_4y'), p2sd: createPriceRatioPattern(this, 'realized_price', 'p2sd_4y'), p25sd: createPriceRatioPattern(this, 'realized_price', 'p2_5sd_4y'), p3sd: createPriceRatioPattern(this, 'realized_price', 'p3sd_4y'), m05sd: createPriceRatioPattern(this, 'realized_price', 'm0_5sd_4y'), m1sd: createPriceRatioPattern(this, 'realized_price', 'm1sd_4y'), m15sd: createPriceRatioPattern(this, 'realized_price', 'm1_5sd_4y'), m2sd: createPriceRatioPattern(this, 'realized_price', 'm2sd_4y'), m25sd: createPriceRatioPattern(this, 'realized_price', 'm2_5sd_4y'), m3sd: createPriceRatioPattern(this, 'realized_price', 'm3sd_4y'), }, _2y: { sd: createSeriesPattern1(this, 'realized_price_ratio_sd_2y'), zscore: createSeriesPattern1(this, 'realized_price_ratio_zscore_2y'), _0sd: createCentsSatsUsdPattern(this, 'realized_price_0sd_2y'), p05sd: createPriceRatioPattern(this, 'realized_price', 'p0_5sd_2y'), p1sd: createPriceRatioPattern(this, 'realized_price', 'p1sd_2y'), p15sd: createPriceRatioPattern(this, 'realized_price', 'p1_5sd_2y'), p2sd: createPriceRatioPattern(this, 'realized_price', 'p2sd_2y'), p25sd: createPriceRatioPattern(this, 'realized_price', 'p2_5sd_2y'), p3sd: createPriceRatioPattern(this, 'realized_price', 'p3sd_2y'), m05sd: createPriceRatioPattern(this, 'realized_price', 'm0_5sd_2y'), m1sd: createPriceRatioPattern(this, 'realized_price', 'm1sd_2y'), m15sd: createPriceRatioPattern(this, 'realized_price', 'm1_5sd_2y'), m2sd: createPriceRatioPattern(this, 'realized_price', 'm2sd_2y'), m25sd: createPriceRatioPattern(this, 'realized_price', 'm2_5sd_2y'), m3sd: createPriceRatioPattern(this, 'realized_price', 'm3sd_2y'), }, _1y: { sd: createSeriesPattern1(this, 'realized_price_ratio_sd_1y'), zscore: createSeriesPattern1(this, 'realized_price_ratio_zscore_1y'), _0sd: createCentsSatsUsdPattern(this, 'realized_price_0sd_1y'), p05sd: createPriceRatioPattern(this, 'realized_price', 'p0_5sd_1y'), p1sd: createPriceRatioPattern(this, 'realized_price', 'p1sd_1y'), p15sd: createPriceRatioPattern(this, 'realized_price', 'p1_5sd_1y'), p2sd: createPriceRatioPattern(this, 'realized_price', 'p2sd_1y'), p25sd: createPriceRatioPattern(this, 'realized_price', 'p2_5sd_1y'), p3sd: createPriceRatioPattern(this, 'realized_price', 'p3sd_1y'), m05sd: createPriceRatioPattern(this, 'realized_price', 'm0_5sd_1y'), m1sd: createPriceRatioPattern(this, 'realized_price', 'm1sd_1y'), m15sd: createPriceRatioPattern(this, 'realized_price', 'm1_5sd_1y'), m2sd: createPriceRatioPattern(this, 'realized_price', 'm2sd_1y'), m25sd: createPriceRatioPattern(this, 'realized_price', 'm2_5sd_1y'), m3sd: createPriceRatioPattern(this, 'realized_price', 'm3sd_1y'), }, }, }, mvrv: createSeriesPattern1(this, 'mvrv'), netPnl: createBaseChangeCumulativeDeltaSumToPattern(this, 'net'), sopr: { valueDestroyed: createBaseCumulativeSumPattern(this, 'value_destroyed'), ratio: create_1m1w1y24hPattern(this, 'sopr'), adjusted: { ratio: create_1m1w1y24hPattern(this, 'asopr'), transferVolume: createBaseCumulativeSumPattern(this, 'adj_value_created'), valueDestroyed: createBaseCumulativeSumPattern(this, 'adj_value_destroyed'), }, }, grossPnl: createBaseCumulativeSumPattern4(this, 'realized_gross_pnl'), sellSideRiskRatio: create_1m1w1y24hPattern6(this, 'sell_side_risk_ratio'), peakRegret: createBaseCumulativeSumToPattern(this, 'realized_peak_regret'), investor: createPricePattern(this, 'investor_price'), profitToLossRatio: create_1m1w1y24hPattern(this, 'realized_profit_to_loss_ratio'), }, costBasis: { min: createCentsSatsUsdPattern(this, 'cost_basis_min'), max: createCentsSatsUsdPattern(this, 'cost_basis_max'), percentiles: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'cost_basis'), investedCapital: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'invested_capital'), supplyDensity: createBpsPercentRatioPattern3(this, 'supply_density'), }, unrealized: { nupl: createBpsRatioPattern(this, 'nupl'), profit: { usd: createSeriesPattern1(this, 'unrealized_profit'), cents: createSeriesPattern1(this, 'unrealized_profit_cents'), toMcap: createBpsPercentRatioPattern3(this, 'unrealized_profit_to_mcap'), toOwnGrossPnl: createBpsPercentRatioPattern3(this, 'unrealized_profit_to_own_gross_pnl'), }, loss: { usd: createSeriesPattern1(this, 'unrealized_loss'), cents: createSeriesPattern1(this, 'unrealized_loss_cents'), negative: createSeriesPattern1(this, 'neg_unrealized_loss'), toMcap: createBpsPercentRatioPattern3(this, 'unrealized_loss_to_mcap'), toOwnGrossPnl: createBpsPercentRatioPattern3(this, 'unrealized_loss_to_own_gross_pnl'), }, netPnl: { usd: createSeriesPattern1(this, 'net_unrealized_pnl'), cents: createSeriesPattern1(this, 'net_unrealized_pnl_cents'), toOwnGrossPnl: createBpsPercentRatioPattern(this, 'net_unrealized_pnl_to_own_gross_pnl'), }, grossPnl: createCentsUsdPattern2(this, 'unrealized_gross_pnl'), investedCapital: createInPattern(this, 'invested_capital_in'), sentiment: { painIndex: createCentsUsdPattern2(this, 'pain_index'), greedIndex: createCentsUsdPattern2(this, 'greed_index'), net: createCentsUsdPattern(this, 'net_sentiment'), }, }, }, sth: { supply: createDeltaHalfInToTotalPattern2(this, 'sth_supply'), outputs: createUnspentPattern(this, 'sth_utxo_count'), activity: { transferVolume: createBaseCumulativeInSumPattern(this, 'sth_transfer_volume'), coindaysDestroyed: createBaseCumulativeSumPattern(this, 'sth_coindays_destroyed'), coinyearsDestroyed: createSeriesPattern1(this, 'sth_coinyears_destroyed'), dormancy: create_1m1w1y24hPattern(this, 'sth_dormancy'), }, realized: { cap: createCentsDeltaToUsdPattern(this, 'sth_realized_cap'), profit: createBaseCumulativeSumToPattern(this, 'sth_realized_profit'), loss: { base: createCentsUsdPattern2(this, 'sth_realized_loss'), cumulative: createCentsUsdPattern2(this, 'sth_realized_loss_cumulative'), sum: create_1m1w1y24hPattern5(this, 'sth_realized_loss_sum'), negative: createBaseSumPattern(this, 'sth_neg_realized_loss'), toRcap: createBpsPercentRatioPattern4(this, 'sth_realized_loss_to_rcap'), }, price: { usd: createSeriesPattern1(this, 'sth_realized_price'), cents: createSeriesPattern1(this, 'sth_realized_price_cents'), sats: createSeriesPattern1(this, 'sth_realized_price_sats'), bps: createSeriesPattern1(this, 'sth_realized_price_ratio_bps'), ratio: createSeriesPattern1(this, 'sth_realized_price_ratio'), percentiles: createPct1Pct2Pct5Pct95Pct98Pct99Pattern(this, 'sth_realized_price'), sma: create_1m1w1y2y4yAllPattern(this, 'sth_realized_price_ratio_sma'), stdDev: { all: { sd: createSeriesPattern1(this, 'sth_realized_price_ratio_sd'), zscore: createSeriesPattern1(this, 'sth_realized_price_ratio_zscore'), _0sd: createCentsSatsUsdPattern(this, 'sth_realized_price_0sd'), p05sd: createPriceRatioPattern(this, 'sth_realized_price', 'p0_5sd'), p1sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1sd'), p15sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1_5sd'), p2sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2sd'), p25sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2_5sd'), p3sd: createPriceRatioPattern(this, 'sth_realized_price', 'p3sd'), m05sd: createPriceRatioPattern(this, 'sth_realized_price', 'm0_5sd'), m1sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1sd'), m15sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1_5sd'), m2sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2sd'), m25sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2_5sd'), m3sd: createPriceRatioPattern(this, 'sth_realized_price', 'm3sd'), }, _4y: { sd: createSeriesPattern1(this, 'sth_realized_price_ratio_sd_4y'), zscore: createSeriesPattern1(this, 'sth_realized_price_ratio_zscore_4y'), _0sd: createCentsSatsUsdPattern(this, 'sth_realized_price_0sd_4y'), p05sd: createPriceRatioPattern(this, 'sth_realized_price', 'p0_5sd_4y'), p1sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1sd_4y'), p15sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1_5sd_4y'), p2sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2sd_4y'), p25sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2_5sd_4y'), p3sd: createPriceRatioPattern(this, 'sth_realized_price', 'p3sd_4y'), m05sd: createPriceRatioPattern(this, 'sth_realized_price', 'm0_5sd_4y'), m1sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1sd_4y'), m15sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1_5sd_4y'), m2sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2sd_4y'), m25sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2_5sd_4y'), m3sd: createPriceRatioPattern(this, 'sth_realized_price', 'm3sd_4y'), }, _2y: { sd: createSeriesPattern1(this, 'sth_realized_price_ratio_sd_2y'), zscore: createSeriesPattern1(this, 'sth_realized_price_ratio_zscore_2y'), _0sd: createCentsSatsUsdPattern(this, 'sth_realized_price_0sd_2y'), p05sd: createPriceRatioPattern(this, 'sth_realized_price', 'p0_5sd_2y'), p1sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1sd_2y'), p15sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1_5sd_2y'), p2sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2sd_2y'), p25sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2_5sd_2y'), p3sd: createPriceRatioPattern(this, 'sth_realized_price', 'p3sd_2y'), m05sd: createPriceRatioPattern(this, 'sth_realized_price', 'm0_5sd_2y'), m1sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1sd_2y'), m15sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1_5sd_2y'), m2sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2sd_2y'), m25sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2_5sd_2y'), m3sd: createPriceRatioPattern(this, 'sth_realized_price', 'm3sd_2y'), }, _1y: { sd: createSeriesPattern1(this, 'sth_realized_price_ratio_sd_1y'), zscore: createSeriesPattern1(this, 'sth_realized_price_ratio_zscore_1y'), _0sd: createCentsSatsUsdPattern(this, 'sth_realized_price_0sd_1y'), p05sd: createPriceRatioPattern(this, 'sth_realized_price', 'p0_5sd_1y'), p1sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1sd_1y'), p15sd: createPriceRatioPattern(this, 'sth_realized_price', 'p1_5sd_1y'), p2sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2sd_1y'), p25sd: createPriceRatioPattern(this, 'sth_realized_price', 'p2_5sd_1y'), p3sd: createPriceRatioPattern(this, 'sth_realized_price', 'p3sd_1y'), m05sd: createPriceRatioPattern(this, 'sth_realized_price', 'm0_5sd_1y'), m1sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1sd_1y'), m15sd: createPriceRatioPattern(this, 'sth_realized_price', 'm1_5sd_1y'), m2sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2sd_1y'), m25sd: createPriceRatioPattern(this, 'sth_realized_price', 'm2_5sd_1y'), m3sd: createPriceRatioPattern(this, 'sth_realized_price', 'm3sd_1y'), }, }, }, mvrv: createSeriesPattern1(this, 'sth_mvrv'), netPnl: createBaseChangeCumulativeDeltaSumToPattern(this, 'sth_net'), sopr: { valueDestroyed: createBaseCumulativeSumPattern(this, 'sth_value_destroyed'), ratio: create_1m1w1y24hPattern(this, 'sth_sopr'), adjusted: { ratio: create_1m1w1y24hPattern(this, 'sth_asopr'), transferVolume: createBaseCumulativeSumPattern(this, 'sth_adj_value_created'), valueDestroyed: createBaseCumulativeSumPattern(this, 'sth_adj_value_destroyed'), }, }, grossPnl: createBaseCumulativeSumPattern4(this, 'sth_realized_gross_pnl'), sellSideRiskRatio: create_1m1w1y24hPattern6(this, 'sth_sell_side_risk_ratio'), peakRegret: createBaseCumulativeSumToPattern(this, 'sth_realized_peak_regret'), investor: createPricePattern(this, 'sth_investor_price'), profitToLossRatio: create_1m1w1y24hPattern(this, 'sth_realized_profit_to_loss_ratio'), }, costBasis: { min: createCentsSatsUsdPattern(this, 'sth_cost_basis_min'), max: createCentsSatsUsdPattern(this, 'sth_cost_basis_max'), percentiles: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'sth_cost_basis'), investedCapital: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'sth_invested_capital'), supplyDensity: createBpsPercentRatioPattern3(this, 'sth_supply_density'), }, unrealized: { nupl: createBpsRatioPattern(this, 'sth_nupl'), profit: createCentsToUsdPattern4(this, 'sth_unrealized_profit'), loss: createCentsNegativeToUsdPattern2(this, 'sth'), netPnl: createCentsToUsdPattern3(this, 'sth_net_unrealized_pnl'), grossPnl: createCentsUsdPattern2(this, 'sth_unrealized_gross_pnl'), investedCapital: createInPattern(this, 'sth_invested_capital_in'), sentiment: { painIndex: createCentsUsdPattern2(this, 'sth_pain_index'), greedIndex: createCentsUsdPattern2(this, 'sth_greed_index'), net: createCentsUsdPattern(this, 'sth_net_sentiment'), }, }, }, lth: { supply: createDeltaHalfInToTotalPattern2(this, 'lth_supply'), outputs: createUnspentPattern(this, 'lth_utxo_count'), activity: { transferVolume: createBaseCumulativeInSumPattern(this, 'lth_transfer_volume'), coindaysDestroyed: createBaseCumulativeSumPattern(this, 'lth_coindays_destroyed'), coinyearsDestroyed: createSeriesPattern1(this, 'lth_coinyears_destroyed'), dormancy: create_1m1w1y24hPattern(this, 'lth_dormancy'), }, realized: { cap: createCentsDeltaToUsdPattern(this, 'lth_realized_cap'), profit: createBaseCumulativeSumToPattern(this, 'lth_realized_profit'), loss: { base: createCentsUsdPattern2(this, 'lth_realized_loss'), cumulative: createCentsUsdPattern2(this, 'lth_realized_loss_cumulative'), sum: create_1m1w1y24hPattern5(this, 'lth_realized_loss_sum'), negative: createBaseSumPattern(this, 'lth_neg_realized_loss'), toRcap: createBpsPercentRatioPattern4(this, 'lth_realized_loss_to_rcap'), }, price: { usd: createSeriesPattern1(this, 'lth_realized_price'), cents: createSeriesPattern1(this, 'lth_realized_price_cents'), sats: createSeriesPattern1(this, 'lth_realized_price_sats'), bps: createSeriesPattern1(this, 'lth_realized_price_ratio_bps'), ratio: createSeriesPattern1(this, 'lth_realized_price_ratio'), percentiles: createPct1Pct2Pct5Pct95Pct98Pct99Pattern(this, 'lth_realized_price'), sma: create_1m1w1y2y4yAllPattern(this, 'lth_realized_price_ratio_sma'), stdDev: { all: { sd: createSeriesPattern1(this, 'lth_realized_price_ratio_sd'), zscore: createSeriesPattern1(this, 'lth_realized_price_ratio_zscore'), _0sd: createCentsSatsUsdPattern(this, 'lth_realized_price_0sd'), p05sd: createPriceRatioPattern(this, 'lth_realized_price', 'p0_5sd'), p1sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1sd'), p15sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1_5sd'), p2sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2sd'), p25sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2_5sd'), p3sd: createPriceRatioPattern(this, 'lth_realized_price', 'p3sd'), m05sd: createPriceRatioPattern(this, 'lth_realized_price', 'm0_5sd'), m1sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1sd'), m15sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1_5sd'), m2sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2sd'), m25sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2_5sd'), m3sd: createPriceRatioPattern(this, 'lth_realized_price', 'm3sd'), }, _4y: { sd: createSeriesPattern1(this, 'lth_realized_price_ratio_sd_4y'), zscore: createSeriesPattern1(this, 'lth_realized_price_ratio_zscore_4y'), _0sd: createCentsSatsUsdPattern(this, 'lth_realized_price_0sd_4y'), p05sd: createPriceRatioPattern(this, 'lth_realized_price', 'p0_5sd_4y'), p1sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1sd_4y'), p15sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1_5sd_4y'), p2sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2sd_4y'), p25sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2_5sd_4y'), p3sd: createPriceRatioPattern(this, 'lth_realized_price', 'p3sd_4y'), m05sd: createPriceRatioPattern(this, 'lth_realized_price', 'm0_5sd_4y'), m1sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1sd_4y'), m15sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1_5sd_4y'), m2sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2sd_4y'), m25sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2_5sd_4y'), m3sd: createPriceRatioPattern(this, 'lth_realized_price', 'm3sd_4y'), }, _2y: { sd: createSeriesPattern1(this, 'lth_realized_price_ratio_sd_2y'), zscore: createSeriesPattern1(this, 'lth_realized_price_ratio_zscore_2y'), _0sd: createCentsSatsUsdPattern(this, 'lth_realized_price_0sd_2y'), p05sd: createPriceRatioPattern(this, 'lth_realized_price', 'p0_5sd_2y'), p1sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1sd_2y'), p15sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1_5sd_2y'), p2sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2sd_2y'), p25sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2_5sd_2y'), p3sd: createPriceRatioPattern(this, 'lth_realized_price', 'p3sd_2y'), m05sd: createPriceRatioPattern(this, 'lth_realized_price', 'm0_5sd_2y'), m1sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1sd_2y'), m15sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1_5sd_2y'), m2sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2sd_2y'), m25sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2_5sd_2y'), m3sd: createPriceRatioPattern(this, 'lth_realized_price', 'm3sd_2y'), }, _1y: { sd: createSeriesPattern1(this, 'lth_realized_price_ratio_sd_1y'), zscore: createSeriesPattern1(this, 'lth_realized_price_ratio_zscore_1y'), _0sd: createCentsSatsUsdPattern(this, 'lth_realized_price_0sd_1y'), p05sd: createPriceRatioPattern(this, 'lth_realized_price', 'p0_5sd_1y'), p1sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1sd_1y'), p15sd: createPriceRatioPattern(this, 'lth_realized_price', 'p1_5sd_1y'), p2sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2sd_1y'), p25sd: createPriceRatioPattern(this, 'lth_realized_price', 'p2_5sd_1y'), p3sd: createPriceRatioPattern(this, 'lth_realized_price', 'p3sd_1y'), m05sd: createPriceRatioPattern(this, 'lth_realized_price', 'm0_5sd_1y'), m1sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1sd_1y'), m15sd: createPriceRatioPattern(this, 'lth_realized_price', 'm1_5sd_1y'), m2sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2sd_1y'), m25sd: createPriceRatioPattern(this, 'lth_realized_price', 'm2_5sd_1y'), m3sd: createPriceRatioPattern(this, 'lth_realized_price', 'm3sd_1y'), }, }, }, mvrv: createSeriesPattern1(this, 'lth_mvrv'), netPnl: createBaseChangeCumulativeDeltaSumToPattern(this, 'lth_net'), sopr: { valueDestroyed: createBaseCumulativeSumPattern(this, 'lth_value_destroyed'), ratio: create_1m1w1y24hPattern(this, 'lth_sopr'), }, grossPnl: createBaseCumulativeSumPattern4(this, 'lth_realized_gross_pnl'), sellSideRiskRatio: create_1m1w1y24hPattern6(this, 'lth_sell_side_risk_ratio'), peakRegret: createBaseCumulativeSumToPattern(this, 'lth_realized_peak_regret'), investor: createPricePattern(this, 'lth_investor_price'), profitToLossRatio: create_1m1w1y24hPattern(this, 'lth_realized_profit_to_loss_ratio'), }, costBasis: { min: createCentsSatsUsdPattern(this, 'lth_cost_basis_min'), max: createCentsSatsUsdPattern(this, 'lth_cost_basis_max'), percentiles: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'lth_cost_basis'), investedCapital: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'lth_invested_capital'), supplyDensity: createBpsPercentRatioPattern3(this, 'lth_supply_density'), }, unrealized: { nupl: createBpsRatioPattern(this, 'lth_nupl'), profit: createCentsToUsdPattern4(this, 'lth_unrealized_profit'), loss: createCentsNegativeToUsdPattern2(this, 'lth'), netPnl: createCentsToUsdPattern3(this, 'lth_net_unrealized_pnl'), grossPnl: createCentsUsdPattern2(this, 'lth_unrealized_gross_pnl'), investedCapital: createInPattern(this, 'lth_invested_capital_in'), sentiment: { painIndex: createCentsUsdPattern2(this, 'lth_pain_index'), greedIndex: createCentsUsdPattern2(this, 'lth_greed_index'), net: createCentsUsdPattern(this, 'lth_net_sentiment'), }, }, }, ageRange: { under1h: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_1h_old'), _1hTo1d: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_1h_to_1d_old'), _1dTo1w: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_1d_to_1w_old'), _1wTo1m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_1w_to_1m_old'), _1mTo2m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_1m_to_2m_old'), _2mTo3m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_2m_to_3m_old'), _3mTo4m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_3m_to_4m_old'), _4mTo5m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_4m_to_5m_old'), _5mTo6m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_5m_to_6m_old'), _6mTo1y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_6m_to_1y_old'), _1yTo2y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_1y_to_2y_old'), _2yTo3y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_2y_to_3y_old'), _3yTo4y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_3y_to_4y_old'), _4yTo5y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_4y_to_5y_old'), _5yTo6y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_5y_to_6y_old'), _6yTo7y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_6y_to_7y_old'), _7yTo8y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_7y_to_8y_old'), _8yTo10y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_8y_to_10y_old'), _10yTo12y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_10y_to_12y_old'), _12yTo15y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_12y_to_15y_old'), over15y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_15y_old'), }, underAge: { _1w: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_1w_old'), _1m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_1m_old'), _2m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_2m_old'), _3m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_3m_old'), _4m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_4m_old'), _5m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_5m_old'), _6m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_6m_old'), _1y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_1y_old'), _2y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_2y_old'), _3y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_3y_old'), _4y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_4y_old'), _5y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_5y_old'), _6y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_6y_old'), _7y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_7y_old'), _8y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_8y_old'), _10y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_10y_old'), _12y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_12y_old'), _15y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_under_15y_old'), }, overAge: { _1d: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_1d_old'), _1w: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_1w_old'), _1m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_1m_old'), _2m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_2m_old'), _3m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_3m_old'), _4m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_4m_old'), _5m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_5m_old'), _6m: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_6m_old'), _1y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_1y_old'), _2y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_2y_old'), _3y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_3y_old'), _4y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_4y_old'), _5y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_5y_old'), _6y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_6y_old'), _7y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_7y_old'), _8y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_8y_old'), _10y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_10y_old'), _12y: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'utxos_over_12y_old'), }, epoch: { _0: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'epoch_0'), _1: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'epoch_1'), _2: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'epoch_2'), _3: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'epoch_3'), _4: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'epoch_4'), }, class: { _2009: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2009'), _2010: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2010'), _2011: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2011'), _2012: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2012'), _2013: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2013'), _2014: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2014'), _2015: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2015'), _2016: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2016'), _2017: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2017'), _2018: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2018'), _2019: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2019'), _2020: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2020'), _2021: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2021'), _2022: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2022'), _2023: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2023'), _2024: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2024'), _2025: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2025'), _2026: createActivityOutputsRealizedSupplyUnrealizedPattern(this, 'class_2026'), }, overAmount: { _1sat: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_1sat'), _10sats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_10sats'), _100sats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_100sats'), _1kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_1k_sats'), _10kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_10k_sats'), _100kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_100k_sats'), _1mSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_1m_sats'), _10mSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_10m_sats'), _1btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_1btc'), _10btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_10btc'), _100btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_100btc'), _1kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_1k_btc'), _10kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_10k_btc'), }, amountRange: { _0sats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_0sats'), _1satTo10sats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_1sat_to_10sats'), _10satsTo100sats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_10sats_to_100sats'), _100satsTo1kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_100sats_to_1k_sats'), _1kSatsTo10kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_1k_sats_to_10k_sats'), _10kSatsTo100kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_10k_sats_to_100k_sats'), _100kSatsTo1mSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_100k_sats_to_1m_sats'), _1mSatsTo10mSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_1m_sats_to_10m_sats'), _10mSatsTo1btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_10m_sats_to_1btc'), _1btcTo10btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_1btc_to_10btc'), _10btcTo100btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_10btc_to_100btc'), _100btcTo1kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_100btc_to_1k_btc'), _1kBtcTo10kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_1k_btc_to_10k_btc'), _10kBtcTo100kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_10k_btc_to_100k_btc'), over100kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_over_100k_btc'), }, underAmount: { _10sats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_10sats'), _100sats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_100sats'), _1kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_1k_sats'), _10kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_10k_sats'), _100kSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_100k_sats'), _1mSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_1m_sats'), _10mSats: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_10m_sats'), _1btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_1btc'), _10btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_10btc'), _100btc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_100btc'), _1kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_1k_btc'), _10kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_10k_btc'), _100kBtc: createActivityOutputsRealizedSupplyUnrealizedPattern2(this, 'utxos_under_100k_btc'), }, type: { p2pk65: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2pk65'), p2pk33: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2pk33'), p2pkh: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2pkh'), p2ms: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2ms'), p2sh: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2sh'), p2wpkh: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2wpkh'), p2wsh: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2wsh'), p2tr: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2tr'), p2a: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'p2a'), unknown: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'unknown_outputs'), empty: createActivityOutputsRealizedSupplyUnrealizedPattern3(this, 'empty_outputs'), }, profitability: { range: { over1000pctInProfit: createNuplRealizedSupplyPattern(this, 'utxos_over_1000pct_in_profit'), _500pctTo1000pctInProfit: createNuplRealizedSupplyPattern(this, 'utxos_500pct_to_1000pct_in_profit'), _300pctTo500pctInProfit: createNuplRealizedSupplyPattern(this, 'utxos_300pct_to_500pct_in_profit'), _200pctTo300pctInProfit: createNuplRealizedSupplyPattern(this, 'utxos_200pct_to_300pct_in_profit'), _100pctTo200pctInProfit: createNuplRealizedSupplyPattern(this, 'utxos_100pct_to_200pct_in_profit'), _90pctTo100pctInProfit: createNuplRealizedSupplyPattern(this, 'utxos_90pct_to_100pct_in_profit'), _80pctTo90pctInProfit: createNuplRealizedSupplyPattern(this, 'utxos_80pct_to_90pct_in_profit'), _70pctTo80pctInProfit: createNuplRealizedSupplyPattern(this, 'utxos_70pct_to_80pct_in_profit'), _60pctTo70pctInProfit: createNuplRealizedSupplyPattern(this, 'utxos_60pct_to_70pct_in_profit'), _50pctTo60pctInProfit: createNuplRealizedSupplyPattern(this, 'utxos_50pct_to_60pct_in_profit'), _40pctTo50pctInProfit: createNuplRealizedSupplyPattern(this, 'utxos_40pct_to_50pct_in_profit'), _30pctTo40pctInProfit: createNuplRealizedSupplyPattern(this, 'utxos_30pct_to_40pct_in_profit'), _20pctTo30pctInProfit: createNuplRealizedSupplyPattern(this, 'utxos_20pct_to_30pct_in_profit'), _10pctTo20pctInProfit: createNuplRealizedSupplyPattern(this, 'utxos_10pct_to_20pct_in_profit'), _0pctTo10pctInProfit: createNuplRealizedSupplyPattern(this, 'utxos_0pct_to_10pct_in_profit'), _0pctTo10pctInLoss: createNuplRealizedSupplyPattern(this, 'utxos_0pct_to_10pct_in_loss'), _10pctTo20pctInLoss: createNuplRealizedSupplyPattern(this, 'utxos_10pct_to_20pct_in_loss'), _20pctTo30pctInLoss: createNuplRealizedSupplyPattern(this, 'utxos_20pct_to_30pct_in_loss'), _30pctTo40pctInLoss: createNuplRealizedSupplyPattern(this, 'utxos_30pct_to_40pct_in_loss'), _40pctTo50pctInLoss: createNuplRealizedSupplyPattern(this, 'utxos_40pct_to_50pct_in_loss'), _50pctTo60pctInLoss: createNuplRealizedSupplyPattern(this, 'utxos_50pct_to_60pct_in_loss'), _60pctTo70pctInLoss: createNuplRealizedSupplyPattern(this, 'utxos_60pct_to_70pct_in_loss'), _70pctTo80pctInLoss: createNuplRealizedSupplyPattern(this, 'utxos_70pct_to_80pct_in_loss'), _80pctTo90pctInLoss: createNuplRealizedSupplyPattern(this, 'utxos_80pct_to_90pct_in_loss'), _90pctTo100pctInLoss: createNuplRealizedSupplyPattern(this, 'utxos_90pct_to_100pct_in_loss'), }, profit: { all: createNuplRealizedSupplyPattern(this, 'utxos_in_profit'), _10pct: createNuplRealizedSupplyPattern(this, 'utxos_over_10pct_in_profit'), _20pct: createNuplRealizedSupplyPattern(this, 'utxos_over_20pct_in_profit'), _30pct: createNuplRealizedSupplyPattern(this, 'utxos_over_30pct_in_profit'), _40pct: createNuplRealizedSupplyPattern(this, 'utxos_over_40pct_in_profit'), _50pct: createNuplRealizedSupplyPattern(this, 'utxos_over_50pct_in_profit'), _60pct: createNuplRealizedSupplyPattern(this, 'utxos_over_60pct_in_profit'), _70pct: createNuplRealizedSupplyPattern(this, 'utxos_over_70pct_in_profit'), _80pct: createNuplRealizedSupplyPattern(this, 'utxos_over_80pct_in_profit'), _90pct: createNuplRealizedSupplyPattern(this, 'utxos_over_90pct_in_profit'), _100pct: createNuplRealizedSupplyPattern(this, 'utxos_over_100pct_in_profit'), _200pct: createNuplRealizedSupplyPattern(this, 'utxos_over_200pct_in_profit'), _300pct: createNuplRealizedSupplyPattern(this, 'utxos_over_300pct_in_profit'), _500pct: createNuplRealizedSupplyPattern(this, 'utxos_over_500pct_in_profit'), }, loss: { all: createNuplRealizedSupplyPattern(this, 'utxos_in_loss'), _10pct: createNuplRealizedSupplyPattern(this, 'utxos_over_10pct_in_loss'), _20pct: createNuplRealizedSupplyPattern(this, 'utxos_over_20pct_in_loss'), _30pct: createNuplRealizedSupplyPattern(this, 'utxos_over_30pct_in_loss'), _40pct: createNuplRealizedSupplyPattern(this, 'utxos_over_40pct_in_loss'), _50pct: createNuplRealizedSupplyPattern(this, 'utxos_over_50pct_in_loss'), _60pct: createNuplRealizedSupplyPattern(this, 'utxos_over_60pct_in_loss'), _70pct: createNuplRealizedSupplyPattern(this, 'utxos_over_70pct_in_loss'), _80pct: createNuplRealizedSupplyPattern(this, 'utxos_over_80pct_in_loss'), }, }, matured: { under1h: createBaseCumulativeSumPattern3(this, 'utxos_under_1h_old_matured_supply'), _1hTo1d: createBaseCumulativeSumPattern3(this, 'utxos_1h_to_1d_old_matured_supply'), _1dTo1w: createBaseCumulativeSumPattern3(this, 'utxos_1d_to_1w_old_matured_supply'), _1wTo1m: createBaseCumulativeSumPattern3(this, 'utxos_1w_to_1m_old_matured_supply'), _1mTo2m: createBaseCumulativeSumPattern3(this, 'utxos_1m_to_2m_old_matured_supply'), _2mTo3m: createBaseCumulativeSumPattern3(this, 'utxos_2m_to_3m_old_matured_supply'), _3mTo4m: createBaseCumulativeSumPattern3(this, 'utxos_3m_to_4m_old_matured_supply'), _4mTo5m: createBaseCumulativeSumPattern3(this, 'utxos_4m_to_5m_old_matured_supply'), _5mTo6m: createBaseCumulativeSumPattern3(this, 'utxos_5m_to_6m_old_matured_supply'), _6mTo1y: createBaseCumulativeSumPattern3(this, 'utxos_6m_to_1y_old_matured_supply'), _1yTo2y: createBaseCumulativeSumPattern3(this, 'utxos_1y_to_2y_old_matured_supply'), _2yTo3y: createBaseCumulativeSumPattern3(this, 'utxos_2y_to_3y_old_matured_supply'), _3yTo4y: createBaseCumulativeSumPattern3(this, 'utxos_3y_to_4y_old_matured_supply'), _4yTo5y: createBaseCumulativeSumPattern3(this, 'utxos_4y_to_5y_old_matured_supply'), _5yTo6y: createBaseCumulativeSumPattern3(this, 'utxos_5y_to_6y_old_matured_supply'), _6yTo7y: createBaseCumulativeSumPattern3(this, 'utxos_6y_to_7y_old_matured_supply'), _7yTo8y: createBaseCumulativeSumPattern3(this, 'utxos_7y_to_8y_old_matured_supply'), _8yTo10y: createBaseCumulativeSumPattern3(this, 'utxos_8y_to_10y_old_matured_supply'), _10yTo12y: createBaseCumulativeSumPattern3(this, 'utxos_10y_to_12y_old_matured_supply'), _12yTo15y: createBaseCumulativeSumPattern3(this, 'utxos_12y_to_15y_old_matured_supply'), over15y: createBaseCumulativeSumPattern3(this, 'utxos_over_15y_old_matured_supply'), }, }, addr: { overAmount: { _1sat: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_1sat'), _10sats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_10sats'), _100sats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_100sats'), _1kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_1k_sats'), _10kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_10k_sats'), _100kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_100k_sats'), _1mSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_1m_sats'), _10mSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_10m_sats'), _1btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_1btc'), _10btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_10btc'), _100btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_100btc'), _1kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_1k_btc'), _10kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_10k_btc'), }, amountRange: { _0sats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_0sats'), _1satTo10sats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_1sat_to_10sats'), _10satsTo100sats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_10sats_to_100sats'), _100satsTo1kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_100sats_to_1k_sats'), _1kSatsTo10kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_1k_sats_to_10k_sats'), _10kSatsTo100kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_10k_sats_to_100k_sats'), _100kSatsTo1mSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_100k_sats_to_1m_sats'), _1mSatsTo10mSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_1m_sats_to_10m_sats'), _10mSatsTo1btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_10m_sats_to_1btc'), _1btcTo10btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_1btc_to_10btc'), _10btcTo100btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_10btc_to_100btc'), _100btcTo1kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_100btc_to_1k_btc'), _1kBtcTo10kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_1k_btc_to_10k_btc'), _10kBtcTo100kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_10k_btc_to_100k_btc'), over100kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_over_100k_btc'), }, underAmount: { _10sats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_10sats'), _100sats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_100sats'), _1kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_1k_sats'), _10kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_10k_sats'), _100kSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_100k_sats'), _1mSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_1m_sats'), _10mSats: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_10m_sats'), _1btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_1btc'), _10btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_10btc'), _100btc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_100btc'), _1kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_1k_btc'), _10kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_10k_btc'), _100kBtc: createActivityAddrOutputsRealizedSupplyUnrealizedPattern(this, 'addrs_under_100k_btc'), }, }, }, }; } /** * Create a dynamic series endpoint builder for any series/index combination. * * Use this for programmatic access when the series name is determined at runtime. * For type-safe access, use the `series` tree instead. * * @param {string} series - The series name * @param {Index} index - The index name * @returns {SeriesEndpoint} */ seriesEndpoint(series, index) { return _endpoint(this, series, index); } /** * Compact OpenAPI specification * * Compact OpenAPI specification optimized for LLM consumption. Removes redundant fields while preserving essential API information. Full spec available at `/openapi.json`. * * Endpoint: `GET /api.json` * @returns {Promise<*>} */ async getApi() { return this.getJson(`/api.json`); } /** * Address information * * Retrieve address information including balance and transaction counts. Supports all standard Bitcoin address types (P2PKH, P2SH, P2WPKH, P2WSH, P2TR). * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-address)* * * Endpoint: `GET /api/address/{address}` * * @param {Addr} address * @returns {Promise} */ async getAddress(address) { return this.getJson(`/api/address/${address}`); } /** * Address transactions * * Get transaction history for an address, sorted with newest first. Returns up to 50 mempool transactions plus the first 25 confirmed transactions. Use ?after_txid= for pagination. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-address-transactions)* * * Endpoint: `GET /api/address/{address}/txs` * * @param {Addr} address * @param {Txid=} [after_txid] - Txid to paginate from (return transactions before this one) * @returns {Promise} */ async getAddressTxs(address, after_txid) { const params = new URLSearchParams(); if (after_txid !== undefined) params.set('after_txid', String(after_txid)); const query = params.toString(); const path = `/api/address/${address}/txs${query ? '?' + query : ''}`; return this.getJson(path); } /** * Address confirmed transactions * * Get confirmed transactions for an address, 25 per page. Use ?after_txid= for pagination. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-address-transactions-chain)* * * Endpoint: `GET /api/address/{address}/txs/chain` * * @param {Addr} address * @param {Txid=} [after_txid] - Txid to paginate from (return transactions before this one) * @returns {Promise} */ async getAddressConfirmedTxs(address, after_txid) { const params = new URLSearchParams(); if (after_txid !== undefined) params.set('after_txid', String(after_txid)); const query = params.toString(); const path = `/api/address/${address}/txs/chain${query ? '?' + query : ''}`; return this.getJson(path); } /** * Address mempool transactions * * Get unconfirmed transaction IDs for an address from the mempool (up to 50). * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-address-transactions-mempool)* * * Endpoint: `GET /api/address/{address}/txs/mempool` * * @param {Addr} address * @returns {Promise} */ async getAddressMempoolTxs(address) { return this.getJson(`/api/address/${address}/txs/mempool`); } /** * Address UTXOs * * Get unspent transaction outputs (UTXOs) for an address. Returns txid, vout, value, and confirmation status for each UTXO. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-address-utxo)* * * Endpoint: `GET /api/address/{address}/utxo` * * @param {Addr} address * @returns {Promise} */ async getAddressUtxos(address) { return this.getJson(`/api/address/${address}/utxo`); } /** * Block by height * * Retrieve block information by block height. Returns block metadata including hash, timestamp, difficulty, size, weight, and transaction count. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-height)* * * Endpoint: `GET /api/block-height/{height}` * * @param {Height} height * @returns {Promise} */ async getBlockByHeight(height) { return this.getJson(`/api/block-height/${height}`); } /** * Block information * * Retrieve block information by block hash. Returns block metadata including height, timestamp, difficulty, size, weight, and transaction count. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block)* * * Endpoint: `GET /api/block/{hash}` * * @param {BlockHash} hash * @returns {Promise} */ async getBlock(hash) { return this.getJson(`/api/block/${hash}`); } /** * Raw block * * Returns the raw block data in binary format. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-raw)* * * Endpoint: `GET /api/block/{hash}/raw` * * @param {BlockHash} hash * @returns {Promise} */ async getBlockRaw(hash) { return this.getJson(`/api/block/${hash}/raw`); } /** * Block status * * Retrieve the status of a block. Returns whether the block is in the best chain and, if so, its height and the hash of the next block. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-status)* * * Endpoint: `GET /api/block/{hash}/status` * * @param {BlockHash} hash * @returns {Promise} */ async getBlockStatus(hash) { return this.getJson(`/api/block/${hash}/status`); } /** * Transaction ID at index * * Retrieve a single transaction ID at a specific index within a block. Returns plain text txid. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-transaction-id)* * * Endpoint: `GET /api/block/{hash}/txid/{index}` * * @param {BlockHash} hash - Bitcoin block hash * @param {TxIndex} index - Transaction index within the block (0-based) * @returns {Promise} */ async getBlockTxid(hash, index) { return this.getJson(`/api/block/${hash}/txid/${index}`); } /** * Block transaction IDs * * Retrieve all transaction IDs in a block. Returns an array of txids in block order. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-transaction-ids)* * * Endpoint: `GET /api/block/{hash}/txids` * * @param {BlockHash} hash * @returns {Promise} */ async getBlockTxids(hash) { return this.getJson(`/api/block/${hash}/txids`); } /** * Block transactions (paginated) * * Retrieve transactions in a block by block hash, starting from the specified index. Returns up to 25 transactions at a time. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-transactions)* * * Endpoint: `GET /api/block/{hash}/txs/{start_index}` * * @param {BlockHash} hash - Bitcoin block hash * @param {TxIndex} start_index - Starting transaction index within the block (0-based) * @returns {Promise} */ async getBlockTxs(hash, start_index) { return this.getJson(`/api/block/${hash}/txs/${start_index}`); } /** * Recent blocks * * Retrieve the last 10 blocks. Returns block metadata for each block. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-blocks)* * * Endpoint: `GET /api/blocks` * @returns {Promise} */ async getBlocks() { return this.getJson(`/api/blocks`); } /** * Blocks from height * * Retrieve up to 10 blocks going backwards from the given height. For example, height=100 returns blocks 100, 99, 98, ..., 91. Height=0 returns only block 0. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-blocks)* * * Endpoint: `GET /api/blocks/{height}` * * @param {Height} height * @returns {Promise} */ async getBlocksFromHeight(height) { return this.getJson(`/api/blocks/${height}`); } /** * Mempool statistics * * Get current mempool statistics including transaction count, total vsize, and total fees. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mempool)* * * Endpoint: `GET /api/mempool/info` * @returns {Promise} */ async getMempool() { return this.getJson(`/api/mempool/info`); } /** * Live BTC/USD price * * Returns the current BTC/USD price in dollars, derived from on-chain round-dollar output patterns in the last 12 blocks plus mempool. * * Endpoint: `GET /api/mempool/price` * @returns {Promise} */ async getLivePrice() { return this.getJson(`/api/mempool/price`); } /** * Mempool transaction IDs * * Get all transaction IDs currently in the mempool. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mempool-transaction-ids)* * * Endpoint: `GET /api/mempool/txids` * @returns {Promise} */ async getMempoolTxids() { return this.getJson(`/api/mempool/txids`); } /** * Series catalog * * Returns the complete hierarchical catalog of available series organized as a tree structure. Series are grouped by categories and subcategories. * * Endpoint: `GET /api/series` * @returns {Promise} */ async getSeriesTree() { return this.getJson(`/api/series`); } /** * Bulk series data * * Fetch multiple series in a single request. Supports filtering by index and date range. Returns an array of SeriesData objects. For a single series, use `get_series` instead. * * Endpoint: `GET /api/series/bulk` * * @param {SeriesList} [series] - Requested series * @param {Index} [index] - Index to query * @param {RangeIndex=} [start] - Inclusive start: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `from`, `f`, `s` * @param {RangeIndex=} [end] - Exclusive end: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `to`, `t`, `e` * @param {Limit=} [limit] - Maximum number of values to return (ignored if `end` is set). Aliases: `count`, `c`, `l` * @param {Format=} [format] - Format of the output * @returns {Promise} */ async getSeriesBulk(series, index, start, end, limit, format) { const params = new URLSearchParams(); params.set('series', String(series)); params.set('index', String(index)); if (start !== undefined) params.set('start', String(start)); if (end !== undefined) params.set('end', String(end)); if (limit !== undefined) params.set('limit', String(limit)); if (format !== undefined) params.set('format', String(format)); const query = params.toString(); const path = `/api/series/bulk${query ? '?' + query : ''}`; if (format === 'csv') { return this.getText(path); } return this.getJson(path); } /** * Available cost basis cohorts * * List available cohorts for cost basis distribution. * * Endpoint: `GET /api/series/cost-basis` * @returns {Promise} */ async getCostBasisCohorts() { return this.getJson(`/api/series/cost-basis`); } /** * Available cost basis dates * * List available dates for a cohort's cost basis distribution. * * Endpoint: `GET /api/series/cost-basis/{cohort}/dates` * * @param {Cohort} cohort * @returns {Promise} */ async getCostBasisDates(cohort) { return this.getJson(`/api/series/cost-basis/${cohort}/dates`); } /** * Cost basis distribution * * Get the cost basis distribution for a cohort on a specific date. * * Query params: * - `bucket`: raw (default), lin200, lin500, lin1000, log10, log50, log100 * - `value`: supply (default, in BTC), realized (USD), unrealized (USD) * * Endpoint: `GET /api/series/cost-basis/{cohort}/{date}` * * @param {Cohort} cohort * @param {string} date * @param {CostBasisBucket=} [bucket] - Bucket type for aggregation. Default: raw (no aggregation). * @param {CostBasisValue=} [value] - Value type to return. Default: supply. * @returns {Promise} */ async getCostBasis(cohort, date, bucket, value) { const params = new URLSearchParams(); if (bucket !== undefined) params.set('bucket', String(bucket)); if (value !== undefined) params.set('value', String(value)); const query = params.toString(); const path = `/api/series/cost-basis/${cohort}/${date}${query ? '?' + query : ''}`; return this.getJson(path); } /** * Series count * * Returns the number of series available per index type. * * Endpoint: `GET /api/series/count` * @returns {Promise} */ async getSeriesCount() { return this.getJson(`/api/series/count`); } /** * List available indexes * * Returns all available indexes with their accepted query aliases. Use any alias when querying series. * * Endpoint: `GET /api/series/indexes` * @returns {Promise} */ async getIndexes() { return this.getJson(`/api/series/indexes`); } /** * Series list * * Paginated flat list of all available series names. Use `page` query param for pagination. * * Endpoint: `GET /api/series/list` * * @param {number=} [page] - Pagination index * @param {number=} [per_page] - Results per page (default: 1000, max: 1000) * @returns {Promise} */ async listSeries(page, per_page) { const params = new URLSearchParams(); if (page !== undefined) params.set('page', String(page)); if (per_page !== undefined) params.set('per_page', String(per_page)); const query = params.toString(); const path = `/api/series/list${query ? '?' + query : ''}`; return this.getJson(path); } /** * Search series * * Fuzzy search for series by name. Supports partial matches and typos. * * Endpoint: `GET /api/series/search` * * @param {SeriesName} [q] - Search query string * @param {Limit=} [limit] - Maximum number of results * @returns {Promise} */ async searchSeries(q, limit) { const params = new URLSearchParams(); params.set('q', String(q)); if (limit !== undefined) params.set('limit', String(limit)); const query = params.toString(); const path = `/api/series/search${query ? '?' + query : ''}`; return this.getJson(path); } /** * Get series info * * Returns the supported indexes and value type for the specified series. * * Endpoint: `GET /api/series/{series}` * * @param {SeriesName} series * @returns {Promise} */ async getSeriesInfo(series) { return this.getJson(`/api/series/${series}`); } /** * Get series data * * Fetch data for a specific series at the given index. Use query parameters to filter by date range and format (json/csv). * * Endpoint: `GET /api/series/{series}/{index}` * * @param {SeriesName} series - Series name * @param {Index} index - Aggregation index * @param {RangeIndex=} [start] - Inclusive start: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `from`, `f`, `s` * @param {RangeIndex=} [end] - Exclusive end: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `to`, `t`, `e` * @param {Limit=} [limit] - Maximum number of values to return (ignored if `end` is set). Aliases: `count`, `c`, `l` * @param {Format=} [format] - Format of the output * @returns {Promise} */ async getSeries(series, index, start, end, limit, format) { const params = new URLSearchParams(); if (start !== undefined) params.set('start', String(start)); if (end !== undefined) params.set('end', String(end)); if (limit !== undefined) params.set('limit', String(limit)); if (format !== undefined) params.set('format', String(format)); const query = params.toString(); const path = `/api/series/${series}/${index}${query ? '?' + query : ''}`; if (format === 'csv') { return this.getText(path); } return this.getJson(path); } /** * Get raw series data * * Returns just the data array without the SeriesData wrapper. Supports the same range and format parameters as the standard endpoint. * * Endpoint: `GET /api/series/{series}/{index}/data` * * @param {SeriesName} series - Series name * @param {Index} index - Aggregation index * @param {RangeIndex=} [start] - Inclusive start: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `from`, `f`, `s` * @param {RangeIndex=} [end] - Exclusive end: integer index, date (YYYY-MM-DD), or timestamp (ISO 8601). Negative integers count from end. Aliases: `to`, `t`, `e` * @param {Limit=} [limit] - Maximum number of values to return (ignored if `end` is set). Aliases: `count`, `c`, `l` * @param {Format=} [format] - Format of the output * @returns {Promise} */ async getSeriesData(series, index, start, end, limit, format) { const params = new URLSearchParams(); if (start !== undefined) params.set('start', String(start)); if (end !== undefined) params.set('end', String(end)); if (limit !== undefined) params.set('limit', String(limit)); if (format !== undefined) params.set('format', String(format)); const query = params.toString(); const path = `/api/series/${series}/${index}/data${query ? '?' + query : ''}`; if (format === 'csv') { return this.getText(path); } return this.getJson(path); } /** * Get latest series value * * Returns the single most recent value for a series, unwrapped (not inside a SeriesData object). * * Endpoint: `GET /api/series/{series}/{index}/latest` * * @param {SeriesName} series - Series name * @param {Index} index - Aggregation index * @returns {Promise<*>} */ async getSeriesLatest(series, index) { return this.getJson(`/api/series/${series}/${index}/latest`); } /** * Get series data length * * Returns the total number of data points for a series at the given index. * * Endpoint: `GET /api/series/{series}/{index}/len` * * @param {SeriesName} series - Series name * @param {Index} index - Aggregation index * @returns {Promise} */ async getSeriesLen(series, index) { return this.getJson(`/api/series/${series}/${index}/len`); } /** * Get series version * * Returns the current version of a series. Changes when the series data is updated. * * Endpoint: `GET /api/series/{series}/{index}/version` * * @param {SeriesName} series - Series name * @param {Index} index - Aggregation index * @returns {Promise} */ async getSeriesVersion(series, index) { return this.getJson(`/api/series/${series}/${index}/version`); } /** * Disk usage * * Returns the disk space used by BRK and Bitcoin data. * * Endpoint: `GET /api/server/disk` * @returns {Promise} */ async getDiskUsage() { return this.getJson(`/api/server/disk`); } /** * Sync status * * Returns the sync status of the indexer, including indexed height, tip height, blocks behind, and last indexed timestamp. * * Endpoint: `GET /api/server/sync` * @returns {Promise} */ async getSyncStatus() { return this.getJson(`/api/server/sync`); } /** * Transaction information * * Retrieve complete transaction data by transaction ID (txid). Returns inputs, outputs, fee, size, and confirmation status. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-transaction)* * * Endpoint: `GET /api/tx/{txid}` * * @param {Txid} txid * @returns {Promise} */ async getTx(txid) { return this.getJson(`/api/tx/${txid}`); } /** * Transaction hex * * Retrieve the raw transaction as a hex-encoded string. Returns the serialized transaction in hexadecimal format. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-transaction-hex)* * * Endpoint: `GET /api/tx/{txid}/hex` * * @param {Txid} txid * @returns {Promise} */ async getTxHex(txid) { return this.getJson(`/api/tx/${txid}/hex`); } /** * Output spend status * * Get the spending status of a transaction output. Returns whether the output has been spent and, if so, the spending transaction details. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-transaction-outspend)* * * Endpoint: `GET /api/tx/{txid}/outspend/{vout}` * * @param {Txid} txid - Transaction ID * @param {Vout} vout - Output index * @returns {Promise} */ async getTxOutspend(txid, vout) { return this.getJson(`/api/tx/${txid}/outspend/${vout}`); } /** * All output spend statuses * * Get the spending status of all outputs in a transaction. Returns an array with the spend status for each output. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-transaction-outspends)* * * Endpoint: `GET /api/tx/{txid}/outspends` * * @param {Txid} txid * @returns {Promise} */ async getTxOutspends(txid) { return this.getJson(`/api/tx/${txid}/outspends`); } /** * Transaction status * * Retrieve the confirmation status of a transaction. Returns whether the transaction is confirmed and, if so, the block height, hash, and timestamp. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-transaction-status)* * * Endpoint: `GET /api/tx/{txid}/status` * * @param {Txid} txid * @returns {Promise} */ async getTxStatus(txid) { return this.getJson(`/api/tx/${txid}/status`); } /** * Difficulty adjustment * * Get current difficulty adjustment information including progress through the current epoch, estimated retarget date, and difficulty change prediction. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-difficulty-adjustment)* * * Endpoint: `GET /api/v1/difficulty-adjustment` * @returns {Promise} */ async getDifficultyAdjustment() { return this.getJson(`/api/v1/difficulty-adjustment`); } /** * Projected mempool blocks * * Get projected blocks from the mempool for fee estimation. Each block contains statistics about transactions that would be included if a block were mined now. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mempool-blocks-fees)* * * Endpoint: `GET /api/v1/fees/mempool-blocks` * @returns {Promise} */ async getMempoolBlocks() { return this.getJson(`/api/v1/fees/mempool-blocks`); } /** * Recommended fees * * Get recommended fee rates for different confirmation targets based on current mempool state. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-recommended-fees)* * * Endpoint: `GET /api/v1/fees/recommended` * @returns {Promise} */ async getRecommendedFees() { return this.getJson(`/api/v1/fees/recommended`); } /** * Block fee rates (WIP) * * **Work in progress.** Get block fee rate percentiles (min, 10th, 25th, median, 75th, 90th, max) for a time period. Valid periods: 24h, 3d, 1w, 1m, 3m, 6m, 1y, 2y, 3y * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-feerates)* * * Endpoint: `GET /api/v1/mining/blocks/fee-rates/{time_period}` * * @param {TimePeriod} time_period * @returns {Promise<*>} */ async getBlockFeeRates(time_period) { return this.getJson(`/api/v1/mining/blocks/fee-rates/${time_period}`); } /** * Block fees * * Get average block fees for a time period. Valid periods: 24h, 3d, 1w, 1m, 3m, 6m, 1y, 2y, 3y * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-fees)* * * Endpoint: `GET /api/v1/mining/blocks/fees/{time_period}` * * @param {TimePeriod} time_period * @returns {Promise} */ async getBlockFees(time_period) { return this.getJson(`/api/v1/mining/blocks/fees/${time_period}`); } /** * Block rewards * * Get average block rewards (coinbase = subsidy + fees) for a time period. Valid periods: 24h, 3d, 1w, 1m, 3m, 6m, 1y, 2y, 3y * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-rewards)* * * Endpoint: `GET /api/v1/mining/blocks/rewards/{time_period}` * * @param {TimePeriod} time_period * @returns {Promise} */ async getBlockRewards(time_period) { return this.getJson(`/api/v1/mining/blocks/rewards/${time_period}`); } /** * Block sizes and weights * * Get average block sizes and weights for a time period. Valid periods: 24h, 3d, 1w, 1m, 3m, 6m, 1y, 2y, 3y * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-sizes-weights)* * * Endpoint: `GET /api/v1/mining/blocks/sizes-weights/{time_period}` * * @param {TimePeriod} time_period * @returns {Promise} */ async getBlockSizesWeights(time_period) { return this.getJson(`/api/v1/mining/blocks/sizes-weights/${time_period}`); } /** * Block by timestamp * * Find the block closest to a given UNIX timestamp. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-timestamp)* * * Endpoint: `GET /api/v1/mining/blocks/timestamp/{timestamp}` * * @param {Timestamp} timestamp * @returns {Promise} */ async getBlockByTimestamp(timestamp) { return this.getJson(`/api/v1/mining/blocks/timestamp/${timestamp}`); } /** * Difficulty adjustments (all time) * * Get historical difficulty adjustments including timestamp, block height, difficulty value, and percentage change. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-difficulty-adjustments)* * * Endpoint: `GET /api/v1/mining/difficulty-adjustments` * @returns {Promise} */ async getDifficultyAdjustments() { return this.getJson(`/api/v1/mining/difficulty-adjustments`); } /** * Difficulty adjustments * * Get historical difficulty adjustments for a time period. Valid periods: 24h, 3d, 1w, 1m, 3m, 6m, 1y, 2y, 3y. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-difficulty-adjustments)* * * Endpoint: `GET /api/v1/mining/difficulty-adjustments/{time_period}` * * @param {TimePeriod} time_period * @returns {Promise} */ async getDifficultyAdjustmentsByPeriod(time_period) { return this.getJson(`/api/v1/mining/difficulty-adjustments/${time_period}`); } /** * Network hashrate (all time) * * Get network hashrate and difficulty data for all time. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-hashrate)* * * Endpoint: `GET /api/v1/mining/hashrate` * @returns {Promise} */ async getHashrate() { return this.getJson(`/api/v1/mining/hashrate`); } /** * Network hashrate * * Get network hashrate and difficulty data for a time period. Valid periods: 24h, 3d, 1w, 1m, 3m, 6m, 1y, 2y, 3y * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-hashrate)* * * Endpoint: `GET /api/v1/mining/hashrate/{time_period}` * * @param {TimePeriod} time_period * @returns {Promise} */ async getHashrateByPeriod(time_period) { return this.getJson(`/api/v1/mining/hashrate/${time_period}`); } /** * Mining pool details * * Get detailed information about a specific mining pool including block counts and shares for different time periods. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mining-pool)* * * Endpoint: `GET /api/v1/mining/pool/{slug}` * * @param {PoolSlug} slug * @returns {Promise} */ async getPool(slug) { return this.getJson(`/api/v1/mining/pool/${slug}`); } /** * List all mining pools * * Get list of all known mining pools with their identifiers. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mining-pools)* * * Endpoint: `GET /api/v1/mining/pools` * @returns {Promise} */ async getPools() { return this.getJson(`/api/v1/mining/pools`); } /** * Mining pool statistics * * Get mining pool statistics for a time period. Valid periods: 24h, 3d, 1w, 1m, 3m, 6m, 1y, 2y, 3y * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mining-pools)* * * Endpoint: `GET /api/v1/mining/pools/{time_period}` * * @param {TimePeriod} time_period * @returns {Promise} */ async getPoolStats(time_period) { return this.getJson(`/api/v1/mining/pools/${time_period}`); } /** * Mining reward statistics * * Get mining reward statistics for the last N blocks including total rewards, fees, and transaction count. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-reward-stats)* * * Endpoint: `GET /api/v1/mining/reward-stats/{block_count}` * * @param {number} block_count - Number of recent blocks to include * @returns {Promise} */ async getRewardStats(block_count) { return this.getJson(`/api/v1/mining/reward-stats/${block_count}`); } /** * Validate address * * Validate a Bitcoin address and get information about its type and scriptPubKey. * * *[Mempool.space docs](https://mempool.space/docs/api/rest#get-address-validate)* * * Endpoint: `GET /api/v1/validate-address/{address}` * * @param {string} address - Bitcoin address to validate (can be any string) * @returns {Promise} */ async validateAddress(address) { return this.getJson(`/api/v1/validate-address/${address}`); } /** * Health check * * Returns the health status of the API server, including uptime information. * * Endpoint: `GET /health` * @returns {Promise} */ async getHealth() { return this.getJson(`/health`); } /** * OpenAPI specification * * Full OpenAPI 3.1 specification for this API. * * Endpoint: `GET /openapi.json` * @returns {Promise<*>} */ async getOpenapi() { return this.getJson(`/openapi.json`); } /** * API version * * Returns the current version of the API server * * Endpoint: `GET /version` * @returns {Promise} */ async getVersion() { return this.getJson(`/version`); } } export { BrkClient, BrkError };