@rosen-bridge/abstract-extractor 0.1.0-2afdd7

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 (81) hide show
  1. package/.eslintignore +1 -0
  2. package/README.md +24 -0
  3. package/dist/AbstractExtractor.d.ts +25 -0
  4. package/dist/AbstractExtractor.d.ts.map +1 -0
  5. package/dist/AbstractExtractor.js +3 -0
  6. package/dist/constants.d.ts +4 -0
  7. package/dist/constants.d.ts.map +1 -0
  8. package/dist/constants.js +4 -0
  9. package/dist/ergo/AbstractErgoExtractor.d.ts +39 -0
  10. package/dist/ergo/AbstractErgoExtractor.d.ts.map +1 -0
  11. package/dist/ergo/AbstractErgoExtractor.js +57 -0
  12. package/dist/ergo/AbstractErgoExtractorAction.d.ts +27 -0
  13. package/dist/ergo/AbstractErgoExtractorAction.d.ts.map +1 -0
  14. package/dist/ergo/AbstractErgoExtractorAction.js +3 -0
  15. package/dist/ergo/index.d.ts +8 -0
  16. package/dist/ergo/index.d.ts.map +1 -0
  17. package/dist/ergo/index.js +8 -0
  18. package/dist/ergo/initializable/AbstractInitializable.d.ts +48 -0
  19. package/dist/ergo/initializable/AbstractInitializable.d.ts.map +1 -0
  20. package/dist/ergo/initializable/AbstractInitializable.js +84 -0
  21. package/dist/ergo/initializable/AbstractInitializableAction.d.ts +9 -0
  22. package/dist/ergo/initializable/AbstractInitializableAction.d.ts.map +1 -0
  23. package/dist/ergo/initializable/AbstractInitializableAction.js +4 -0
  24. package/dist/ergo/initializable/InitializableByAddress.d.ts +26 -0
  25. package/dist/ergo/initializable/InitializableByAddress.d.ts.map +1 -0
  26. package/dist/ergo/initializable/InitializableByAddress.js +38 -0
  27. package/dist/ergo/initializable/InitializableByToken.d.ts +26 -0
  28. package/dist/ergo/initializable/InitializableByToken.d.ts.map +1 -0
  29. package/dist/ergo/initializable/InitializableByToken.js +38 -0
  30. package/dist/ergo/initializable/index.d.ts +5 -0
  31. package/dist/ergo/initializable/index.d.ts.map +1 -0
  32. package/dist/ergo/initializable/index.js +5 -0
  33. package/dist/ergo/interfaces.d.ts +56 -0
  34. package/dist/ergo/interfaces.d.ts.map +1 -0
  35. package/dist/ergo/interfaces.js +6 -0
  36. package/dist/ergo/network/AbstractNetwork.d.ts +32 -0
  37. package/dist/ergo/network/AbstractNetwork.d.ts.map +1 -0
  38. package/dist/ergo/network/AbstractNetwork.js +3 -0
  39. package/dist/ergo/network/ExplorerNetwork.d.ts +35 -0
  40. package/dist/ergo/network/ExplorerNetwork.d.ts.map +1 -0
  41. package/dist/ergo/network/ExplorerNetwork.js +53 -0
  42. package/dist/ergo/network/NodeNetwork.d.ts +42 -0
  43. package/dist/ergo/network/NodeNetwork.d.ts.map +1 -0
  44. package/dist/ergo/network/NodeNetwork.js +71 -0
  45. package/dist/ergo/utils.d.ts +8 -0
  46. package/dist/ergo/utils.d.ts.map +1 -0
  47. package/dist/ergo/utils.js +16 -0
  48. package/dist/index.d.ts +4 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +4 -0
  51. package/dist/interfaces.d.ts +12 -0
  52. package/dist/interfaces.d.ts.map +1 -0
  53. package/dist/interfaces.js +2 -0
  54. package/lib/AbstractExtractor.ts +31 -0
  55. package/lib/constants.ts +3 -0
  56. package/lib/ergo/AbstractErgoExtractor.ts +107 -0
  57. package/lib/ergo/AbstractErgoExtractorAction.ts +39 -0
  58. package/lib/ergo/index.ts +7 -0
  59. package/lib/ergo/initializable/AbstractInitializable.ts +148 -0
  60. package/lib/ergo/initializable/AbstractInitializableAction.ts +11 -0
  61. package/lib/ergo/initializable/InitializableByAddress.ts +53 -0
  62. package/lib/ergo/initializable/InitializableByToken.ts +53 -0
  63. package/lib/ergo/initializable/index.ts +4 -0
  64. package/lib/ergo/interfaces.ts +64 -0
  65. package/lib/ergo/network/AbstractNetwork.ts +35 -0
  66. package/lib/ergo/network/ExplorerNetwork.ts +68 -0
  67. package/lib/ergo/network/NodeNetwork.ts +93 -0
  68. package/lib/ergo/utils.ts +15 -0
  69. package/lib/index.ts +3 -0
  70. package/lib/interfaces.ts +12 -0
  71. package/package.json +42 -0
  72. package/tests/AbstractExtractor.mock.ts +26 -0
  73. package/tests/AbstractExtractor.spec.ts +106 -0
  74. package/tests/initializable/AbstractInitializable.mock.ts +31 -0
  75. package/tests/initializable/AbstractInitializable.spec.ts +258 -0
  76. package/tests/initializable/testData.ts +59 -0
  77. package/tests/testData.ts +111 -0
  78. package/tsconfig.build.json +7 -0
  79. package/tsconfig.build.tsbuildinfo +1 -0
  80. package/tsconfig.json +7 -0
  81. package/vitest.config.ts +17 -0
