@rosen-bridge/ergo-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 ADDED
@@ -0,0 +1,8 @@
1
+ # @rosen-bridge/ergo-scanner
2
+
3
+ ---
4
+
5
+ ## 0.1.0
6
+
7
+ - This package was **extracted** from `@rosen-bridge/scanner`.
8
+ 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/ergo-scanner
2
+
3
+ ## Table of contents
4
+
5
+ - [Introduction](#introduction)
6
+ - [Installation](#installation)
7
+
8
+ ## Introduction
9
+
10
+ An ergo blockchain scanner based on Node or Explorer API.
11
+
12
+ ## Installation
13
+
14
+ npm:
15
+
16
+ ```sh
17
+ npm i @rosen-bridge/ergo-scanner
18
+ ```
19
+
20
+ yarn:
21
+
22
+ ```sh
23
+ yarn add @rosen-bridge/ergo-scanner
24
+ ```
25
+
26
+ ### Usage
27
+
28
+ Ergo Scanner:
29
+
30
+ ```javascript
31
+ const ergoScannerConfig = {
32
+ nodeUrl: <node_url>,
33
+ timeout: <node_timeout>,
34
+ initialHeight: <ergo_initial_height>,
35
+ dataSource: dataSource,
36
+ }
37
+ scanner = new ErgoScanner(ergoScannerConfig);
38
+ ```
@@ -0,0 +1,7 @@
1
+ import { GeneralScanner, ScannerConfig } from '@rosen-bridge/abstract-scanner';
2
+ import { Transaction } from '@rosen-bridge/scanner-interfaces';
3
+ declare class ErgoScanner extends GeneralScanner<Transaction> {
4
+ constructor(config: ScannerConfig<Transaction>);
5
+ }
6
+ export { ErgoScanner };
7
+ //# sourceMappingURL=ergoScanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ergoScanner.d.ts","sourceRoot":"","sources":["../lib/ergoScanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE/D,cAAM,WAAY,SAAQ,cAAc,CAAC,WAAW,CAAC;gBACvC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC;CAW/C;AACD,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { GeneralScanner } from '@rosen-bridge/abstract-scanner';
2
+ class ErgoScanner extends GeneralScanner {
3
+ constructor(config) {
4
+ super('ergo', config.dataSource, config.initialHeight, config.network, config.blockRetrieveGap, config.logger, config.suffix);
5
+ }
6
+ }
7
+ export { ErgoScanner };
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJnb1NjYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvZXJnb1NjYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUcvRSxNQUFNLFdBQVksU0FBUSxjQUEyQjtJQUNuRCxZQUFZLE1BQWtDO1FBQzVDLEtBQUssQ0FDSCxNQUFNLEVBQ04sTUFBTSxDQUFDLFVBQVUsRUFDakIsTUFBTSxDQUFDLGFBQWEsRUFDcEIsTUFBTSxDQUFDLE9BQU8sRUFDZCxNQUFNLENBQUMsZ0JBQWdCLEVBQ3ZCLE1BQU0sQ0FBQyxNQUFNLEVBQ2IsTUFBTSxDQUFDLE1BQU0sQ0FDZCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBQ0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2VuZXJhbFNjYW5uZXIsIFNjYW5uZXJDb25maWcgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LXNjYW5uZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmNsYXNzIEVyZ29TY2FubmVyIGV4dGVuZHMgR2VuZXJhbFNjYW5uZXI8VHJhbnNhY3Rpb24+IHtcbiAgY29uc3RydWN0b3IoY29uZmlnOiBTY2FubmVyQ29uZmlnPFRyYW5zYWN0aW9uPikge1xuICAgIHN1cGVyKFxuICAgICAgJ2VyZ28nLFxuICAgICAgY29uZmlnLmRhdGFTb3VyY2UsXG4gICAgICBjb25maWcuaW5pdGlhbEhlaWdodCxcbiAgICAgIGNvbmZpZy5uZXR3b3JrLFxuICAgICAgY29uZmlnLmJsb2NrUmV0cmlldmVHYXAsXG4gICAgICBjb25maWcubG9nZ2VyLFxuICAgICAgY29uZmlnLnN1ZmZpeFxuICAgICk7XG4gIH1cbn1cbmV4cG9ydCB7IEVyZ29TY2FubmVyIH07XG4iXX0=
@@ -0,0 +1,4 @@
1
+ export * from './ergoScanner';
2
+ export * from './network/ergoNodeNetwork';
3
+ export * from './network/ergoExplorerNetwork';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from './ergoScanner';
2
+ export * from './network/ergoNodeNetwork';
3
+ export * from './network/ergoExplorerNetwork';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9lcmdvU2Nhbm5lcic7XG5leHBvcnQgKiBmcm9tICcuL25ldHdvcmsvZXJnb05vZGVOZXR3b3JrJztcbmV4cG9ydCAqIGZyb20gJy4vbmV0d29yay9lcmdvRXhwbG9yZXJOZXR3b3JrJztcbiJdfQ==
@@ -0,0 +1,25 @@
1
+ import { AbstractNetworkConnector, Block, Transaction } from '@rosen-bridge/scanner-interfaces';
2
+ export declare class ErgoExplorerNetwork extends AbstractNetworkConnector<Transaction> {
3
+ private client;
4
+ constructor(explorerUrl: string);
5
+ /**
6
+ * get block at height.
7
+ * @param height
8
+ */
9
+ getBlockAtHeight: (height: number) => Promise<Block>;
10
+ /**
11
+ * convert Explorer transaction to scanner transaction type
12
+ * @param tx
13
+ */
14
+ private convertToTransaction;
15
+ /**
16
+ * get list of all block transactions
17
+ * @param blockHash
18
+ */
19
+ getBlockTxs: (blockHash: string) => Promise<Array<Transaction>>;
20
+ /**
21
+ * get current height of blockchain
22
+ */
23
+ getCurrentHeight: () => Promise<number>;
24
+ }
25
+ //# sourceMappingURL=ergoExplorerNetwork.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ergoExplorerNetwork.d.ts","sourceRoot":"","sources":["../../lib/network/ergoExplorerNetwork.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EACxB,KAAK,EACL,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAG1C,qBAAa,mBAAoB,SAAQ,wBAAwB,CAAC,WAAW,CAAC;IAC5E,OAAO,CAAC,MAAM,CAA+C;gBAEjD,WAAW,EAAE,MAAM;IAK/B;;;OAGG;IACH,gBAAgB,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,KAAK,CAAC,CASvD;IAEF;;;OAGG;IACH,OAAO,CAAC,oBAAoB,CAqB1B;IAEF;;;OAGG;IACH,WAAW,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAIlE;IAEF;;OAEG;IACH,gBAAgB,QAAa,OAAO,CAAC,MAAM,CAAC,CAG1C;CACH"}
@@ -0,0 +1,64 @@
1
+ import { AbstractNetworkConnector, } from '@rosen-bridge/scanner-interfaces';
2
+ import ergoExplorerClientFactory from '@rosen-clients/ergo-explorer';
3
+ export class ErgoExplorerNetwork extends AbstractNetworkConnector {
4
+ client;
5
+ constructor(explorerUrl) {
6
+ super();
7
+ this.client = ergoExplorerClientFactory(explorerUrl);
8
+ }
9
+ /**
10
+ * get block at height.
11
+ * @param height
12
+ */
13
+ getBlockAtHeight = async (height) => {
14
+ const blockIds = await this.client.v0.getApiV0BlocksAtP1(height);
15
+ const blockSummary = await this.client.v1.getApiV1BlocksP1(blockIds[0]);
16
+ return {
17
+ parentHash: blockSummary.block.header.parentId,
18
+ height: blockSummary.block.header.height,
19
+ timestamp: Number(blockSummary.block.header.timestamp / 1000n),
20
+ hash: blockSummary.block.header.id,
21
+ };
22
+ };
23
+ /**
24
+ * convert Explorer transaction to scanner transaction type
25
+ * @param tx
26
+ */
27
+ convertToTransaction = (tx) => {
28
+ return {
29
+ id: tx.id,
30
+ dataInputs: tx.dataInputs?.map((dataInput) => ({
31
+ boxId: dataInput.id,
32
+ })) ?? [],
33
+ // TODO: Add input extension to explorer local/ergo/rosen-bridge/scanner/-/issues/156
34
+ inputs: tx.inputs?.map((input) => ({ boxId: input.id })) ?? [],
35
+ outputs: tx.outputs?.map((output) => ({
36
+ boxId: output.id,
37
+ transactionId: output.txId,
38
+ additionalRegisters: output.additionalRegisters,
39
+ assets: output.assets || [],
40
+ ergoTree: output.ergoTree,
41
+ creationHeight: output.creationHeight,
42
+ index: output.index,
43
+ value: output.value,
44
+ })) ?? [],
45
+ };
46
+ };
47
+ /**
48
+ * get list of all block transactions
49
+ * @param blockHash
50
+ */
51
+ getBlockTxs = async (blockHash) => {
52
+ const block = await this.client.v1.getApiV1BlocksP1(blockHash);
53
+ const transactions = block.block.blockTransactions || [];
54
+ return transactions.map(this.convertToTransaction);
55
+ };
56
+ /**
57
+ * get current height of blockchain
58
+ */
59
+ getCurrentHeight = async () => {
60
+ const networkState = await this.client.v1.getApiV1Networkstate();
61
+ return Number(networkState.height);
62
+ };
63
+ }
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJnb0V4cGxvcmVyTmV0d29yay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9uZXR3b3JrL2VyZ29FeHBsb3Jlck5ldHdvcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLHdCQUF3QixHQUd6QixNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLE9BQU8seUJBQXlCLE1BQU0sOEJBQThCLENBQUM7QUFFckUsTUFBTSxPQUFPLG1CQUFvQixTQUFRLHdCQUFxQztJQUNwRSxNQUFNLENBQStDO0lBRTdELFlBQVksV0FBbUI7UUFDN0IsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsTUFBTSxHQUFHLHlCQUF5QixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0IsR0FBRyxLQUFLLEVBQUUsTUFBYyxFQUFrQixFQUFFO1FBQzFELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxPQUFPO1lBQ0wsVUFBVSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVE7WUFDOUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU07WUFDeEMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQzlELElBQUksRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1NBQ25DLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRjs7O09BR0c7SUFDSyxvQkFBb0IsR0FBRyxDQUFDLEVBQW9CLEVBQWUsRUFBRTtRQUNuRSxPQUFPO1lBQ0wsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ1QsVUFBVSxFQUNSLEVBQUUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUU7YUFDcEIsQ0FBQyxDQUFDLElBQUksRUFBRTtZQUNYLHFGQUFxRjtZQUNyRixNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFO1lBQzlELE9BQU8sRUFDTCxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDM0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFO2dCQUNoQixhQUFhLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQzFCLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxtQkFBbUI7Z0JBQy9DLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUU7Z0JBQzNCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjO2dCQUNyQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSzthQUNwQixDQUFDLENBQUMsSUFBSSxFQUFFO1NBQ1osQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNILFdBQVcsR0FBRyxLQUFLLEVBQUUsU0FBaUIsRUFBK0IsRUFBRTtRQUNyRSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDO1FBQ3pELE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNyRCxDQUFDLENBQUM7SUFFRjs7T0FFRztJQUNILGdCQUFnQixHQUFHLEtBQUssSUFBcUIsRUFBRTtRQUM3QyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDakUsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNhY3Rpb25JbmZvMSB9IGZyb20gJ0Byb3Nlbi1jbGllbnRzL2VyZ28tZXhwbG9yZXIvZGlzdC9zcmMvdjEvdHlwZXMnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3ROZXR3b3JrQ29ubmVjdG9yLFxuICBCbG9jayxcbiAgVHJhbnNhY3Rpb24sXG59IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcbmltcG9ydCBlcmdvRXhwbG9yZXJDbGllbnRGYWN0b3J5IGZyb20gJ0Byb3Nlbi1jbGllbnRzL2VyZ28tZXhwbG9yZXInO1xuXG5leHBvcnQgY2xhc3MgRXJnb0V4cGxvcmVyTmV0d29yayBleHRlbmRzIEFic3RyYWN0TmV0d29ya0Nvbm5lY3RvcjxUcmFuc2FjdGlvbj4ge1xuICBwcml2YXRlIGNsaWVudDogUmV0dXJuVHlwZTx0eXBlb2YgZXJnb0V4cGxvcmVyQ2xpZW50RmFjdG9yeT47XG5cbiAgY29uc3RydWN0b3IoZXhwbG9yZXJVcmw6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jbGllbnQgPSBlcmdvRXhwbG9yZXJDbGllbnRGYWN0b3J5KGV4cGxvcmVyVXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgYmxvY2sgYXQgaGVpZ2h0LlxuICAgKiBAcGFyYW0gaGVpZ2h0XG4gICAqL1xuICBnZXRCbG9ja0F0SGVpZ2h0ID0gYXN5bmMgKGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTxCbG9jaz4gPT4ge1xuICAgIGNvbnN0IGJsb2NrSWRzID0gYXdhaXQgdGhpcy5jbGllbnQudjAuZ2V0QXBpVjBCbG9ja3NBdFAxKGhlaWdodCk7XG4gICAgY29uc3QgYmxvY2tTdW1tYXJ5ID0gYXdhaXQgdGhpcy5jbGllbnQudjEuZ2V0QXBpVjFCbG9ja3NQMShibG9ja0lkc1swXSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudEhhc2g6IGJsb2NrU3VtbWFyeS5ibG9jay5oZWFkZXIucGFyZW50SWQsXG4gICAgICBoZWlnaHQ6IGJsb2NrU3VtbWFyeS5ibG9jay5oZWFkZXIuaGVpZ2h0LFxuICAgICAgdGltZXN0YW1wOiBOdW1iZXIoYmxvY2tTdW1tYXJ5LmJsb2NrLmhlYWRlci50aW1lc3RhbXAgLyAxMDAwbiksXG4gICAgICBoYXNoOiBibG9ja1N1bW1hcnkuYmxvY2suaGVhZGVyLmlkLFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIGNvbnZlcnQgRXhwbG9yZXIgdHJhbnNhY3Rpb24gdG8gc2Nhbm5lciB0cmFuc2FjdGlvbiB0eXBlXG4gICAqIEBwYXJhbSB0eFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0VG9UcmFuc2FjdGlvbiA9ICh0eDogVHJhbnNhY3Rpb25JbmZvMSk6IFRyYW5zYWN0aW9uID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHR4LmlkLFxuICAgICAgZGF0YUlucHV0czpcbiAgICAgICAgdHguZGF0YUlucHV0cz8ubWFwKChkYXRhSW5wdXQpID0+ICh7XG4gICAgICAgICAgYm94SWQ6IGRhdGFJbnB1dC5pZCxcbiAgICAgICAgfSkpID8/IFtdLFxuICAgICAgLy8gVE9ETzogQWRkIGlucHV0IGV4dGVuc2lvbiB0byBleHBsb3JlciBsb2NhbC9lcmdvL3Jvc2VuLWJyaWRnZS9zY2FubmVyLy0vaXNzdWVzLzE1NlxuICAgICAgaW5wdXRzOiB0eC5pbnB1dHM/Lm1hcCgoaW5wdXQpID0+ICh7IGJveElkOiBpbnB1dC5pZCB9KSkgPz8gW10sXG4gICAgICBvdXRwdXRzOlxuICAgICAgICB0eC5vdXRwdXRzPy5tYXAoKG91dHB1dCkgPT4gKHtcbiAgICAgICAgICBib3hJZDogb3V0cHV0LmlkLFxuICAgICAgICAgIHRyYW5zYWN0aW9uSWQ6IG91dHB1dC50eElkLFxuICAgICAgICAgIGFkZGl0aW9uYWxSZWdpc3RlcnM6IG91dHB1dC5hZGRpdGlvbmFsUmVnaXN0ZXJzLFxuICAgICAgICAgIGFzc2V0czogb3V0cHV0LmFzc2V0cyB8fCBbXSxcbiAgICAgICAgICBlcmdvVHJlZTogb3V0cHV0LmVyZ29UcmVlLFxuICAgICAgICAgIGNyZWF0aW9uSGVpZ2h0OiBvdXRwdXQuY3JlYXRpb25IZWlnaHQsXG4gICAgICAgICAgaW5kZXg6IG91dHB1dC5pbmRleCxcbiAgICAgICAgICB2YWx1ZTogb3V0cHV0LnZhbHVlLFxuICAgICAgICB9KSkgPz8gW10sXG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogZ2V0IGxpc3Qgb2YgYWxsIGJsb2NrIHRyYW5zYWN0aW9uc1xuICAgKiBAcGFyYW0gYmxvY2tIYXNoXG4gICAqL1xuICBnZXRCbG9ja1R4cyA9IGFzeW5jIChibG9ja0hhc2g6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8VHJhbnNhY3Rpb24+PiA9PiB7XG4gICAgY29uc3QgYmxvY2sgPSBhd2FpdCB0aGlzLmNsaWVudC52MS5nZXRBcGlWMUJsb2Nrc1AxKGJsb2NrSGFzaCk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25zID0gYmxvY2suYmxvY2suYmxvY2tUcmFuc2FjdGlvbnMgfHwgW107XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9ucy5tYXAodGhpcy5jb252ZXJ0VG9UcmFuc2FjdGlvbik7XG4gIH07XG5cbiAgLyoqXG4gICAqIGdldCBjdXJyZW50IGhlaWdodCBvZiBibG9ja2NoYWluXG4gICAqL1xuICBnZXRDdXJyZW50SGVpZ2h0ID0gYXN5bmMgKCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgY29uc3QgbmV0d29ya1N0YXRlID0gYXdhaXQgdGhpcy5jbGllbnQudjEuZ2V0QXBpVjFOZXR3b3Jrc3RhdGUoKTtcbiAgICByZXR1cm4gTnVtYmVyKG5ldHdvcmtTdGF0ZS5oZWlnaHQpO1xuICB9O1xufVxuIl19
@@ -0,0 +1,25 @@
1
+ import { AbstractNetworkConnector, Block, Transaction } from '@rosen-bridge/scanner-interfaces';
2
+ export declare class ErgoNodeNetwork extends AbstractNetworkConnector<Transaction> {
3
+ private client;
4
+ constructor(nodeUrl: string);
5
+ /**
6
+ * get block at height.
7
+ * @param height
8
+ */
9
+ getBlockAtHeight: (height: number) => Promise<Block>;
10
+ /**
11
+ * convert Node transaction to scanner transaction type
12
+ * @param tx
13
+ */
14
+ private convertNodeTransactionToTransaction;
15
+ /**
16
+ * get list of all block transactions
17
+ * @param blockHash
18
+ */
19
+ getBlockTxs: (blockHash: string) => Promise<Array<Transaction>>;
20
+ /**
21
+ * get current height of blockchain
22
+ */
23
+ getCurrentHeight: () => Promise<number>;
24
+ }
25
+ //# sourceMappingURL=ergoNodeNetwork.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ergoNodeNetwork.d.ts","sourceRoot":"","sources":["../../lib/network/ergoNodeNetwork.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,KAAK,EACL,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAK1C,qBAAa,eAAgB,SAAQ,wBAAwB,CAAC,WAAW,CAAC;IACxE,OAAO,CAAC,MAAM,CAA2C;gBAC7C,OAAO,EAAE,MAAM;IAK3B;;;OAGG;IACH,gBAAgB,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,KAAK,CAAC,CAYvD;IAEF;;;OAGG;IACH,OAAO,CAAC,mCAAmC,CAqBzC;IAEF;;;OAGG;IACH,WAAW,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAOlE;IAEF;;OAEG;IACH,gBAAgB,QAAa,OAAO,CAAC,MAAM,CAAC,CAG1C;CACH"}
@@ -0,0 +1,66 @@
1
+ import { AbstractNetworkConnector, } from '@rosen-bridge/scanner-interfaces';
2
+ import ergoNodeClientFactory from '@rosen-clients/ergo-node';
3
+ export class ErgoNodeNetwork extends AbstractNetworkConnector {
4
+ client;
5
+ constructor(nodeUrl) {
6
+ super();
7
+ this.client = ergoNodeClientFactory(nodeUrl);
8
+ }
9
+ /**
10
+ * get block at height.
11
+ * @param height
12
+ */
13
+ getBlockAtHeight = async (height) => {
14
+ const blocks = await this.client.getChainSlice({
15
+ fromHeight: height,
16
+ toHeight: height,
17
+ });
18
+ const block = blocks[0];
19
+ return {
20
+ hash: block.id,
21
+ height: block.height,
22
+ parentHash: block.parentId,
23
+ timestamp: Number(block.timestamp / 1000n),
24
+ };
25
+ };
26
+ /**
27
+ * convert Node transaction to scanner transaction type
28
+ * @param tx
29
+ */
30
+ convertNodeTransactionToTransaction = (tx) => {
31
+ return {
32
+ id: tx.id || '',
33
+ outputs: tx.outputs.map((output) => ({
34
+ transactionId: output.transactionId || '',
35
+ index: output.index || 0,
36
+ value: output.value || 0n,
37
+ ergoTree: output.ergoTree || '',
38
+ creationHeight: output.creationHeight || 0,
39
+ assets: output.assets || [],
40
+ additionalRegisters: output.additionalRegisters,
41
+ boxId: output.boxId || '',
42
+ })),
43
+ inputs: tx.inputs.map((input) => ({
44
+ boxId: input.boxId,
45
+ extension: input.spendingProof.extension,
46
+ })),
47
+ dataInputs: tx.dataInputs,
48
+ };
49
+ };
50
+ /**
51
+ * get list of all block transactions
52
+ * @param blockHash
53
+ */
54
+ getBlockTxs = async (blockHash) => {
55
+ const blockTransaction = await this.client.getBlockTransactionsById(blockHash);
56
+ return blockTransaction.transactions.map(this.convertNodeTransactionToTransaction);
57
+ };
58
+ /**
59
+ * get current height of blockchain
60
+ */
61
+ getCurrentHeight = async () => {
62
+ const info = await this.client.getNodeInfo();
63
+ return info.fullHeight || 0;
64
+ };
65
+ }
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJnb05vZGVOZXR3b3JrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL25ldHdvcmsvZXJnb05vZGVOZXR3b3JrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx3QkFBd0IsR0FHekIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLHFCQUVOLE1BQU0sMEJBQTBCLENBQUM7QUFFbEMsTUFBTSxPQUFPLGVBQWdCLFNBQVEsd0JBQXFDO0lBQ2hFLE1BQU0sQ0FBMkM7SUFDekQsWUFBWSxPQUFlO1FBQ3pCLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLEdBQUcsS0FBSyxFQUFFLE1BQWMsRUFBa0IsRUFBRTtRQUMxRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO1lBQzdDLFVBQVUsRUFBRSxNQUFNO1lBQ2xCLFFBQVEsRUFBRSxNQUFNO1NBQ2pCLENBQUMsQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixPQUFPO1lBQ0wsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ2QsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUMxQixTQUFTLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1NBQzNDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRjs7O09BR0c7SUFDSyxtQ0FBbUMsR0FBRyxDQUM1QyxFQUFtQixFQUNOLEVBQUU7UUFDZixPQUFPO1lBQ0wsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRTtZQUNmLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbkMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhLElBQUksRUFBRTtnQkFDekMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQztnQkFDeEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDekIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRTtnQkFDL0IsY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjLElBQUksQ0FBQztnQkFDMUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRTtnQkFDM0IsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLG1CQUFtQjtnQkFDL0MsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTthQUMxQixDQUFDLENBQUM7WUFDSCxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2hDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztnQkFDbEIsU0FBUyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUzthQUN6QyxDQUFDLENBQUM7WUFDSCxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVU7U0FDMUIsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNILFdBQVcsR0FBRyxLQUFLLEVBQUUsU0FBaUIsRUFBK0IsRUFBRTtRQUNyRSxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FDakUsU0FBUyxDQUNWLENBQUM7UUFDRixPQUFPLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxHQUFHLENBQ3RDLElBQUksQ0FBQyxtQ0FBbUMsQ0FDekMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsZ0JBQWdCLEdBQUcsS0FBSyxJQUFxQixFQUFFO1FBQzdDLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QyxPQUFPLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWJzdHJhY3ROZXR3b3JrQ29ubmVjdG9yLFxuICBCbG9jayxcbiAgVHJhbnNhY3Rpb24sXG59IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcbmltcG9ydCBlcmdvTm9kZUNsaWVudEZhY3RvcnksIHtcbiAgRXJnb1RyYW5zYWN0aW9uLFxufSBmcm9tICdAcm9zZW4tY2xpZW50cy9lcmdvLW5vZGUnO1xuXG5leHBvcnQgY2xhc3MgRXJnb05vZGVOZXR3b3JrIGV4dGVuZHMgQWJzdHJhY3ROZXR3b3JrQ29ubmVjdG9yPFRyYW5zYWN0aW9uPiB7XG4gIHByaXZhdGUgY2xpZW50OiBSZXR1cm5UeXBlPHR5cGVvZiBlcmdvTm9kZUNsaWVudEZhY3Rvcnk+O1xuICBjb25zdHJ1Y3Rvcihub2RlVXJsOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY2xpZW50ID0gZXJnb05vZGVDbGllbnRGYWN0b3J5KG5vZGVVcmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBibG9jayBhdCBoZWlnaHQuXG4gICAqIEBwYXJhbSBoZWlnaHRcbiAgICovXG4gIGdldEJsb2NrQXRIZWlnaHQgPSBhc3luYyAoaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPEJsb2NrPiA9PiB7XG4gICAgY29uc3QgYmxvY2tzID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0Q2hhaW5TbGljZSh7XG4gICAgICBmcm9tSGVpZ2h0OiBoZWlnaHQsXG4gICAgICB0b0hlaWdodDogaGVpZ2h0LFxuICAgIH0pO1xuICAgIGNvbnN0IGJsb2NrID0gYmxvY2tzWzBdO1xuICAgIHJldHVybiB7XG4gICAgICBoYXNoOiBibG9jay5pZCxcbiAgICAgIGhlaWdodDogYmxvY2suaGVpZ2h0LFxuICAgICAgcGFyZW50SGFzaDogYmxvY2sucGFyZW50SWQsXG4gICAgICB0aW1lc3RhbXA6IE51bWJlcihibG9jay50aW1lc3RhbXAgLyAxMDAwbiksXG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogY29udmVydCBOb2RlIHRyYW5zYWN0aW9uIHRvIHNjYW5uZXIgdHJhbnNhY3Rpb24gdHlwZVxuICAgKiBAcGFyYW0gdHhcbiAgICovXG4gIHByaXZhdGUgY29udmVydE5vZGVUcmFuc2FjdGlvblRvVHJhbnNhY3Rpb24gPSAoXG4gICAgdHg6IEVyZ29UcmFuc2FjdGlvblxuICApOiBUcmFuc2FjdGlvbiA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0eC5pZCB8fCAnJyxcbiAgICAgIG91dHB1dHM6IHR4Lm91dHB1dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IG91dHB1dC50cmFuc2FjdGlvbklkIHx8ICcnLFxuICAgICAgICBpbmRleDogb3V0cHV0LmluZGV4IHx8IDAsXG4gICAgICAgIHZhbHVlOiBvdXRwdXQudmFsdWUgfHwgMG4sXG4gICAgICAgIGVyZ29UcmVlOiBvdXRwdXQuZXJnb1RyZWUgfHwgJycsXG4gICAgICAgIGNyZWF0aW9uSGVpZ2h0OiBvdXRwdXQuY3JlYXRpb25IZWlnaHQgfHwgMCxcbiAgICAgICAgYXNzZXRzOiBvdXRwdXQuYXNzZXRzIHx8IFtdLFxuICAgICAgICBhZGRpdGlvbmFsUmVnaXN0ZXJzOiBvdXRwdXQuYWRkaXRpb25hbFJlZ2lzdGVycyxcbiAgICAgICAgYm94SWQ6IG91dHB1dC5ib3hJZCB8fCAnJyxcbiAgICAgIH0pKSxcbiAgICAgIGlucHV0czogdHguaW5wdXRzLm1hcCgoaW5wdXQpID0+ICh7XG4gICAgICAgIGJveElkOiBpbnB1dC5ib3hJZCxcbiAgICAgICAgZXh0ZW5zaW9uOiBpbnB1dC5zcGVuZGluZ1Byb29mLmV4dGVuc2lvbixcbiAgICAgIH0pKSxcbiAgICAgIGRhdGFJbnB1dHM6IHR4LmRhdGFJbnB1dHMsXG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogZ2V0IGxpc3Qgb2YgYWxsIGJsb2NrIHRyYW5zYWN0aW9uc1xuICAgKiBAcGFyYW0gYmxvY2tIYXNoXG4gICAqL1xuICBnZXRCbG9ja1R4cyA9IGFzeW5jIChibG9ja0hhc2g6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8VHJhbnNhY3Rpb24+PiA9PiB7XG4gICAgY29uc3QgYmxvY2tUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuY2xpZW50LmdldEJsb2NrVHJhbnNhY3Rpb25zQnlJZChcbiAgICAgIGJsb2NrSGFzaFxuICAgICk7XG4gICAgcmV0dXJuIGJsb2NrVHJhbnNhY3Rpb24udHJhbnNhY3Rpb25zLm1hcChcbiAgICAgIHRoaXMuY29udmVydE5vZGVUcmFuc2FjdGlvblRvVHJhbnNhY3Rpb25cbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBnZXQgY3VycmVudCBoZWlnaHQgb2YgYmxvY2tjaGFpblxuICAgKi9cbiAgZ2V0Q3VycmVudEhlaWdodCA9IGFzeW5jICgpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAgIGNvbnN0IGluZm8gPSBhd2FpdCB0aGlzLmNsaWVudC5nZXROb2RlSW5mbygpO1xuICAgIHJldHVybiBpbmZvLmZ1bGxIZWlnaHQgfHwgMDtcbiAgfTtcbn1cbiJdfQ==
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@rosen-bridge/ergo-scanner",
3
+ "version": "0.1.0-52fc0239",
4
+ "description": "An Ergo 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
+ },
30
+ "engines": {
31
+ "node": ">=22.18.0"
32
+ },
33
+ "dependencies": {
34
+ "@rosen-bridge/abstract-scanner": "^0.1.0-52fc0239",
35
+ "@rosen-bridge/scanner-interfaces": "^0.1.1-52fc0239",
36
+ "@rosen-clients/ergo-explorer": "^1.1.5",
37
+ "@rosen-clients/ergo-node": "^1.2.3"
38
+ }
39
+ }