@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.
- package/.eslintignore +1 -0
- package/README.md +24 -0
- package/dist/AbstractExtractor.d.ts +25 -0
- package/dist/AbstractExtractor.d.ts.map +1 -0
- package/dist/AbstractExtractor.js +3 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +4 -0
- package/dist/ergo/AbstractErgoExtractor.d.ts +39 -0
- package/dist/ergo/AbstractErgoExtractor.d.ts.map +1 -0
- package/dist/ergo/AbstractErgoExtractor.js +57 -0
- package/dist/ergo/AbstractErgoExtractorAction.d.ts +27 -0
- package/dist/ergo/AbstractErgoExtractorAction.d.ts.map +1 -0
- package/dist/ergo/AbstractErgoExtractorAction.js +3 -0
- package/dist/ergo/index.d.ts +8 -0
- package/dist/ergo/index.d.ts.map +1 -0
- package/dist/ergo/index.js +8 -0
- package/dist/ergo/initializable/AbstractInitializable.d.ts +48 -0
- package/dist/ergo/initializable/AbstractInitializable.d.ts.map +1 -0
- package/dist/ergo/initializable/AbstractInitializable.js +84 -0
- package/dist/ergo/initializable/AbstractInitializableAction.d.ts +9 -0
- package/dist/ergo/initializable/AbstractInitializableAction.d.ts.map +1 -0
- package/dist/ergo/initializable/AbstractInitializableAction.js +4 -0
- package/dist/ergo/initializable/InitializableByAddress.d.ts +26 -0
- package/dist/ergo/initializable/InitializableByAddress.d.ts.map +1 -0
- package/dist/ergo/initializable/InitializableByAddress.js +38 -0
- package/dist/ergo/initializable/InitializableByToken.d.ts +26 -0
- package/dist/ergo/initializable/InitializableByToken.d.ts.map +1 -0
- package/dist/ergo/initializable/InitializableByToken.js +38 -0
- package/dist/ergo/initializable/index.d.ts +5 -0
- package/dist/ergo/initializable/index.d.ts.map +1 -0
- package/dist/ergo/initializable/index.js +5 -0
- package/dist/ergo/interfaces.d.ts +56 -0
- package/dist/ergo/interfaces.d.ts.map +1 -0
- package/dist/ergo/interfaces.js +6 -0
- package/dist/ergo/network/AbstractNetwork.d.ts +32 -0
- package/dist/ergo/network/AbstractNetwork.d.ts.map +1 -0
- package/dist/ergo/network/AbstractNetwork.js +3 -0
- package/dist/ergo/network/ExplorerNetwork.d.ts +35 -0
- package/dist/ergo/network/ExplorerNetwork.d.ts.map +1 -0
- package/dist/ergo/network/ExplorerNetwork.js +53 -0
- package/dist/ergo/network/NodeNetwork.d.ts +42 -0
- package/dist/ergo/network/NodeNetwork.d.ts.map +1 -0
- package/dist/ergo/network/NodeNetwork.js +71 -0
- package/dist/ergo/utils.d.ts +8 -0
- package/dist/ergo/utils.d.ts.map +1 -0
- package/dist/ergo/utils.js +16 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/interfaces.d.ts +12 -0
- package/dist/interfaces.d.ts.map +1 -0
- package/dist/interfaces.js +2 -0
- package/lib/AbstractExtractor.ts +31 -0
- package/lib/constants.ts +3 -0
- package/lib/ergo/AbstractErgoExtractor.ts +107 -0
- package/lib/ergo/AbstractErgoExtractorAction.ts +39 -0
- package/lib/ergo/index.ts +7 -0
- package/lib/ergo/initializable/AbstractInitializable.ts +148 -0
- package/lib/ergo/initializable/AbstractInitializableAction.ts +11 -0
- package/lib/ergo/initializable/InitializableByAddress.ts +53 -0
- package/lib/ergo/initializable/InitializableByToken.ts +53 -0
- package/lib/ergo/initializable/index.ts +4 -0
- package/lib/ergo/interfaces.ts +64 -0
- package/lib/ergo/network/AbstractNetwork.ts +35 -0
- package/lib/ergo/network/ExplorerNetwork.ts +68 -0
- package/lib/ergo/network/NodeNetwork.ts +93 -0
- package/lib/ergo/utils.ts +15 -0
- package/lib/index.ts +3 -0
- package/lib/interfaces.ts +12 -0
- package/package.json +42 -0
- package/tests/AbstractExtractor.mock.ts +26 -0
- package/tests/AbstractExtractor.spec.ts +106 -0
- package/tests/initializable/AbstractInitializable.mock.ts +31 -0
- package/tests/initializable/AbstractInitializable.spec.ts +258 -0
- package/tests/initializable/testData.ts +59 -0
- package/tests/testData.ts +111 -0
- package/tsconfig.build.json +7 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +7 -0
- 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
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
+
}
|
package/lib/constants.ts
ADDED
|
@@ -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';
|