@rosen-bridge/cardano-scanner 0.1.0-52fc0239
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/README.md +38 -0
- package/dist/constants.d.ts +5 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +5 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/interfaces/BlockFrost.d.ts +9 -0
- package/dist/interfaces/BlockFrost.d.ts.map +1 -0
- package/dist/interfaces/BlockFrost.js +6 -0
- package/dist/interfaces/Koios.d.ts +25 -0
- package/dist/interfaces/Koios.d.ts.map +1 -0
- package/dist/interfaces/Koios.js +2 -0
- package/dist/interfaces/index.d.ts +19 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +2 -0
- package/dist/network/blockfrost.d.ts +26 -0
- package/dist/network/blockfrost.d.ts.map +1 -0
- package/dist/network/blockfrost.js +76 -0
- package/dist/network/koios.d.ts +26 -0
- package/dist/network/koios.d.ts.map +1 -0
- package/dist/network/koios.js +89 -0
- package/dist/scanner/blockfrost.d.ts +7 -0
- package/dist/scanner/blockfrost.d.ts.map +1 -0
- package/dist/scanner/blockfrost.js +8 -0
- package/dist/scanner/koios.d.ts +7 -0
- package/dist/scanner/koios.d.ts.map +1 -0
- package/dist/scanner/koios.js +8 -0
- package/dist/scanner/ogmios.d.ts +51 -0
- package/dist/scanner/ogmios.d.ts.map +1 -0
- package/dist/scanner/ogmios.js +172 -0
- package/package.json +47 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# @rosen-bridge/cardano-scanner
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## 0.1.0
|
|
6
|
+
|
|
7
|
+
- Added optional suffix support for Cardano Ogmios scanner
|
|
8
|
+
- This package was **extracted** from `@rosen-bridge/scanner`.
|
|
9
|
+
You can follow the previous history in the old package’s changelog. The last changelog update is available [here](https://github.com/rosen-bridge/scanner/blob/d4a5539b01c523b101104470b03ff7023a10b70b/packages/scanner/CHANGELOG.md).
|
package/README.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# @rosen-bridge/cardano-scanner
|
|
2
|
+
|
|
3
|
+
## Table of contents
|
|
4
|
+
|
|
5
|
+
- [Introduction](#introduction)
|
|
6
|
+
- [Installation](#installation)
|
|
7
|
+
|
|
8
|
+
## Introduction
|
|
9
|
+
|
|
10
|
+
A Cardano blockchain scanner based on blackfrost , koios and ogmios API.
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
npm:
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
npm i @rosen-bridge/cardano-scanner
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
yarn:
|
|
21
|
+
|
|
22
|
+
```sh
|
|
23
|
+
yarn add @rosen-bridge/cardano-scanner
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Usage
|
|
27
|
+
|
|
28
|
+
Cardano Scanner:
|
|
29
|
+
|
|
30
|
+
```javascript
|
|
31
|
+
const cardanoScannerConfig = {
|
|
32
|
+
koiosUrl: <koios_url>,
|
|
33
|
+
timeout: <api_timeout>,
|
|
34
|
+
initialHeight: <cardano_initial_height>,
|
|
35
|
+
dataSource: dataSource,
|
|
36
|
+
}
|
|
37
|
+
cardanoScanner = new CardanoKoiosScanner(cardanoScannerConfig)
|
|
38
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../lib/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAC7C,eAAO,MAAM,sBAAsB,QAAiB,CAAC;AACrD,eAAO,MAAM,0BAA0B,QAAY,CAAC;AACpD,eAAO,MAAM,yBAAyB,QAAW,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export const SLOT_SHELLY_NUMBER = 1591566291;
|
|
2
|
+
export const RECONNECTION_MAX_DELAY = 60 * 60 * 1000; // One hour
|
|
3
|
+
export const RECONNECTION_INITIAL_DELAY = 30 * 1000; // 30 seconds
|
|
4
|
+
export const RECONNECTION_MAX_ATTEMPTS = Infinity;
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxVQUFVLENBQUM7QUFDN0MsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxXQUFXO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxhQUFhO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBTTE9UX1NIRUxMWV9OVU1CRVIgPSAxNTkxNTY2MjkxO1xuZXhwb3J0IGNvbnN0IFJFQ09OTkVDVElPTl9NQVhfREVMQVkgPSA2MCAqIDYwICogMTAwMDsgLy8gT25lIGhvdXJcbmV4cG9ydCBjb25zdCBSRUNPTk5FQ1RJT05fSU5JVElBTF9ERUxBWSA9IDMwICogMTAwMDsgLy8gMzAgc2Vjb25kc1xuZXhwb3J0IGNvbnN0IFJFQ09OTkVDVElPTl9NQVhfQVRURU1QVFMgPSBJbmZpbml0eTtcbiJdfQ==
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './scanner/blockfrost';
|
|
2
|
+
export * from './interfaces/BlockFrost';
|
|
3
|
+
export * from './interfaces/index';
|
|
4
|
+
export * from './interfaces/Koios';
|
|
5
|
+
export * from './scanner/koios';
|
|
6
|
+
export * from './scanner/ogmios';
|
|
7
|
+
export * from './constants';
|
|
8
|
+
export * from './network/blockfrost';
|
|
9
|
+
export * from './network/koios';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './scanner/blockfrost';
|
|
2
|
+
export * from './interfaces/BlockFrost';
|
|
3
|
+
export * from './interfaces/index';
|
|
4
|
+
export * from './interfaces/Koios';
|
|
5
|
+
export * from './scanner/koios';
|
|
6
|
+
export * from './scanner/ogmios';
|
|
7
|
+
export * from './constants';
|
|
8
|
+
export * from './network/blockfrost';
|
|
9
|
+
export * from './network/koios';
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zY2FubmVyL2Jsb2NrZnJvc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2VzL0Jsb2NrRnJvc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2VzL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlcy9Lb2lvcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjYW5uZXIva29pb3MnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2FubmVyL29nbWlvcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgKiBmcm9tICcuL25ldHdvcmsvYmxvY2tmcm9zdCc7XG5leHBvcnQgKiBmcm9tICcuL25ldHdvcmsva29pb3MnO1xuIl19
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { components } from '@blockfrost/openapi';
|
|
2
|
+
export declare class BlockFrostNullValueError extends Error {
|
|
3
|
+
constructor(msg: string);
|
|
4
|
+
}
|
|
5
|
+
export interface BlockFrostTransaction {
|
|
6
|
+
utxos: components['schemas']['tx_content_utxo'];
|
|
7
|
+
metadata: components['schemas']['tx_content_metadata'];
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=BlockFrost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlockFrost.d.ts","sourceRoot":"","sources":["../../lib/interfaces/BlockFrost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,GAAG,EAAE,MAAM;CAGxB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAChD,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC;CACxD"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export class BlockFrostNullValueError extends Error {
|
|
2
|
+
constructor(msg) {
|
|
3
|
+
super('BlockFrostNullValueError: ' + msg);
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2tGcm9zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9pbnRlcmZhY2VzL0Jsb2NrRnJvc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLHdCQUF5QixTQUFRLEtBQUs7SUFDakQsWUFBWSxHQUFXO1FBQ3JCLEtBQUssQ0FBQyw0QkFBNEIsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUM1QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wb25lbnRzIH0gZnJvbSAnQGJsb2NrZnJvc3Qvb3BlbmFwaSc7XG5cbmV4cG9ydCBjbGFzcyBCbG9ja0Zyb3N0TnVsbFZhbHVlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nKSB7XG4gICAgc3VwZXIoJ0Jsb2NrRnJvc3ROdWxsVmFsdWVFcnJvcjogJyArIG1zZyk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBCbG9ja0Zyb3N0VHJhbnNhY3Rpb24ge1xuICB1dHhvczogY29tcG9uZW50c1snc2NoZW1hcyddWyd0eF9jb250ZW50X3V0eG8nXTtcbiAgbWV0YWRhdGE6IGNvbXBvbmVudHNbJ3NjaGVtYXMnXVsndHhfY29udGVudF9tZXRhZGF0YSddO1xufVxuIl19
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { TransactionJSON } from '@emurgo/cardano-serialization-lib-nodejs';
|
|
2
|
+
interface KoiosBlock {
|
|
3
|
+
hash: string;
|
|
4
|
+
block_height: number;
|
|
5
|
+
block_time: number;
|
|
6
|
+
tx_count: number;
|
|
7
|
+
}
|
|
8
|
+
interface KoiosBlockInfo {
|
|
9
|
+
hash: string;
|
|
10
|
+
block_height: number;
|
|
11
|
+
parent_hash: string;
|
|
12
|
+
child_hash?: string;
|
|
13
|
+
}
|
|
14
|
+
interface KoiosCborTx {
|
|
15
|
+
tx_hash: string;
|
|
16
|
+
block_hash: string;
|
|
17
|
+
block_height: number;
|
|
18
|
+
epoch_no: number;
|
|
19
|
+
absolute_slot: number;
|
|
20
|
+
tx_timestamp: number;
|
|
21
|
+
cbor: string;
|
|
22
|
+
}
|
|
23
|
+
type KoiosTransaction = KoiosCborTx & TransactionJSON;
|
|
24
|
+
export { KoiosBlock, KoiosBlockInfo, KoiosTransaction, KoiosCborTx };
|
|
25
|
+
//# sourceMappingURL=Koios.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Koios.d.ts","sourceRoot":"","sources":["../../lib/interfaces/Koios.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAE3E,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,KAAK,gBAAgB,GAAG,WAAW,GAAG,eAAe,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS29pb3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaW50ZXJmYWNlcy9Lb2lvcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNhY3Rpb25KU09OIH0gZnJvbSAnQGVtdXJnby9jYXJkYW5vLXNlcmlhbGl6YXRpb24tbGliLW5vZGVqcyc7XG5cbmludGVyZmFjZSBLb2lvc0Jsb2NrIHtcbiAgaGFzaDogc3RyaW5nO1xuICBibG9ja19oZWlnaHQ6IG51bWJlcjtcbiAgYmxvY2tfdGltZTogbnVtYmVyO1xuICB0eF9jb3VudDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgS29pb3NCbG9ja0luZm8ge1xuICBoYXNoOiBzdHJpbmc7XG4gIGJsb2NrX2hlaWdodDogbnVtYmVyO1xuICBwYXJlbnRfaGFzaDogc3RyaW5nO1xuICBjaGlsZF9oYXNoPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgS29pb3NDYm9yVHgge1xuICB0eF9oYXNoOiBzdHJpbmc7XG4gIGJsb2NrX2hhc2g6IHN0cmluZztcbiAgYmxvY2tfaGVpZ2h0OiBudW1iZXI7XG4gIGVwb2NoX25vOiBudW1iZXI7XG4gIGFic29sdXRlX3Nsb3Q6IG51bWJlcjtcbiAgdHhfdGltZXN0YW1wOiBudW1iZXI7XG4gIGNib3I6IHN0cmluZztcbn1cblxudHlwZSBLb2lvc1RyYW5zYWN0aW9uID0gS29pb3NDYm9yVHggJiBUcmFuc2FjdGlvbkpTT047XG5cbmV4cG9ydCB7IEtvaW9zQmxvY2ssIEtvaW9zQmxvY2tJbmZvLCBLb2lvc1RyYW5zYWN0aW9uLCBLb2lvc0Nib3JUeCB9O1xuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { DataSource } from '@rosen-bridge/extended-typeorm';
|
|
2
|
+
interface OgmiosReconnectionConfig {
|
|
3
|
+
initialDelay?: number;
|
|
4
|
+
maxDelay?: number;
|
|
5
|
+
maxAttempts?: number;
|
|
6
|
+
}
|
|
7
|
+
interface CardanoOgmiosConfig {
|
|
8
|
+
nodeHostOrIp: string;
|
|
9
|
+
nodePort: number;
|
|
10
|
+
initialSlot: number;
|
|
11
|
+
initialHash: string;
|
|
12
|
+
maxTryBlock?: number;
|
|
13
|
+
dataSource: DataSource;
|
|
14
|
+
useTls?: boolean;
|
|
15
|
+
reconnectionConfig?: OgmiosReconnectionConfig;
|
|
16
|
+
suffix?: string;
|
|
17
|
+
}
|
|
18
|
+
export { OgmiosReconnectionConfig, CardanoOgmiosConfig };
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/interfaces/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,UAAU,wBAAwB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,mBAAmB;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaW50ZXJmYWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5cbmludGVyZmFjZSBPZ21pb3NSZWNvbm5lY3Rpb25Db25maWcge1xuICBpbml0aWFsRGVsYXk/OiBudW1iZXI7XG4gIG1heERlbGF5PzogbnVtYmVyO1xuICBtYXhBdHRlbXB0cz86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIENhcmRhbm9PZ21pb3NDb25maWcge1xuICBub2RlSG9zdE9ySXA6IHN0cmluZztcbiAgbm9kZVBvcnQ6IG51bWJlcjtcbiAgaW5pdGlhbFNsb3Q6IG51bWJlcjtcbiAgaW5pdGlhbEhhc2g6IHN0cmluZztcbiAgbWF4VHJ5QmxvY2s/OiBudW1iZXI7XG4gIGRhdGFTb3VyY2U6IERhdGFTb3VyY2U7XG4gIHVzZVRscz86IGJvb2xlYW47XG4gIHJlY29ubmVjdGlvbkNvbmZpZz86IE9nbWlvc1JlY29ubmVjdGlvbkNvbmZpZztcbiAgc3VmZml4Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgeyBPZ21pb3NSZWNvbm5lY3Rpb25Db25maWcsIENhcmRhbm9PZ21pb3NDb25maWcgfTtcbiJdfQ==
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AbstractNetworkConnector, Block } from '@rosen-bridge/scanner-interfaces';
|
|
2
|
+
import { BlockFrostTransaction } from '../interfaces/BlockFrost';
|
|
3
|
+
export declare class BlockFrostNetwork extends AbstractNetworkConnector<BlockFrostTransaction> {
|
|
4
|
+
private client;
|
|
5
|
+
constructor(projectId: string, url?: string);
|
|
6
|
+
/**
|
|
7
|
+
* get block header from height
|
|
8
|
+
* @param height
|
|
9
|
+
*/
|
|
10
|
+
getBlockAtHeight: (height: number) => Promise<Block>;
|
|
11
|
+
/**
|
|
12
|
+
* get current height for blockchain
|
|
13
|
+
*/
|
|
14
|
+
getCurrentHeight: () => Promise<number>;
|
|
15
|
+
/**
|
|
16
|
+
* Try getting transactions information.
|
|
17
|
+
* @param txHashes
|
|
18
|
+
*/
|
|
19
|
+
getTxInformation: (txId: string) => Promise<BlockFrostTransaction>;
|
|
20
|
+
/**
|
|
21
|
+
* fetch list of transaction for a specific block
|
|
22
|
+
* @param blockId
|
|
23
|
+
*/
|
|
24
|
+
getBlockTxs: (blockId: string) => Promise<Array<BlockFrostTransaction>>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=blockfrost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockfrost.d.ts","sourceRoot":"","sources":["../../lib/network/blockfrost.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EACxB,KAAK,EACN,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAEL,qBAAqB,EACtB,MAAM,0BAA0B,CAAC;AAElC,qBAAa,iBAAkB,SAAQ,wBAAwB,CAAC,qBAAqB,CAAC;IACpF,OAAO,CAAC,MAAM,CAAgB;gBAElB,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM;IAS3C;;;OAGG;IACH,gBAAgB,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,KAAK,CAAC,CAkBvD;IAEF;;OAEG;IACH,gBAAgB,QAAa,OAAO,CAAC,MAAM,CAAC,CAW1C;IAEF;;;OAGG;IACH,gBAAgB,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,qBAAqB,CAAC,CAQrE;IAEF;;;OAGG;IACH,WAAW,GACT,SAAS,MAAM,KACd,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAStC;CACH"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { BlockFrostAPI } from '@blockfrost/blockfrost-js';
|
|
2
|
+
import { AbstractNetworkConnector, } from '@rosen-bridge/scanner-interfaces';
|
|
3
|
+
import { BlockFrostNullValueError, } from '../interfaces/BlockFrost';
|
|
4
|
+
export class BlockFrostNetwork extends AbstractNetworkConnector {
|
|
5
|
+
client;
|
|
6
|
+
constructor(projectId, url) {
|
|
7
|
+
super();
|
|
8
|
+
this.client = new BlockFrostAPI({
|
|
9
|
+
projectId: projectId,
|
|
10
|
+
customBackend: url,
|
|
11
|
+
network: 'mainnet',
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* get block header from height
|
|
16
|
+
* @param height
|
|
17
|
+
*/
|
|
18
|
+
getBlockAtHeight = async (height) => {
|
|
19
|
+
return this.client
|
|
20
|
+
.blocks(height)
|
|
21
|
+
.then((res) => {
|
|
22
|
+
if (!res.height || !res.previous_block)
|
|
23
|
+
throw new BlockFrostNullValueError(`Block height or previous_block is null`);
|
|
24
|
+
return {
|
|
25
|
+
hash: res.hash,
|
|
26
|
+
height: res.height,
|
|
27
|
+
parentHash: res.previous_block,
|
|
28
|
+
timestamp: res.time,
|
|
29
|
+
};
|
|
30
|
+
})
|
|
31
|
+
.catch((exp) => {
|
|
32
|
+
throw exp;
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* get current height for blockchain
|
|
37
|
+
*/
|
|
38
|
+
getCurrentHeight = async () => {
|
|
39
|
+
return this.client
|
|
40
|
+
.blocksLatest()
|
|
41
|
+
.then((block) => {
|
|
42
|
+
const height = block.height;
|
|
43
|
+
if (height)
|
|
44
|
+
return height;
|
|
45
|
+
throw new BlockFrostNullValueError('Height of last block is null');
|
|
46
|
+
})
|
|
47
|
+
.catch((exp) => {
|
|
48
|
+
throw exp;
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Try getting transactions information.
|
|
53
|
+
* @param txHashes
|
|
54
|
+
*/
|
|
55
|
+
getTxInformation = async (txId) => {
|
|
56
|
+
const txUtxos = await this.client.txsUtxos(txId);
|
|
57
|
+
const txMetadata = await this.client.txsMetadata(txId);
|
|
58
|
+
return {
|
|
59
|
+
utxos: txUtxos,
|
|
60
|
+
metadata: txMetadata,
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* fetch list of transaction for a specific block
|
|
65
|
+
* @param blockId
|
|
66
|
+
*/
|
|
67
|
+
getBlockTxs = async (blockId) => {
|
|
68
|
+
const blockTxIds = await this.client.blocksTxsAll(blockId);
|
|
69
|
+
const blockTxs = [];
|
|
70
|
+
for (const txId of blockTxIds) {
|
|
71
|
+
blockTxs.push(await this.getTxInformation(txId));
|
|
72
|
+
}
|
|
73
|
+
return blockTxs;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tmcm9zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9uZXR3b3JrL2Jsb2NrZnJvc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFDTCx3QkFBd0IsR0FFekIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsd0JBQXdCLEdBRXpCLE1BQU0sMEJBQTBCLENBQUM7QUFFbEMsTUFBTSxPQUFPLGlCQUFrQixTQUFRLHdCQUErQztJQUM1RSxNQUFNLENBQWdCO0lBRTlCLFlBQVksU0FBaUIsRUFBRSxHQUFZO1FBQ3pDLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGFBQWEsQ0FBQztZQUM5QixTQUFTLEVBQUUsU0FBUztZQUNwQixhQUFhLEVBQUUsR0FBRztZQUNsQixPQUFPLEVBQUUsU0FBUztTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLEdBQUcsS0FBSyxFQUFFLE1BQWMsRUFBa0IsRUFBRTtRQUMxRCxPQUFPLElBQUksQ0FBQyxNQUFNO2FBQ2YsTUFBTSxDQUFDLE1BQU0sQ0FBQzthQUNkLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYztnQkFDcEMsTUFBTSxJQUFJLHdCQUF3QixDQUNoQyx3Q0FBd0MsQ0FDekMsQ0FBQztZQUNKLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO2dCQUNkLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtnQkFDbEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxjQUFjO2dCQUM5QixTQUFTLEVBQUUsR0FBRyxDQUFDLElBQUk7YUFDcEIsQ0FBQztRQUNKLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2IsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsZ0JBQWdCLEdBQUcsS0FBSyxJQUFxQixFQUFFO1FBQzdDLE9BQU8sSUFBSSxDQUFDLE1BQU07YUFDZixZQUFZLEVBQUU7YUFDZCxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNkLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDNUIsSUFBSSxNQUFNO2dCQUFFLE9BQU8sTUFBTSxDQUFDO1lBQzFCLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3JFLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2IsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNILGdCQUFnQixHQUFHLEtBQUssRUFBRSxJQUFZLEVBQWtDLEVBQUU7UUFDeEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZELE9BQU87WUFDTCxLQUFLLEVBQUUsT0FBTztZQUNkLFFBQVEsRUFBRSxVQUFVO1NBQ3JCLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRjs7O09BR0c7SUFDSCxXQUFXLEdBQUcsS0FBSyxFQUNqQixPQUFlLEVBQ3dCLEVBQUU7UUFDekMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUzRCxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDcEIsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUM5QixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmxvY2tGcm9zdEFQSSB9IGZyb20gJ0BibG9ja2Zyb3N0L2Jsb2NrZnJvc3QtanMnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3ROZXR3b3JrQ29ubmVjdG9yLFxuICBCbG9jayxcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgQmxvY2tGcm9zdE51bGxWYWx1ZUVycm9yLFxuICBCbG9ja0Zyb3N0VHJhbnNhY3Rpb24sXG59IGZyb20gJy4uL2ludGVyZmFjZXMvQmxvY2tGcm9zdCc7XG5cbmV4cG9ydCBjbGFzcyBCbG9ja0Zyb3N0TmV0d29yayBleHRlbmRzIEFic3RyYWN0TmV0d29ya0Nvbm5lY3RvcjxCbG9ja0Zyb3N0VHJhbnNhY3Rpb24+IHtcbiAgcHJpdmF0ZSBjbGllbnQ6IEJsb2NrRnJvc3RBUEk7XG5cbiAgY29uc3RydWN0b3IocHJvamVjdElkOiBzdHJpbmcsIHVybD86IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jbGllbnQgPSBuZXcgQmxvY2tGcm9zdEFQSSh7XG4gICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZCxcbiAgICAgIGN1c3RvbUJhY2tlbmQ6IHVybCxcbiAgICAgIG5ldHdvcms6ICdtYWlubmV0JyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgYmxvY2sgaGVhZGVyIGZyb20gaGVpZ2h0XG4gICAqIEBwYXJhbSBoZWlnaHRcbiAgICovXG4gIGdldEJsb2NrQXRIZWlnaHQgPSBhc3luYyAoaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPEJsb2NrPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50XG4gICAgICAuYmxvY2tzKGhlaWdodClcbiAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgaWYgKCFyZXMuaGVpZ2h0IHx8ICFyZXMucHJldmlvdXNfYmxvY2spXG4gICAgICAgICAgdGhyb3cgbmV3IEJsb2NrRnJvc3ROdWxsVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBCbG9jayBoZWlnaHQgb3IgcHJldmlvdXNfYmxvY2sgaXMgbnVsbGBcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhhc2g6IHJlcy5oYXNoLFxuICAgICAgICAgIGhlaWdodDogcmVzLmhlaWdodCxcbiAgICAgICAgICBwYXJlbnRIYXNoOiByZXMucHJldmlvdXNfYmxvY2ssXG4gICAgICAgICAgdGltZXN0YW1wOiByZXMudGltZSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGV4cCkgPT4ge1xuICAgICAgICB0aHJvdyBleHA7XG4gICAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogZ2V0IGN1cnJlbnQgaGVpZ2h0IGZvciBibG9ja2NoYWluXG4gICAqL1xuICBnZXRDdXJyZW50SGVpZ2h0ID0gYXN5bmMgKCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50XG4gICAgICAuYmxvY2tzTGF0ZXN0KClcbiAgICAgIC50aGVuKChibG9jaykgPT4ge1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBibG9jay5oZWlnaHQ7XG4gICAgICAgIGlmIChoZWlnaHQpIHJldHVybiBoZWlnaHQ7XG4gICAgICAgIHRocm93IG5ldyBCbG9ja0Zyb3N0TnVsbFZhbHVlRXJyb3IoJ0hlaWdodCBvZiBsYXN0IGJsb2NrIGlzIG51bGwnKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGV4cCkgPT4ge1xuICAgICAgICB0aHJvdyBleHA7XG4gICAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogVHJ5IGdldHRpbmcgdHJhbnNhY3Rpb25zIGluZm9ybWF0aW9uLlxuICAgKiBAcGFyYW0gdHhIYXNoZXNcbiAgICovXG4gIGdldFR4SW5mb3JtYXRpb24gPSBhc3luYyAodHhJZDogc3RyaW5nKTogUHJvbWlzZTxCbG9ja0Zyb3N0VHJhbnNhY3Rpb24+ID0+IHtcbiAgICBjb25zdCB0eFV0eG9zID0gYXdhaXQgdGhpcy5jbGllbnQudHhzVXR4b3ModHhJZCk7XG4gICAgY29uc3QgdHhNZXRhZGF0YSA9IGF3YWl0IHRoaXMuY2xpZW50LnR4c01ldGFkYXRhKHR4SWQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHV0eG9zOiB0eFV0eG9zLFxuICAgICAgbWV0YWRhdGE6IHR4TWV0YWRhdGEsXG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogZmV0Y2ggbGlzdCBvZiB0cmFuc2FjdGlvbiBmb3IgYSBzcGVjaWZpYyBibG9ja1xuICAgKiBAcGFyYW0gYmxvY2tJZFxuICAgKi9cbiAgZ2V0QmxvY2tUeHMgPSBhc3luYyAoXG4gICAgYmxvY2tJZDogc3RyaW5nXG4gICk6IFByb21pc2U8QXJyYXk8QmxvY2tGcm9zdFRyYW5zYWN0aW9uPj4gPT4ge1xuICAgIGNvbnN0IGJsb2NrVHhJZHMgPSBhd2FpdCB0aGlzLmNsaWVudC5ibG9ja3NUeHNBbGwoYmxvY2tJZCk7XG5cbiAgICBjb25zdCBibG9ja1R4cyA9IFtdO1xuICAgIGZvciAoY29uc3QgdHhJZCBvZiBibG9ja1R4SWRzKSB7XG4gICAgICBibG9ja1R4cy5wdXNoKGF3YWl0IHRoaXMuZ2V0VHhJbmZvcm1hdGlvbih0eElkKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJsb2NrVHhzO1xuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AbstractNetworkConnector, Block } from '@rosen-bridge/scanner-interfaces';
|
|
2
|
+
import { KoiosTransaction } from '../interfaces/Koios';
|
|
3
|
+
export declare class KoiosNetwork extends AbstractNetworkConnector<KoiosTransaction> {
|
|
4
|
+
private readonly url;
|
|
5
|
+
private readonly timeout;
|
|
6
|
+
private koios;
|
|
7
|
+
constructor(url: string, timeout: number, authToken?: string);
|
|
8
|
+
/**
|
|
9
|
+
* Returns block at height
|
|
10
|
+
* @param height
|
|
11
|
+
* @returns Block
|
|
12
|
+
*/
|
|
13
|
+
getBlockAtHeight: (height: number) => Promise<Block>;
|
|
14
|
+
/**
|
|
15
|
+
* Returns current network height
|
|
16
|
+
* @returns current height
|
|
17
|
+
*/
|
|
18
|
+
getCurrentHeight: () => Promise<number>;
|
|
19
|
+
/**
|
|
20
|
+
* Return transactions in a block with specified hash
|
|
21
|
+
* @param blockHash
|
|
22
|
+
* @returns array of KoiosTransaction
|
|
23
|
+
*/
|
|
24
|
+
getBlockTxs: (blockHash: string) => Promise<Array<KoiosTransaction>>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=koios.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koios.d.ts","sourceRoot":"","sources":["../../lib/network/koios.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,wBAAwB,EACxB,KAAK,EACN,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAA2B,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGhF,qBAAa,YAAa,SAAQ,wBAAwB,CAAC,gBAAgB,CAAC;IAC1E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,KAAK,CAAQ;gBAET,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAgB5D;;;;OAIG;IACH,gBAAgB,GAAI,QAAQ,MAAM,KAAG,OAAO,CAAC,KAAK,CAAC,CAuBjD;IAEF;;;OAGG;IACH,gBAAgB,QAAO,OAAO,CAAC,MAAM,CAAC,CASpC;IAEF;;;;OAIG;IACH,WAAW,GAAI,WAAW,MAAM,KAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAmBjE;CACH"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import axios from '@rosen-bridge/rate-limited-axios';
|
|
2
|
+
import { Transaction } from '@emurgo/cardano-serialization-lib-nodejs';
|
|
3
|
+
import { AbstractNetworkConnector, } from '@rosen-bridge/scanner-interfaces';
|
|
4
|
+
import JsonBigint from '@rosen-bridge/json-bigint';
|
|
5
|
+
export class KoiosNetwork extends AbstractNetworkConnector {
|
|
6
|
+
url;
|
|
7
|
+
timeout;
|
|
8
|
+
koios;
|
|
9
|
+
constructor(url, timeout, authToken) {
|
|
10
|
+
super();
|
|
11
|
+
this.url = url;
|
|
12
|
+
this.timeout = timeout;
|
|
13
|
+
this.koios = axios.create({
|
|
14
|
+
baseURL: this.url,
|
|
15
|
+
timeout: this.timeout,
|
|
16
|
+
headers: { 'Content-Type': 'application/json' },
|
|
17
|
+
});
|
|
18
|
+
if (authToken) {
|
|
19
|
+
this.koios.defaults.headers.common['Authorization'] = `Bearer ${authToken}`;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Returns block at height
|
|
24
|
+
* @param height
|
|
25
|
+
* @returns Block
|
|
26
|
+
*/
|
|
27
|
+
getBlockAtHeight = (height) => {
|
|
28
|
+
return this.koios
|
|
29
|
+
.get('/blocks', {
|
|
30
|
+
params: {
|
|
31
|
+
block_height: `lte.${height}`,
|
|
32
|
+
limit: 2,
|
|
33
|
+
select: 'hash,block_height,block_time,tx_count',
|
|
34
|
+
},
|
|
35
|
+
})
|
|
36
|
+
.then((res) => {
|
|
37
|
+
const block = res.data[0];
|
|
38
|
+
const parentBlock = res.data[1];
|
|
39
|
+
return {
|
|
40
|
+
hash: block.hash,
|
|
41
|
+
height: block.block_height,
|
|
42
|
+
parentHash: parentBlock.hash,
|
|
43
|
+
timestamp: block.block_time,
|
|
44
|
+
txCount: block.tx_count,
|
|
45
|
+
};
|
|
46
|
+
})
|
|
47
|
+
.catch((exp) => {
|
|
48
|
+
throw exp;
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Returns current network height
|
|
53
|
+
* @returns current height
|
|
54
|
+
*/
|
|
55
|
+
getCurrentHeight = () => {
|
|
56
|
+
return this.koios
|
|
57
|
+
.get('/blocks', {
|
|
58
|
+
params: { offset: 0, limit: 1, select: 'hash,block_height' },
|
|
59
|
+
})
|
|
60
|
+
.then((res) => res.data[0].block_height)
|
|
61
|
+
.catch((exp) => {
|
|
62
|
+
throw exp;
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Return transactions in a block with specified hash
|
|
67
|
+
* @param blockHash
|
|
68
|
+
* @returns array of KoiosTransaction
|
|
69
|
+
*/
|
|
70
|
+
getBlockTxs = (blockHash) => {
|
|
71
|
+
return this.koios
|
|
72
|
+
.post('/block_tx_cbor', {
|
|
73
|
+
_block_hashes: [blockHash],
|
|
74
|
+
})
|
|
75
|
+
.then((res) => {
|
|
76
|
+
return res.data.map((tx) => {
|
|
77
|
+
const serializedTx = Transaction.from_bytes(new Uint8Array(Buffer.from(tx.cbor, 'hex')));
|
|
78
|
+
return {
|
|
79
|
+
...tx,
|
|
80
|
+
...JsonBigint.parse(serializedTx.to_json()),
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
})
|
|
84
|
+
.catch((exp) => {
|
|
85
|
+
throw exp;
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia29pb3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbmV0d29yay9rb2lvcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQWdCLE1BQU0sa0NBQWtDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3ZFLE9BQU8sRUFDTCx3QkFBd0IsR0FFekIsTUFBTSxrQ0FBa0MsQ0FBQztBQUUxQyxPQUFPLFVBQVUsTUFBTSwyQkFBMkIsQ0FBQztBQUVuRCxNQUFNLE9BQU8sWUFBYSxTQUFRLHdCQUEwQztJQUN6RCxHQUFHLENBQVM7SUFDWixPQUFPLENBQVM7SUFDekIsS0FBSyxDQUFRO0lBRXJCLFlBQVksR0FBVyxFQUFFLE9BQWUsRUFBRSxTQUFrQjtRQUMxRCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3hCLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRztZQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1NBQ2hELENBQUMsQ0FBQztRQUNILElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUNoQyxlQUFlLENBQ2hCLEdBQUcsVUFBVSxTQUFTLEVBQUUsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxnQkFBZ0IsR0FBRyxDQUFDLE1BQWMsRUFBa0IsRUFBRTtRQUNwRCxPQUFPLElBQUksQ0FBQyxLQUFLO2FBQ2QsR0FBRyxDQUFvQixTQUFTLEVBQUU7WUFDakMsTUFBTSxFQUFFO2dCQUNOLFlBQVksRUFBRSxPQUFPLE1BQU0sRUFBRTtnQkFDN0IsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxFQUFFLHVDQUF1QzthQUNoRDtTQUNGLENBQUM7YUFDRCxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNaLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxPQUFPO2dCQUNMLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxZQUFZO2dCQUMxQixVQUFVLEVBQUUsV0FBVyxDQUFDLElBQUk7Z0JBQzVCLFNBQVMsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDM0IsT0FBTyxFQUFFLEtBQUssQ0FBQyxRQUFRO2FBQ3hCLENBQUM7UUFDSixDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNiLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUM7SUFFRjs7O09BR0c7SUFDSCxnQkFBZ0IsR0FBRyxHQUFvQixFQUFFO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLEtBQUs7YUFDZCxHQUFHLENBQW9CLFNBQVMsRUFBRTtZQUNqQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFO1NBQzdELENBQUM7YUFDRCxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO2FBQ3ZDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2IsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztJQUVGOzs7O09BSUc7SUFDSCxXQUFXLEdBQUcsQ0FBQyxTQUFpQixFQUFvQyxFQUFFO1FBQ3BFLE9BQU8sSUFBSSxDQUFDLEtBQUs7YUFDZCxJQUFJLENBQXFCLGdCQUFnQixFQUFFO1lBQzFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUMzQixDQUFDO2FBQ0QsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDWixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7Z0JBQ3pCLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQ3pDLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUM1QyxDQUFDO2dCQUNGLE9BQU87b0JBQ0wsR0FBRyxFQUFFO29CQUNMLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQzVDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2IsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGF4aW9zLCB7IEF4aW9zIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9yYXRlLWxpbWl0ZWQtYXhpb3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICdAZW11cmdvL2NhcmRhbm8tc2VyaWFsaXphdGlvbi1saWItbm9kZWpzJztcbmltcG9ydCB7XG4gIEFic3RyYWN0TmV0d29ya0Nvbm5lY3RvcixcbiAgQmxvY2ssXG59IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcbmltcG9ydCB7IEtvaW9zQmxvY2ssIEtvaW9zQ2JvclR4LCBLb2lvc1RyYW5zYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Lb2lvcyc7XG5pbXBvcnQgSnNvbkJpZ2ludCBmcm9tICdAcm9zZW4tYnJpZGdlL2pzb24tYmlnaW50JztcblxuZXhwb3J0IGNsYXNzIEtvaW9zTmV0d29yayBleHRlbmRzIEFic3RyYWN0TmV0d29ya0Nvbm5lY3RvcjxLb2lvc1RyYW5zYWN0aW9uPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGltZW91dDogbnVtYmVyO1xuICBwcml2YXRlIGtvaW9zOiBBeGlvcztcblxuICBjb25zdHJ1Y3Rvcih1cmw6IHN0cmluZywgdGltZW91dDogbnVtYmVyLCBhdXRoVG9rZW4/OiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudXJsID0gdXJsO1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgdGhpcy5rb2lvcyA9IGF4aW9zLmNyZWF0ZSh7XG4gICAgICBiYXNlVVJMOiB0aGlzLnVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMudGltZW91dCxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIH0pO1xuICAgIGlmIChhdXRoVG9rZW4pIHtcbiAgICAgIHRoaXMua29pb3MuZGVmYXVsdHMuaGVhZGVycy5jb21tb25bXG4gICAgICAgICdBdXRob3JpemF0aW9uJ1xuICAgICAgXSA9IGBCZWFyZXIgJHthdXRoVG9rZW59YDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBibG9jayBhdCBoZWlnaHRcbiAgICogQHBhcmFtIGhlaWdodFxuICAgKiBAcmV0dXJucyBCbG9ja1xuICAgKi9cbiAgZ2V0QmxvY2tBdEhlaWdodCA9IChoZWlnaHQ6IG51bWJlcik6IFByb21pc2U8QmxvY2s+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5rb2lvc1xuICAgICAgLmdldDxBcnJheTxLb2lvc0Jsb2NrPj4oJy9ibG9ja3MnLCB7XG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGJsb2NrX2hlaWdodDogYGx0ZS4ke2hlaWdodH1gLFxuICAgICAgICAgIGxpbWl0OiAyLFxuICAgICAgICAgIHNlbGVjdDogJ2hhc2gsYmxvY2tfaGVpZ2h0LGJsb2NrX3RpbWUsdHhfY291bnQnLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgY29uc3QgYmxvY2sgPSByZXMuZGF0YVswXTtcbiAgICAgICAgY29uc3QgcGFyZW50QmxvY2sgPSByZXMuZGF0YVsxXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoYXNoOiBibG9jay5oYXNoLFxuICAgICAgICAgIGhlaWdodDogYmxvY2suYmxvY2tfaGVpZ2h0LFxuICAgICAgICAgIHBhcmVudEhhc2g6IHBhcmVudEJsb2NrLmhhc2gsXG4gICAgICAgICAgdGltZXN0YW1wOiBibG9jay5ibG9ja190aW1lLFxuICAgICAgICAgIHR4Q291bnQ6IGJsb2NrLnR4X2NvdW50LFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXhwKSA9PiB7XG4gICAgICAgIHRocm93IGV4cDtcbiAgICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1cnJlbnQgbmV0d29yayBoZWlnaHRcbiAgICogQHJldHVybnMgY3VycmVudCBoZWlnaHRcbiAgICovXG4gIGdldEN1cnJlbnRIZWlnaHQgPSAoKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5rb2lvc1xuICAgICAgLmdldDxBcnJheTxLb2lvc0Jsb2NrPj4oJy9ibG9ja3MnLCB7XG4gICAgICAgIHBhcmFtczogeyBvZmZzZXQ6IDAsIGxpbWl0OiAxLCBzZWxlY3Q6ICdoYXNoLGJsb2NrX2hlaWdodCcgfSxcbiAgICAgIH0pXG4gICAgICAudGhlbigocmVzKSA9PiByZXMuZGF0YVswXS5ibG9ja19oZWlnaHQpXG4gICAgICAuY2F0Y2goKGV4cCkgPT4ge1xuICAgICAgICB0aHJvdyBleHA7XG4gICAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIHRyYW5zYWN0aW9ucyBpbiBhIGJsb2NrIHdpdGggc3BlY2lmaWVkIGhhc2hcbiAgICogQHBhcmFtIGJsb2NrSGFzaFxuICAgKiBAcmV0dXJucyBhcnJheSBvZiBLb2lvc1RyYW5zYWN0aW9uXG4gICAqL1xuICBnZXRCbG9ja1R4cyA9IChibG9ja0hhc2g6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8S29pb3NUcmFuc2FjdGlvbj4+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5rb2lvc1xuICAgICAgLnBvc3Q8QXJyYXk8S29pb3NDYm9yVHg+PignL2Jsb2NrX3R4X2Nib3InLCB7XG4gICAgICAgIF9ibG9ja19oYXNoZXM6IFtibG9ja0hhc2hdLFxuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlcy5kYXRhLm1hcCgodHgpID0+IHtcbiAgICAgICAgICBjb25zdCBzZXJpYWxpemVkVHggPSBUcmFuc2FjdGlvbi5mcm9tX2J5dGVzKFxuICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odHguY2JvciwgJ2hleCcpKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnR4LFxuICAgICAgICAgICAgLi4uSnNvbkJpZ2ludC5wYXJzZShzZXJpYWxpemVkVHgudG9fanNvbigpKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGV4cCkgPT4ge1xuICAgICAgICB0aHJvdyBleHA7XG4gICAgICB9KTtcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { BlockFrostTransaction } from '../interfaces/BlockFrost';
|
|
2
|
+
import { GeneralScanner, ScannerConfig } from '@rosen-bridge/abstract-scanner';
|
|
3
|
+
declare class CardanoBlockFrostScanner extends GeneralScanner<BlockFrostTransaction> {
|
|
4
|
+
constructor(config: ScannerConfig<BlockFrostTransaction>);
|
|
5
|
+
}
|
|
6
|
+
export { CardanoBlockFrostScanner };
|
|
7
|
+
//# sourceMappingURL=blockfrost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockfrost.d.ts","sourceRoot":"","sources":["../../lib/scanner/blockfrost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/E,cAAM,wBAAyB,SAAQ,cAAc,CAAC,qBAAqB,CAAC;gBAC9D,MAAM,EAAE,aAAa,CAAC,qBAAqB,CAAC;CAWzD;AACD,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { GeneralScanner } from '@rosen-bridge/abstract-scanner';
|
|
2
|
+
class CardanoBlockFrostScanner extends GeneralScanner {
|
|
3
|
+
constructor(config) {
|
|
4
|
+
super('cardano', config.dataSource, config.initialHeight, config.network, config.blockRetrieveGap, config.logger, config.suffix);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export { CardanoBlockFrostScanner };
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tmcm9zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9zY2FubmVyL2Jsb2NrZnJvc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUvRSxNQUFNLHdCQUF5QixTQUFRLGNBQXFDO0lBQzFFLFlBQVksTUFBNEM7UUFDdEQsS0FBSyxDQUNILFNBQVMsRUFDVCxNQUFNLENBQUMsVUFBVSxFQUNqQixNQUFNLENBQUMsYUFBYSxFQUNwQixNQUFNLENBQUMsT0FBTyxFQUNkLE1BQU0sQ0FBQyxnQkFBZ0IsRUFDdkIsTUFBTSxDQUFDLE1BQU0sRUFDYixNQUFNLENBQUMsTUFBTSxDQUNkLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFDRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJsb2NrRnJvc3RUcmFuc2FjdGlvbiB9IGZyb20gJy4uL2ludGVyZmFjZXMvQmxvY2tGcm9zdCc7XG5pbXBvcnQgeyBHZW5lcmFsU2Nhbm5lciwgU2Nhbm5lckNvbmZpZyB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3Qtc2Nhbm5lcic7XG5cbmNsYXNzIENhcmRhbm9CbG9ja0Zyb3N0U2Nhbm5lciBleHRlbmRzIEdlbmVyYWxTY2FubmVyPEJsb2NrRnJvc3RUcmFuc2FjdGlvbj4ge1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNjYW5uZXJDb25maWc8QmxvY2tGcm9zdFRyYW5zYWN0aW9uPikge1xuICAgIHN1cGVyKFxuICAgICAgJ2NhcmRhbm8nLFxuICAgICAgY29uZmlnLmRhdGFTb3VyY2UsXG4gICAgICBjb25maWcuaW5pdGlhbEhlaWdodCxcbiAgICAgIGNvbmZpZy5uZXR3b3JrLFxuICAgICAgY29uZmlnLmJsb2NrUmV0cmlldmVHYXAsXG4gICAgICBjb25maWcubG9nZ2VyLFxuICAgICAgY29uZmlnLnN1ZmZpeFxuICAgICk7XG4gIH1cbn1cbmV4cG9ydCB7IENhcmRhbm9CbG9ja0Zyb3N0U2Nhbm5lciB9O1xuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { KoiosTransaction } from '../interfaces/Koios';
|
|
2
|
+
import { GeneralScanner, ScannerConfig } from '@rosen-bridge/abstract-scanner';
|
|
3
|
+
declare class CardanoKoiosScanner extends GeneralScanner<KoiosTransaction> {
|
|
4
|
+
constructor(config: ScannerConfig<KoiosTransaction>);
|
|
5
|
+
}
|
|
6
|
+
export { CardanoKoiosScanner };
|
|
7
|
+
//# sourceMappingURL=koios.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koios.d.ts","sourceRoot":"","sources":["../../lib/scanner/koios.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/E,cAAM,mBAAoB,SAAQ,cAAc,CAAC,gBAAgB,CAAC;gBACpD,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC;CAWpD;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { GeneralScanner } from '@rosen-bridge/abstract-scanner';
|
|
2
|
+
class CardanoKoiosScanner extends GeneralScanner {
|
|
3
|
+
constructor(config) {
|
|
4
|
+
super('cardano', config.dataSource, config.initialHeight, config.network, config.blockRetrieveGap, config.logger, config.suffix);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export { CardanoKoiosScanner };
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia29pb3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc2Nhbm5lci9rb2lvcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFpQixNQUFNLGdDQUFnQyxDQUFDO0FBRS9FLE1BQU0sbUJBQW9CLFNBQVEsY0FBZ0M7SUFDaEUsWUFBWSxNQUF1QztRQUNqRCxLQUFLLENBQ0gsU0FBUyxFQUNULE1BQU0sQ0FBQyxVQUFVLEVBQ2pCLE1BQU0sQ0FBQyxhQUFhLEVBQ3BCLE1BQU0sQ0FBQyxPQUFPLEVBQ2QsTUFBTSxDQUFDLGdCQUFnQixFQUN2QixNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxNQUFNLENBQ2QsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS29pb3NUcmFuc2FjdGlvbiB9IGZyb20gJy4uL2ludGVyZmFjZXMvS29pb3MnO1xuaW1wb3J0IHsgR2VuZXJhbFNjYW5uZXIsIFNjYW5uZXJDb25maWcgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LXNjYW5uZXInO1xuXG5jbGFzcyBDYXJkYW5vS29pb3NTY2FubmVyIGV4dGVuZHMgR2VuZXJhbFNjYW5uZXI8S29pb3NUcmFuc2FjdGlvbj4ge1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNjYW5uZXJDb25maWc8S29pb3NUcmFuc2FjdGlvbj4pIHtcbiAgICBzdXBlcihcbiAgICAgICdjYXJkYW5vJyxcbiAgICAgIGNvbmZpZy5kYXRhU291cmNlLFxuICAgICAgY29uZmlnLmluaXRpYWxIZWlnaHQsXG4gICAgICBjb25maWcubmV0d29yayxcbiAgICAgIGNvbmZpZy5ibG9ja1JldHJpZXZlR2FwLFxuICAgICAgY29uZmlnLmxvZ2dlcixcbiAgICAgIGNvbmZpZy5zdWZmaXhcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7IENhcmRhbm9Lb2lvc1NjYW5uZXIgfTtcbiJdfQ==
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Point, Transaction } from '@cardano-ogmios/schema';
|
|
2
|
+
import { ChainSynchronizationClient } from '@cardano-ogmios/client/dist/ChainSynchronization';
|
|
3
|
+
import { WebSocketScanner } from '@rosen-bridge/abstract-scanner';
|
|
4
|
+
import { CardanoOgmiosConfig } from '../interfaces';
|
|
5
|
+
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
6
|
+
declare class CardanoOgmiosScanner extends WebSocketScanner<Transaction> {
|
|
7
|
+
client: ChainSynchronizationClient;
|
|
8
|
+
initPoint: Point;
|
|
9
|
+
host: string;
|
|
10
|
+
port: number;
|
|
11
|
+
useTls: boolean;
|
|
12
|
+
private connected;
|
|
13
|
+
private stopped;
|
|
14
|
+
private reconnectionConfig;
|
|
15
|
+
constructor(config: CardanoOgmiosConfig, logger?: AbstractLogger);
|
|
16
|
+
/**
|
|
17
|
+
* process block when a block forked library call this function
|
|
18
|
+
* @param response: forked block
|
|
19
|
+
* @param requestNext: a function to tell node to send next block
|
|
20
|
+
*/
|
|
21
|
+
private rollBackward;
|
|
22
|
+
/**
|
|
23
|
+
* Step forward when new block arrived ogmios-client call this function
|
|
24
|
+
* @param response: new block
|
|
25
|
+
* @param requestNext: tell library that this block proceeds. pass next block when available
|
|
26
|
+
*/
|
|
27
|
+
private rollForward;
|
|
28
|
+
/**
|
|
29
|
+
* find intersect between stored blocks and blockchain.
|
|
30
|
+
* @param context: blockchain context
|
|
31
|
+
*/
|
|
32
|
+
private findIntersection;
|
|
33
|
+
/**
|
|
34
|
+
* Handles ogmios connection closure
|
|
35
|
+
*/
|
|
36
|
+
private connectionCloseHandler;
|
|
37
|
+
/**
|
|
38
|
+
* start scanner. first find fork point. fork all blocks and request updates from node.
|
|
39
|
+
*/
|
|
40
|
+
start: () => Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* stop ws connection to node.
|
|
43
|
+
*/
|
|
44
|
+
stop: () => Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* @returns The connection status of ogmios scanner
|
|
47
|
+
*/
|
|
48
|
+
getConnectionStatus: () => boolean;
|
|
49
|
+
}
|
|
50
|
+
export { CardanoOgmiosScanner };
|
|
51
|
+
//# sourceMappingURL=ogmios.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ogmios.d.ts","sourceRoot":"","sources":["../../lib/scanner/ogmios.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,EAGL,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EACL,0BAA0B,EAE3B,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAEL,gBAAgB,EACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAA4B,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAmB/D,cAAM,oBAAqB,SAAQ,gBAAgB,CAAC,WAAW,CAAC;IAC9D,MAAM,EAAE,0BAA0B,CAAC;IACnC,SAAS,EAAE,KAAK,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,kBAAkB,CAA2B;gBAEzC,MAAM,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,cAAc;IAoBhE;;;;OAIG;IACH,OAAO,CAAC,YAAY,CAsBlB;IAEF;;;;OAIG;IACH,OAAO,CAAC,WAAW,CAuBjB;IAEF;;;OAGG;IACH,OAAO,CAAC,gBAAgB,CAkCtB;IAEF;;OAEG;IACH,OAAO,CAAC,sBAAsB,CA6B5B;IAEF;;OAEG;IACH,KAAK,QAAa,OAAO,CAAC,IAAI,CAAC,CAwB7B;IAEF;;OAEG;IACH,IAAI,QAAa,OAAO,CAAC,IAAI,CAAC,CAG5B;IAEF;;OAEG;IACH,mBAAmB,gBAAwB;CAC5C;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { createInteractionContext, createChainSynchronizationClient, } from '@cardano-ogmios/client';
|
|
2
|
+
import { findIntersection, } from '@cardano-ogmios/client/dist/ChainSynchronization';
|
|
3
|
+
import { BlockDbAction, WebSocketScanner, } from '@rosen-bridge/abstract-scanner';
|
|
4
|
+
import { RECONNECTION_INITIAL_DELAY, RECONNECTION_MAX_DELAY, SLOT_SHELLY_NUMBER, RECONNECTION_MAX_ATTEMPTS, } from '../constants';
|
|
5
|
+
import { ExponentialBackoff, handleWhen, retry } from 'cockatiel';
|
|
6
|
+
class CardanoOgmiosScanner extends WebSocketScanner {
|
|
7
|
+
client;
|
|
8
|
+
initPoint;
|
|
9
|
+
host;
|
|
10
|
+
port;
|
|
11
|
+
useTls;
|
|
12
|
+
connected;
|
|
13
|
+
stopped;
|
|
14
|
+
reconnectionConfig;
|
|
15
|
+
constructor(config, logger) {
|
|
16
|
+
super('cardano', logger, config.maxTryBlock, config.suffix);
|
|
17
|
+
this.action = new BlockDbAction(config.dataSource, this.name(), logger);
|
|
18
|
+
this.host = config.nodeHostOrIp;
|
|
19
|
+
this.port = config.nodePort;
|
|
20
|
+
this.useTls = config.useTls ?? false;
|
|
21
|
+
this.connected = false;
|
|
22
|
+
this.initPoint = {
|
|
23
|
+
id: config.initialHash,
|
|
24
|
+
slot: config.initialSlot,
|
|
25
|
+
};
|
|
26
|
+
this.reconnectionConfig = {
|
|
27
|
+
initialDelay: config.reconnectionConfig?.initialDelay ?? RECONNECTION_INITIAL_DELAY,
|
|
28
|
+
maxDelay: config.reconnectionConfig?.maxDelay ?? RECONNECTION_MAX_DELAY,
|
|
29
|
+
maxAttempts: config.reconnectionConfig?.maxAttempts ?? RECONNECTION_MAX_ATTEMPTS,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* process block when a block forked library call this function
|
|
34
|
+
* @param response: forked block
|
|
35
|
+
* @param requestNext: a function to tell node to send next block
|
|
36
|
+
*/
|
|
37
|
+
rollBackward = async (response, requestNext) => {
|
|
38
|
+
const hash = response.point.id;
|
|
39
|
+
const savedBlock = await this.action.getBlockWithHash(hash);
|
|
40
|
+
this.logger.debug(`Rolling backward to height ${savedBlock?.height} in scanner ${this.name()}`);
|
|
41
|
+
if (savedBlock) {
|
|
42
|
+
const block = {
|
|
43
|
+
hash: savedBlock.hash,
|
|
44
|
+
height: savedBlock.height,
|
|
45
|
+
parentHash: savedBlock.parentHash,
|
|
46
|
+
extra: savedBlock.extra,
|
|
47
|
+
timestamp: savedBlock.timestamp,
|
|
48
|
+
};
|
|
49
|
+
await this.stepBackward(block);
|
|
50
|
+
}
|
|
51
|
+
requestNext();
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Step forward when new block arrived ogmios-client call this function
|
|
55
|
+
* @param response: new block
|
|
56
|
+
* @param requestNext: tell library that this block proceeds. pass next block when available
|
|
57
|
+
*/
|
|
58
|
+
rollForward = async (response, requestNext) => {
|
|
59
|
+
if (response.block.type === 'praos') {
|
|
60
|
+
const praosBlock = response.block;
|
|
61
|
+
this.logger.debug(`Queueing new block at height ${praosBlock.height} in scanner ${this.name()}`);
|
|
62
|
+
const block = {
|
|
63
|
+
hash: praosBlock.id,
|
|
64
|
+
height: praosBlock.height,
|
|
65
|
+
parentHash: praosBlock.ancestor,
|
|
66
|
+
extra: `${praosBlock.slot}`,
|
|
67
|
+
// Caution: In case of a hard fork and change in slot duration, this must change!
|
|
68
|
+
timestamp: praosBlock.slot + SLOT_SHELLY_NUMBER,
|
|
69
|
+
};
|
|
70
|
+
if (praosBlock.transactions)
|
|
71
|
+
await this.stepForward(block, praosBlock.transactions);
|
|
72
|
+
}
|
|
73
|
+
requestNext();
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* find intersect between stored blocks and blockchain.
|
|
77
|
+
* @param context: blockchain context
|
|
78
|
+
*/
|
|
79
|
+
findIntersection = async (context) => {
|
|
80
|
+
let count = 1;
|
|
81
|
+
let skip = 0;
|
|
82
|
+
while (count !== 0) {
|
|
83
|
+
try {
|
|
84
|
+
const release = await this.mutex.acquire();
|
|
85
|
+
const blocks = await this.action.getLastSavedBlocks(skip, count);
|
|
86
|
+
release();
|
|
87
|
+
if (blocks.length === 0)
|
|
88
|
+
count = 0;
|
|
89
|
+
const points = blocks.length > 0
|
|
90
|
+
? blocks.map((item) => ({
|
|
91
|
+
slot: item.extra ? parseInt(item.extra) : 0,
|
|
92
|
+
id: item.hash,
|
|
93
|
+
}))
|
|
94
|
+
: [this.initPoint];
|
|
95
|
+
const intersect = await findIntersection(context, points);
|
|
96
|
+
const intersectPoint = intersect.intersection;
|
|
97
|
+
let height = 0;
|
|
98
|
+
if (blocks.length) {
|
|
99
|
+
const foundedBlock = blocks.find((item) => (item.hash = intersectPoint.id));
|
|
100
|
+
if (foundedBlock) {
|
|
101
|
+
height = foundedBlock.height;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return { point: intersect.intersection, height: height };
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
skip += count;
|
|
108
|
+
count *= 2;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return undefined;
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* Handles ogmios connection closure
|
|
115
|
+
*/
|
|
116
|
+
connectionCloseHandler = async () => {
|
|
117
|
+
this.connected = false;
|
|
118
|
+
this.logger.warn('Ogmios connection closed');
|
|
119
|
+
if (this.stopped)
|
|
120
|
+
return;
|
|
121
|
+
const retryPolicy = retry(handleWhen((error) => {
|
|
122
|
+
this.logger.warn(`An error occurred while reconnecting to ogmios client: ${error}`);
|
|
123
|
+
return true;
|
|
124
|
+
}), {
|
|
125
|
+
maxAttempts: this.reconnectionConfig.maxAttempts,
|
|
126
|
+
backoff: new ExponentialBackoff({
|
|
127
|
+
maxDelay: this.reconnectionConfig.maxDelay,
|
|
128
|
+
initialDelay: this.reconnectionConfig.initialDelay,
|
|
129
|
+
}),
|
|
130
|
+
});
|
|
131
|
+
let trial = 0;
|
|
132
|
+
retryPolicy.execute(async () => {
|
|
133
|
+
trial++;
|
|
134
|
+
this.logger.debug(`Retrying to connect to ogmios client in trial step #${trial}`);
|
|
135
|
+
return await this.start();
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* start scanner. first find fork point. fork all blocks and request updates from node.
|
|
140
|
+
*/
|
|
141
|
+
start = async () => {
|
|
142
|
+
this.stopped = false;
|
|
143
|
+
const context = await createInteractionContext((err) => this.logger.error(`${err}`), this.connectionCloseHandler, { connection: { port: this.port, host: this.host, tls: this.useTls } });
|
|
144
|
+
const intersect = await this.findIntersection(context);
|
|
145
|
+
if (intersect) {
|
|
146
|
+
// find intersect then start from that point
|
|
147
|
+
this.client = await createChainSynchronizationClient(context, {
|
|
148
|
+
rollBackward: this.rollBackward,
|
|
149
|
+
rollForward: this.rollForward,
|
|
150
|
+
}, { sequential: true });
|
|
151
|
+
this.connected = true;
|
|
152
|
+
await this.forkBlock(intersect.height + 1);
|
|
153
|
+
await this.client.resume([intersect.point], 2);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
throw Error('Can not start scanner. initial block is invalid');
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* stop ws connection to node.
|
|
161
|
+
*/
|
|
162
|
+
stop = async () => {
|
|
163
|
+
this.stopped = true;
|
|
164
|
+
await this.client.shutdown();
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* @returns The connection status of ogmios scanner
|
|
168
|
+
*/
|
|
169
|
+
getConnectionStatus = () => this.connected;
|
|
170
|
+
}
|
|
171
|
+
export { CardanoOgmiosScanner };
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2dtaW9zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL3NjYW5uZXIvb2dtaW9zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsZ0NBQWdDLEdBRWpDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUVMLGdCQUFnQixHQUNqQixNQUFNLGtEQUFrRCxDQUFDO0FBQzFELE9BQU8sRUFDTCxhQUFhLEVBQ2IsZ0JBQWdCLEdBQ2pCLE1BQU0sZ0NBQWdDLENBQUM7QUFHeEMsT0FBTyxFQUNMLDBCQUEwQixFQUMxQixzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLHlCQUF5QixHQUMxQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVlsRSxNQUFNLG9CQUFxQixTQUFRLGdCQUE2QjtJQUM5RCxNQUFNLENBQTZCO0lBQ25DLFNBQVMsQ0FBUTtJQUNqQixJQUFJLENBQVM7SUFDYixJQUFJLENBQVM7SUFDYixNQUFNLENBQVU7SUFDUixTQUFTLENBQVU7SUFDbkIsT0FBTyxDQUFVO0lBQ2pCLGtCQUFrQixDQUEyQjtJQUVyRCxZQUFZLE1BQTJCLEVBQUUsTUFBdUI7UUFDOUQsS0FBSyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDaEMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUM7UUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRztZQUNmLEVBQUUsRUFBRSxNQUFNLENBQUMsV0FBVztZQUN0QixJQUFJLEVBQUUsTUFBTSxDQUFDLFdBQVc7U0FDekIsQ0FBQztRQUNGLElBQUksQ0FBQyxrQkFBa0IsR0FBRztZQUN4QixZQUFZLEVBQ1YsTUFBTSxDQUFDLGtCQUFrQixFQUFFLFlBQVksSUFBSSwwQkFBMEI7WUFDdkUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLElBQUksc0JBQXNCO1lBQ3ZFLFdBQVcsRUFDVCxNQUFNLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxJQUFJLHlCQUF5QjtTQUN0RSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxZQUFZLEdBQUcsS0FBSyxFQUMxQixRQUEwQixFQUMxQixXQUF1QixFQUN2QixFQUFFO1FBQ0YsTUFBTSxJQUFJLEdBQUksUUFBUSxDQUFDLEtBQWUsQ0FBQyxFQUFFLENBQUM7UUFDMUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLDhCQUNFLFVBQVUsRUFBRSxNQUNkLGVBQWUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQzdCLENBQUM7UUFDRixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsTUFBTSxLQUFLLEdBQUc7Z0JBQ1osSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJO2dCQUNyQixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07Z0JBQ3pCLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVTtnQkFDakMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO2dCQUN2QixTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7YUFDaEMsQ0FBQztZQUNGLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsV0FBVyxFQUFFLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0lBRUY7Ozs7T0FJRztJQUNLLFdBQVcsR0FBRyxLQUFLLEVBQ3pCLFFBQXlCLEVBQ3pCLFdBQXVCLEVBQ3ZCLEVBQUU7UUFDRixJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3BDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFtQixDQUFDO1lBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLGdDQUNFLFVBQVUsQ0FBQyxNQUNiLGVBQWUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQzdCLENBQUM7WUFDRixNQUFNLEtBQUssR0FBRztnQkFDWixJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUU7Z0JBQ25CLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtnQkFDekIsVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRO2dCQUMvQixLQUFLLEVBQUUsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFO2dCQUMzQixpRkFBaUY7Z0JBQ2pGLFNBQVMsRUFBRSxVQUFVLENBQUMsSUFBSSxHQUFHLGtCQUFrQjthQUNoRCxDQUFDO1lBQ0YsSUFBSSxVQUFVLENBQUMsWUFBWTtnQkFDekIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUNELFdBQVcsRUFBRSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNLLGdCQUFnQixHQUFHLEtBQUssRUFBRSxPQUEyQixFQUFFLEVBQUU7UUFDL0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsT0FBTyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDakUsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDbkMsTUFBTSxNQUFNLEdBQ1YsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUNmLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUNwQixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDM0MsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJO3FCQUNkLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU0sU0FBUyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMxRCxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsWUFBcUIsQ0FBQztnQkFDdkQsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNsQixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUM5QixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FDMUMsQ0FBQztvQkFDRixJQUFJLFlBQVksRUFBRSxDQUFDO3dCQUNqQixNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFDL0IsQ0FBQztnQkFDSCxDQUFDO2dCQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLFlBQXFCLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3BFLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsSUFBSSxJQUFJLEtBQUssQ0FBQztnQkFDZCxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQ2IsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRjs7T0FFRztJQUNLLHNCQUFzQixHQUFHLEtBQUssSUFBSSxFQUFFO1FBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDN0MsSUFBSSxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFFekIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUN2QixVQUFVLENBQUMsQ0FBQyxLQUFZLEVBQUUsRUFBRTtZQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCwwREFBMEQsS0FBSyxFQUFFLENBQ2xFLENBQUM7WUFDRixPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxFQUNGO1lBQ0UsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXO1lBQ2hELE9BQU8sRUFBRSxJQUFJLGtCQUFrQixDQUFDO2dCQUM5QixRQUFRLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVE7Z0JBQzFDLFlBQVksRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWTthQUNuRCxDQUFDO1NBQ0gsQ0FDRixDQUFDO1FBRUYsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtZQUM3QixLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLHVEQUF1RCxLQUFLLEVBQUUsQ0FDL0QsQ0FBQztZQUNGLE9BQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRjs7T0FFRztJQUNILEtBQUssR0FBRyxLQUFLLElBQW1CLEVBQUU7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsTUFBTSxPQUFPLEdBQXVCLE1BQU0sd0JBQXdCLENBQ2hFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQ3BDLElBQUksQ0FBQyxzQkFBc0IsRUFDM0IsRUFBRSxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ3ZFLENBQUM7UUFDRixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2RCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsNENBQTRDO1lBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxnQ0FBZ0MsQ0FDbEQsT0FBTyxFQUNQO2dCQUNFLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDL0IsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2FBQzlCLEVBQ0QsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQ3JCLENBQUM7WUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNqRSxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUY7O09BRUc7SUFDSCxJQUFJLEdBQUcsS0FBSyxJQUFtQixFQUFFO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDLENBQUM7SUFFRjs7T0FFRztJQUNILG1CQUFtQixHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Q0FDNUM7QUFFRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJsb2NrLFxuICBCbG9ja1ByYW9zLFxuICBQb2ludCxcbiAgUG9pbnRPck9yaWdpbixcbiAgVGlwT3JPcmlnaW4sXG4gIFRyYW5zYWN0aW9uLFxufSBmcm9tICdAY2FyZGFuby1vZ21pb3Mvc2NoZW1hJztcbmltcG9ydCB7XG4gIGNyZWF0ZUludGVyYWN0aW9uQ29udGV4dCxcbiAgY3JlYXRlQ2hhaW5TeW5jaHJvbml6YXRpb25DbGllbnQsXG4gIEludGVyYWN0aW9uQ29udGV4dCxcbn0gZnJvbSAnQGNhcmRhbm8tb2dtaW9zL2NsaWVudCc7XG5pbXBvcnQge1xuICBDaGFpblN5bmNocm9uaXphdGlvbkNsaWVudCxcbiAgZmluZEludGVyc2VjdGlvbixcbn0gZnJvbSAnQGNhcmRhbm8tb2dtaW9zL2NsaWVudC9kaXN0L0NoYWluU3luY2hyb25pemF0aW9uJztcbmltcG9ydCB7XG4gIEJsb2NrRGJBY3Rpb24sXG4gIFdlYlNvY2tldFNjYW5uZXIsXG59IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3Qtc2Nhbm5lcic7XG5pbXBvcnQgeyBDYXJkYW5vT2dtaW9zQ29uZmlnLCBPZ21pb3NSZWNvbm5lY3Rpb25Db25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHtcbiAgUkVDT05ORUNUSU9OX0lOSVRJQUxfREVMQVksXG4gIFJFQ09OTkVDVElPTl9NQVhfREVMQVksXG4gIFNMT1RfU0hFTExZX05VTUJFUixcbiAgUkVDT05ORUNUSU9OX01BWF9BVFRFTVBUUyxcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEV4cG9uZW50aWFsQmFja29mZiwgaGFuZGxlV2hlbiwgcmV0cnkgfSBmcm9tICdjb2NrYXRpZWwnO1xuXG5pbnRlcmZhY2UgQmFja3dhcmRSZXNwb25zZSB7XG4gIHBvaW50OiBQb2ludE9yT3JpZ2luO1xuICB0aXA6IFRpcE9yT3JpZ2luO1xufVxuXG5pbnRlcmZhY2UgRm9yd2FyZFJlc3BvbnNlIHtcbiAgYmxvY2s6IEJsb2NrO1xuICB0aXA6IFRpcE9yT3JpZ2luO1xufVxuXG5jbGFzcyBDYXJkYW5vT2dtaW9zU2Nhbm5lciBleHRlbmRzIFdlYlNvY2tldFNjYW5uZXI8VHJhbnNhY3Rpb24+IHtcbiAgY2xpZW50OiBDaGFpblN5bmNocm9uaXphdGlvbkNsaWVudDtcbiAgaW5pdFBvaW50OiBQb2ludDtcbiAgaG9zdDogc3RyaW5nO1xuICBwb3J0OiBudW1iZXI7XG4gIHVzZVRsczogYm9vbGVhbjtcbiAgcHJpdmF0ZSBjb25uZWN0ZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgc3RvcHBlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWNvbm5lY3Rpb25Db25maWc6IE9nbWlvc1JlY29ubmVjdGlvbkNvbmZpZztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IENhcmRhbm9PZ21pb3NDb25maWcsIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgc3VwZXIoJ2NhcmRhbm8nLCBsb2dnZXIsIGNvbmZpZy5tYXhUcnlCbG9jaywgY29uZmlnLnN1ZmZpeCk7XG4gICAgdGhpcy5hY3Rpb24gPSBuZXcgQmxvY2tEYkFjdGlvbihjb25maWcuZGF0YVNvdXJjZSwgdGhpcy5uYW1lKCksIGxvZ2dlcik7XG4gICAgdGhpcy5ob3N0ID0gY29uZmlnLm5vZGVIb3N0T3JJcDtcbiAgICB0aGlzLnBvcnQgPSBjb25maWcubm9kZVBvcnQ7XG4gICAgdGhpcy51c2VUbHMgPSBjb25maWcudXNlVGxzID8/IGZhbHNlO1xuICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5pbml0UG9pbnQgPSB7XG4gICAgICBpZDogY29uZmlnLmluaXRpYWxIYXNoLFxuICAgICAgc2xvdDogY29uZmlnLmluaXRpYWxTbG90LFxuICAgIH07XG4gICAgdGhpcy5yZWNvbm5lY3Rpb25Db25maWcgPSB7XG4gICAgICBpbml0aWFsRGVsYXk6XG4gICAgICAgIGNvbmZpZy5yZWNvbm5lY3Rpb25Db25maWc/LmluaXRpYWxEZWxheSA/PyBSRUNPTk5FQ1RJT05fSU5JVElBTF9ERUxBWSxcbiAgICAgIG1heERlbGF5OiBjb25maWcucmVjb25uZWN0aW9uQ29uZmlnPy5tYXhEZWxheSA/PyBSRUNPTk5FQ1RJT05fTUFYX0RFTEFZLFxuICAgICAgbWF4QXR0ZW1wdHM6XG4gICAgICAgIGNvbmZpZy5yZWNvbm5lY3Rpb25Db25maWc/Lm1heEF0dGVtcHRzID8/IFJFQ09OTkVDVElPTl9NQVhfQVRURU1QVFMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBwcm9jZXNzIGJsb2NrIHdoZW4gYSBibG9jayBmb3JrZWQgbGlicmFyeSBjYWxsIHRoaXMgZnVuY3Rpb25cbiAgICogQHBhcmFtIHJlc3BvbnNlOiBmb3JrZWQgYmxvY2tcbiAgICogQHBhcmFtIHJlcXVlc3ROZXh0OiBhIGZ1bmN0aW9uIHRvIHRlbGwgbm9kZSB0byBzZW5kIG5leHQgYmxvY2tcbiAgICovXG4gIHByaXZhdGUgcm9sbEJhY2t3YXJkID0gYXN5bmMgKFxuICAgIHJlc3BvbnNlOiBCYWNrd2FyZFJlc3BvbnNlLFxuICAgIHJlcXVlc3ROZXh0OiAoKSA9PiB2b2lkXG4gICkgPT4ge1xuICAgIGNvbnN0IGhhc2ggPSAocmVzcG9uc2UucG9pbnQgYXMgUG9pbnQpLmlkO1xuICAgIGNvbnN0IHNhdmVkQmxvY2sgPSBhd2FpdCB0aGlzLmFjdGlvbi5nZXRCbG9ja1dpdGhIYXNoKGhhc2gpO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYFJvbGxpbmcgYmFja3dhcmQgdG8gaGVpZ2h0ICR7XG4gICAgICAgIHNhdmVkQmxvY2s/LmhlaWdodFxuICAgICAgfSBpbiBzY2FubmVyICR7dGhpcy5uYW1lKCl9YFxuICAgICk7XG4gICAgaWYgKHNhdmVkQmxvY2spIHtcbiAgICAgIGNvbnN0IGJsb2NrID0ge1xuICAgICAgICBoYXNoOiBzYXZlZEJsb2NrLmhhc2gsXG4gICAgICAgIGhlaWdodDogc2F2ZWRCbG9jay5oZWlnaHQsXG4gICAgICAgIHBhcmVudEhhc2g6IHNhdmVkQmxvY2sucGFyZW50SGFzaCxcbiAgICAgICAgZXh0cmE6IHNhdmVkQmxvY2suZXh0cmEsXG4gICAgICAgIHRpbWVzdGFtcDogc2F2ZWRCbG9jay50aW1lc3RhbXAsXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5zdGVwQmFja3dhcmQoYmxvY2spO1xuICAgIH1cbiAgICByZXF1ZXN0TmV4dCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdGVwIGZvcndhcmQgd2hlbiBuZXcgYmxvY2sgYXJyaXZlZCBvZ21pb3MtY2xpZW50IGNhbGwgdGhpcyBmdW5jdGlvblxuICAgKiBAcGFyYW0gcmVzcG9uc2U6IG5ldyBibG9ja1xuICAgKiBAcGFyYW0gcmVxdWVzdE5leHQ6IHRlbGwgbGlicmFyeSB0aGF0IHRoaXMgYmxvY2sgcHJvY2VlZHMuIHBhc3MgbmV4dCBibG9jayB3aGVuIGF2YWlsYWJsZVxuICAgKi9cbiAgcHJpdmF0ZSByb2xsRm9yd2FyZCA9IGFzeW5jIChcbiAgICByZXNwb25zZTogRm9yd2FyZFJlc3BvbnNlLFxuICAgIHJlcXVlc3ROZXh0OiAoKSA9PiB2b2lkXG4gICkgPT4ge1xuICAgIGlmIChyZXNwb25zZS5ibG9jay50eXBlID09PSAncHJhb3MnKSB7XG4gICAgICBjb25zdCBwcmFvc0Jsb2NrID0gcmVzcG9uc2UuYmxvY2sgYXMgQmxvY2tQcmFvcztcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgUXVldWVpbmcgbmV3IGJsb2NrIGF0IGhlaWdodCAke1xuICAgICAgICAgIHByYW9zQmxvY2suaGVpZ2h0XG4gICAgICAgIH0gaW4gc2Nhbm5lciAke3RoaXMubmFtZSgpfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBibG9jayA9IHtcbiAgICAgICAgaGFzaDogcHJhb3NCbG9jay5pZCxcbiAgICAgICAgaGVpZ2h0OiBwcmFvc0Jsb2NrLmhlaWdodCxcbiAgICAgICAgcGFyZW50SGFzaDogcHJhb3NCbG9jay5hbmNlc3RvcixcbiAgICAgICAgZXh0cmE6IGAke3ByYW9zQmxvY2suc2xvdH1gLFxuICAgICAgICAvLyBDYXV0aW9uOiBJbiBjYXNlIG9mIGEgaGFyZCBmb3JrIGFuZCBjaGFuZ2UgaW4gc2xvdCBkdXJhdGlvbiwgdGhpcyBtdXN0IGNoYW5nZSFcbiAgICAgICAgdGltZXN0YW1wOiBwcmFvc0Jsb2NrLnNsb3QgKyBTTE9UX1NIRUxMWV9OVU1CRVIsXG4gICAgICB9O1xuICAgICAgaWYgKHByYW9zQmxvY2sudHJhbnNhY3Rpb25zKVxuICAgICAgICBhd2FpdCB0aGlzLnN0ZXBGb3J3YXJkKGJsb2NrLCBwcmFvc0Jsb2NrLnRyYW5zYWN0aW9ucyk7XG4gICAgfVxuICAgIHJlcXVlc3ROZXh0KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGZpbmQgaW50ZXJzZWN0IGJldHdlZW4gc3RvcmVkIGJsb2NrcyBhbmQgYmxvY2tjaGFpbi5cbiAgICogQHBhcmFtIGNvbnRleHQ6IGJsb2NrY2hhaW4gY29udGV4dFxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kSW50ZXJzZWN0aW9uID0gYXN5bmMgKGNvbnRleHQ6IEludGVyYWN0aW9uQ29udGV4dCkgPT4ge1xuICAgIGxldCBjb3VudCA9IDE7XG4gICAgbGV0IHNraXAgPSAwO1xuICAgIHdoaWxlIChjb3VudCAhPT0gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IHRoaXMubXV0ZXguYWNxdWlyZSgpO1xuICAgICAgICBjb25zdCBibG9ja3MgPSBhd2FpdCB0aGlzLmFjdGlvbi5nZXRMYXN0U2F2ZWRCbG9ja3Moc2tpcCwgY291bnQpO1xuICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgIGlmIChibG9ja3MubGVuZ3RoID09PSAwKSBjb3VudCA9IDA7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9XG4gICAgICAgICAgYmxvY2tzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gYmxvY2tzLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAgICAgICBzbG90OiBpdGVtLmV4dHJhID8gcGFyc2VJbnQoaXRlbS5leHRyYSkgOiAwLFxuICAgICAgICAgICAgICAgIGlkOiBpdGVtLmhhc2gsXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgOiBbdGhpcy5pbml0UG9pbnRdO1xuICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSBhd2FpdCBmaW5kSW50ZXJzZWN0aW9uKGNvbnRleHQsIHBvaW50cyk7XG4gICAgICAgIGNvbnN0IGludGVyc2VjdFBvaW50ID0gaW50ZXJzZWN0LmludGVyc2VjdGlvbiBhcyBQb2ludDtcbiAgICAgICAgbGV0IGhlaWdodCA9IDA7XG4gICAgICAgIGlmIChibG9ja3MubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgZm91bmRlZEJsb2NrID0gYmxvY2tzLmZpbmQoXG4gICAgICAgICAgICAoaXRlbSkgPT4gKGl0ZW0uaGFzaCA9IGludGVyc2VjdFBvaW50LmlkKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGZvdW5kZWRCbG9jaykge1xuICAgICAgICAgICAgaGVpZ2h0ID0gZm91bmRlZEJsb2NrLmhlaWdodDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgcG9pbnQ6IGludGVyc2VjdC5pbnRlcnNlY3Rpb24gYXMgUG9pbnQsIGhlaWdodDogaGVpZ2h0IH07XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgc2tpcCArPSBjb3VudDtcbiAgICAgICAgY291bnQgKj0gMjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlcyBvZ21pb3MgY29ubmVjdGlvbiBjbG9zdXJlXG4gICAqL1xuICBwcml2YXRlIGNvbm5lY3Rpb25DbG9zZUhhbmRsZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmxvZ2dlci53YXJuKCdPZ21pb3MgY29ubmVjdGlvbiBjbG9zZWQnKTtcbiAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm47XG5cbiAgICBjb25zdCByZXRyeVBvbGljeSA9IHJldHJ5KFxuICAgICAgaGFuZGxlV2hlbigoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlY29ubmVjdGluZyB0byBvZ21pb3MgY2xpZW50OiAke2Vycm9yfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgbWF4QXR0ZW1wdHM6IHRoaXMucmVjb25uZWN0aW9uQ29uZmlnLm1heEF0dGVtcHRzLFxuICAgICAgICBiYWNrb2ZmOiBuZXcgRXhwb25lbnRpYWxCYWNrb2ZmKHtcbiAgICAgICAgICBtYXhEZWxheTogdGhpcy5yZWNvbm5lY3Rpb25Db25maWcubWF4RGVsYXksXG4gICAgICAgICAgaW5pdGlhbERlbGF5OiB0aGlzLnJlY29ubmVjdGlvbkNvbmZpZy5pbml0aWFsRGVsYXksXG4gICAgICAgIH0pLFxuICAgICAgfVxuICAgICk7XG5cbiAgICBsZXQgdHJpYWwgPSAwO1xuICAgIHJldHJ5UG9saWN5LmV4ZWN1dGUoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJpYWwrKztcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgUmV0cnlpbmcgdG8gY29ubmVjdCB0byBvZ21pb3MgY2xpZW50IGluIHRyaWFsIHN0ZXAgIyR7dHJpYWx9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN0YXJ0KCk7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHN0YXJ0IHNjYW5uZXIuIGZpcnN0IGZpbmQgZm9yayBwb2ludC4gZm9yayBhbGwgYmxvY2tzIGFuZCByZXF1ZXN0IHVwZGF0ZXMgZnJvbSBub2RlLlxuICAgKi9cbiAgc3RhcnQgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdGhpcy5zdG9wcGVkID0gZmFsc2U7XG4gICAgY29uc3QgY29udGV4dDogSW50ZXJhY3Rpb25Db250ZXh0ID0gYXdhaXQgY3JlYXRlSW50ZXJhY3Rpb25Db250ZXh0KFxuICAgICAgKGVycikgPT4gdGhpcy5sb2dnZXIuZXJyb3IoYCR7ZXJyfWApLFxuICAgICAgdGhpcy5jb25uZWN0aW9uQ2xvc2VIYW5kbGVyLFxuICAgICAgeyBjb25uZWN0aW9uOiB7IHBvcnQ6IHRoaXMucG9ydCwgaG9zdDogdGhpcy5ob3N0LCB0bHM6IHRoaXMudXNlVGxzIH0gfVxuICAgICk7XG4gICAgY29uc3QgaW50ZXJzZWN0ID0gYXdhaXQgdGhpcy5maW5kSW50ZXJzZWN0aW9uKGNvbnRleHQpO1xuICAgIGlmIChpbnRlcnNlY3QpIHtcbiAgICAgIC8vIGZpbmQgaW50ZXJzZWN0IHRoZW4gc3RhcnQgZnJvbSB0aGF0IHBvaW50XG4gICAgICB0aGlzLmNsaWVudCA9IGF3YWl0IGNyZWF0ZUNoYWluU3luY2hyb25pemF0aW9uQ2xpZW50KFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB7XG4gICAgICAgICAgcm9sbEJhY2t3YXJkOiB0aGlzLnJvbGxCYWNrd2FyZCxcbiAgICAgICAgICByb2xsRm9yd2FyZDogdGhpcy5yb2xsRm9yd2FyZCxcbiAgICAgICAgfSxcbiAgICAgICAgeyBzZXF1ZW50aWFsOiB0cnVlIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgICBhd2FpdCB0aGlzLmZvcmtCbG9jayhpbnRlcnNlY3QuaGVpZ2h0ICsgMSk7XG4gICAgICBhd2FpdCB0aGlzLmNsaWVudC5yZXN1bWUoW2ludGVyc2VjdC5wb2ludF0sIDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2FuIG5vdCBzdGFydCBzY2FubmVyLiBpbml0aWFsIGJsb2NrIGlzIGludmFsaWQnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIHN0b3Agd3MgY29ubmVjdGlvbiB0byBub2RlLlxuICAgKi9cbiAgc3RvcCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LnNodXRkb3duKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBjb25uZWN0aW9uIHN0YXR1cyBvZiBvZ21pb3Mgc2Nhbm5lclxuICAgKi9cbiAgZ2V0Q29ubmVjdGlvblN0YXR1cyA9ICgpID0+IHRoaXMuY29ubmVjdGVkO1xufVxuXG5leHBvcnQgeyBDYXJkYW5vT2dtaW9zU2Nhbm5lciB9O1xuIl19
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rosen-bridge/cardano-scanner",
|
|
3
|
+
"version": "0.1.0-52fc0239",
|
|
4
|
+
"description": "A Cardano chain scanner.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/rosen-bridge/scanner.git"
|
|
8
|
+
},
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"author": "Rosen Team",
|
|
11
|
+
"type": "module",
|
|
12
|
+
"main": "dist/index.js",
|
|
13
|
+
"types": "dist/index.d.ts",
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"CHANGELOG.md"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc --build tsconfig.build.json",
|
|
20
|
+
"lint": "eslint --fix . && npm run prettify",
|
|
21
|
+
"prettify": "prettier --write . --ignore-path ./.gitignore",
|
|
22
|
+
"release": "npm run test -- --run && npm run build && npm publish --access public",
|
|
23
|
+
"type-check": "tsc --noEmit"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/node": "^22.18.0",
|
|
27
|
+
"tsx": "^4.19.4",
|
|
28
|
+
"typescript": "^5.3.3",
|
|
29
|
+
"@rosen-bridge/extended-typeorm": "^0.2.1"
|
|
30
|
+
},
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=22.18.0"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@rosen-bridge/abstract-scanner": "^0.1.0-52fc0239",
|
|
36
|
+
"@rosen-bridge/scanner-interfaces": "^0.1.1-52fc0239",
|
|
37
|
+
"@rosen-bridge/rate-limited-axios": "^0.2.1",
|
|
38
|
+
"@rosen-bridge/abstract-logger": "^2.0.1",
|
|
39
|
+
"@blockfrost/blockfrost-js": "^6.0.0",
|
|
40
|
+
"cockatiel": "^3.2.1",
|
|
41
|
+
"@blockfrost/openapi": "0.1.78",
|
|
42
|
+
"@emurgo/cardano-serialization-lib-nodejs": "^13.2.1",
|
|
43
|
+
"@cardano-ogmios/client": "^6.6.1",
|
|
44
|
+
"@cardano-ogmios/schema": "^6.6.1",
|
|
45
|
+
"@rosen-bridge/json-bigint": "^0.1.0"
|
|
46
|
+
}
|
|
47
|
+
}
|