From d128caca49832566505e74a6782c373f540024d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aco=20S=CC=8Cmrkas?= Date: Thu, 30 Oct 2025 20:46:33 +0700 Subject: [PATCH 1/4] implemented handshake --- config/default.yaml | 13 ++++++++ package.json | 2 ++ src/config/config.ts | 44 +++++++++++++++++++++++++++ src/config/constants.ts | 2 ++ src/jobs/initScanner.ts | 7 +++++ src/types/config.ts | 3 +- src/utils/healthCheck.ts | 26 ++++++++++++++-- src/utils/networkConnectorManagers.ts | 38 +++++++++++++++++++++++ src/utils/scanner.ts | 41 +++++++++++++++++++++++-- 9 files changed, 171 insertions(+), 5 deletions(-) diff --git a/config/default.yaml b/config/default.yaml index 06ba3780..6371c9f0 100644 --- a/config/default.yaml +++ b/config/default.yaml @@ -73,6 +73,16 @@ binance: url: '' # rpc url timeout: 10 # rpc request timeout (in seconds) # authToken: # rpc auth token +handshake: + type: 'rpc' # options: rpc + initial: + height: -1 # initial height of scanning + interval: 180 # scanning interval (in seconds) + rpc: + timeout: 10 # rpc request timeout (in seconds) + url: '' # rpc url + # username: '' # rpc username for authentication required instances + # password: '' # rpc password for authentication required instances ergo: network: 'Mainnet' # ergo network type. testnet or mainnet type: 'node' # ergo scanner type. options: node, explorer @@ -153,6 +163,9 @@ healthCheck: binanceScanner: warnDifference: 160 # warning difference between existing and scanned blocks height criticalDifference: 640 # critical difference between existing and scanned blocks height + handshakeScanner: + warnDifference: 2 # warning difference between existing and scanned blocks height + criticalDifference: 10 # critical difference between existing and scanned blocks height permit: warnCommitmentCount: 4 # warning remaining permits for creating commitment criticalCommitmentCount: 0 # critical remaining permits for creating commitment diff --git a/package.json b/package.json index f111741e..7571c9e7 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,8 @@ "@rosen-bridge/evm-observation-extractor": "^5.2.1", "@rosen-bridge/evm-scanner": "^0.1.0", "@rosen-bridge/extended-typeorm": "0.2.1", + "@rosen-bridge/handshake-rpc-observation-extractor": "^0.1.0", + "@rosen-bridge/handshake-rpc-scanner": "^0.1.0", "@rosen-bridge/health-check": "^7.0.1", "@rosen-bridge/log-level-check": "^2.0.1", "@rosen-bridge/minimum-fee": "^2.3.0", diff --git a/src/config/config.ts b/src/config/config.ts index 4e9454d5..93a8ca08 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -20,6 +20,7 @@ const supportedNetworks: Array = [ Constants.DOGE_CHAIN_NAME, Constants.ETHEREUM_CHAIN_NAME, Constants.BINANCE_CHAIN_NAME, + Constants.HANDSHAKE_CHAIN_NAME, ]; interface ConfigType { @@ -30,6 +31,7 @@ interface ConfigType { ethereum: EthereumConfig; binance: BinanceConfig; doge: DogeConfig; + handshake: HandshakeConfig; general: Config; rosen: RosenConfig; database: DatabaseConfig; @@ -575,6 +577,37 @@ class BinanceConfig { } } +class HandshakeConfig { + type: string; + initialHeight: number; + interval: number; + rpc?: { + url: string; + timeout: number; + username?: string; + password?: string; + }; + + constructor(network: string) { + this.type = config.get('handshake.type'); + if (network === Constants.HANDSHAKE_CHAIN_NAME) { + this.initialHeight = getRequiredNumber('handshake.initial.height'); + this.interval = getRequiredNumber('handshake.interval'); + if (this.type == Constants.RPC_TYPE) { + const url = getRequiredString('handshake.rpc.url'); + const timeout = getRequiredNumber('handshake.rpc.timeout'); + const username = getOptionalString('handshake.rpc.username', undefined); + const password = getOptionalString('handshake.rpc.password', undefined); + this.rpc = { url, timeout, username, password }; + } else { + throw new Error( + `Improperly configured. handshake configuration type is invalid available choices are '${Constants.RPC_TYPE}'` + ); + } + } + } +} + class DatabaseConfig { type: string; path = ''; @@ -645,6 +678,8 @@ class HealthCheckConfig { ethereumScannerCriticalDiff: number; binanceScannerWarnDiff: number; binanceScannerCriticalDiff: number; + handshakeScannerWarnDiff: number; + handshakeScannerCriticalDiff: number; ergoNodeMaxHeightDiff: number; ergoNodeMaxBlockTime: number; ergoNodeMinPeerCount: number; @@ -712,6 +747,12 @@ class HealthCheckConfig { this.binanceScannerCriticalDiff = getRequiredNumber( 'healthCheck.binanceScanner.criticalDifference' ); + this.handshakeScannerWarnDiff = getRequiredNumber( + 'healthCheck.handshakeScanner.warnDifference' + ); + this.handshakeScannerCriticalDiff = getRequiredNumber( + 'healthCheck.handshakeScanner.criticalDifference' + ); this.permitWarnCommitmentCount = getRequiredNumber( 'healthCheck.permit.warnCommitmentCount' ); @@ -741,6 +782,7 @@ const getConfig = (): ConfigType => { const doge = new DogeConfig(general.networkWatcher); const ethereum = new EthereumConfig(general.networkWatcher); const binance = new BinanceConfig(general.networkWatcher); + const handshake = new HandshakeConfig(general.networkWatcher); const rosen = new RosenConfig( general.networkWatcher, general.networkType, @@ -756,6 +798,7 @@ const getConfig = (): ConfigType => { doge, ethereum, binance, + handshake, logger, general, rosen, @@ -777,4 +820,5 @@ export { EthereumConfig, BinanceConfig, DogeConfig, + HandshakeConfig, }; diff --git a/src/config/constants.ts b/src/config/constants.ts index 56ce76f7..9c83c4bc 100644 --- a/src/config/constants.ts +++ b/src/config/constants.ts @@ -18,6 +18,7 @@ export const BITCOIN_RUNES_CHAIN_NAME = 'bitcoin-runes'; export const DOGE_CHAIN_NAME = 'doge'; export const ETHEREUM_CHAIN_NAME = 'ethereum'; export const BINANCE_CHAIN_NAME = 'binance'; +export const HANDSHAKE_CHAIN_NAME = 'handshake'; export const ERGO_NATIVE_ASSET = 'erg'; export const ERGO_DECIMALS = 9; export const DEFAULT_API_LIMIT = 20; @@ -33,3 +34,4 @@ export const CARDANO_BLOCK_TIME = 20; export const ERGO_BLOCK_TIME = 120; export const ETHEREUM_BLOCK_TIME = 12; export const DOGE_BLOCK_TIME = 60; +export const HANDSHAKE_BLOCK_TIME = 600; diff --git a/src/jobs/initScanner.ts b/src/jobs/initScanner.ts index 092b5b84..daaf3fc0 100644 --- a/src/jobs/initScanner.ts +++ b/src/jobs/initScanner.ts @@ -15,6 +15,7 @@ const { doge: dogeConfig, ethereum: ethereumConfig, binance: binanceConfig, + handshake: handshakeConfig, } = allConfig; const logger = CallbackLoggerFactory.getInstance().getLogger(import.meta.url); @@ -80,6 +81,12 @@ export const scannerInit = () => { scanner.getObservationScanner() as EvmRpcScanner ).then(() => null); break; + case Constants.HANDSHAKE_CHAIN_NAME: + scanningJob( + handshakeConfig.interval, + scanner.getObservationScanner() as GeneralScanner + ).then(() => null); + break; case Constants.ERGO_CHAIN_NAME: break; default: diff --git a/src/types/config.ts b/src/types/config.ts index c3f9d47c..d5f58d6b 100644 --- a/src/types/config.ts +++ b/src/types/config.ts @@ -7,6 +7,7 @@ type NetworkType = | typeof Constants.BITCOIN_RUNES_CHAIN_NAME | typeof Constants.DOGE_CHAIN_NAME | typeof Constants.ETHEREUM_CHAIN_NAME - | typeof Constants.BINANCE_CHAIN_NAME; + | typeof Constants.BINANCE_CHAIN_NAME + | typeof Constants.HANDSHAKE_CHAIN_NAME; export { NetworkType }; diff --git a/src/utils/healthCheck.ts b/src/utils/healthCheck.ts index c7832458..02f39ccf 100644 --- a/src/utils/healthCheck.ts +++ b/src/utils/healthCheck.ts @@ -41,6 +41,8 @@ import { ETHEREUM_BLOCK_TIME, ETHEREUM_CHAIN_NAME, EXPLORER_TYPE, + HANDSHAKE_BLOCK_TIME, + HANDSHAKE_CHAIN_NAME, NODE_TYPE, OGMIOS_TYPE, } from '../config/constants'; @@ -223,38 +225,58 @@ class HealthCheckSingleton { } else { let chainName: string; let chainBlockTime: number; + let warnDiff: number; + let criticalDiff: number; switch (getConfig().general.networkWatcher) { case CARDANO_CHAIN_NAME: chainName = CARDANO_CHAIN_NAME; chainBlockTime = CARDANO_BLOCK_TIME; + warnDiff = getConfig().healthCheck.cardanoScannerWarnDiff; + criticalDiff = getConfig().healthCheck.cardanoScannerCriticalDiff; break; case BITCOIN_CHAIN_NAME: chainName = BITCOIN_CHAIN_NAME; chainBlockTime = BITCOIN_BLOCK_TIME; + warnDiff = getConfig().healthCheck.bitcoinScannerWarnDiff; + criticalDiff = getConfig().healthCheck.bitcoinScannerCriticalDiff; break; case BITCOIN_RUNES_CHAIN_NAME: chainName = BITCOIN_RUNES_CHAIN_NAME; chainBlockTime = BITCOIN_BLOCK_TIME; + warnDiff = getConfig().healthCheck.bitcoinScannerWarnDiff; + criticalDiff = getConfig().healthCheck.bitcoinScannerCriticalDiff; break; case DOGE_CHAIN_NAME: chainName = DOGE_CHAIN_NAME; chainBlockTime = DOGE_BLOCK_TIME; + warnDiff = getConfig().healthCheck.dogeScannerWarnDiff; + criticalDiff = getConfig().healthCheck.dogeScannerCriticalDiff; break; case ETHEREUM_CHAIN_NAME: chainName = ETHEREUM_CHAIN_NAME; chainBlockTime = ETHEREUM_BLOCK_TIME; + warnDiff = getConfig().healthCheck.ethereumScannerWarnDiff; + criticalDiff = getConfig().healthCheck.ethereumScannerCriticalDiff; break; case BINANCE_CHAIN_NAME: chainName = BINANCE_CHAIN_NAME; chainBlockTime = BINANCE_BLOCK_TIME; + warnDiff = getConfig().healthCheck.binanceScannerWarnDiff; + criticalDiff = getConfig().healthCheck.binanceScannerCriticalDiff; + break; + case HANDSHAKE_CHAIN_NAME: + chainName = HANDSHAKE_CHAIN_NAME; + chainBlockTime = HANDSHAKE_BLOCK_TIME; + warnDiff = getConfig().healthCheck.handshakeScannerWarnDiff; + criticalDiff = getConfig().healthCheck.handshakeScannerCriticalDiff; break; } scannerSyncCheck = new ScannerSyncHealthCheckParam( chainName!, this.observingNetworkLastBlock(scanner.getObservationScanner().name()), - getConfig().healthCheck.cardanoScannerWarnDiff, - getConfig().healthCheck.cardanoScannerCriticalDiff, + warnDiff!, + criticalDiff!, chainBlockTime! ); } diff --git a/src/utils/networkConnectorManagers.ts b/src/utils/networkConnectorManagers.ts index db8809ad..a3b0a9f4 100644 --- a/src/utils/networkConnectorManagers.ts +++ b/src/utils/networkConnectorManagers.ts @@ -15,6 +15,10 @@ import { EsploraNetwork, BitcoinEsploraTransaction, } from '@rosen-bridge/bitcoin-scanner'; +import { + HandshakeRpcTransaction, + HandshakeRpcNetwork, +} from '@rosen-bridge/handshake-rpc-scanner'; import { KoiosNetwork, BlockFrostNetwork, @@ -40,6 +44,8 @@ const bitcoinLogger = CallbackLoggerFactory.getInstance().getLogger('bitcoin-connector'); const dogeLogger = CallbackLoggerFactory.getInstance().getLogger('doge-connector'); +const handshakeLogger = + CallbackLoggerFactory.getInstance().getLogger('handshake-connector'); const cardanoKoiosLogger = CallbackLoggerFactory.getInstance().getLogger( 'cardano-koios-connector' ); @@ -282,3 +288,35 @@ export const createEvmNetworkConnectorManager = (chainName: string) => { return networkConnectorManager; }; + +/** + * Creates and configures a NetworkConnectorManager instance for Handshake RPC scanner + */ +export const createHandshakeRpcNetworkConnectorManager = () => { + const networkConnectorManager = + new NetworkConnectorManager( + new FailoverStrategy(), + handshakeLogger + ); + + if (config.handshake.rpc) { + networkConnectorManager.addConnector( + new HandshakeRpcNetwork( + config.handshake.rpc.url, + config.handshake.rpc.timeout * 1000, + config.handshake.rpc.username && config.handshake.rpc.password + ? { + username: config.handshake.rpc.username, + password: config.handshake.rpc.password, + } + : undefined + ) + ); + } else { + throw new Error( + 'Rpc configuration must be provided for Handshake Rpc network' + ); + } + + return networkConnectorManager; +}; diff --git a/src/utils/scanner.ts b/src/utils/scanner.ts index 57fca2ca..d1127668 100644 --- a/src/utils/scanner.ts +++ b/src/utils/scanner.ts @@ -5,12 +5,14 @@ import { BitcoinRpcScanner, DogeRpcScanner, } from '@rosen-bridge/bitcoin-scanner'; +import { HandshakeRpcScanner } from '@rosen-bridge/handshake-rpc-scanner'; import { BitcoinEsploraObservationExtractor, BitcoinRpcObservationExtractor, DogeEsploraObservationExtractor, DogeRpcObservationExtractor, } from '@rosen-bridge/bitcoin-observation-extractor'; +import { HandshakeRpcObservationExtractor } from '@rosen-bridge/handshake-rpc-observation-extractor'; import { CallbackLoggerFactory } from '@rosen-bridge/callback-logger'; import { ErgoObservationExtractor } from '@rosen-bridge/ergo-observation-extractor'; import { @@ -52,6 +54,7 @@ import { RosenConfig, DogeConfig, BitcoinRunesConfig, + HandshakeConfig, } from '../config/config'; import * as Constants from '../config/constants'; import { TokensConfig } from '../config/tokensConfig'; @@ -65,6 +68,7 @@ import { createEvmNetworkConnectorManager, createErgoNodeNetworkConnectorManager, createErgoExplorerNetworkConnectorManager, + createHandshakeRpcNetworkConnectorManager, } from './networkConnectorManagers'; /** @@ -109,7 +113,8 @@ class CreateScanner { | BitcoinRpcScanner | DogeEsploraScanner | DogeRpcScanner - | EvmRpcScanner; + | EvmRpcScanner + | HandshakeRpcScanner; private constructor() { // do nothing @@ -131,6 +136,7 @@ class CreateScanner { doge: dogeConfig, ethereum: ethereumConfig, binance: binanceConfig, + handshake: handshakeConfig, } = allConfig; await CreateScanner.instance.createErgoScanner(config, rosenConfig); @@ -172,6 +178,12 @@ class CreateScanner { rosenConfig ); break; + case Constants.HANDSHAKE_CHAIN_NAME: + await CreateScanner.instance.createHandshakeScanner( + handshakeConfig, + rosenConfig + ); + break; } if (!CreateScanner.instance.observationScanner) throw Error( @@ -213,7 +225,8 @@ class CreateScanner { | BitcoinRpcScanner | DogeEsploraScanner | DogeRpcScanner - | EvmRpcScanner => { + | EvmRpcScanner + | HandshakeRpcScanner => { if (!CreateScanner.instance) { throw new Error('Scanner is not initialized'); } @@ -539,6 +552,30 @@ class CreateScanner { } } }; + + private createHandshakeScanner = async ( + handshakeConfig: HandshakeConfig, + rosenConfig: RosenConfig + ) => { + if (!this.observationScanner) { + if (handshakeConfig.rpc) { + this.observationScanner = new HandshakeRpcScanner({ + dataSource, + initialHeight: handshakeConfig.initialHeight, + network: createHandshakeRpcNetworkConnectorManager(), + logger: loggers.observationScannerLogger, + }); + + const observationExtractor = new HandshakeRpcObservationExtractor( + rosenConfig.lockAddress, + dataSource, + TokensConfig.getInstance().getTokenMap(), + loggers.observationExtractorLogger + ); + this.observationScanner.registerExtractor(observationExtractor); + } + } + }; } export { CreateScanner }; From caea517ca3541c402e78aff92c90b0cedd2e4cd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aco=20S=CC=8Cmrkas?= Date: Wed, 22 Apr 2026 21:54:50 +0200 Subject: [PATCH 2/4] updated implementation --- docker/custom-environment-variables.yaml | 4 +++ src/config/config.ts | 18 +++++++++-- src/utils/healthCheck.ts | 39 ++++++++++++++---------- 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/docker/custom-environment-variables.yaml b/docker/custom-environment-variables.yaml index 2847b00b..9c2283ca 100644 --- a/docker/custom-environment-variables.yaml +++ b/docker/custom-environment-variables.yaml @@ -34,4 +34,8 @@ firo: rpc: username: 'FIRO_RPC_USERNAME' password: 'FIRO_RPC_PASSWORD' +handshake: + rpc: + username: 'HANDSHAKE_RPC_USERNAME' + password: 'HANDSHAKE_RPC_PASSWORD' overrideLokiBasicAuth: 'OVERRIDE_LOKI_BASIC_AUTH' diff --git a/src/config/config.ts b/src/config/config.ts index f2c83ac6..5314f81a 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -232,7 +232,7 @@ class Config { this.observationConfirmation = getRequiredNumber( 'observation.confirmation' ); - const blockTime = { + const blockTimeByNetwork: Record = { [Constants.ERGO_CHAIN_NAME]: Constants.ERGO_BLOCK_TIME, [Constants.BITCOIN_CHAIN_NAME]: Constants.BITCOIN_BLOCK_TIME, [Constants.BITCOIN_RUNES_CHAIN_NAME]: Constants.BITCOIN_BLOCK_TIME, @@ -241,9 +241,11 @@ class Config { [Constants.ETHEREUM_CHAIN_NAME]: Constants.ETHEREUM_BLOCK_TIME, [Constants.DOGE_CHAIN_NAME]: Constants.DOGE_BLOCK_TIME, [Constants.FIRO_CHAIN_NAME]: Constants.FIRO_BLOCK_TIME, - }[this.networkWatcher]; + [Constants.HANDSHAKE_CHAIN_NAME]: Constants.HANDSHAKE_BLOCK_TIME, + }; this.observationValidThreshold = Math.floor( - getRequiredNumber('observation.validThreshold') / blockTime + getRequiredNumber('observation.validThreshold') / + blockTimeByNetwork[this.networkWatcher] ); this.observationStoreRawData = config.get( 'observation.storeRawData' @@ -732,6 +734,8 @@ class HealthCheckConfig { ergCriticalThreshold: bigint; scannerWarnDiff: number; scannerCriticalDiff: number; + handshakeScannerWarnDiff: number; + handshakeScannerCriticalDiff: number; permitWarnCommitmentCount: number; permitCriticalCommitmentCount: number; permitDefaultCommitmentRWT: number; @@ -753,6 +757,14 @@ class HealthCheckConfig { this.scannerCriticalDiff = getRequiredNumber( 'healthCheck.scanner.criticalDifference' ); + this.handshakeScannerWarnDiff = getOptionalNumber( + 'healthCheck.handshakeScanner.warnDifference', + this.scannerWarnDiff + ); + this.handshakeScannerCriticalDiff = getOptionalNumber( + 'healthCheck.handshakeScanner.criticalDifference', + this.scannerCriticalDiff + ); this.permitWarnCommitmentCount = getRequiredNumber( 'healthCheck.permit.warnCommitmentCount' ); diff --git a/src/utils/healthCheck.ts b/src/utils/healthCheck.ts index e2cc7033..b03878c0 100644 --- a/src/utils/healthCheck.ts +++ b/src/utils/healthCheck.ts @@ -198,75 +198,82 @@ class HealthCheckSingleton { */ registerScannerSyncHealthCheck = () => { const scanner = CreateScanner.getInstance(); + const currentConfig = getConfig(); let scannerSyncCheck: | ScannerSyncHealthCheckParam | CardanoOgmiosScannerHealthCheck; if ( - getConfig().general.networkWatcher === CARDANO_CHAIN_NAME && - getConfig().cardano.type === OGMIOS_TYPE + currentConfig.general.networkWatcher === CARDANO_CHAIN_NAME && + currentConfig.cardano.type === OGMIOS_TYPE ) { scannerSyncCheck = new CardanoOgmiosScannerHealthCheck( this.observingNetworkLastBlock(scanner.getObservationScanner().name()), ( scanner.getObservationScanner() as CardanoOgmiosScanner ).getConnectionStatus, - getConfig().healthCheck.scannerWarnDiff, - getConfig().healthCheck.scannerCriticalDiff, + currentConfig.healthCheck.scannerWarnDiff, + currentConfig.healthCheck.scannerCriticalDiff, // TODO: Fix configuration: local/health-check/-/issues/29 - getConfig().cardano.ogmios!.connectionRetrialInterval * 15 + currentConfig.cardano.ogmios!.connectionRetrialInterval * 15 ); } else { let chainName: string; let chainBlockTime: number; let updateInterval: number; - switch (getConfig().general.networkWatcher) { + let scannerWarnDiff = currentConfig.healthCheck.scannerWarnDiff; + let scannerCriticalDiff = currentConfig.healthCheck.scannerCriticalDiff; + + switch (currentConfig.general.networkWatcher) { case CARDANO_CHAIN_NAME: chainName = CARDANO_CHAIN_NAME; chainBlockTime = CARDANO_BLOCK_TIME; - updateInterval = getConfig().cardano.koios!.interval; + updateInterval = currentConfig.cardano.koios!.interval; break; case BITCOIN_CHAIN_NAME: chainName = BITCOIN_CHAIN_NAME; chainBlockTime = BITCOIN_BLOCK_TIME; - updateInterval = getConfig().bitcoin.interval; + updateInterval = currentConfig.bitcoin.interval; break; case BITCOIN_RUNES_CHAIN_NAME: chainName = BITCOIN_RUNES_CHAIN_NAME; chainBlockTime = BITCOIN_BLOCK_TIME; - updateInterval = getConfig().bitcoin.interval; + updateInterval = currentConfig.bitcoin.interval; break; case DOGE_CHAIN_NAME: chainName = DOGE_CHAIN_NAME; chainBlockTime = DOGE_BLOCK_TIME; - updateInterval = getConfig().doge.interval; + updateInterval = currentConfig.doge.interval; break; case ETHEREUM_CHAIN_NAME: chainName = ETHEREUM_CHAIN_NAME; chainBlockTime = ETHEREUM_BLOCK_TIME; - updateInterval = getConfig().ethereum.interval; + updateInterval = currentConfig.ethereum.interval; break; case BINANCE_CHAIN_NAME: chainName = BINANCE_CHAIN_NAME; chainBlockTime = BINANCE_BLOCK_TIME; - updateInterval = getConfig().binance.interval; + updateInterval = currentConfig.binance.interval; break; case FIRO_CHAIN_NAME: chainName = FIRO_CHAIN_NAME; chainBlockTime = FIRO_BLOCK_TIME; - updateInterval = getConfig().firo.interval; + updateInterval = currentConfig.firo.interval; break; case HANDSHAKE_CHAIN_NAME: chainName = HANDSHAKE_CHAIN_NAME; chainBlockTime = HANDSHAKE_BLOCK_TIME; - updateInterval = getConfig().handshake.interval; + updateInterval = currentConfig.handshake.interval; + scannerWarnDiff = currentConfig.healthCheck.handshakeScannerWarnDiff; + scannerCriticalDiff = + currentConfig.healthCheck.handshakeScannerCriticalDiff; break; } scannerSyncCheck = new ScannerSyncHealthCheckParam( chainName!, this.observingNetworkLastBlock(scanner.getObservationScanner().name()), - getConfig().healthCheck.scannerWarnDiff, - getConfig().healthCheck.scannerCriticalDiff, + scannerWarnDiff, + scannerCriticalDiff, chainBlockTime!, updateInterval! ); From b6be728121c8d4f9ebe554d6d02e3ec25df11be4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aco=20S=CC=8Cmrkas?= Date: Thu, 23 Apr 2026 14:41:18 +0200 Subject: [PATCH 3/4] PR review updates --- .gitignore | 1 - config/default.yaml | 3 - package-lock.json | 279 +++++++++++++++++++++++++++++++++++++++ package.json | 2 + src/config/config.ts | 17 +-- src/utils/healthCheck.ts | 9 +- src/utils/scanner.ts | 9 +- 7 files changed, 292 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index 1b472487..1c0ef1ae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -src/config/*.json config/local*.yaml config/contracts*.json config/tokens*.json diff --git a/config/default.yaml b/config/default.yaml index 214507ea..e81cc65f 100644 --- a/config/default.yaml +++ b/config/default.yaml @@ -157,9 +157,6 @@ healthCheck: scanner: warnDifference: 5 # warning difference between existing and scanned blocks height criticalDifference: 20 # critical difference between existing and scanned blocks height - handshakeScanner: - warnDifference: 2 # warning difference between existing and scanned blocks height - criticalDifference: 10 # critical difference between existing and scanned blocks height permit: warnCommitmentCount: 4 # warning remaining permits for creating commitment criticalCommitmentCount: 0 # critical remaining permits for creating commitment diff --git a/package-lock.json b/package-lock.json index 6b352ef3..7081cd1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,6 +31,8 @@ "@rosen-bridge/extended-typeorm": "1.1.0", "@rosen-bridge/firo-observation-extractor": "^1.0.0", "@rosen-bridge/firo-scanner": "^0.1.2", + "@rosen-bridge/handshake-observation-extractor": "^0.1.1", + "@rosen-bridge/handshake-scanner": "^0.1.2", "@rosen-bridge/health-check": "^8.0.0", "@rosen-bridge/json-bigint": "^1.1.0", "@rosen-bridge/log-level-check": "^4.0.0", @@ -3977,6 +3979,283 @@ "npm": "11.6.2" } }, + "node_modules/@rosen-bridge/handshake-observation-extractor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@rosen-bridge/handshake-observation-extractor/-/handshake-observation-extractor-0.1.1.tgz", + "integrity": "sha512-CwSyr3U11TyDYm2YPwhCXeBsxs7aEjuzYAPCHzqayRRO7zhaREB22T3Q0EOblU8SKcEGDYPslH/MFqeia+1Giw==", + "license": "MIT", + "dependencies": { + "@rosen-bridge/abstract-logger": "^4.0.0", + "@rosen-bridge/abstract-observation-extractor": "^1.0.4", + "@rosen-bridge/extended-typeorm": "^1.0.1", + "@rosen-bridge/handshake-scanner": "^0.1.1", + "@rosen-bridge/rosen-extractor": "^11.3.0", + "@rosen-bridge/scanner-interfaces": "^0.2.2", + "@rosen-bridge/tokens": "^6.0.0", + "blakejs": "^1.2.1" + }, + "engines": { + "node": ">=22.18.0", + "npm": "11.6.2" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/@blockfrost/openapi": { + "version": "0.1.86", + "resolved": "https://registry.npmjs.org/@blockfrost/openapi/-/openapi-0.1.86.tgz", + "integrity": "sha512-VWFshFtUVmg27jn/dSc+7FvGbGyuHBUyNCqyE4ah9EkE3+ZcF3mIC095TE+f8uS/4lMIryUEGBq/p2zrfF+dEw==", + "dependencies": { + "ajv": "^8.17.1", + "cbor": "^9.0.2", + "rimraf": "6.0.1", + "yaml": "^2.6.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/@isaacs/cliui": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", + "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/@rosen-bridge/address-codec": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-1.2.0.tgz", + "integrity": "sha512-p0UgMkCGMjVabWWQxcYSyCE0VJ8IdZkIxMSOq9JUbqLtbiJJ2ZNjrpJ+jPhWavdS6eg1iMr2j5q+krOFHWhXyw==", + "license": "MIT", + "dependencies": { + "@bitcoinerlab/secp256k1": "^1.2.0", + "@emurgo/cardano-serialization-lib-nodejs": "^13.2.1", + "bitcoinjs-lib": "^6.1.5", + "ergo-lib-wasm-nodejs": "^0.24.1", + "ethers": "6.16.0" + }, + "engines": { + "node": ">=22.18.0", + "npm": "11.6.2" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/@rosen-bridge/rosen-extractor": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-11.3.0.tgz", + "integrity": "sha512-NMYttFxUKBAckytK/IvOcwDUTgGZm4RQA7YT8UZ4/5n99AmTWBSc6wTWmSR3quLIC1dkf9QYsMYaf5YzNKFLRA==", + "license": "MIT", + "dependencies": { + "@bitcoinerlab/secp256k1": "^1.2.0", + "@blockfrost/openapi": "^0.1.80", + "@cardano-ogmios/schema": "^6.0.3", + "@emurgo/cardano-serialization-lib-nodejs": "^13.2.1", + "@rosen-bridge/abstract-logger": "^4.0.0", + "@rosen-bridge/address-codec": "^1.2.0", + "@rosen-bridge/json-bigint": "^1.1.0", + "@rosen-bridge/tokens": "^6.0.0", + "bitcoinjs-lib": "^6.1.5", + "ergo-lib-wasm-nodejs": "^0.24.1", + "ethers": "6.16.0", + "lodash-es": "^4.17.21" + }, + "engines": { + "node": ">=22.18.0", + "npm": "11.6.2" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/glob": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "BlueOak-1.0.0", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/jackspeak": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", + "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^9.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/lru-cache": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rosen-bridge/handshake-scanner": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@rosen-bridge/handshake-scanner/-/handshake-scanner-0.1.2.tgz", + "integrity": "sha512-2qoOrrhgVYX4aPG6kuvHeNU3ow+3q6YP7BAfV7hjUaEQFqzB6/IboFuuPX47Zvzlr99k3zdVFIc/nzL177lDvQ==", + "license": "MIT", + "dependencies": { + "@rosen-bridge/abstract-scanner": "^1.0.4", + "@rosen-bridge/scanner-interfaces": "^0.2.2", + "@rosen-clients/rate-limited-axios": "^2.0.0" + }, + "engines": { + "node": ">=22.18.0", + "npm": "11.6.2" + } + }, "node_modules/@rosen-bridge/health-check": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@rosen-bridge/health-check/-/health-check-8.0.0.tgz", diff --git a/package.json b/package.json index 82c02fad..fdcecd7e 100644 --- a/package.json +++ b/package.json @@ -94,6 +94,8 @@ "@rosen-bridge/extended-typeorm": "1.1.0", "@rosen-bridge/firo-observation-extractor": "^1.0.0", "@rosen-bridge/firo-scanner": "^0.1.2", + "@rosen-bridge/handshake-observation-extractor": "^0.1.1", + "@rosen-bridge/handshake-scanner": "^0.1.2", "@rosen-bridge/health-check": "^8.0.0", "@rosen-bridge/json-bigint": "^1.1.0", "@rosen-bridge/log-level-check": "^4.0.0", diff --git a/src/config/config.ts b/src/config/config.ts index 5314f81a..36781168 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -232,7 +232,7 @@ class Config { this.observationConfirmation = getRequiredNumber( 'observation.confirmation' ); - const blockTimeByNetwork: Record = { + const blockTime = { [Constants.ERGO_CHAIN_NAME]: Constants.ERGO_BLOCK_TIME, [Constants.BITCOIN_CHAIN_NAME]: Constants.BITCOIN_BLOCK_TIME, [Constants.BITCOIN_RUNES_CHAIN_NAME]: Constants.BITCOIN_BLOCK_TIME, @@ -242,10 +242,9 @@ class Config { [Constants.DOGE_CHAIN_NAME]: Constants.DOGE_BLOCK_TIME, [Constants.FIRO_CHAIN_NAME]: Constants.FIRO_BLOCK_TIME, [Constants.HANDSHAKE_CHAIN_NAME]: Constants.HANDSHAKE_BLOCK_TIME, - }; + }[this.networkWatcher]; this.observationValidThreshold = Math.floor( - getRequiredNumber('observation.validThreshold') / - blockTimeByNetwork[this.networkWatcher] + getRequiredNumber('observation.validThreshold') / blockTime ); this.observationStoreRawData = config.get( 'observation.storeRawData' @@ -734,8 +733,6 @@ class HealthCheckConfig { ergCriticalThreshold: bigint; scannerWarnDiff: number; scannerCriticalDiff: number; - handshakeScannerWarnDiff: number; - handshakeScannerCriticalDiff: number; permitWarnCommitmentCount: number; permitCriticalCommitmentCount: number; permitDefaultCommitmentRWT: number; @@ -757,14 +754,6 @@ class HealthCheckConfig { this.scannerCriticalDiff = getRequiredNumber( 'healthCheck.scanner.criticalDifference' ); - this.handshakeScannerWarnDiff = getOptionalNumber( - 'healthCheck.handshakeScanner.warnDifference', - this.scannerWarnDiff - ); - this.handshakeScannerCriticalDiff = getOptionalNumber( - 'healthCheck.handshakeScanner.criticalDifference', - this.scannerCriticalDiff - ); this.permitWarnCommitmentCount = getRequiredNumber( 'healthCheck.permit.warnCommitmentCount' ); diff --git a/src/utils/healthCheck.ts b/src/utils/healthCheck.ts index b03878c0..29856df0 100644 --- a/src/utils/healthCheck.ts +++ b/src/utils/healthCheck.ts @@ -220,8 +220,6 @@ class HealthCheckSingleton { let chainName: string; let chainBlockTime: number; let updateInterval: number; - let scannerWarnDiff = currentConfig.healthCheck.scannerWarnDiff; - let scannerCriticalDiff = currentConfig.healthCheck.scannerCriticalDiff; switch (currentConfig.general.networkWatcher) { case CARDANO_CHAIN_NAME: @@ -263,17 +261,14 @@ class HealthCheckSingleton { chainName = HANDSHAKE_CHAIN_NAME; chainBlockTime = HANDSHAKE_BLOCK_TIME; updateInterval = currentConfig.handshake.interval; - scannerWarnDiff = currentConfig.healthCheck.handshakeScannerWarnDiff; - scannerCriticalDiff = - currentConfig.healthCheck.handshakeScannerCriticalDiff; break; } scannerSyncCheck = new ScannerSyncHealthCheckParam( chainName!, this.observingNetworkLastBlock(scanner.getObservationScanner().name()), - scannerWarnDiff, - scannerCriticalDiff, + currentConfig.healthCheck.scannerWarnDiff, + currentConfig.healthCheck.scannerCriticalDiff, chainBlockTime!, updateInterval! ); diff --git a/src/utils/scanner.ts b/src/utils/scanner.ts index 9890ba3c..90d45231 100644 --- a/src/utils/scanner.ts +++ b/src/utils/scanner.ts @@ -192,7 +192,8 @@ class CreateScanner { case Constants.HANDSHAKE_CHAIN_NAME: await CreateScanner.instance.createHandshakeScanner( handshakeConfig, - rosenConfig + rosenConfig, + config.observationStoreRawData ); break; } @@ -629,7 +630,8 @@ class CreateScanner { private createHandshakeScanner = async ( handshakeConfig: HandshakeConfig, - rosenConfig: RosenConfig + rosenConfig: RosenConfig, + observationStoreRawData: boolean ) => { if (!this.observationScanner) { if (handshakeConfig.rpc) { @@ -644,7 +646,8 @@ class CreateScanner { rosenConfig.lockAddress, dataSource, TokensConfig.getInstance().getTokenMap(), - loggers.observationExtractorLogger + loggers.observationExtractorLogger, + observationStoreRawData ); this.observationScanner.registerExtractor(observationExtractor); } From 13ae1c603c9ef4f72eb0a83c94f14911d229a620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aco=20S=CC=8Cmrkas?= Date: Mon, 11 May 2026 13:10:33 +0200 Subject: [PATCH 4/4] Merged dev and updated handshake-observation-extractor version --- package-lock.json | 261 ++-------------------------------------------- package.json | 2 +- 2 files changed, 10 insertions(+), 253 deletions(-) diff --git a/package-lock.json b/package-lock.json index aa1585f4..fcc124c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "@rosen-bridge/extended-typeorm": "1.1.0", "@rosen-bridge/firo-observation-extractor": "^1.0.1", "@rosen-bridge/firo-scanner": "^0.1.2", - "@rosen-bridge/handshake-observation-extractor": "^0.1.1", + "@rosen-bridge/handshake-observation-extractor": "^1.0.1", "@rosen-bridge/handshake-scanner": "^0.1.2", "@rosen-bridge/health-check": "^8.0.0", "@rosen-bridge/json-bigint": "^1.1.0", @@ -3980,267 +3980,24 @@ } }, "node_modules/@rosen-bridge/handshake-observation-extractor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@rosen-bridge/handshake-observation-extractor/-/handshake-observation-extractor-0.1.1.tgz", - "integrity": "sha512-CwSyr3U11TyDYm2YPwhCXeBsxs7aEjuzYAPCHzqayRRO7zhaREB22T3Q0EOblU8SKcEGDYPslH/MFqeia+1Giw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rosen-bridge/handshake-observation-extractor/-/handshake-observation-extractor-1.0.1.tgz", + "integrity": "sha512-WyizMBnHfwDwuscTffnxm1be0X77+ZV4zT9LQOs/uLOHnG8z2y35fUppODW1Mi6o0zUCpCq6MRhLvH5atkSyqw==", "license": "MIT", "dependencies": { "@rosen-bridge/abstract-logger": "^4.0.0", - "@rosen-bridge/abstract-observation-extractor": "^1.0.4", - "@rosen-bridge/extended-typeorm": "^1.0.1", - "@rosen-bridge/handshake-scanner": "^0.1.1", - "@rosen-bridge/rosen-extractor": "^11.3.0", + "@rosen-bridge/abstract-observation-extractor": "^1.0.6", + "@rosen-bridge/extended-typeorm": "^1.1.0", + "@rosen-bridge/handshake-scanner": "^0.1.2", + "@rosen-bridge/rosen-extractor": "^12.0.2", "@rosen-bridge/scanner-interfaces": "^0.2.2", - "@rosen-bridge/tokens": "^6.0.0", - "blakejs": "^1.2.1" - }, - "engines": { - "node": ">=22.18.0", - "npm": "11.6.2" - } - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/@blockfrost/openapi": { - "version": "0.1.86", - "resolved": "https://registry.npmjs.org/@blockfrost/openapi/-/openapi-0.1.86.tgz", - "integrity": "sha512-VWFshFtUVmg27jn/dSc+7FvGbGyuHBUyNCqyE4ah9EkE3+ZcF3mIC095TE+f8uS/4lMIryUEGBq/p2zrfF+dEw==", - "dependencies": { - "ajv": "^8.17.1", - "cbor": "^9.0.2", - "rimraf": "6.0.1", - "yaml": "^2.6.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/@isaacs/cliui": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", - "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/@rosen-bridge/address-codec": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/address-codec/-/address-codec-1.2.0.tgz", - "integrity": "sha512-p0UgMkCGMjVabWWQxcYSyCE0VJ8IdZkIxMSOq9JUbqLtbiJJ2ZNjrpJ+jPhWavdS6eg1iMr2j5q+krOFHWhXyw==", - "license": "MIT", - "dependencies": { - "@bitcoinerlab/secp256k1": "^1.2.0", - "@emurgo/cardano-serialization-lib-nodejs": "^13.2.1", - "bitcoinjs-lib": "^6.1.5", - "ergo-lib-wasm-nodejs": "^0.24.1", - "ethers": "6.16.0" - }, - "engines": { - "node": ">=22.18.0", - "npm": "11.6.2" - } - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/@rosen-bridge/rosen-extractor": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@rosen-bridge/rosen-extractor/-/rosen-extractor-11.3.0.tgz", - "integrity": "sha512-NMYttFxUKBAckytK/IvOcwDUTgGZm4RQA7YT8UZ4/5n99AmTWBSc6wTWmSR3quLIC1dkf9QYsMYaf5YzNKFLRA==", - "license": "MIT", - "dependencies": { - "@bitcoinerlab/secp256k1": "^1.2.0", - "@blockfrost/openapi": "^0.1.80", - "@cardano-ogmios/schema": "^6.0.3", - "@emurgo/cardano-serialization-lib-nodejs": "^13.2.1", - "@rosen-bridge/abstract-logger": "^4.0.0", - "@rosen-bridge/address-codec": "^1.2.0", - "@rosen-bridge/json-bigint": "^1.1.0", - "@rosen-bridge/tokens": "^6.0.0", - "bitcoinjs-lib": "^6.1.5", - "ergo-lib-wasm-nodejs": "^0.24.1", - "ethers": "6.16.0", - "lodash-es": "^4.17.21" + "@rosen-bridge/tokens": "^6.0.1" }, "engines": { "node": ">=22.18.0", "npm": "11.6.2" } }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/glob": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", - "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "BlueOak-1.0.0", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/jackspeak": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", - "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^9.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/lru-cache": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", - "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/rimraf": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", - "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", - "license": "ISC", - "dependencies": { - "glob": "^11.0.0", - "package-json-from-dist": "^1.0.0" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@rosen-bridge/handshake-observation-extractor/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@rosen-bridge/handshake-scanner": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@rosen-bridge/handshake-scanner/-/handshake-scanner-0.1.2.tgz", diff --git a/package.json b/package.json index 6569f6c8..3fe94819 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "@rosen-bridge/extended-typeorm": "1.1.0", "@rosen-bridge/firo-observation-extractor": "^1.0.1", "@rosen-bridge/firo-scanner": "^0.1.2", - "@rosen-bridge/handshake-observation-extractor": "^0.1.1", + "@rosen-bridge/handshake-observation-extractor": "^1.0.1", "@rosen-bridge/handshake-scanner": "^0.1.2", "@rosen-bridge/health-check": "^8.0.0", "@rosen-bridge/json-bigint": "^1.1.0",