@@ -0,0 +1,56 @@
1
+ export declare enum ErgoNetworkType {
2
+ Explorer = "explorer",
3
+ Node = "node"
4
+ }
5
+ export type InputBox = {
6
+ boxId: string;
7
+ };
8
+ export type DataInput = {
9
+ boxId: string;
10
+ };
11
+ export type Asset = {
12
+ tokenId: string;
13
+ amount: bigint;
14
+ };
15
+ export type AdditionalRegisters = {
16
+ R4?: string;
17
+ R5?: string;
18
+ R6?: string;
19
+ R7?: string;
20
+ R8?: string;
21
+ R9?: string;
22
+ };
23
+ export type OutputBox = {
24
+ boxId: string;
25
+ value: bigint;
26
+ ergoTree: string;
27
+ creationHeight: number;
28
+ assets?: Array<Asset>;
29
+ additionalRegisters?: AdditionalRegisters;
30
+ transactionId: string;
31
+ index: bigint | number;
32
+ };
33
+ export interface ErgoBox extends OutputBox {
34
+ blockId: string;
35
+ spentTransactionId?: string;
36
+ }
37
+ export type Transaction = {
38
+ id: string;
39
+ inputs: Array<InputBox>;
40
+ dataInputs: Array<DataInput>;
41
+ outputs: Array<OutputBox>;
42
+ size?: bigint;
43
+ };
44
+ export interface SpendInfo {
45
+ boxId: string;
46
+ txId: string;
47
+ index: number;
48
+ }
49
+ export interface ErgoExtractedData {
50
+ boxId: string;
51
+ height: number;
52
+ blockId: string;
53
+ spendBlock?: string;
54
+ spendHeight?: number;
55
+ }
56
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../lib/ergo/interfaces.ts"],"names":[],"mappings":"AAAA,oBAAY,eAAe;IACzB,QAAQ,aAAa;IACrB,IAAI,SAAS;CACd;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACtB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,WAAW,OAAQ,SAAQ,SAAS;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxB,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7B,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,6 @@
1
+ export var ErgoNetworkType;
2
+ (function (ErgoNetworkType) {
3
+ ErgoNetworkType["Explorer"] = "explorer";
4
+ ErgoNetworkType["Node"] = "node";
5
+ })(ErgoNetworkType || (ErgoNetworkType = {}));
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9lcmdvL2ludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksZUFHWDtBQUhELFdBQVksZUFBZTtJQUN6Qix3Q0FBcUIsQ0FBQTtJQUNyQixnQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQUhXLGVBQWUsS0FBZixlQUFlLFFBRzFCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gRXJnb05ldHdvcmtUeXBlIHtcbiAgRXhwbG9yZXIgPSAnZXhwbG9yZXInLFxuICBOb2RlID0gJ25vZGUnLFxufVxuXG5leHBvcnQgdHlwZSBJbnB1dEJveCA9IHtcbiAgYm94SWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERhdGFJbnB1dCA9IHtcbiAgYm94SWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFzc2V0ID0ge1xuICB0b2tlbklkOiBzdHJpbmc7XG4gIGFtb3VudDogYmlnaW50O1xufTtcblxuZXhwb3J0IHR5cGUgQWRkaXRpb25hbFJlZ2lzdGVycyA9IHtcbiAgUjQ/OiBzdHJpbmc7XG4gIFI1Pzogc3RyaW5nO1xuICBSNj86IHN0cmluZztcbiAgUjc/OiBzdHJpbmc7XG4gIFI4Pzogc3RyaW5nO1xuICBSOT86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIE91dHB1dEJveCA9IHtcbiAgYm94SWQ6IHN0cmluZztcbiAgdmFsdWU6IGJpZ2ludDtcbiAgZXJnb1RyZWU6IHN0cmluZztcbiAgY3JlYXRpb25IZWlnaHQ6IG51bWJlcjtcbiAgYXNzZXRzPzogQXJyYXk8QXNzZXQ+O1xuICBhZGRpdGlvbmFsUmVnaXN0ZXJzPzogQWRkaXRpb25hbFJlZ2lzdGVycztcbiAgdHJhbnNhY3Rpb25JZDogc3RyaW5nO1xuICBpbmRleDogYmlnaW50IHwgbnVtYmVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBFcmdvQm94IGV4dGVuZHMgT3V0cHV0Qm94IHtcbiAgYmxvY2tJZDogc3RyaW5nO1xuICBzcGVudFRyYW5zYWN0aW9uSWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uID0ge1xuICBpZDogc3RyaW5nO1xuICBpbnB1dHM6IEFycmF5PElucHV0Qm94PjtcbiAgZGF0YUlucHV0czogQXJyYXk8RGF0YUlucHV0PjtcbiAgb3V0cHV0czogQXJyYXk8T3V0cHV0Qm94PjtcbiAgc2l6ZT86IGJpZ2ludDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3BlbmRJbmZvIHtcbiAgYm94SWQ6IHN0cmluZztcbiAgdHhJZDogc3RyaW5nO1xuICBpbmRleDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVyZ29FeHRyYWN0ZWREYXRhIHtcbiAgYm94SWQ6IHN0cmluZztcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGJsb2NrSWQ6IHN0cmluZztcbiAgc3BlbmRCbG9jaz86IHN0cmluZztcbiAgc3BlbmRIZWlnaHQ/OiBudW1iZXI7XG59XG4iXX0=
@@ -0,0 +1,32 @@
1
+ import { BlockInfo } from '../../interfaces';
2
+ import { ErgoBox } from '../interfaces';
3
+ export declare abstract class AbstractNetwork {
4
+ /**
5
+ * return block information of specified tx
6
+ * @param txId
7
+ */
8
+ abstract getTxBlock: (txId: string) => Promise<BlockInfo>;
9
+ /**
10
+ * return related boxes by specified address with limit offset
11
+ * @param address
12
+ * @param offset
13
+ * @param limit
14
+ * @returns related boxes
15
+ */
16
+ abstract getBoxesByAddress: (address: string, offset: number, limit: number) => Promise<{
17
+ boxes: ErgoBox[];
18
+ hasNextBatch: boolean;
19
+ }>;
20
+ /**
21
+ * return related boxes by specified token with limit offset
22
+ * @param tokenId
23
+ * @param offset
24
+ * @param limit
25
+ * @returns related boxes
26
+ */
27
+ abstract getBoxesByTokenId: (tokenId: string, offset: number, limit: number) => Promise<{
28
+ boxes: ErgoBox[];
29
+ hasNextBatch: boolean;
30
+ }>;
31
+ }
32
+ //# sourceMappingURL=AbstractNetwork.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractNetwork.d.ts","sourceRoot":"","sources":["../../../lib/ergo/network/AbstractNetwork.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,8BAAsB,eAAe;IACnC;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IAE1D;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,EAAE,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,KACV,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAE1D;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,EAAE,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,KACV,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC3D"}
@@ -0,0 +1,3 @@
1
+ export class AbstractNetwork {
2
+ }
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3ROZXR3b3JrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2VyZ28vbmV0d29yay9BYnN0cmFjdE5ldHdvcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFnQixlQUFlO0NBZ0NwQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJsb2NrSW5mbyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgRXJnb0JveCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmV0d29yayB7XG4gIC8qKlxuICAgKiByZXR1cm4gYmxvY2sgaW5mb3JtYXRpb24gb2Ygc3BlY2lmaWVkIHR4XG4gICAqIEBwYXJhbSB0eElkXG4gICAqL1xuICBhYnN0cmFjdCBnZXRUeEJsb2NrOiAodHhJZDogc3RyaW5nKSA9PiBQcm9taXNlPEJsb2NrSW5mbz47XG5cbiAgLyoqXG4gICAqIHJldHVybiByZWxhdGVkIGJveGVzIGJ5IHNwZWNpZmllZCBhZGRyZXNzIHdpdGggbGltaXQgb2Zmc2V0XG4gICAqIEBwYXJhbSBhZGRyZXNzXG4gICAqIEBwYXJhbSBvZmZzZXRcbiAgICogQHBhcmFtIGxpbWl0XG4gICAqIEByZXR1cm5zIHJlbGF0ZWQgYm94ZXNcbiAgICovXG4gIGFic3RyYWN0IGdldEJveGVzQnlBZGRyZXNzOiAoXG4gICAgYWRkcmVzczogc3RyaW5nLFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIGxpbWl0OiBudW1iZXJcbiAgKSA9PiBQcm9taXNlPHsgYm94ZXM6IEVyZ29Cb3hbXTsgaGFzTmV4dEJhdGNoOiBib29sZWFuIH0+O1xuXG4gIC8qKlxuICAgKiByZXR1cm4gcmVsYXRlZCBib3hlcyBieSBzcGVjaWZpZWQgdG9rZW4gd2l0aCBsaW1pdCBvZmZzZXRcbiAgICogQHBhcmFtIHRva2VuSWRcbiAgICogQHBhcmFtIG9mZnNldFxuICAgKiBAcGFyYW0gbGltaXRcbiAgICogQHJldHVybnMgcmVsYXRlZCBib3hlc1xuICAgKi9cbiAgYWJzdHJhY3QgZ2V0Qm94ZXNCeVRva2VuSWQ6IChcbiAgICB0b2tlbklkOiBzdHJpbmcsXG4gICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgbGltaXQ6IG51bWJlclxuICApID0+IFByb21pc2U8eyBib3hlczogRXJnb0JveFtdOyBoYXNOZXh0QmF0Y2g6IGJvb2xlYW4gfT47XG59XG4iXX0=
@@ -0,0 +1,35 @@
1
+ import { BlockInfo } from '../../interfaces';
2
+ import { ErgoBox } from '../interfaces';
3
+ import { AbstractNetwork } from './AbstractNetwork';
4
+ export declare class ExplorerNetwork extends AbstractNetwork {
5
+ private api;
6
+ constructor(url: string);
7
+ /**
8
+ * return block information of specified tx
9
+ * @param txId
10
+ */
11
+ getTxBlock: (txId: string) => Promise<BlockInfo>;
12
+ /**
13
+ * use explorer api to return related boxes by specified address
14
+ * @param address
15
+ * @param offset
16
+ * @param limit
17
+ * @returns related boxes
18
+ */
19
+ getBoxesByAddress: (address: string, offset: number, limit: number) => Promise<{
20
+ boxes: ErgoBox[];
21
+ hasNextBatch: boolean;
22
+ }>;
23
+ /**
24
+ * use explorer api to return related boxes by specified token id
25
+ * @param tokenId
26
+ * @param offset
27
+ * @param limit
28
+ * @returns related boxes
29
+ */
30
+ getBoxesByTokenId: (tokenId: string, offset: number, limit: number) => Promise<{
31
+ boxes: ErgoBox[];
32
+ hasNextBatch: boolean;
33
+ }>;
34
+ }
35
+ //# sourceMappingURL=ExplorerNetwork.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExplorerNetwork.d.ts","sourceRoot":"","sources":["../../../lib/ergo/network/ExplorerNetwork.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,qBAAa,eAAgB,SAAQ,eAAe;IAClD,OAAO,CAAC,GAAG,CAAC;gBAEA,GAAG,EAAE,MAAM;IAKvB;;;OAGG;IACH,UAAU,SAAgB,MAAM,KAAG,QAAQ,SAAS,CAAC,CAMnD;IAEF;;;;;;OAMG;IACH,iBAAiB,YACN,MAAM,UACP,MAAM,SACP,MAAM,KACZ,QAAQ;QAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAQrD;IAEF;;;;;;OAMG;IACH,iBAAiB,YACN,MAAM,UACP,MAAM,SACP,MAAM,KACZ,QAAQ;QAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAQrD;CACH"}
@@ -0,0 +1,53 @@
1
+ import ergoExplorerClientFactory from '@rosen-clients/ergo-explorer';
2
+ import { AbstractNetwork } from './AbstractNetwork';
3
+ export class ExplorerNetwork extends AbstractNetwork {
4
+ api;
5
+ constructor(url) {
6
+ super();
7
+ this.api = ergoExplorerClientFactory(url);
8
+ }
9
+ /**
10
+ * return block information of specified tx
11
+ * @param txId
12
+ */
13
+ getTxBlock = async (txId) => {
14
+ const tx = await this.api.v1.getApiV1TransactionsP1(txId);
15
+ return {
16
+ hash: tx.blockId,
17
+ height: tx.inclusionHeight,
18
+ };
19
+ };
20
+ /**
21
+ * use explorer api to return related boxes by specified address
22
+ * @param address
23
+ * @param offset
24
+ * @param limit
25
+ * @returns related boxes
26
+ */
27
+ getBoxesByAddress = async (address, offset, limit) => {
28
+ const boxes = await this.api.v1.getApiV1BoxesByaddressP1(address, {
29
+ offset: offset,
30
+ limit: limit,
31
+ });
32
+ if (!boxes.items)
33
+ throw new Error('Explorer BoxesByAddress api expected to have items');
34
+ return { boxes: boxes.items, hasNextBatch: boxes.total > offset + limit };
35
+ };
36
+ /**
37
+ * use explorer api to return related boxes by specified token id
38
+ * @param tokenId
39
+ * @param offset
40
+ * @param limit
41
+ * @returns related boxes
42
+ */
43
+ getBoxesByTokenId = async (tokenId, offset, limit) => {
44
+ const boxes = await this.api.v1.getApiV1BoxesBytokenidP1(tokenId, {
45
+ offset: offset,
46
+ limit: limit,
47
+ });
48
+ if (!boxes.items)
49
+ throw new Error('Explorer BoxesByTokeId api expected to have items');
50
+ return { boxes: boxes.items, hasNextBatch: boxes.total > offset + limit };
51
+ };
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwbG9yZXJOZXR3b3JrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2VyZ28vbmV0d29yay9FeHBsb3Jlck5ldHdvcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyx5QkFBeUIsTUFBTSw4QkFBOEIsQ0FBQztBQUlyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxPQUFPLGVBQWdCLFNBQVEsZUFBZTtJQUMxQyxHQUFHLENBQUM7SUFFWixZQUFZLEdBQVc7UUFDckIsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsR0FBRyxHQUFHLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVLEdBQUcsS0FBSyxFQUFFLElBQVksRUFBc0IsRUFBRTtRQUN0RCxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELE9BQU87WUFDTCxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU87WUFDaEIsTUFBTSxFQUFFLEVBQUUsQ0FBQyxlQUFlO1NBQzNCLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRjs7Ozs7O09BTUc7SUFDSCxpQkFBaUIsR0FBRyxLQUFLLEVBQ3ZCLE9BQWUsRUFDZixNQUFjLEVBQ2QsS0FBYSxFQUN5QyxFQUFFO1FBQ3hELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFO1lBQ2hFLE1BQU0sRUFBRSxNQUFNO1lBQ2QsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUs7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUM1RSxDQUFDLENBQUM7SUFFRjs7Ozs7O09BTUc7SUFDSCxpQkFBaUIsR0FBRyxLQUFLLEVBQ3ZCLE9BQWUsRUFDZixNQUFjLEVBQ2QsS0FBYSxFQUN5QyxFQUFFO1FBQ3hELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFO1lBQ2hFLE1BQU0sRUFBRSxNQUFNO1lBQ2QsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUs7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7UUFDdkUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUM1RSxDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBlcmdvRXhwbG9yZXJDbGllbnRGYWN0b3J5IGZyb20gJ0Byb3Nlbi1jbGllbnRzL2VyZ28tZXhwbG9yZXInO1xuXG5pbXBvcnQgeyBCbG9ja0luZm8gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEVyZ29Cb3ggfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFic3RyYWN0TmV0d29yayB9IGZyb20gJy4vQWJzdHJhY3ROZXR3b3JrJztcblxuZXhwb3J0IGNsYXNzIEV4cGxvcmVyTmV0d29yayBleHRlbmRzIEFic3RyYWN0TmV0d29yayB7XG4gIHByaXZhdGUgYXBpO1xuXG4gIGNvbnN0cnVjdG9yKHVybDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwaSA9IGVyZ29FeHBsb3JlckNsaWVudEZhY3RvcnkodXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYmxvY2sgaW5mb3JtYXRpb24gb2Ygc3BlY2lmaWVkIHR4XG4gICAqIEBwYXJhbSB0eElkXG4gICAqL1xuICBnZXRUeEJsb2NrID0gYXN5bmMgKHR4SWQ6IHN0cmluZyk6IFByb21pc2U8QmxvY2tJbmZvPiA9PiB7XG4gICAgY29uc3QgdHggPSBhd2FpdCB0aGlzLmFwaS52MS5nZXRBcGlWMVRyYW5zYWN0aW9uc1AxKHR4SWQpO1xuICAgIHJldHVybiB7XG4gICAgICBoYXNoOiB0eC5ibG9ja0lkLFxuICAgICAgaGVpZ2h0OiB0eC5pbmNsdXNpb25IZWlnaHQsXG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogdXNlIGV4cGxvcmVyIGFwaSB0byByZXR1cm4gcmVsYXRlZCBib3hlcyBieSBzcGVjaWZpZWQgYWRkcmVzc1xuICAgKiBAcGFyYW0gYWRkcmVzc1xuICAgKiBAcGFyYW0gb2Zmc2V0XG4gICAqIEBwYXJhbSBsaW1pdFxuICAgKiBAcmV0dXJucyByZWxhdGVkIGJveGVzXG4gICAqL1xuICBnZXRCb3hlc0J5QWRkcmVzcyA9IGFzeW5jIChcbiAgICBhZGRyZXNzOiBzdHJpbmcsXG4gICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgbGltaXQ6IG51bWJlclxuICApOiBQcm9taXNlPHsgYm94ZXM6IEVyZ29Cb3hbXTsgaGFzTmV4dEJhdGNoOiBib29sZWFuIH0+ID0+IHtcbiAgICBjb25zdCBib3hlcyA9IGF3YWl0IHRoaXMuYXBpLnYxLmdldEFwaVYxQm94ZXNCeWFkZHJlc3NQMShhZGRyZXNzLCB7XG4gICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgIGxpbWl0OiBsaW1pdCxcbiAgICB9KTtcbiAgICBpZiAoIWJveGVzLml0ZW1zKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBsb3JlciBCb3hlc0J5QWRkcmVzcyBhcGkgZXhwZWN0ZWQgdG8gaGF2ZSBpdGVtcycpO1xuICAgIHJldHVybiB7IGJveGVzOiBib3hlcy5pdGVtcywgaGFzTmV4dEJhdGNoOiBib3hlcy50b3RhbCA+IG9mZnNldCArIGxpbWl0IH07XG4gIH07XG5cbiAgLyoqXG4gICAqIHVzZSBleHBsb3JlciBhcGkgdG8gcmV0dXJuIHJlbGF0ZWQgYm94ZXMgYnkgc3BlY2lmaWVkIHRva2VuIGlkXG4gICAqIEBwYXJhbSB0b2tlbklkXG4gICAqIEBwYXJhbSBvZmZzZXRcbiAgICogQHBhcmFtIGxpbWl0XG4gICAqIEByZXR1cm5zIHJlbGF0ZWQgYm94ZXNcbiAgICovXG4gIGdldEJveGVzQnlUb2tlbklkID0gYXN5bmMgKFxuICAgIHRva2VuSWQ6IHN0cmluZyxcbiAgICBvZmZzZXQ6IG51bWJlcixcbiAgICBsaW1pdDogbnVtYmVyXG4gICk6IFByb21pc2U8eyBib3hlczogRXJnb0JveFtdOyBoYXNOZXh0QmF0Y2g6IGJvb2xlYW4gfT4gPT4ge1xuICAgIGNvbnN0IGJveGVzID0gYXdhaXQgdGhpcy5hcGkudjEuZ2V0QXBpVjFCb3hlc0J5dG9rZW5pZFAxKHRva2VuSWQsIHtcbiAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgbGltaXQ6IGxpbWl0LFxuICAgIH0pO1xuICAgIGlmICghYm94ZXMuaXRlbXMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGxvcmVyIEJveGVzQnlUb2tlSWQgYXBpIGV4cGVjdGVkIHRvIGhhdmUgaXRlbXMnKTtcbiAgICByZXR1cm4geyBib3hlczogYm94ZXMuaXRlbXMsIGhhc05leHRCYXRjaDogYm94ZXMudG90YWwgPiBvZmZzZXQgKyBsaW1pdCB9O1xuICB9O1xufVxuIl19
@@ -0,0 +1,42 @@
1
+ import { IndexedErgoBox } from '@rosen-clients/ergo-node';
2
+ import { BlockInfo } from '../../interfaces';
3
+ import { ErgoBox } from '../interfaces';
4
+ import { AbstractNetwork } from './AbstractNetwork';
5
+ export declare class NodeNetwork extends AbstractNetwork {
6
+ private api;
7
+ constructor(url: string);
8
+ /**
9
+ * covert node api boxes to ErgoBox interface
10
+ * @param box
11
+ * @returns ErgoBox
12
+ */
13
+ convertToErgoBox: (box: IndexedErgoBox) => Promise<ErgoBox>;
14
+ /**
15
+ * return block information of specified tx
16
+ * @param txId
17
+ */
18
+ getTxBlock: (txId: string) => Promise<BlockInfo>;
19
+ /**
20
+ * use node api to return related boxes by specified address
21
+ * @param address
22
+ * @param offset
23
+ * @param limit
24
+ * @returns related boxes
25
+ */
26
+ getBoxesByAddress: (address: string, offset: number, limit: number) => Promise<{
27
+ boxes: ErgoBox[];
28
+ hasNextBatch: boolean;
29
+ }>;
30
+ /**
31
+ * use node api to return related boxes by specified token id
32
+ * @param tokenId
33
+ * @param offset
34
+ * @param limit
35
+ * @returns related boxes
36
+ */
37
+ getBoxesByTokenId: (tokenId: string, offset: number, limit: number) => Promise<{
38
+ boxes: ErgoBox[];
39
+ hasNextBatch: boolean;
40
+ }>;
41
+ }
42
+ //# sourceMappingURL=NodeNetwork.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeNetwork.d.ts","sourceRoot":"","sources":["../../../lib/ergo/network/NodeNetwork.ts"],"names":[],"mappings":"AAAA,OAA8B,EAC5B,cAAc,EACf,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,qBAAa,WAAY,SAAQ,eAAe;IAC9C,OAAO,CAAC,GAAG,CAAC;gBAEA,GAAG,EAAE,MAAM;IAKvB;;;;OAIG;IACH,gBAAgB,QAAe,cAAc,KAAG,QAAQ,OAAO,CAAC,CAU7D;IAEH;;;OAGG;IACH,UAAU,SAAgB,MAAM,KAAG,QAAQ,SAAS,CAAC,CAMnD;IAEF;;;;;;OAMG;IACH,iBAAiB,YACN,MAAM,UACP,MAAM,SACP,MAAM,KACZ,QAAQ;QAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAWrD;IAEF;;;;;;OAMG;IACH,iBAAiB,YACN,MAAM,UACP,MAAM,SACP,MAAM,KACZ,QAAQ;QAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAWrD;CACH"}
@@ -0,0 +1,71 @@
1
+ import ergoNodeClientFactory from '@rosen-clients/ergo-node';
2
+ import { AbstractNetwork } from './AbstractNetwork';
3
+ export class NodeNetwork extends AbstractNetwork {
4
+ api;
5
+ constructor(url) {
6
+ super();
7
+ this.api = ergoNodeClientFactory(url);
8
+ }
9
+ /**
10
+ * covert node api boxes to ErgoBox interface
11
+ * @param box
12
+ * @returns ErgoBox
13
+ */
14
+ convertToErgoBox = async (box) => ({
15
+ transactionId: box.transactionId || '',
16
+ index: box.index || 0,
17
+ value: box.value || 0n,
18
+ ergoTree: box.ergoTree || '',
19
+ creationHeight: box.creationHeight || 0,
20
+ assets: box.assets || [],
21
+ additionalRegisters: box.additionalRegisters,
22
+ boxId: box.boxId || '',
23
+ blockId: (await this.getTxBlock(box.transactionId)).hash,
24
+ });
25
+ /**
26
+ * return block information of specified tx
27
+ * @param txId
28
+ */
29
+ getTxBlock = async (txId) => {
30
+ const tx = await this.api.getTxById(txId);
31
+ return {
32
+ hash: tx.blockId,
33
+ height: tx.inclusionHeight,
34
+ };
35
+ };
36
+ /**
37
+ * use node api to return related boxes by specified address
38
+ * @param address
39
+ * @param offset
40
+ * @param limit
41
+ * @returns related boxes
42
+ */
43
+ getBoxesByAddress = async (address, offset, limit) => {
44
+ const boxes = await this.api.getBoxesByAddress(address, {
45
+ offset: offset,
46
+ limit: limit,
47
+ });
48
+ if (!boxes.items)
49
+ throw new Error('Ergo node BoxesByAddress api expected to have items');
50
+ const ergoBoxes = await Promise.all(boxes.items.map(async (box) => await this.convertToErgoBox(box)));
51
+ return { boxes: ergoBoxes, hasNextBatch: boxes.items.length > 0 };
52
+ };
53
+ /**
54
+ * use node api to return related boxes by specified token id
55
+ * @param tokenId
56
+ * @param offset
57
+ * @param limit
58
+ * @returns related boxes
59
+ */
60
+ getBoxesByTokenId = async (tokenId, offset, limit) => {
61
+ const boxes = await this.api.getBoxesByTokenId(tokenId, {
62
+ offset: offset,
63
+ limit: limit,
64
+ });
65
+ if (!boxes.items)
66
+ throw new Error('Ergo node BoxesByTokenId api expected to have items');
67
+ const ergoBoxes = await Promise.all(boxes.items.map(async (box) => await this.convertToErgoBox(box)));
68
+ return { boxes: ergoBoxes, hasNextBatch: boxes.items.length > 0 };
69
+ };
70
+ }
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZU5ldHdvcmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXJnby9uZXR3b3JrL05vZGVOZXR3b3JrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8scUJBRU4sTUFBTSwwQkFBMEIsQ0FBQztBQUlsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxPQUFPLFdBQVksU0FBUSxlQUFlO0lBQ3RDLEdBQUcsQ0FBQztJQUVaLFlBQVksR0FBVztRQUNyQixLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxHQUFHLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxnQkFBZ0IsR0FBRyxLQUFLLEVBQUUsR0FBbUIsRUFBb0IsRUFBRSxDQUFDLENBQUM7UUFDbkUsYUFBYSxFQUFFLEdBQUcsQ0FBQyxhQUFhLElBQUksRUFBRTtRQUN0QyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDO1FBQ3JCLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDdEIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLElBQUksRUFBRTtRQUM1QixjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWMsSUFBSSxDQUFDO1FBQ3ZDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUU7UUFDeEIsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLG1CQUFtQjtRQUM1QyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ3RCLE9BQU8sRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsYUFBYyxDQUFDLENBQUMsQ0FBQyxJQUFJO0tBQzFELENBQUMsQ0FBQztJQUVIOzs7T0FHRztJQUNILFVBQVUsR0FBRyxLQUFLLEVBQUUsSUFBWSxFQUFzQixFQUFFO1FBQ3RELE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsT0FBTztZQUNMLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTztZQUNoQixNQUFNLEVBQUUsRUFBRSxDQUFDLGVBQWU7U0FDM0IsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGOzs7Ozs7T0FNRztJQUNILGlCQUFpQixHQUFHLEtBQUssRUFDdkIsT0FBZSxFQUNmLE1BQWMsRUFDZCxLQUFhLEVBQ3lDLEVBQUU7UUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRTtZQUN0RCxNQUFNLEVBQUUsTUFBTTtZQUNkLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sU0FBUyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDakMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDakUsQ0FBQztRQUNGLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNwRSxDQUFDLENBQUM7SUFFRjs7Ozs7O09BTUc7SUFDSCxpQkFBaUIsR0FBRyxLQUFLLEVBQ3ZCLE9BQWUsRUFDZixNQUFjLEVBQ2QsS0FBYSxFQUN5QyxFQUFFO1FBQ3hELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUU7WUFDdEQsTUFBTSxFQUFFLE1BQU07WUFDZCxLQUFLLEVBQUUsS0FBSztTQUNiLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztRQUN6RSxNQUFNLFNBQVMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2pDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ2pFLENBQUM7UUFDRixPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDcEUsQ0FBQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZXJnb05vZGVDbGllbnRGYWN0b3J5LCB7XG4gIEluZGV4ZWRFcmdvQm94LFxufSBmcm9tICdAcm9zZW4tY2xpZW50cy9lcmdvLW5vZGUnO1xuXG5pbXBvcnQgeyBCbG9ja0luZm8gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEVyZ29Cb3ggfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFic3RyYWN0TmV0d29yayB9IGZyb20gJy4vQWJzdHJhY3ROZXR3b3JrJztcblxuZXhwb3J0IGNsYXNzIE5vZGVOZXR3b3JrIGV4dGVuZHMgQWJzdHJhY3ROZXR3b3JrIHtcbiAgcHJpdmF0ZSBhcGk7XG5cbiAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBpID0gZXJnb05vZGVDbGllbnRGYWN0b3J5KHVybCk7XG4gIH1cblxuICAvKipcbiAgICogY292ZXJ0IG5vZGUgYXBpIGJveGVzIHRvIEVyZ29Cb3ggaW50ZXJmYWNlXG4gICAqIEBwYXJhbSBib3hcbiAgICogQHJldHVybnMgRXJnb0JveFxuICAgKi9cbiAgY29udmVydFRvRXJnb0JveCA9IGFzeW5jIChib3g6IEluZGV4ZWRFcmdvQm94KTogUHJvbWlzZTxFcmdvQm94PiA9PiAoe1xuICAgIHRyYW5zYWN0aW9uSWQ6IGJveC50cmFuc2FjdGlvbklkIHx8ICcnLFxuICAgIGluZGV4OiBib3guaW5kZXggfHwgMCxcbiAgICB2YWx1ZTogYm94LnZhbHVlIHx8IDBuLFxuICAgIGVyZ29UcmVlOiBib3guZXJnb1RyZWUgfHwgJycsXG4gICAgY3JlYXRpb25IZWlnaHQ6IGJveC5jcmVhdGlvbkhlaWdodCB8fCAwLFxuICAgIGFzc2V0czogYm94LmFzc2V0cyB8fCBbXSxcbiAgICBhZGRpdGlvbmFsUmVnaXN0ZXJzOiBib3guYWRkaXRpb25hbFJlZ2lzdGVycyxcbiAgICBib3hJZDogYm94LmJveElkIHx8ICcnLFxuICAgIGJsb2NrSWQ6IChhd2FpdCB0aGlzLmdldFR4QmxvY2soYm94LnRyYW5zYWN0aW9uSWQhKSkuaGFzaCxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIHJldHVybiBibG9jayBpbmZvcm1hdGlvbiBvZiBzcGVjaWZpZWQgdHhcbiAgICogQHBhcmFtIHR4SWRcbiAgICovXG4gIGdldFR4QmxvY2sgPSBhc3luYyAodHhJZDogc3RyaW5nKTogUHJvbWlzZTxCbG9ja0luZm8+ID0+IHtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHRoaXMuYXBpLmdldFR4QnlJZCh0eElkKTtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzaDogdHguYmxvY2tJZCxcbiAgICAgIGhlaWdodDogdHguaW5jbHVzaW9uSGVpZ2h0LFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIHVzZSBub2RlIGFwaSB0byByZXR1cm4gcmVsYXRlZCBib3hlcyBieSBzcGVjaWZpZWQgYWRkcmVzc1xuICAgKiBAcGFyYW0gYWRkcmVzc1xuICAgKiBAcGFyYW0gb2Zmc2V0XG4gICAqIEBwYXJhbSBsaW1pdFxuICAgKiBAcmV0dXJucyByZWxhdGVkIGJveGVzXG4gICAqL1xuICBnZXRCb3hlc0J5QWRkcmVzcyA9IGFzeW5jIChcbiAgICBhZGRyZXNzOiBzdHJpbmcsXG4gICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgbGltaXQ6IG51bWJlclxuICApOiBQcm9taXNlPHsgYm94ZXM6IEVyZ29Cb3hbXTsgaGFzTmV4dEJhdGNoOiBib29sZWFuIH0+ID0+IHtcbiAgICBjb25zdCBib3hlcyA9IGF3YWl0IHRoaXMuYXBpLmdldEJveGVzQnlBZGRyZXNzKGFkZHJlc3MsIHtcbiAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgbGltaXQ6IGxpbWl0LFxuICAgIH0pO1xuICAgIGlmICghYm94ZXMuaXRlbXMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VyZ28gbm9kZSBCb3hlc0J5QWRkcmVzcyBhcGkgZXhwZWN0ZWQgdG8gaGF2ZSBpdGVtcycpO1xuICAgIGNvbnN0IGVyZ29Cb3hlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYm94ZXMuaXRlbXMubWFwKGFzeW5jIChib3gpID0+IGF3YWl0IHRoaXMuY29udmVydFRvRXJnb0JveChib3gpKVxuICAgICk7XG4gICAgcmV0dXJuIHsgYm94ZXM6IGVyZ29Cb3hlcywgaGFzTmV4dEJhdGNoOiBib3hlcy5pdGVtcy5sZW5ndGggPiAwIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIHVzZSBub2RlIGFwaSB0byByZXR1cm4gcmVsYXRlZCBib3hlcyBieSBzcGVjaWZpZWQgdG9rZW4gaWRcbiAgICogQHBhcmFtIHRva2VuSWRcbiAgICogQHBhcmFtIG9mZnNldFxuICAgKiBAcGFyYW0gbGltaXRcbiAgICogQHJldHVybnMgcmVsYXRlZCBib3hlc1xuICAgKi9cbiAgZ2V0Qm94ZXNCeVRva2VuSWQgPSBhc3luYyAoXG4gICAgdG9rZW5JZDogc3RyaW5nLFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIGxpbWl0OiBudW1iZXJcbiAgKTogUHJvbWlzZTx7IGJveGVzOiBFcmdvQm94W107IGhhc05leHRCYXRjaDogYm9vbGVhbiB9PiA9PiB7XG4gICAgY29uc3QgYm94ZXMgPSBhd2FpdCB0aGlzLmFwaS5nZXRCb3hlc0J5VG9rZW5JZCh0b2tlbklkLCB7XG4gICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgIGxpbWl0OiBsaW1pdCxcbiAgICB9KTtcbiAgICBpZiAoIWJveGVzLml0ZW1zKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcmdvIG5vZGUgQm94ZXNCeVRva2VuSWQgYXBpIGV4cGVjdGVkIHRvIGhhdmUgaXRlbXMnKTtcbiAgICBjb25zdCBlcmdvQm94ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGJveGVzLml0ZW1zLm1hcChhc3luYyAoYm94KSA9PiBhd2FpdCB0aGlzLmNvbnZlcnRUb0VyZ29Cb3goYm94KSlcbiAgICApO1xuICAgIHJldHVybiB7IGJveGVzOiBlcmdvQm94ZXMsIGhhc05leHRCYXRjaDogYm94ZXMuaXRlbXMubGVuZ3RoID4gMCB9O1xuICB9O1xufVxuIl19
@@ -0,0 +1,8 @@
1
+ import { OutputBox } from './interfaces';
2
+ /**
3
+ * Check box to have specified tokens
4
+ * @param box
5
+ * @return true if box has the required token and false otherwise
6
+ */
7
+ export declare const boxHasToken: (box: OutputBox, tokenIds: string[]) => boolean;
8
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../lib/ergo/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,WAAW,QAAS,SAAS,YAAY,MAAM,EAAE,YAM7D,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { intersection } from 'lodash-es';
2
+ /**
3
+ * Check box to have specified tokens
4
+ * @param box
5
+ * @return true if box has the required token and false otherwise
6
+ */
7
+ export const boxHasToken = (box, tokenIds) => {
8
+ if (!box.assets)
9
+ return false;
10
+ const boxTokens = box.assets.map((token) => token.tokenId);
11
+ const requiredTokens = intersection(tokenIds, boxTokens);
12
+ if (requiredTokens.length == tokenIds.length)
13
+ return true;
14
+ return false;
15
+ };
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXJnby91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBR3pDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFjLEVBQUUsUUFBa0IsRUFBRSxFQUFFO0lBQ2hFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlCLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0QsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN6RCxJQUFJLGNBQWMsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUMxRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGludGVyc2VjdGlvbiB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBPdXRwdXRCb3ggfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqIENoZWNrIGJveCB0byBoYXZlIHNwZWNpZmllZCB0b2tlbnNcbiAqIEBwYXJhbSBib3hcbiAqIEByZXR1cm4gdHJ1ZSBpZiBib3ggaGFzIHRoZSByZXF1aXJlZCB0b2tlbiBhbmQgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBjb25zdCBib3hIYXNUb2tlbiA9IChib3g6IE91dHB1dEJveCwgdG9rZW5JZHM6IHN0cmluZ1tdKSA9PiB7XG4gIGlmICghYm94LmFzc2V0cykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBib3hUb2tlbnMgPSBib3guYXNzZXRzLm1hcCgodG9rZW4pID0+IHRva2VuLnRva2VuSWQpO1xuICBjb25zdCByZXF1aXJlZFRva2VucyA9IGludGVyc2VjdGlvbih0b2tlbklkcywgYm94VG9rZW5zKTtcbiAgaWYgKHJlcXVpcmVkVG9rZW5zLmxlbmd0aCA9PSB0b2tlbklkcy5sZW5ndGgpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59O1xuIl19
@@ -0,0 +1,4 @@
1
+ export * from './interfaces';
2
+ export * from './ergo';
3
+ export * from './AbstractExtractor';
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,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from './interfaces';
2
+ export * from './ergo';
3
+ export * from './AbstractExtractor';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxRQUFRLENBQUM7QUFDdkIsY0FBYyxxQkFBcUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL2VyZ28nO1xuZXhwb3J0ICogZnJvbSAnLi9BYnN0cmFjdEV4dHJhY3Rvcic7XG4iXX0=
@@ -0,0 +1,12 @@
1
+ export interface Block {
2
+ parentHash: string;
3
+ hash: string;
4
+ height: number;
5
+ timestamp: number;
6
+ extra?: string;
7
+ }
8
+ export interface BlockInfo {
9
+ height: number;
10
+ hash: string;
11
+ }
12
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../lib/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIEJsb2NrIHtcbiAgcGFyZW50SGFzaDogc3RyaW5nO1xuICBoYXNoOiBzdHJpbmc7XG4gIGhlaWdodDogbnVtYmVyO1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgZXh0cmE/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmxvY2tJbmZvIHtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGhhc2g6IHN0cmluZztcbn1cbiJdfQ==
@@ -0,0 +1,31 @@
1
+ import { BlockInfo, Block } from './interfaces';
2
+
3
+ export abstract class AbstractExtractor<TransactionType> {
4
+ /**
5
+ * process a list of transactions in a block and store required information
6
+ * @param txs list of transactions in the block
7
+ * @param block
8
+ * @return true if the process is completed successfully and false otherwise
9
+ */
10
+ abstract processTransactions: (
11
+ txs: Array<TransactionType>,
12
+ block: Block
13
+ ) => Promise<boolean>;
14
+
15
+ /**
16
+ * return extractor id. This id must be unique over all extractors.
17
+ */
18
+ abstract getId: () => string;
19
+
20
+ /**
21
+ * fork one block and remove all stored information for this block
22
+ * @param hash block hash
23
+ */
24
+ abstract forkBlock: (hash: string) => Promise<void>;
25
+
26
+ /**
27
+ * initialize extractor database with data created below the initial height
28
+ * @param initialBlock
29
+ */
30
+ abstract initializeBoxes: (initialBlock: BlockInfo) => Promise<void>;
31
+ }
@@ -0,0 +1,3 @@
1
+ export const API_LIMIT = 100;
2
+ export const RETRIAL_COUNT = 10;
3
+ export const DB_CHUNK_SIZE = 100;
@@ -0,0 +1,107 @@
1
+ import { DataSource } from 'typeorm';
2
+ import { AbstractLogger, DummyLogger } from '@rosen-bridge/abstract-logger';
3
+ import JsonBigInt from '@rosen-bridge/json-bigint';
4
+
5
+ import { AbstractExtractor } from '../AbstractExtractor';
6
+ import { AbstractErgoExtractorAction } from './AbstractErgoExtractorAction';
7
+ import { Block } from '../interfaces';
8
+ import {
9
+ Transaction,
10
+ OutputBox,
11
+ ErgoExtractedData,
12
+ SpendInfo,
13
+ } from './interfaces';
14
+
15
+ export abstract class AbstractErgoExtractor<
16
+ ExtractedData extends ErgoExtractedData
17
+ > extends AbstractExtractor<Transaction> {
18
+ protected readonly dataSource: DataSource;
19
+ protected abstract actions: AbstractErgoExtractorAction<ExtractedData>;
20
+ protected logger: AbstractLogger;
21
+
22
+ constructor(logger = new DummyLogger()) {
23
+ super();
24
+ this.logger = logger;
25
+ }
26
+
27
+ /**
28
+ * extract box data to proper format (not including spending information)
29
+ * @param box
30
+ * @param blockId box inclusion block hash
31
+ * @param height box inclusion block height
32
+ * @return extracted data in proper format
33
+ */
34
+ abstract extractBoxData: (
35
+ box: OutputBox,
36
+ blockId: string,
37
+ height: number
38
+ ) => Omit<ExtractedData, 'spendBlock' | 'spendHeight'> | undefined;
39
+
40
+ /**
41
+ * check proper data format in the box
42
+ * @param box
43
+ * @return true if the box has the required data and false otherwise
44
+ */
45
+ abstract hasData: (box: OutputBox) => boolean;
46
+
47
+ /**
48
+ * process a list of transactions in a block and store required information
49
+ * @param txs list of transactions in the block
50
+ * @param block
51
+ * @return true if the process is completed successfully and false otherwise
52
+ */
53
+ processTransactions = async (
54
+ txs: Transaction[],
55
+ block: Block
56
+ ): Promise<boolean> => {
57
+ try {
58
+ const boxes: Array<ExtractedData> = [];
59
+ const spentInfos: Array<SpendInfo> = [];
60
+ for (const tx of txs) {
61
+ for (const output of tx.outputs) {
62
+ if (!this.hasData(output)) {
63
+ continue;
64
+ }
65
+ this.logger.debug(`Trying to extract data from box ${output.boxId}`);
66
+ const extractedData = this.extractBoxData(
67
+ output,
68
+ block.hash,
69
+ block.height
70
+ );
71
+ if (extractedData) {
72
+ this.logger.debug(
73
+ `Extracted data ${JsonBigInt.stringify(extractedData)} from box ${
74
+ output.boxId
75
+ }`
76
+ );
77
+ boxes.push(extractedData as ExtractedData);
78
+ }
79
+ }
80
+ let boxIndex = 1;
81
+ for (const input of tx.inputs) {
82
+ spentInfos.push({ txId: tx.id, boxId: input.boxId, index: boxIndex });
83
+ boxIndex += 1;
84
+ }
85
+
86
+ if (boxes.length > 0)
87
+ await this.actions.insertBoxes(boxes, this.getId());
88
+ await this.actions.spendBoxes(spentInfos, block, this.getId());
89
+ }
90
+ } catch (e) {
91
+ this.logger.error(
92
+ `Error in storing data in ${this.getId()} of the block ${block}: ${e}`
93
+ );
94
+ return false;
95
+ }
96
+
97
+ return true;
98
+ };
99
+
100
+ /**
101
+ * fork one block and remove all stored information for this block
102
+ * @param hash block hash
103
+ */
104
+ forkBlock = async (hash: string): Promise<void> => {
105
+ await this.actions.deleteBlockBoxes(hash, this.getId());
106
+ };
107
+ }
@@ -0,0 +1,39 @@
1
+ import { Block } from '../interfaces';
2
+ import { SpendInfo } from './interfaces';
3
+
4
+ export abstract class AbstractErgoExtractorAction<ExtractedData> {
5
+ /**
6
+ * insert all extracted box data in an atomic transaction
7
+ * @param data
8
+ * @param extractorId
9
+ * @return process success
10
+ */
11
+ abstract insertBoxes: (
12
+ data: ExtractedData[],
13
+ extractorId: string
14
+ ) => Promise<boolean>;
15
+
16
+ /**
17
+ * update spending information of stored boxes
18
+ * @param spendInfos
19
+ * @param block
20
+ * @param extractorId
21
+ */
22
+ abstract spendBoxes: (
23
+ spendInfos: SpendInfo[],
24
+ block: Block,
25
+ extractorId: string
26
+ ) => Promise<void>;
27
+
28
+ /**
29
+ * delete extracted data from a specific block
30
+ * if a box is spend in this block mark it as unspent
31
+ * if a box is created in this block remove it from database
32
+ * @param block
33
+ * @param extractorId
34
+ */
35
+ abstract deleteBlockBoxes: (
36
+ block: string,
37
+ extractorId: string
38
+ ) => Promise<void>;
39
+ }
@@ -0,0 +1,7 @@
1
+ export * from './AbstractErgoExtractor';
2
+ export * from './AbstractErgoExtractorAction';
3
+ export * from './interfaces';
4
+ export * from './network/ExplorerNetwork';
5
+ export * from './network/NodeNetwork';
6
+ export * from './initializable';
7
+ export * from './utils';