@rosen-bridge/bitcoin-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.
Files changed (52) hide show
  1. package/.eslintignore +1 -0
  2. package/CHANGELOG.md +11 -0
  3. package/README.md +24 -0
  4. package/dist/index.d.ts +9 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +9 -0
  7. package/dist/network/BitcoinRpcNetwork.d.ts +30 -0
  8. package/dist/network/BitcoinRpcNetwork.d.ts.map +1 -0
  9. package/dist/network/BitcoinRpcNetwork.js +88 -0
  10. package/dist/network/DogeRpcNetwork.d.ts +30 -0
  11. package/dist/network/DogeRpcNetwork.d.ts.map +1 -0
  12. package/dist/network/DogeRpcNetwork.js +88 -0
  13. package/dist/network/EsploraNetwork.d.ts +28 -0
  14. package/dist/network/EsploraNetwork.d.ts.map +1 -0
  15. package/dist/network/EsploraNetwork.js +64 -0
  16. package/dist/scanner/BitcoinEsploraScanner.d.ts +6 -0
  17. package/dist/scanner/BitcoinEsploraScanner.d.ts.map +1 -0
  18. package/dist/scanner/BitcoinEsploraScanner.js +7 -0
  19. package/dist/scanner/BitcoinRpcScanner.d.ts +6 -0
  20. package/dist/scanner/BitcoinRpcScanner.d.ts.map +1 -0
  21. package/dist/scanner/BitcoinRpcScanner.js +7 -0
  22. package/dist/scanner/DogeEsploraScanner.d.ts +6 -0
  23. package/dist/scanner/DogeEsploraScanner.d.ts.map +1 -0
  24. package/dist/scanner/DogeEsploraScanner.js +7 -0
  25. package/dist/scanner/DogeRpcScanner.d.ts +6 -0
  26. package/dist/scanner/DogeRpcScanner.d.ts.map +1 -0
  27. package/dist/scanner/DogeRpcScanner.js +7 -0
  28. package/dist/types.d.ts +142 -0
  29. package/dist/types.d.ts.map +1 -0
  30. package/dist/types.js +2 -0
  31. package/lib/index.ts +8 -0
  32. package/lib/network/BitcoinRpcNetwork.ts +111 -0
  33. package/lib/network/DogeRpcNetwork.ts +112 -0
  34. package/lib/network/EsploraNetwork.ts +92 -0
  35. package/lib/scanner/BitcoinEsploraScanner.ts +15 -0
  36. package/lib/scanner/BitcoinRpcScanner.ts +16 -0
  37. package/lib/scanner/DogeEsploraScanner.ts +15 -0
  38. package/lib/scanner/DogeRpcScanner.ts +16 -0
  39. package/lib/types.ts +155 -0
  40. package/package.json +35 -0
  41. package/tests/bitcoinEsploraTestData.ts +1773 -0
  42. package/tests/bitcoinRpcTestData.ts +305 -0
  43. package/tests/dogeRpcTestData.ts +659 -0
  44. package/tests/mocked/axiosEsplora.mock.ts +28 -0
  45. package/tests/mocked/axiosRpc.mock.ts +28 -0
  46. package/tests/network/BitcoinRpcNetwork.spec.ts +112 -0
  47. package/tests/network/DogeRpcNetwork.spec.ts +111 -0
  48. package/tests/network/EsploraNetwork.spec.ts +106 -0
  49. package/tsconfig.build.json +11 -0
  50. package/tsconfig.build.tsbuildinfo +1 -0
  51. package/tsconfig.json +11 -0
  52. package/vitest.config.ts +18 -0
package/.eslintignore ADDED
@@ -0,0 +1 @@
1
+ dist
package/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ # @rosen-bridge/bitcoin-scanner
2
+
3
+ ---
4
+
5
+ ## 0.1.0
6
+
7
+ - This package was **integrated** from `@rosen-bridge/bitcoin-esplora-scanner` and `@rosen-bridge/bitcoin-rpc-scanner`.
8
+ You can follow the previous history in the old package’s changelog. The last changelog updates for the integrated packages are available below:
9
+
10
+ - [Bitcoin Esplora Scanner Changelog](https://github.com/rosen-bridge/scanner/blob/d4a5539b01c523b101104470b03ff7023a10b70b/packages/scanners/bitcoin-esplora-scanner/CHANGELOG.md)
11
+ - [Bitcoin RPC Scanner Changelog](https://github.com/rosen-bridge/scanner/blob/d4a5539b01c523b101104470b03ff7023a10b70b/packages/scanners/bitcoin-rpc-scanner/CHANGELOG.md)
package/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # @rosen-bridge/bitcoin-esplora-scanner
2
+
3
+ ## Table of contents
4
+
5
+ - [Introduction](#introduction)
6
+ - [Installation](#installation)
7
+
8
+ ## Introduction
9
+
10
+ A Bitcoin blockchain scanner based on Rpc and Esplora Block Explorer API.
11
+
12
+ ## Installation
13
+
14
+ npm:
15
+
16
+ ```sh
17
+ npm i @rosen-bridge/bitcoin-esplora-scanner
18
+ ```
19
+
20
+ yarn:
21
+
22
+ ```sh
23
+ yarn add @rosen-bridge/bitcoin-esplora-scanner
24
+ ```
@@ -0,0 +1,9 @@
1
+ export { BitcoinEsploraScanner } from './scanner/BitcoinEsploraScanner';
2
+ export * from './types';
3
+ export { DogeEsploraScanner } from './scanner/DogeEsploraScanner';
4
+ export { EsploraNetwork } from './network/EsploraNetwork';
5
+ export * from './scanner/BitcoinRpcScanner';
6
+ export * from './scanner/DogeRpcScanner';
7
+ export * from './network/BitcoinRpcNetwork';
8
+ export * from './network/DogeRpcNetwork';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { BitcoinEsploraScanner } from './scanner/BitcoinEsploraScanner';
2
+ export * from './types';
3
+ export { DogeEsploraScanner } from './scanner/DogeEsploraScanner';
4
+ export { EsploraNetwork } from './network/EsploraNetwork';
5
+ export * from './scanner/BitcoinRpcScanner';
6
+ export * from './scanner/DogeRpcScanner';
7
+ export * from './network/BitcoinRpcNetwork';
8
+ export * from './network/DogeRpcNetwork';
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsY0FBYyxTQUFTLENBQUM7QUFDeEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBCaXRjb2luRXNwbG9yYVNjYW5uZXIgfSBmcm9tICcuL3NjYW5uZXIvQml0Y29pbkVzcGxvcmFTY2FubmVyJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IHsgRG9nZUVzcGxvcmFTY2FubmVyIH0gZnJvbSAnLi9zY2FubmVyL0RvZ2VFc3Bsb3JhU2Nhbm5lcic7XG5leHBvcnQgeyBFc3Bsb3JhTmV0d29yayB9IGZyb20gJy4vbmV0d29yay9Fc3Bsb3JhTmV0d29yayc7XG5leHBvcnQgKiBmcm9tICcuL3NjYW5uZXIvQml0Y29pblJwY1NjYW5uZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zY2FubmVyL0RvZ2VScGNTY2FubmVyJztcbmV4cG9ydCAqIGZyb20gJy4vbmV0d29yay9CaXRjb2luUnBjTmV0d29yayc7XG5leHBvcnQgKiBmcm9tICcuL25ldHdvcmsvRG9nZVJwY05ldHdvcmsnO1xuIl19
@@ -0,0 +1,30 @@
1
+ import { AbstractNetworkConnector, Block } from '@rosen-bridge/scanner-interfaces';
2
+ import { BitcoinRpcTransaction } from '../types';
3
+ export declare class BitcoinRpcNetwork extends AbstractNetworkConnector<BitcoinRpcTransaction> {
4
+ private readonly url;
5
+ private readonly timeout;
6
+ private client;
7
+ constructor(url: string, timeout: number, auth?: {
8
+ username: string;
9
+ password: string;
10
+ });
11
+ private generateRandomId;
12
+ /**
13
+ * Returns block at height
14
+ * @param height
15
+ * @returns Block
16
+ */
17
+ getBlockAtHeight: (height: number) => Promise<Block>;
18
+ /**
19
+ * Returns current network height
20
+ * @returns current height
21
+ */
22
+ getCurrentHeight: () => Promise<number>;
23
+ /**
24
+ * Return transactions in a block with specified hash
25
+ * @param blockHash
26
+ * @returns
27
+ */
28
+ getBlockTxs: (blockHash: string) => Promise<Array<BitcoinRpcTransaction>>;
29
+ }
30
+ //# sourceMappingURL=BitcoinRpcNetwork.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BitcoinRpcNetwork.d.ts","sourceRoot":"","sources":["../../lib/network/BitcoinRpcNetwork.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EACxB,KAAK,EACN,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAA8B,MAAM,UAAU,CAAC;AAI7E,qBAAa,iBAAkB,SAAQ,wBAAwB,CAAC,qBAAqB,CAAC;IACpF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,MAAM,CAAQ;gBAGpB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB;IAaH,OAAO,CAAC,gBAAgB,CAAyC;IAEjE;;;;OAIG;IACH,gBAAgB,WAAkB,MAAM,KAAG,QAAQ,KAAK,CAAC,CA8BvD;IAEF;;;OAGG;IACH,gBAAgB,QAAa,QAAQ,MAAM,CAAC,CAU1C;IAEF;;;;OAIG;IACH,WAAW,cACE,MAAM,KAChB,QAAQ,MAAM,qBAAqB,CAAC,CAAC,CActC;CACH"}
@@ -0,0 +1,88 @@
1
+ import axios from '@rosen-bridge/rate-limited-axios';
2
+ import { AbstractNetworkConnector, } from '@rosen-bridge/scanner-interfaces';
3
+ import { randomBytes } from 'crypto';
4
+ export class BitcoinRpcNetwork extends AbstractNetworkConnector {
5
+ url;
6
+ timeout;
7
+ client;
8
+ constructor(url, timeout, auth) {
9
+ super();
10
+ this.url = url;
11
+ this.timeout = timeout;
12
+ this.client = axios.create({
13
+ baseURL: this.url,
14
+ timeout: this.timeout,
15
+ headers: { 'Content-Type': 'application/json' },
16
+ auth: auth,
17
+ });
18
+ }
19
+ generateRandomId = () => randomBytes(32).toString('hex');
20
+ /**
21
+ * Returns block at height
22
+ * @param height
23
+ * @returns Block
24
+ */
25
+ getBlockAtHeight = async (height) => {
26
+ const randomId1 = this.generateRandomId();
27
+ // get block hash using block height
28
+ const blockHashResponse = await this.client.post('', {
29
+ method: 'getblockhash',
30
+ id: randomId1,
31
+ params: [height],
32
+ });
33
+ if (blockHashResponse.data.id !== randomId1)
34
+ throw Error(`UnexpectedBehavior: Request and response id are different`);
35
+ const blockHash = blockHashResponse.data.result;
36
+ const randomId2 = this.generateRandomId();
37
+ // get block headers using block hash
38
+ const blockHeaderResponse = await this.client.post('', {
39
+ method: 'getblockheader',
40
+ id: randomId2,
41
+ params: [blockHash, true],
42
+ });
43
+ if (blockHeaderResponse.data.id !== randomId2)
44
+ throw Error(`UnexpectedBehavior: Request and response id are different`);
45
+ const blockHeader = blockHeaderResponse.data
46
+ .result;
47
+ return {
48
+ parentHash: blockHeader.previousblockhash,
49
+ hash: blockHeader.hash,
50
+ height: blockHeader.height,
51
+ timestamp: blockHeader.time,
52
+ txCount: blockHeader.nTx,
53
+ };
54
+ };
55
+ /**
56
+ * Returns current network height
57
+ * @returns current height
58
+ */
59
+ getCurrentHeight = async () => {
60
+ const randomId = this.generateRandomId();
61
+ const result = await this.client.post('', {
62
+ method: 'getblockchaininfo',
63
+ id: randomId,
64
+ params: [],
65
+ });
66
+ if (result.data.id !== randomId)
67
+ throw Error(`UnexpectedBehavior: Request and response id are different`);
68
+ return result.data.result.blocks;
69
+ };
70
+ /**
71
+ * Return transactions in a block with specified hash
72
+ * @param blockHash
73
+ * @returns
74
+ */
75
+ getBlockTxs = async (blockHash) => {
76
+ const randomId = this.generateRandomId();
77
+ const blockHashResponse = await this.client.post('', {
78
+ method: 'getblock',
79
+ id: randomId,
80
+ params: [blockHash, 2], // verbosity should be 2 in order to retrieve full transaction info
81
+ });
82
+ if (blockHashResponse.data.id !== randomId)
83
+ throw Error(`UnexpectedBehavior: Request and response id are different`);
84
+ const blockTxs = blockHashResponse.data.result.tx;
85
+ return blockTxs;
86
+ };
87
+ }
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQml0Y29pblJwY05ldHdvcmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbmV0d29yay9CaXRjb2luUnBjTmV0d29yay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQWdCLE1BQU0sa0NBQWtDLENBQUM7QUFDaEUsT0FBTyxFQUNMLHdCQUF3QixHQUV6QixNQUFNLGtDQUFrQyxDQUFDO0FBRzFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFckMsTUFBTSxPQUFPLGlCQUFrQixTQUFRLHdCQUErQztJQUNuRSxHQUFHLENBQVM7SUFDWixPQUFPLENBQVM7SUFDekIsTUFBTSxDQUFRO0lBRXRCLFlBQ0UsR0FBVyxFQUNYLE9BQWUsRUFDZixJQUdDO1FBRUQsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUN6QixPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDakIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtZQUMvQyxJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxnQkFBZ0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpFOzs7O09BSUc7SUFDSCxnQkFBZ0IsR0FBRyxLQUFLLEVBQUUsTUFBYyxFQUFrQixFQUFFO1FBQzFELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFDLG9DQUFvQztRQUNwQyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQWdCLEVBQUUsRUFBRTtZQUNsRSxNQUFNLEVBQUUsY0FBYztZQUN0QixFQUFFLEVBQUUsU0FBUztZQUNiLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztTQUNqQixDQUFDLENBQUM7UUFDSCxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssU0FBUztZQUN6QyxNQUFNLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDMUMscUNBQXFDO1FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBZ0IsRUFBRSxFQUFFO1lBQ3BFLE1BQU0sRUFBRSxnQkFBZ0I7WUFDeEIsRUFBRSxFQUFFLFNBQVM7WUFDYixNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDO1NBQzFCLENBQUMsQ0FBQztRQUNILElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxTQUFTO1lBQzNDLE1BQU0sS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7UUFDM0UsTUFBTSxXQUFXLEdBQWdCLG1CQUFtQixDQUFDLElBQUk7YUFDdEQsTUFBcUIsQ0FBQztRQUN6QixPQUFPO1lBQ0wsVUFBVSxFQUFFLFdBQVcsQ0FBQyxpQkFBaUI7WUFDekMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJO1lBQ3RCLE1BQU0sRUFBRSxXQUFXLENBQUMsTUFBTTtZQUMxQixTQUFTLEVBQUUsV0FBVyxDQUFDLElBQUk7WUFDM0IsT0FBTyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1NBQ3pCLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRjs7O09BR0c7SUFDSCxnQkFBZ0IsR0FBRyxLQUFLLElBQXFCLEVBQUU7UUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDekMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBZ0IsRUFBRSxFQUFFO1lBQ3ZELE1BQU0sRUFBRSxtQkFBbUI7WUFDM0IsRUFBRSxFQUFFLFFBQVE7WUFDWixNQUFNLEVBQUUsRUFBRTtTQUNYLENBQUMsQ0FBQztRQUNILElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssUUFBUTtZQUM3QixNQUFNLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1FBQzNFLE9BQVEsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUE2QixDQUFDLE1BQU0sQ0FBQztJQUMzRCxDQUFDLENBQUM7SUFFRjs7OztPQUlHO0lBQ0gsV0FBVyxHQUFHLEtBQUssRUFDakIsU0FBaUIsRUFDc0IsRUFBRTtRQUN6QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN6QyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQWdCLEVBQUUsRUFBRTtZQUNsRSxNQUFNLEVBQUUsVUFBVTtZQUNsQixFQUFFLEVBQUUsUUFBUTtZQUNaLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxtRUFBbUU7U0FDNUYsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFFBQVE7WUFDeEMsTUFBTSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztRQUMzRSxNQUFNLFFBQVEsR0FDWixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFDeEIsQ0FBQyxFQUFFLENBQUM7UUFFTCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcywgeyBBeGlvcyB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvcmF0ZS1saW1pdGVkLWF4aW9zJztcbmltcG9ydCB7XG4gIEFic3RyYWN0TmV0d29ya0Nvbm5lY3RvcixcbiAgQmxvY2ssXG59IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcbmltcG9ydCB7IEJpdGNvaW5ScGNUcmFuc2FjdGlvbiwgQmxvY2tIZWFkZXIsIEpzb25ScGNSZXN1bHQgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcblxuZXhwb3J0IGNsYXNzIEJpdGNvaW5ScGNOZXR3b3JrIGV4dGVuZHMgQWJzdHJhY3ROZXR3b3JrQ29ubmVjdG9yPEJpdGNvaW5ScGNUcmFuc2FjdGlvbj4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbWVvdXQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBjbGllbnQ6IEF4aW9zO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHVybDogc3RyaW5nLFxuICAgIHRpbWVvdXQ6IG51bWJlcixcbiAgICBhdXRoPzoge1xuICAgICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgfVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudXJsID0gdXJsO1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgdGhpcy5jbGllbnQgPSBheGlvcy5jcmVhdGUoe1xuICAgICAgYmFzZVVSTDogdGhpcy51cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLnRpbWVvdXQsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGF1dGg6IGF1dGgsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUmFuZG9tSWQgPSAoKSA9PiByYW5kb21CeXRlcygzMikudG9TdHJpbmcoJ2hleCcpO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGJsb2NrIGF0IGhlaWdodFxuICAgKiBAcGFyYW0gaGVpZ2h0XG4gICAqIEByZXR1cm5zIEJsb2NrXG4gICAqL1xuICBnZXRCbG9ja0F0SGVpZ2h0ID0gYXN5bmMgKGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTxCbG9jaz4gPT4ge1xuICAgIGNvbnN0IHJhbmRvbUlkMSA9IHRoaXMuZ2VuZXJhdGVSYW5kb21JZCgpO1xuICAgIC8vIGdldCBibG9jayBoYXNoIHVzaW5nIGJsb2NrIGhlaWdodFxuICAgIGNvbnN0IGJsb2NrSGFzaFJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucG9zdDxKc29uUnBjUmVzdWx0PignJywge1xuICAgICAgbWV0aG9kOiAnZ2V0YmxvY2toYXNoJyxcbiAgICAgIGlkOiByYW5kb21JZDEsXG4gICAgICBwYXJhbXM6IFtoZWlnaHRdLFxuICAgIH0pO1xuICAgIGlmIChibG9ja0hhc2hSZXNwb25zZS5kYXRhLmlkICE9PSByYW5kb21JZDEpXG4gICAgICB0aHJvdyBFcnJvcihgVW5leHBlY3RlZEJlaGF2aW9yOiBSZXF1ZXN0IGFuZCByZXNwb25zZSBpZCBhcmUgZGlmZmVyZW50YCk7XG4gICAgY29uc3QgYmxvY2tIYXNoID0gYmxvY2tIYXNoUmVzcG9uc2UuZGF0YS5yZXN1bHQ7XG5cbiAgICBjb25zdCByYW5kb21JZDIgPSB0aGlzLmdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICAvLyBnZXQgYmxvY2sgaGVhZGVycyB1c2luZyBibG9jayBoYXNoXG4gICAgY29uc3QgYmxvY2tIZWFkZXJSZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnBvc3Q8SnNvblJwY1Jlc3VsdD4oJycsIHtcbiAgICAgIG1ldGhvZDogJ2dldGJsb2NraGVhZGVyJyxcbiAgICAgIGlkOiByYW5kb21JZDIsXG4gICAgICBwYXJhbXM6IFtibG9ja0hhc2gsIHRydWVdLFxuICAgIH0pO1xuICAgIGlmIChibG9ja0hlYWRlclJlc3BvbnNlLmRhdGEuaWQgIT09IHJhbmRvbUlkMilcbiAgICAgIHRocm93IEVycm9yKGBVbmV4cGVjdGVkQmVoYXZpb3I6IFJlcXVlc3QgYW5kIHJlc3BvbnNlIGlkIGFyZSBkaWZmZXJlbnRgKTtcbiAgICBjb25zdCBibG9ja0hlYWRlcjogQmxvY2tIZWFkZXIgPSBibG9ja0hlYWRlclJlc3BvbnNlLmRhdGFcbiAgICAgIC5yZXN1bHQgYXMgQmxvY2tIZWFkZXI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudEhhc2g6IGJsb2NrSGVhZGVyLnByZXZpb3VzYmxvY2toYXNoLFxuICAgICAgaGFzaDogYmxvY2tIZWFkZXIuaGFzaCxcbiAgICAgIGhlaWdodDogYmxvY2tIZWFkZXIuaGVpZ2h0LFxuICAgICAgdGltZXN0YW1wOiBibG9ja0hlYWRlci50aW1lLFxuICAgICAgdHhDb3VudDogYmxvY2tIZWFkZXIublR4LFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VycmVudCBuZXR3b3JrIGhlaWdodFxuICAgKiBAcmV0dXJucyBjdXJyZW50IGhlaWdodFxuICAgKi9cbiAgZ2V0Q3VycmVudEhlaWdodCA9IGFzeW5jICgpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAgIGNvbnN0IHJhbmRvbUlkID0gdGhpcy5nZW5lcmF0ZVJhbmRvbUlkKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jbGllbnQucG9zdDxKc29uUnBjUmVzdWx0PignJywge1xuICAgICAgbWV0aG9kOiAnZ2V0YmxvY2tjaGFpbmluZm8nLFxuICAgICAgaWQ6IHJhbmRvbUlkLFxuICAgICAgcGFyYW1zOiBbXSxcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmRhdGEuaWQgIT09IHJhbmRvbUlkKVxuICAgICAgdGhyb3cgRXJyb3IoYFVuZXhwZWN0ZWRCZWhhdmlvcjogUmVxdWVzdCBhbmQgcmVzcG9uc2UgaWQgYXJlIGRpZmZlcmVudGApO1xuICAgIHJldHVybiAocmVzdWx0LmRhdGEucmVzdWx0IGFzIHsgYmxvY2tzOiBudW1iZXIgfSkuYmxvY2tzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdHJhbnNhY3Rpb25zIGluIGEgYmxvY2sgd2l0aCBzcGVjaWZpZWQgaGFzaFxuICAgKiBAcGFyYW0gYmxvY2tIYXNoXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRCbG9ja1R4cyA9IGFzeW5jIChcbiAgICBibG9ja0hhc2g6IHN0cmluZ1xuICApOiBQcm9taXNlPEFycmF5PEJpdGNvaW5ScGNUcmFuc2FjdGlvbj4+ID0+IHtcbiAgICBjb25zdCByYW5kb21JZCA9IHRoaXMuZ2VuZXJhdGVSYW5kb21JZCgpO1xuICAgIGNvbnN0IGJsb2NrSGFzaFJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucG9zdDxKc29uUnBjUmVzdWx0PignJywge1xuICAgICAgbWV0aG9kOiAnZ2V0YmxvY2snLFxuICAgICAgaWQ6IHJhbmRvbUlkLFxuICAgICAgcGFyYW1zOiBbYmxvY2tIYXNoLCAyXSwgLy8gdmVyYm9zaXR5IHNob3VsZCBiZSAyIGluIG9yZGVyIHRvIHJldHJpZXZlIGZ1bGwgdHJhbnNhY3Rpb24gaW5mb1xuICAgIH0pO1xuICAgIGlmIChibG9ja0hhc2hSZXNwb25zZS5kYXRhLmlkICE9PSByYW5kb21JZClcbiAgICAgIHRocm93IEVycm9yKGBVbmV4cGVjdGVkQmVoYXZpb3I6IFJlcXVlc3QgYW5kIHJlc3BvbnNlIGlkIGFyZSBkaWZmZXJlbnRgKTtcbiAgICBjb25zdCBibG9ja1R4cyA9IChcbiAgICAgIGJsb2NrSGFzaFJlc3BvbnNlLmRhdGEucmVzdWx0IGFzIHsgdHg6IEFycmF5PEJpdGNvaW5ScGNUcmFuc2FjdGlvbj4gfVxuICAgICkudHg7XG5cbiAgICByZXR1cm4gYmxvY2tUeHM7XG4gIH07XG59XG4iXX0=
@@ -0,0 +1,30 @@
1
+ import { AbstractNetworkConnector, Block } from '@rosen-bridge/scanner-interfaces';
2
+ import { DogeRpcTransaction } from '../types';
3
+ export declare class DogeRpcNetwork extends AbstractNetworkConnector<DogeRpcTransaction> {
4
+ private readonly url;
5
+ private readonly timeout;
6
+ private client;
7
+ constructor(url: string, timeout: number, auth?: {
8
+ username: string;
9
+ password: string;
10
+ });
11
+ private generateRandomId;
12
+ /**
13
+ * Returns block at height
14
+ * @param height
15
+ * @returns Block
16
+ */
17
+ getBlockAtHeight: (height: number) => Promise<Block>;
18
+ /**
19
+ * Returns current network height
20
+ * @returns current height
21
+ */
22
+ getCurrentHeight: () => Promise<number>;
23
+ /**
24
+ * Return transactions in a block with specified hash
25
+ * @param blockHash
26
+ * @returns
27
+ */
28
+ getBlockTxs: (blockHash: string) => Promise<Array<DogeRpcTransaction>>;
29
+ }
30
+ //# sourceMappingURL=DogeRpcNetwork.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DogeRpcNetwork.d.ts","sourceRoot":"","sources":["../../lib/network/DogeRpcNetwork.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EACxB,KAAK,EACN,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAmC,MAAM,UAAU,CAAC;AAI/E,qBAAa,cAAe,SAAQ,wBAAwB,CAAC,kBAAkB,CAAC;IAC9E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,MAAM,CAAQ;gBAGpB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB;IAaH,OAAO,CAAC,gBAAgB,CAAyC;IAEjE;;;;OAIG;IACH,gBAAgB,WAAkB,MAAM,KAAG,QAAQ,KAAK,CAAC,CA+BvD;IAEF;;;OAGG;IACH,gBAAgB,QAAa,QAAQ,MAAM,CAAC,CAU1C;IAEF;;;;OAIG;IACH,WAAW,cACE,MAAM,KAChB,QAAQ,MAAM,kBAAkB,CAAC,CAAC,CAcnC;CACH"}
@@ -0,0 +1,88 @@
1
+ import axios from '@rosen-bridge/rate-limited-axios';
2
+ import { AbstractNetworkConnector, } from '@rosen-bridge/scanner-interfaces';
3
+ import { randomBytes } from 'crypto';
4
+ export class DogeRpcNetwork extends AbstractNetworkConnector {
5
+ url;
6
+ timeout;
7
+ client;
8
+ constructor(url, timeout, auth) {
9
+ super();
10
+ this.url = url;
11
+ this.timeout = timeout;
12
+ this.client = axios.create({
13
+ baseURL: this.url,
14
+ timeout: this.timeout,
15
+ headers: { 'Content-Type': 'application/json' },
16
+ auth: auth,
17
+ });
18
+ }
19
+ generateRandomId = () => randomBytes(32).toString('hex');
20
+ /**
21
+ * Returns block at height
22
+ * @param height
23
+ * @returns Block
24
+ */
25
+ getBlockAtHeight = async (height) => {
26
+ const randomId1 = this.generateRandomId();
27
+ // get block hash using block height
28
+ const blockHashResponse = await this.client.post('', {
29
+ method: 'getblockhash',
30
+ id: randomId1,
31
+ params: [height],
32
+ });
33
+ if (blockHashResponse.data.id !== randomId1)
34
+ throw Error(`UnexpectedBehavior: Request and response id are different`);
35
+ const blockHash = blockHashResponse.data.result;
36
+ const randomId2 = this.generateRandomId();
37
+ // get block headers using block hash
38
+ const blockSummaryResponse = await this.client.post('', {
39
+ method: 'getblock',
40
+ id: randomId2,
41
+ params: [blockHash, 1],
42
+ });
43
+ if (blockSummaryResponse.data.id !== randomId2)
44
+ throw Error(`UnexpectedBehavior: Request and response id are different`);
45
+ const blockSummary = blockSummaryResponse.data
46
+ .result;
47
+ return {
48
+ parentHash: blockSummary.previousblockhash,
49
+ hash: blockSummary.hash,
50
+ height: blockSummary.height,
51
+ timestamp: blockSummary.time,
52
+ txCount: blockSummary.tx.length,
53
+ };
54
+ };
55
+ /**
56
+ * Returns current network height
57
+ * @returns current height
58
+ */
59
+ getCurrentHeight = async () => {
60
+ const randomId = this.generateRandomId();
61
+ const result = await this.client.post('', {
62
+ method: 'getblockchaininfo',
63
+ id: randomId,
64
+ params: [],
65
+ });
66
+ if (result.data.id !== randomId)
67
+ throw Error(`UnexpectedBehavior: Request and response id are different`);
68
+ return result.data.result.blocks;
69
+ };
70
+ /**
71
+ * Return transactions in a block with specified hash
72
+ * @param blockHash
73
+ * @returns
74
+ */
75
+ getBlockTxs = async (blockHash) => {
76
+ const randomId = this.generateRandomId();
77
+ const blockHashResponse = await this.client.post('', {
78
+ method: 'getblock',
79
+ id: randomId,
80
+ params: [blockHash, 2], // verbosity should be 2 in order to retrieve full transaction info
81
+ });
82
+ if (blockHashResponse.data.id !== randomId)
83
+ throw Error(`UnexpectedBehavior: Request and response id are different`);
84
+ const blockTxs = blockHashResponse.data.result.tx;
85
+ return blockTxs;
86
+ };
87
+ }
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG9nZVJwY05ldHdvcmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbmV0d29yay9Eb2dlUnBjTmV0d29yay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQWdCLE1BQU0sa0NBQWtDLENBQUM7QUFDaEUsT0FBTyxFQUNMLHdCQUF3QixHQUV6QixNQUFNLGtDQUFrQyxDQUFDO0FBRzFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFckMsTUFBTSxPQUFPLGNBQWUsU0FBUSx3QkFBNEM7SUFDN0QsR0FBRyxDQUFTO0lBQ1osT0FBTyxDQUFTO0lBQ3pCLE1BQU0sQ0FBUTtJQUV0QixZQUNFLEdBQVcsRUFDWCxPQUFlLEVBQ2YsSUFHQztRQUVELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2pCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7WUFDL0MsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sZ0JBQWdCLEdBQUcsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVqRTs7OztPQUlHO0lBQ0gsZ0JBQWdCLEdBQUcsS0FBSyxFQUFFLE1BQWMsRUFBa0IsRUFBRTtRQUMxRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQyxvQ0FBb0M7UUFDcEMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFnQixFQUFFLEVBQUU7WUFDbEUsTUFBTSxFQUFFLGNBQWM7WUFDdEIsRUFBRSxFQUFFLFNBQVM7WUFDYixNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUM7U0FDakIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFNBQVM7WUFDekMsTUFBTSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztRQUMzRSxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRWhELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFDLHFDQUFxQztRQUNyQyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQWdCLEVBQUUsRUFBRTtZQUNyRSxNQUFNLEVBQUUsVUFBVTtZQUNsQixFQUFFLEVBQUUsU0FBUztZQUNiLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFNBQVM7WUFDNUMsTUFBTSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztRQUMzRSxNQUFNLFlBQVksR0FBcUIsb0JBQW9CLENBQUMsSUFBSTthQUM3RCxNQUEwQixDQUFDO1FBRTlCLE9BQU87WUFDTCxVQUFVLEVBQUUsWUFBWSxDQUFDLGlCQUFpQjtZQUMxQyxJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUk7WUFDdkIsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNO1lBQzNCLFNBQVMsRUFBRSxZQUFZLENBQUMsSUFBSTtZQUM1QixPQUFPLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNO1NBQ2hDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRjs7O09BR0c7SUFDSCxnQkFBZ0IsR0FBRyxLQUFLLElBQXFCLEVBQUU7UUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDekMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBZ0IsRUFBRSxFQUFFO1lBQ3ZELE1BQU0sRUFBRSxtQkFBbUI7WUFDM0IsRUFBRSxFQUFFLFFBQVE7WUFDWixNQUFNLEVBQUUsRUFBRTtTQUNYLENBQUMsQ0FBQztRQUNILElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssUUFBUTtZQUM3QixNQUFNLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1FBQzNFLE9BQVEsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUE2QixDQUFDLE1BQU0sQ0FBQztJQUMzRCxDQUFDLENBQUM7SUFFRjs7OztPQUlHO0lBQ0gsV0FBVyxHQUFHLEtBQUssRUFDakIsU0FBaUIsRUFDbUIsRUFBRTtRQUN0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN6QyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQWdCLEVBQUUsRUFBRTtZQUNsRSxNQUFNLEVBQUUsVUFBVTtZQUNsQixFQUFFLEVBQUUsUUFBUTtZQUNaLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxtRUFBbUU7U0FDNUYsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFFBQVE7WUFDeEMsTUFBTSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztRQUMzRSxNQUFNLFFBQVEsR0FDWixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFDeEIsQ0FBQyxFQUFFLENBQUM7UUFFTCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcywgeyBBeGlvcyB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvcmF0ZS1saW1pdGVkLWF4aW9zJztcbmltcG9ydCB7XG4gIEFic3RyYWN0TmV0d29ya0Nvbm5lY3RvcixcbiAgQmxvY2ssXG59IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcbmltcG9ydCB7IERvZ2VScGNUcmFuc2FjdGlvbiwgSnNvblJwY1Jlc3VsdCwgRG9nZUJsb2NrU3VtbWFyeSB9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5leHBvcnQgY2xhc3MgRG9nZVJwY05ldHdvcmsgZXh0ZW5kcyBBYnN0cmFjdE5ldHdvcmtDb25uZWN0b3I8RG9nZVJwY1RyYW5zYWN0aW9uPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGltZW91dDogbnVtYmVyO1xuICBwcml2YXRlIGNsaWVudDogQXhpb3M7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgdGltZW91dDogbnVtYmVyLFxuICAgIGF1dGg/OiB7XG4gICAgICB1c2VybmFtZTogc3RyaW5nO1xuICAgICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICB9XG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy51cmwgPSB1cmw7XG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgICB0aGlzLmNsaWVudCA9IGF4aW9zLmNyZWF0ZSh7XG4gICAgICBiYXNlVVJMOiB0aGlzLnVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMudGltZW91dCxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYXV0aDogYXV0aCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVSYW5kb21JZCA9ICgpID0+IHJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYmxvY2sgYXQgaGVpZ2h0XG4gICAqIEBwYXJhbSBoZWlnaHRcbiAgICogQHJldHVybnMgQmxvY2tcbiAgICovXG4gIGdldEJsb2NrQXRIZWlnaHQgPSBhc3luYyAoaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPEJsb2NrPiA9PiB7XG4gICAgY29uc3QgcmFuZG9tSWQxID0gdGhpcy5nZW5lcmF0ZVJhbmRvbUlkKCk7XG4gICAgLy8gZ2V0IGJsb2NrIGhhc2ggdXNpbmcgYmxvY2sgaGVpZ2h0XG4gICAgY29uc3QgYmxvY2tIYXNoUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5wb3N0PEpzb25ScGNSZXN1bHQ+KCcnLCB7XG4gICAgICBtZXRob2Q6ICdnZXRibG9ja2hhc2gnLFxuICAgICAgaWQ6IHJhbmRvbUlkMSxcbiAgICAgIHBhcmFtczogW2hlaWdodF0sXG4gICAgfSk7XG4gICAgaWYgKGJsb2NrSGFzaFJlc3BvbnNlLmRhdGEuaWQgIT09IHJhbmRvbUlkMSlcbiAgICAgIHRocm93IEVycm9yKGBVbmV4cGVjdGVkQmVoYXZpb3I6IFJlcXVlc3QgYW5kIHJlc3BvbnNlIGlkIGFyZSBkaWZmZXJlbnRgKTtcbiAgICBjb25zdCBibG9ja0hhc2ggPSBibG9ja0hhc2hSZXNwb25zZS5kYXRhLnJlc3VsdDtcblxuICAgIGNvbnN0IHJhbmRvbUlkMiA9IHRoaXMuZ2VuZXJhdGVSYW5kb21JZCgpO1xuICAgIC8vIGdldCBibG9jayBoZWFkZXJzIHVzaW5nIGJsb2NrIGhhc2hcbiAgICBjb25zdCBibG9ja1N1bW1hcnlSZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnBvc3Q8SnNvblJwY1Jlc3VsdD4oJycsIHtcbiAgICAgIG1ldGhvZDogJ2dldGJsb2NrJyxcbiAgICAgIGlkOiByYW5kb21JZDIsXG4gICAgICBwYXJhbXM6IFtibG9ja0hhc2gsIDFdLFxuICAgIH0pO1xuICAgIGlmIChibG9ja1N1bW1hcnlSZXNwb25zZS5kYXRhLmlkICE9PSByYW5kb21JZDIpXG4gICAgICB0aHJvdyBFcnJvcihgVW5leHBlY3RlZEJlaGF2aW9yOiBSZXF1ZXN0IGFuZCByZXNwb25zZSBpZCBhcmUgZGlmZmVyZW50YCk7XG4gICAgY29uc3QgYmxvY2tTdW1tYXJ5OiBEb2dlQmxvY2tTdW1tYXJ5ID0gYmxvY2tTdW1tYXJ5UmVzcG9uc2UuZGF0YVxuICAgICAgLnJlc3VsdCBhcyBEb2dlQmxvY2tTdW1tYXJ5O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudEhhc2g6IGJsb2NrU3VtbWFyeS5wcmV2aW91c2Jsb2NraGFzaCxcbiAgICAgIGhhc2g6IGJsb2NrU3VtbWFyeS5oYXNoLFxuICAgICAgaGVpZ2h0OiBibG9ja1N1bW1hcnkuaGVpZ2h0LFxuICAgICAgdGltZXN0YW1wOiBibG9ja1N1bW1hcnkudGltZSxcbiAgICAgIHR4Q291bnQ6IGJsb2NrU3VtbWFyeS50eC5sZW5ndGgsXG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBjdXJyZW50IG5ldHdvcmsgaGVpZ2h0XG4gICAqIEByZXR1cm5zIGN1cnJlbnQgaGVpZ2h0XG4gICAqL1xuICBnZXRDdXJyZW50SGVpZ2h0ID0gYXN5bmMgKCk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgY29uc3QgcmFuZG9tSWQgPSB0aGlzLmdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNsaWVudC5wb3N0PEpzb25ScGNSZXN1bHQ+KCcnLCB7XG4gICAgICBtZXRob2Q6ICdnZXRibG9ja2NoYWluaW5mbycsXG4gICAgICBpZDogcmFuZG9tSWQsXG4gICAgICBwYXJhbXM6IFtdLFxuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZGF0YS5pZCAhPT0gcmFuZG9tSWQpXG4gICAgICB0aHJvdyBFcnJvcihgVW5leHBlY3RlZEJlaGF2aW9yOiBSZXF1ZXN0IGFuZCByZXNwb25zZSBpZCBhcmUgZGlmZmVyZW50YCk7XG4gICAgcmV0dXJuIChyZXN1bHQuZGF0YS5yZXN1bHQgYXMgeyBibG9ja3M6IG51bWJlciB9KS5ibG9ja3M7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiB0cmFuc2FjdGlvbnMgaW4gYSBibG9jayB3aXRoIHNwZWNpZmllZCBoYXNoXG4gICAqIEBwYXJhbSBibG9ja0hhc2hcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldEJsb2NrVHhzID0gYXN5bmMgKFxuICAgIGJsb2NrSGFzaDogc3RyaW5nXG4gICk6IFByb21pc2U8QXJyYXk8RG9nZVJwY1RyYW5zYWN0aW9uPj4gPT4ge1xuICAgIGNvbnN0IHJhbmRvbUlkID0gdGhpcy5nZW5lcmF0ZVJhbmRvbUlkKCk7XG4gICAgY29uc3QgYmxvY2tIYXNoUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5wb3N0PEpzb25ScGNSZXN1bHQ+KCcnLCB7XG4gICAgICBtZXRob2Q6ICdnZXRibG9jaycsXG4gICAgICBpZDogcmFuZG9tSWQsXG4gICAgICBwYXJhbXM6IFtibG9ja0hhc2gsIDJdLCAvLyB2ZXJib3NpdHkgc2hvdWxkIGJlIDIgaW4gb3JkZXIgdG8gcmV0cmlldmUgZnVsbCB0cmFuc2FjdGlvbiBpbmZvXG4gICAgfSk7XG4gICAgaWYgKGJsb2NrSGFzaFJlc3BvbnNlLmRhdGEuaWQgIT09IHJhbmRvbUlkKVxuICAgICAgdGhyb3cgRXJyb3IoYFVuZXhwZWN0ZWRCZWhhdmlvcjogUmVxdWVzdCBhbmQgcmVzcG9uc2UgaWQgYXJlIGRpZmZlcmVudGApO1xuICAgIGNvbnN0IGJsb2NrVHhzID0gKFxuICAgICAgYmxvY2tIYXNoUmVzcG9uc2UuZGF0YS5yZXN1bHQgYXMgeyB0eDogQXJyYXk8RG9nZVJwY1RyYW5zYWN0aW9uPiB9XG4gICAgKS50eDtcblxuICAgIHJldHVybiBibG9ja1R4cztcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,28 @@
1
+ import { AbstractNetworkConnector, Block } from '@rosen-bridge/scanner-interfaces';
2
+ import { BitcoinEsploraTransaction } from '../types';
3
+ export declare class EsploraNetwork extends AbstractNetworkConnector<BitcoinEsploraTransaction> {
4
+ private readonly url;
5
+ private readonly timeout;
6
+ private readonly ESPLORA_BLOCK_TXS_LIMIT;
7
+ private client;
8
+ private apiPrefix;
9
+ constructor(url: string, timeout: number, apiPrefix?: string);
10
+ /**
11
+ * Returns block at height
12
+ * @param height
13
+ * @returns Block
14
+ */
15
+ getBlockAtHeight: (height: number) => Promise<Block>;
16
+ /**
17
+ * Returns current network height
18
+ * @returns current height
19
+ */
20
+ getCurrentHeight: () => Promise<number>;
21
+ /**
22
+ * Return transactions in a block with specified hash
23
+ * @param blockHash
24
+ * @returns
25
+ */
26
+ getBlockTxs: (blockHash: string) => Promise<Array<BitcoinEsploraTransaction>>;
27
+ }
28
+ //# sourceMappingURL=EsploraNetwork.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EsploraNetwork.d.ts","sourceRoot":"","sources":["../../lib/network/EsploraNetwork.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EACxB,KAAK,EACN,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,yBAAyB,EAAgB,MAAM,UAAU,CAAC;AAEnE,qBAAa,cAAe,SAAQ,wBAAwB,CAAC,yBAAyB,CAAC;IACrF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAM;IAC9C,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,SAAS,CAAS;gBAEd,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAY5D;;;;OAIG;IACH,gBAAgB,WAAkB,MAAM,KAAG,QAAQ,KAAK,CAAC,CAmBvD;IAEF;;;OAGG;IACH,gBAAgB,QAAO,QAAQ,MAAM,CAAC,CAIpC;IAEF;;;;OAIG;IACH,WAAW,cACE,MAAM,KAChB,QAAQ,MAAM,yBAAyB,CAAC,CAAC,CAqB1C;CACH"}
@@ -0,0 +1,64 @@
1
+ import axios from '@rosen-bridge/rate-limited-axios';
2
+ import { AbstractNetworkConnector, } from '@rosen-bridge/scanner-interfaces';
3
+ export class EsploraNetwork extends AbstractNetworkConnector {
4
+ url;
5
+ timeout;
6
+ ESPLORA_BLOCK_TXS_LIMIT = 25;
7
+ client;
8
+ apiPrefix;
9
+ constructor(url, timeout, apiPrefix) {
10
+ super();
11
+ this.url = url;
12
+ this.timeout = timeout;
13
+ this.client = axios.create({
14
+ baseURL: this.url,
15
+ timeout: this.timeout,
16
+ headers: { 'Content-Type': 'application/json' },
17
+ });
18
+ this.apiPrefix = apiPrefix || '/api';
19
+ }
20
+ /**
21
+ * Returns block at height
22
+ * @param height
23
+ * @returns Block
24
+ */
25
+ getBlockAtHeight = async (height) => {
26
+ // get block hash using block height
27
+ const blockHash = (await this.client.get(`${this.apiPrefix}/block-height/${height}`)).data;
28
+ // get block headers using block hash
29
+ const blockHeader = (await this.client.get(`${this.apiPrefix}/block/${blockHash}`)).data;
30
+ return {
31
+ parentHash: blockHeader.previousblockhash,
32
+ hash: blockHeader.id,
33
+ height: blockHeader.height,
34
+ timestamp: blockHeader.timestamp,
35
+ txCount: blockHeader.tx_count,
36
+ };
37
+ };
38
+ /**
39
+ * Returns current network height
40
+ * @returns current height
41
+ */
42
+ getCurrentHeight = () => {
43
+ return this.client
44
+ .get(`${this.apiPrefix}/blocks/tip/height`)
45
+ .then((res) => res.data);
46
+ };
47
+ /**
48
+ * Return transactions in a block with specified hash
49
+ * @param blockHash
50
+ * @returns
51
+ */
52
+ getBlockTxs = async (blockHash) => {
53
+ const txCount = (await this.client.get(`${this.apiPrefix}/block/${blockHash}`)).data.tx_count;
54
+ const blockTxs = [];
55
+ let offset = 0;
56
+ while (offset < txCount) {
57
+ const txs = (await this.client.get(`${this.apiPrefix}/block/${blockHash}/txs/${offset}`)).data;
58
+ blockTxs.push(...txs);
59
+ offset += this.ESPLORA_BLOCK_TXS_LIMIT;
60
+ }
61
+ return blockTxs;
62
+ };
63
+ }
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXNwbG9yYU5ldHdvcmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbmV0d29yay9Fc3Bsb3JhTmV0d29yay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQWdCLE1BQU0sa0NBQWtDLENBQUM7QUFDaEUsT0FBTyxFQUNMLHdCQUF3QixHQUV6QixNQUFNLGtDQUFrQyxDQUFDO0FBRzFDLE1BQU0sT0FBTyxjQUFlLFNBQVEsd0JBQW1EO0lBQ3BFLEdBQUcsQ0FBUztJQUNaLE9BQU8sQ0FBUztJQUNoQix1QkFBdUIsR0FBRyxFQUFFLENBQUM7SUFDdEMsTUFBTSxDQUFRO0lBQ2QsU0FBUyxDQUFTO0lBRTFCLFlBQVksR0FBVyxFQUFFLE9BQWUsRUFBRSxTQUFrQjtRQUMxRCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRztZQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1NBQ2hELENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxJQUFJLE1BQU0sQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQixHQUFHLEtBQUssRUFBRSxNQUFjLEVBQWtCLEVBQUU7UUFDMUQsb0NBQW9DO1FBQ3BDLE1BQU0sU0FBUyxHQUFHLENBQ2hCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxpQkFBaUIsTUFBTSxFQUFFLENBQUMsQ0FDMUUsQ0FBQyxJQUFJLENBQUM7UUFFUCxxQ0FBcUM7UUFDckMsTUFBTSxXQUFXLEdBQUcsQ0FDbEIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FDbkIsR0FBRyxJQUFJLENBQUMsU0FBUyxVQUFVLFNBQVMsRUFBRSxDQUN2QyxDQUNGLENBQUMsSUFBSSxDQUFDO1FBQ1AsT0FBTztZQUNMLFVBQVUsRUFBRSxXQUFXLENBQUMsaUJBQWlCO1lBQ3pDLElBQUksRUFBRSxXQUFXLENBQUMsRUFBRTtZQUNwQixNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU07WUFDMUIsU0FBUyxFQUFFLFdBQVcsQ0FBQyxTQUFTO1lBQ2hDLE9BQU8sRUFBRSxXQUFXLENBQUMsUUFBUTtTQUM5QixDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUY7OztPQUdHO0lBQ0gsZ0JBQWdCLEdBQUcsR0FBb0IsRUFBRTtRQUN2QyxPQUFPLElBQUksQ0FBQyxNQUFNO2FBQ2YsR0FBRyxDQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsb0JBQW9CLENBQUM7YUFDbEQsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQyxDQUFDO0lBRUY7Ozs7T0FJRztJQUNILFdBQVcsR0FBRyxLQUFLLEVBQ2pCLFNBQWlCLEVBQzBCLEVBQUU7UUFDN0MsTUFBTSxPQUFPLEdBQUcsQ0FDZCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNuQixHQUFHLElBQUksQ0FBQyxTQUFTLFVBQVUsU0FBUyxFQUFFLENBQ3ZDLENBQ0YsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRWhCLE1BQU0sUUFBUSxHQUFxQyxFQUFFLENBQUM7UUFDdEQsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRWYsT0FBTyxNQUFNLEdBQUcsT0FBTyxFQUFFLENBQUM7WUFDeEIsTUFBTSxHQUFHLEdBQUcsQ0FDVixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNuQixHQUFHLElBQUksQ0FBQyxTQUFTLFVBQVUsU0FBUyxRQUFRLE1BQU0sRUFBRSxDQUNyRCxDQUNGLENBQUMsSUFBSSxDQUFDO1lBQ1AsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGF4aW9zLCB7IEF4aW9zIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9yYXRlLWxpbWl0ZWQtYXhpb3MnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3ROZXR3b3JrQ29ubmVjdG9yLFxuICBCbG9jayxcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuaW1wb3J0IHsgQml0Y29pbkVzcGxvcmFUcmFuc2FjdGlvbiwgRXNwbG9yYUJsb2NrIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgRXNwbG9yYU5ldHdvcmsgZXh0ZW5kcyBBYnN0cmFjdE5ldHdvcmtDb25uZWN0b3I8Qml0Y29pbkVzcGxvcmFUcmFuc2FjdGlvbj4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbWVvdXQ6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBFU1BMT1JBX0JMT0NLX1RYU19MSU1JVCA9IDI1O1xuICBwcml2YXRlIGNsaWVudDogQXhpb3M7XG4gIHByaXZhdGUgYXBpUHJlZml4OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcsIHRpbWVvdXQ6IG51bWJlciwgYXBpUHJlZml4Pzogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIHRoaXMuY2xpZW50ID0gYXhpb3MuY3JlYXRlKHtcbiAgICAgIGJhc2VVUkw6IHRoaXMudXJsLFxuICAgICAgdGltZW91dDogdGhpcy50aW1lb3V0LFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgfSk7XG4gICAgdGhpcy5hcGlQcmVmaXggPSBhcGlQcmVmaXggfHwgJy9hcGknO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYmxvY2sgYXQgaGVpZ2h0XG4gICAqIEBwYXJhbSBoZWlnaHRcbiAgICogQHJldHVybnMgQmxvY2tcbiAgICovXG4gIGdldEJsb2NrQXRIZWlnaHQgPSBhc3luYyAoaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPEJsb2NrPiA9PiB7XG4gICAgLy8gZ2V0IGJsb2NrIGhhc2ggdXNpbmcgYmxvY2sgaGVpZ2h0XG4gICAgY29uc3QgYmxvY2tIYXNoID0gKFxuICAgICAgYXdhaXQgdGhpcy5jbGllbnQuZ2V0PHN0cmluZz4oYCR7dGhpcy5hcGlQcmVmaXh9L2Jsb2NrLWhlaWdodC8ke2hlaWdodH1gKVxuICAgICkuZGF0YTtcblxuICAgIC8vIGdldCBibG9jayBoZWFkZXJzIHVzaW5nIGJsb2NrIGhhc2hcbiAgICBjb25zdCBibG9ja0hlYWRlciA9IChcbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50LmdldDxFc3Bsb3JhQmxvY2s+KFxuICAgICAgICBgJHt0aGlzLmFwaVByZWZpeH0vYmxvY2svJHtibG9ja0hhc2h9YFxuICAgICAgKVxuICAgICkuZGF0YTtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50SGFzaDogYmxvY2tIZWFkZXIucHJldmlvdXNibG9ja2hhc2gsXG4gICAgICBoYXNoOiBibG9ja0hlYWRlci5pZCxcbiAgICAgIGhlaWdodDogYmxvY2tIZWFkZXIuaGVpZ2h0LFxuICAgICAgdGltZXN0YW1wOiBibG9ja0hlYWRlci50aW1lc3RhbXAsXG4gICAgICB0eENvdW50OiBibG9ja0hlYWRlci50eF9jb3VudCxcbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1cnJlbnQgbmV0d29yayBoZWlnaHRcbiAgICogQHJldHVybnMgY3VycmVudCBoZWlnaHRcbiAgICovXG4gIGdldEN1cnJlbnRIZWlnaHQgPSAoKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnRcbiAgICAgIC5nZXQ8bnVtYmVyPihgJHt0aGlzLmFwaVByZWZpeH0vYmxvY2tzL3RpcC9oZWlnaHRgKVxuICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmRhdGEpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdHJhbnNhY3Rpb25zIGluIGEgYmxvY2sgd2l0aCBzcGVjaWZpZWQgaGFzaFxuICAgKiBAcGFyYW0gYmxvY2tIYXNoXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRCbG9ja1R4cyA9IGFzeW5jIChcbiAgICBibG9ja0hhc2g6IHN0cmluZ1xuICApOiBQcm9taXNlPEFycmF5PEJpdGNvaW5Fc3Bsb3JhVHJhbnNhY3Rpb24+PiA9PiB7XG4gICAgY29uc3QgdHhDb3VudCA9IChcbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50LmdldDxFc3Bsb3JhQmxvY2s+KFxuICAgICAgICBgJHt0aGlzLmFwaVByZWZpeH0vYmxvY2svJHtibG9ja0hhc2h9YFxuICAgICAgKVxuICAgICkuZGF0YS50eF9jb3VudDtcblxuICAgIGNvbnN0IGJsb2NrVHhzOiBBcnJheTxCaXRjb2luRXNwbG9yYVRyYW5zYWN0aW9uPiA9IFtdO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuXG4gICAgd2hpbGUgKG9mZnNldCA8IHR4Q291bnQpIHtcbiAgICAgIGNvbnN0IHR4cyA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuZ2V0PEFycmF5PEJpdGNvaW5Fc3Bsb3JhVHJhbnNhY3Rpb24+PihcbiAgICAgICAgICBgJHt0aGlzLmFwaVByZWZpeH0vYmxvY2svJHtibG9ja0hhc2h9L3R4cy8ke29mZnNldH1gXG4gICAgICAgIClcbiAgICAgICkuZGF0YTtcbiAgICAgIGJsb2NrVHhzLnB1c2goLi4udHhzKTtcbiAgICAgIG9mZnNldCArPSB0aGlzLkVTUExPUkFfQkxPQ0tfVFhTX0xJTUlUO1xuICAgIH1cblxuICAgIHJldHVybiBibG9ja1R4cztcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,6 @@
1
+ import { GeneralScanner, ScannerConfig } from '@rosen-bridge/abstract-scanner';
2
+ import { BitcoinEsploraTransaction } from '../types';
3
+ export declare class BitcoinEsploraScanner extends GeneralScanner<BitcoinEsploraTransaction> {
4
+ constructor(config: ScannerConfig<BitcoinEsploraTransaction>);
5
+ }
6
+ //# sourceMappingURL=BitcoinEsploraScanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BitcoinEsploraScanner.d.ts","sourceRoot":"","sources":["../../lib/scanner/BitcoinEsploraScanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AACrD,qBAAa,qBAAsB,SAAQ,cAAc,CAAC,yBAAyB,CAAC;gBACtE,MAAM,EAAE,aAAa,CAAC,yBAAyB,CAAC;CAW7D"}
@@ -0,0 +1,7 @@
1
+ import { GeneralScanner } from '@rosen-bridge/abstract-scanner';
2
+ export class BitcoinEsploraScanner extends GeneralScanner {
3
+ constructor(config) {
4
+ super('bitcoin', config.dataSource, config.initialHeight, config.network, config.blockRetrieveGap, config.logger, config.suffix);
5
+ }
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQml0Y29pbkVzcGxvcmFTY2FubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL3NjYW5uZXIvQml0Y29pbkVzcGxvcmFTY2FubmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQWlCLE1BQU0sZ0NBQWdDLENBQUM7QUFFL0UsTUFBTSxPQUFPLHFCQUFzQixTQUFRLGNBQXlDO0lBQ2xGLFlBQVksTUFBZ0Q7UUFDMUQsS0FBSyxDQUNILFNBQVMsRUFDVCxNQUFNLENBQUMsVUFBVSxFQUNqQixNQUFNLENBQUMsYUFBYSxFQUNwQixNQUFNLENBQUMsT0FBTyxFQUNkLE1BQU0sQ0FBQyxnQkFBZ0IsRUFDdkIsTUFBTSxDQUFDLE1BQU0sRUFDYixNQUFNLENBQUMsTUFBTSxDQUNkLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHZW5lcmFsU2Nhbm5lciwgU2Nhbm5lckNvbmZpZyB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3Qtc2Nhbm5lcic7XG5pbXBvcnQgeyBCaXRjb2luRXNwbG9yYVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vdHlwZXMnO1xuZXhwb3J0IGNsYXNzIEJpdGNvaW5Fc3Bsb3JhU2Nhbm5lciBleHRlbmRzIEdlbmVyYWxTY2FubmVyPEJpdGNvaW5Fc3Bsb3JhVHJhbnNhY3Rpb24+IHtcbiAgY29uc3RydWN0b3IoY29uZmlnOiBTY2FubmVyQ29uZmlnPEJpdGNvaW5Fc3Bsb3JhVHJhbnNhY3Rpb24+KSB7XG4gICAgc3VwZXIoXG4gICAgICAnYml0Y29pbicsXG4gICAgICBjb25maWcuZGF0YVNvdXJjZSxcbiAgICAgIGNvbmZpZy5pbml0aWFsSGVpZ2h0LFxuICAgICAgY29uZmlnLm5ldHdvcmssXG4gICAgICBjb25maWcuYmxvY2tSZXRyaWV2ZUdhcCxcbiAgICAgIGNvbmZpZy5sb2dnZXIsXG4gICAgICBjb25maWcuc3VmZml4XG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,6 @@
1
+ import { GeneralScanner, ScannerConfig } from '@rosen-bridge/abstract-scanner';
2
+ import { BitcoinRpcTransaction } from '../types';
3
+ export declare class BitcoinRpcScanner extends GeneralScanner<BitcoinRpcTransaction> {
4
+ constructor(config: ScannerConfig<BitcoinRpcTransaction>);
5
+ }
6
+ //# sourceMappingURL=BitcoinRpcScanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BitcoinRpcScanner.d.ts","sourceRoot":"","sources":["../../lib/scanner/BitcoinRpcScanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEjD,qBAAa,iBAAkB,SAAQ,cAAc,CAAC,qBAAqB,CAAC;gBAC9D,MAAM,EAAE,aAAa,CAAC,qBAAqB,CAAC;CAWzD"}
@@ -0,0 +1,7 @@
1
+ import { GeneralScanner } from '@rosen-bridge/abstract-scanner';
2
+ export class BitcoinRpcScanner extends GeneralScanner {
3
+ constructor(config) {
4
+ super('bitcoin', config.dataSource, config.initialHeight, config.network, config.blockRetrieveGap, config.logger, config.suffix);
5
+ }
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQml0Y29pblJwY1NjYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc2Nhbm5lci9CaXRjb2luUnBjU2Nhbm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFpQixNQUFNLGdDQUFnQyxDQUFDO0FBRy9FLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxjQUFxQztJQUMxRSxZQUFZLE1BQTRDO1FBQ3RELEtBQUssQ0FDSCxTQUFTLEVBQ1QsTUFBTSxDQUFDLFVBQVUsRUFDakIsTUFBTSxDQUFDLGFBQWEsRUFDcEIsTUFBTSxDQUFDLE9BQU8sRUFDZCxNQUFNLENBQUMsZ0JBQWdCLEVBQ3ZCLE1BQU0sQ0FBQyxNQUFNLEVBQ2IsTUFBTSxDQUFDLE1BQU0sQ0FDZCxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2VuZXJhbFNjYW5uZXIsIFNjYW5uZXJDb25maWcgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LXNjYW5uZXInO1xuaW1wb3J0IHsgQml0Y29pblJwY1RyYW5zYWN0aW9uIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQml0Y29pblJwY1NjYW5uZXIgZXh0ZW5kcyBHZW5lcmFsU2Nhbm5lcjxCaXRjb2luUnBjVHJhbnNhY3Rpb24+IHtcbiAgY29uc3RydWN0b3IoY29uZmlnOiBTY2FubmVyQ29uZmlnPEJpdGNvaW5ScGNUcmFuc2FjdGlvbj4pIHtcbiAgICBzdXBlcihcbiAgICAgICdiaXRjb2luJyxcbiAgICAgIGNvbmZpZy5kYXRhU291cmNlLFxuICAgICAgY29uZmlnLmluaXRpYWxIZWlnaHQsXG4gICAgICBjb25maWcubmV0d29yayxcbiAgICAgIGNvbmZpZy5ibG9ja1JldHJpZXZlR2FwLFxuICAgICAgY29uZmlnLmxvZ2dlcixcbiAgICAgIGNvbmZpZy5zdWZmaXhcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,6 @@
1
+ import { GeneralScanner, ScannerConfig } from '@rosen-bridge/abstract-scanner';
2
+ import { BitcoinEsploraTransaction } from '../types';
3
+ export declare class DogeEsploraScanner extends GeneralScanner<BitcoinEsploraTransaction> {
4
+ constructor(config: ScannerConfig<BitcoinEsploraTransaction>);
5
+ }
6
+ //# sourceMappingURL=DogeEsploraScanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DogeEsploraScanner.d.ts","sourceRoot":"","sources":["../../lib/scanner/DogeEsploraScanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AACrD,qBAAa,kBAAmB,SAAQ,cAAc,CAAC,yBAAyB,CAAC;gBACnE,MAAM,EAAE,aAAa,CAAC,yBAAyB,CAAC;CAW7D"}
@@ -0,0 +1,7 @@
1
+ import { GeneralScanner } from '@rosen-bridge/abstract-scanner';
2
+ export class DogeEsploraScanner extends GeneralScanner {
3
+ constructor(config) {
4
+ super('doge', config.dataSource, config.initialHeight, config.network, config.blockRetrieveGap, config.logger, config.suffix);
5
+ }
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG9nZUVzcGxvcmFTY2FubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL3NjYW5uZXIvRG9nZUVzcGxvcmFTY2FubmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQWlCLE1BQU0sZ0NBQWdDLENBQUM7QUFFL0UsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGNBQXlDO0lBQy9FLFlBQVksTUFBZ0Q7UUFDMUQsS0FBSyxDQUNILE1BQU0sRUFDTixNQUFNLENBQUMsVUFBVSxFQUNqQixNQUFNLENBQUMsYUFBYSxFQUNwQixNQUFNLENBQUMsT0FBTyxFQUNkLE1BQU0sQ0FBQyxnQkFBZ0IsRUFDdkIsTUFBTSxDQUFDLE1BQU0sRUFDYixNQUFNLENBQUMsTUFBTSxDQUNkLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHZW5lcmFsU2Nhbm5lciwgU2Nhbm5lckNvbmZpZyB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3Qtc2Nhbm5lcic7XG5pbXBvcnQgeyBCaXRjb2luRXNwbG9yYVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vdHlwZXMnO1xuZXhwb3J0IGNsYXNzIERvZ2VFc3Bsb3JhU2Nhbm5lciBleHRlbmRzIEdlbmVyYWxTY2FubmVyPEJpdGNvaW5Fc3Bsb3JhVHJhbnNhY3Rpb24+IHtcbiAgY29uc3RydWN0b3IoY29uZmlnOiBTY2FubmVyQ29uZmlnPEJpdGNvaW5Fc3Bsb3JhVHJhbnNhY3Rpb24+KSB7XG4gICAgc3VwZXIoXG4gICAgICAnZG9nZScsXG4gICAgICBjb25maWcuZGF0YVNvdXJjZSxcbiAgICAgIGNvbmZpZy5pbml0aWFsSGVpZ2h0LFxuICAgICAgY29uZmlnLm5ldHdvcmssXG4gICAgICBjb25maWcuYmxvY2tSZXRyaWV2ZUdhcCxcbiAgICAgIGNvbmZpZy5sb2dnZXIsXG4gICAgICBjb25maWcuc3VmZml4XG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,6 @@
1
+ import { GeneralScanner, ScannerConfig } from '@rosen-bridge/abstract-scanner';
2
+ import { DogeRpcTransaction } from '../types';
3
+ export declare class DogeRpcScanner extends GeneralScanner<DogeRpcTransaction> {
4
+ constructor(config: ScannerConfig<DogeRpcTransaction>);
5
+ }
6
+ //# sourceMappingURL=DogeRpcScanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DogeRpcScanner.d.ts","sourceRoot":"","sources":["../../lib/scanner/DogeRpcScanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,qBAAa,cAAe,SAAQ,cAAc,CAAC,kBAAkB,CAAC;gBACxD,MAAM,EAAE,aAAa,CAAC,kBAAkB,CAAC;CAWtD"}
@@ -0,0 +1,7 @@
1
+ import { GeneralScanner } from '@rosen-bridge/abstract-scanner';
2
+ export class DogeRpcScanner extends GeneralScanner {
3
+ constructor(config) {
4
+ super('doge', config.dataSource, config.initialHeight, config.network, config.blockRetrieveGap, config.logger, config.suffix);
5
+ }
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG9nZVJwY1NjYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc2Nhbm5lci9Eb2dlUnBjU2Nhbm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFpQixNQUFNLGdDQUFnQyxDQUFDO0FBRy9FLE1BQU0sT0FBTyxjQUFlLFNBQVEsY0FBa0M7SUFDcEUsWUFBWSxNQUF5QztRQUNuRCxLQUFLLENBQ0gsTUFBTSxFQUNOLE1BQU0sQ0FBQyxVQUFVLEVBQ2pCLE1BQU0sQ0FBQyxhQUFhLEVBQ3BCLE1BQU0sQ0FBQyxPQUFPLEVBQ2QsTUFBTSxDQUFDLGdCQUFnQixFQUN2QixNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxNQUFNLENBQ2QsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdlbmVyYWxTY2FubmVyLCBTY2FubmVyQ29uZmlnIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1zY2FubmVyJztcbmltcG9ydCB7IERvZ2VScGNUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIERvZ2VScGNTY2FubmVyIGV4dGVuZHMgR2VuZXJhbFNjYW5uZXI8RG9nZVJwY1RyYW5zYWN0aW9uPiB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU2Nhbm5lckNvbmZpZzxEb2dlUnBjVHJhbnNhY3Rpb24+KSB7XG4gICAgc3VwZXIoXG4gICAgICAnZG9nZScsXG4gICAgICBjb25maWcuZGF0YVNvdXJjZSxcbiAgICAgIGNvbmZpZy5pbml0aWFsSGVpZ2h0LFxuICAgICAgY29uZmlnLm5ldHdvcmssXG4gICAgICBjb25maWcuYmxvY2tSZXRyaWV2ZUdhcCxcbiAgICAgIGNvbmZpZy5sb2dnZXIsXG4gICAgICBjb25maWcuc3VmZml4XG4gICAgKTtcbiAgfVxufVxuIl19