@subql/node-stellar 2.9.3-2

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 (175) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +674 -0
  3. package/README.md +77 -0
  4. package/bin/run +4 -0
  5. package/bin/run.cmd +3 -0
  6. package/dist/.tsbuildinfo +1 -0
  7. package/dist/app.module.d.ts +2 -0
  8. package/dist/app.module.js +35 -0
  9. package/dist/app.module.js.map +1 -0
  10. package/dist/configure/SubqueryProject.d.ts +25 -0
  11. package/dist/configure/SubqueryProject.js +148 -0
  12. package/dist/configure/SubqueryProject.js.map +1 -0
  13. package/dist/configure/configure.module.d.ts +10 -0
  14. package/dist/configure/configure.module.js +129 -0
  15. package/dist/configure/configure.module.js.map +1 -0
  16. package/dist/indexer/blockDispatcher/block-dispatcher.service.d.ts +16 -0
  17. package/dist/indexer/blockDispatcher/block-dispatcher.service.js +54 -0
  18. package/dist/indexer/blockDispatcher/block-dispatcher.service.js.map +1 -0
  19. package/dist/indexer/blockDispatcher/index.d.ts +4 -0
  20. package/dist/indexer/blockDispatcher/index.js +10 -0
  21. package/dist/indexer/blockDispatcher/index.js.map +1 -0
  22. package/dist/indexer/blockDispatcher/stellar-block-dispatcher.d.ts +4 -0
  23. package/dist/indexer/blockDispatcher/stellar-block-dispatcher.js +5 -0
  24. package/dist/indexer/blockDispatcher/stellar-block-dispatcher.js.map +1 -0
  25. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.d.ts +16 -0
  26. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +78 -0
  27. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +1 -0
  28. package/dist/indexer/dictionary.service.d.ts +7 -0
  29. package/dist/indexer/dictionary.service.js +34 -0
  30. package/dist/indexer/dictionary.service.js.map +1 -0
  31. package/dist/indexer/ds-processor.service.d.ts +9 -0
  32. package/dist/indexer/ds-processor.service.js +46 -0
  33. package/dist/indexer/ds-processor.service.js.map +1 -0
  34. package/dist/indexer/dynamic-ds.service.d.ts +9 -0
  35. package/dist/indexer/dynamic-ds.service.js +71 -0
  36. package/dist/indexer/dynamic-ds.service.js.map +1 -0
  37. package/dist/indexer/fetch.module.d.ts +2 -0
  38. package/dist/indexer/fetch.module.js +93 -0
  39. package/dist/indexer/fetch.module.js.map +1 -0
  40. package/dist/indexer/fetch.service.d.ts +33 -0
  41. package/dist/indexer/fetch.service.js +201 -0
  42. package/dist/indexer/fetch.service.js.map +1 -0
  43. package/dist/indexer/fetch.service.spec.d.ts +1 -0
  44. package/dist/indexer/fetch.service.spec.js +58 -0
  45. package/dist/indexer/fetch.service.spec.js.map +1 -0
  46. package/dist/indexer/indexer.manager.d.ts +36 -0
  47. package/dist/indexer/indexer.manager.js +92 -0
  48. package/dist/indexer/indexer.manager.js.map +1 -0
  49. package/dist/indexer/indexer.module.d.ts +2 -0
  50. package/dist/indexer/indexer.module.js +86 -0
  51. package/dist/indexer/indexer.module.js.map +1 -0
  52. package/dist/indexer/project.service.d.ts +13 -0
  53. package/dist/indexer/project.service.js +60 -0
  54. package/dist/indexer/project.service.js.map +1 -0
  55. package/dist/indexer/sandbox.service.d.ts +13 -0
  56. package/dist/indexer/sandbox.service.js +64 -0
  57. package/dist/indexer/sandbox.service.js.map +1 -0
  58. package/dist/indexer/types.d.ts +1 -0
  59. package/dist/indexer/types.js +5 -0
  60. package/dist/indexer/types.js.map +1 -0
  61. package/dist/indexer/unfinalizedBlocks.service.d.ts +11 -0
  62. package/dist/indexer/unfinalizedBlocks.service.js +52 -0
  63. package/dist/indexer/unfinalizedBlocks.service.js.map +1 -0
  64. package/dist/indexer/worker/worker.d.ts +31 -0
  65. package/dist/indexer/worker/worker.js +103 -0
  66. package/dist/indexer/worker/worker.js.map +1 -0
  67. package/dist/indexer/worker/worker.module.d.ts +2 -0
  68. package/dist/indexer/worker/worker.module.js +33 -0
  69. package/dist/indexer/worker/worker.module.js.map +1 -0
  70. package/dist/indexer/worker/worker.service.d.ts +26 -0
  71. package/dist/indexer/worker/worker.service.js +90 -0
  72. package/dist/indexer/worker/worker.service.js.map +1 -0
  73. package/dist/indexer/worker/worker.unfinalizedBlocks.service.d.ts +16 -0
  74. package/dist/indexer/worker/worker.unfinalizedBlocks.service.js +50 -0
  75. package/dist/indexer/worker/worker.unfinalizedBlocks.service.js.map +1 -0
  76. package/dist/init.d.ts +1 -0
  77. package/dist/init.js +52 -0
  78. package/dist/init.js.map +1 -0
  79. package/dist/main.d.ts +1 -0
  80. package/dist/main.js +22 -0
  81. package/dist/main.js.map +1 -0
  82. package/dist/meta/meta.controller.d.ts +21 -0
  83. package/dist/meta/meta.controller.js +36 -0
  84. package/dist/meta/meta.controller.js.map +1 -0
  85. package/dist/meta/meta.module.d.ts +2 -0
  86. package/dist/meta/meta.module.js +28 -0
  87. package/dist/meta/meta.module.js.map +1 -0
  88. package/dist/meta/meta.service.d.ts +24 -0
  89. package/dist/meta/meta.service.js +121 -0
  90. package/dist/meta/meta.service.js.map +1 -0
  91. package/dist/stellar/api.connection.d.ts +20 -0
  92. package/dist/stellar/api.connection.js +63 -0
  93. package/dist/stellar/api.connection.js.map +1 -0
  94. package/dist/stellar/api.connection.spec.d.ts +1 -0
  95. package/dist/stellar/api.connection.spec.js +81 -0
  96. package/dist/stellar/api.connection.spec.js.map +1 -0
  97. package/dist/stellar/api.service.stellar.d.ts +18 -0
  98. package/dist/stellar/api.service.stellar.js +144 -0
  99. package/dist/stellar/api.service.stellar.js.map +1 -0
  100. package/dist/stellar/api.service.stellar.spec.d.ts +5 -0
  101. package/dist/stellar/api.service.stellar.spec.js +87 -0
  102. package/dist/stellar/api.service.stellar.spec.js.map +1 -0
  103. package/dist/stellar/api.stellar.d.ts +29 -0
  104. package/dist/stellar/api.stellar.js +116 -0
  105. package/dist/stellar/api.stellar.js.map +1 -0
  106. package/dist/stellar/api.stellar.spec.d.ts +1 -0
  107. package/dist/stellar/api.stellar.spec.js +81 -0
  108. package/dist/stellar/api.stellar.spec.js.map +1 -0
  109. package/dist/stellar/block.stellar.d.ts +11 -0
  110. package/dist/stellar/block.stellar.js +81 -0
  111. package/dist/stellar/block.stellar.js.map +1 -0
  112. package/dist/stellar/block.stellar.spec.d.ts +1 -0
  113. package/dist/stellar/block.stellar.spec.js +58 -0
  114. package/dist/stellar/block.stellar.spec.js.map +1 -0
  115. package/dist/stellar/index.d.ts +2 -0
  116. package/dist/stellar/index.js +21 -0
  117. package/dist/stellar/index.js.map +1 -0
  118. package/dist/stellar/safe-api.d.ts +20 -0
  119. package/dist/stellar/safe-api.js +67 -0
  120. package/dist/stellar/safe-api.js.map +1 -0
  121. package/dist/stellar/stellar.server.d.ts +8 -0
  122. package/dist/stellar/stellar.server.js +72 -0
  123. package/dist/stellar/stellar.server.js.map +1 -0
  124. package/dist/stellar/stellar.server.spec.d.ts +1 -0
  125. package/dist/stellar/stellar.server.spec.js +132 -0
  126. package/dist/stellar/stellar.server.spec.js.map +1 -0
  127. package/dist/stellar/utils.stellar.d.ts +2 -0
  128. package/dist/stellar/utils.stellar.js +10 -0
  129. package/dist/stellar/utils.stellar.js.map +1 -0
  130. package/dist/subcommands/forceClean.init.d.ts +1 -0
  131. package/dist/subcommands/forceClean.init.js +24 -0
  132. package/dist/subcommands/forceClean.init.js.map +1 -0
  133. package/dist/subcommands/forceClean.module.d.ts +2 -0
  134. package/dist/subcommands/forceClean.module.js +28 -0
  135. package/dist/subcommands/forceClean.module.js.map +1 -0
  136. package/dist/subcommands/mmrMigrate.init.d.ts +2 -0
  137. package/dist/subcommands/mmrMigrate.init.js +28 -0
  138. package/dist/subcommands/mmrMigrate.init.js.map +1 -0
  139. package/dist/subcommands/mmrMigrate.module.d.ts +2 -0
  140. package/dist/subcommands/mmrMigrate.module.js +28 -0
  141. package/dist/subcommands/mmrMigrate.module.js.map +1 -0
  142. package/dist/subcommands/mmrRegenerate.init.d.ts +1 -0
  143. package/dist/subcommands/mmrRegenerate.init.js +28 -0
  144. package/dist/subcommands/mmrRegenerate.init.js.map +1 -0
  145. package/dist/subcommands/mmrRegenerate.module.d.ts +2 -0
  146. package/dist/subcommands/mmrRegenerate.module.js +30 -0
  147. package/dist/subcommands/mmrRegenerate.module.js.map +1 -0
  148. package/dist/subcommands/reindex.init.d.ts +1 -0
  149. package/dist/subcommands/reindex.init.js +30 -0
  150. package/dist/subcommands/reindex.init.js.map +1 -0
  151. package/dist/subcommands/reindex.module.d.ts +4 -0
  152. package/dist/subcommands/reindex.module.js +60 -0
  153. package/dist/subcommands/reindex.module.js.map +1 -0
  154. package/dist/subcommands/reindex.service.d.ts +11 -0
  155. package/dist/subcommands/reindex.service.js +46 -0
  156. package/dist/subcommands/reindex.service.js.map +1 -0
  157. package/dist/subcommands/testing.init.d.ts +1 -0
  158. package/dist/subcommands/testing.init.js +25 -0
  159. package/dist/subcommands/testing.init.js.map +1 -0
  160. package/dist/subcommands/testing.module.d.ts +4 -0
  161. package/dist/subcommands/testing.module.js +88 -0
  162. package/dist/subcommands/testing.module.js.map +1 -0
  163. package/dist/subcommands/testing.service.d.ts +9 -0
  164. package/dist/subcommands/testing.service.js +49 -0
  165. package/dist/subcommands/testing.service.js.map +1 -0
  166. package/dist/utils/project.d.ts +6 -0
  167. package/dist/utils/project.js +33 -0
  168. package/dist/utils/project.js.map +1 -0
  169. package/dist/utils/string.d.ts +1 -0
  170. package/dist/utils/string.js +10 -0
  171. package/dist/utils/string.js.map +1 -0
  172. package/dist/yargs.d.ts +303 -0
  173. package/dist/yargs.js +381 -0
  174. package/dist/yargs.js.map +1 -0
  175. package/package.json +69 -0
@@ -0,0 +1,29 @@
1
+ import { EventEmitter2 } from '@nestjs/event-emitter';
2
+ import { ApiWrapper, StellarBlockWrapper } from '@subql/types-stellar';
3
+ import { Server, SorobanRpc } from 'soroban-client';
4
+ import { StellarBlockWrapped } from './block.stellar';
5
+ import SafeStellarProvider from './safe-api';
6
+ export declare class StellarApi implements ApiWrapper<StellarBlockWrapper> {
7
+ private endpoint;
8
+ private eventEmitter;
9
+ private client;
10
+ private chainId;
11
+ private name;
12
+ constructor(endpoint: string, eventEmitter: EventEmitter2);
13
+ init(): Promise<void>;
14
+ getFinalizedBlock(): Promise<SorobanRpc.GetLatestLedgerResponse>;
15
+ getFinalizedBlockHeight(): Promise<number>;
16
+ getBestBlockHeight(): Promise<number>;
17
+ getRuntimeChain(): string;
18
+ getChainId(): string;
19
+ getGenesisHash(): string;
20
+ getSpecName(): string;
21
+ getEvents(height: number): Promise<SorobanRpc.GetEventsResponse>;
22
+ fetchBlock(blockNumber: number, includeTx?: boolean): Promise<StellarBlockWrapped>;
23
+ fetchBlocks(bufferBlocks: number[]): Promise<StellarBlockWrapper[]>;
24
+ get api(): Server;
25
+ getSafeApi(blockHeight: number): SafeStellarProvider;
26
+ connect(): Promise<void>;
27
+ disconnect(): Promise<void>;
28
+ handleError(e: Error, height: number): Error;
29
+ }
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ // Copyright 2020-2023 SubQuery Pte Ltd authors & contributors
3
+ // SPDX-License-Identifier: GPL-3.0
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.StellarApi = void 0;
9
+ const node_core_1 = require("@subql/node-core");
10
+ const soroban_client_1 = require("soroban-client");
11
+ const block_stellar_1 = require("./block.stellar");
12
+ const safe_api_1 = __importDefault(require("./safe-api"));
13
+ const stellar_server_1 = require("./stellar.server");
14
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
15
+ const { version: packageVersion } = require('../../package.json');
16
+ const logger = (0, node_core_1.getLogger)('api.Stellar');
17
+ class StellarApi {
18
+ constructor(endpoint, eventEmitter) {
19
+ this.endpoint = endpoint;
20
+ this.eventEmitter = eventEmitter;
21
+ const { hostname, protocol, searchParams } = new URL(endpoint);
22
+ const protocolStr = protocol.replace(':', '');
23
+ logger.info(`Api host: ${hostname}, method: ${protocolStr}`);
24
+ if (protocolStr === 'https' || protocolStr === 'http') {
25
+ const options = {
26
+ //headers: {
27
+ // 'User-Agent': `Subquery-Node ${packageVersion}`,
28
+ //},
29
+ allowHttp: protocolStr === 'http',
30
+ };
31
+ //searchParams.forEach((value, name, searchParams) => {
32
+ // (connection.headers as any)[name] = value;
33
+ //});
34
+ this.client = new stellar_server_1.StellarServer(endpoint, options);
35
+ }
36
+ else {
37
+ throw new Error(`Unsupported protocol: ${protocol}`);
38
+ }
39
+ }
40
+ async init() {
41
+ const network = await this.client.getNetwork();
42
+ this.chainId = network.passphrase;
43
+ }
44
+ async getFinalizedBlock() {
45
+ return this.client.getLatestLedger();
46
+ }
47
+ async getFinalizedBlockHeight() {
48
+ return (await this.getFinalizedBlock()).sequence;
49
+ }
50
+ async getBestBlockHeight() {
51
+ return (await this.getFinalizedBlockHeight()) + 1;
52
+ }
53
+ getRuntimeChain() {
54
+ return this.name;
55
+ }
56
+ getChainId() {
57
+ return this.chainId;
58
+ }
59
+ getGenesisHash() {
60
+ return this.getChainId();
61
+ }
62
+ getSpecName() {
63
+ return 'Stellar';
64
+ }
65
+ async getEvents(height) {
66
+ return this.client.getEvents({ startLedger: height, filters: [] });
67
+ }
68
+ async fetchBlock(blockNumber, includeTx) {
69
+ try {
70
+ const rawEvents = (await this.getEvents(blockNumber)).events;
71
+ const events = rawEvents.map((event) => (Object.assign(Object.assign({}, event), { value: Object.assign(Object.assign({}, event.value), { get decoded() {
72
+ return (0, soroban_client_1.scValToNative)(soroban_client_1.xdr.ScVal.fromXDR(event.value.xdr, 'base64'));
73
+ } }), topic: event.topic.map((topic) => block_stellar_1.StellarBlockWrapped.decodeScVals(soroban_client_1.xdr.ScVal.fromXDR(topic, 'base64'))) })));
74
+ const ret = new block_stellar_1.StellarBlockWrapped(events, {
75
+ ledger: blockNumber,
76
+ hash: blockNumber.toString(),
77
+ });
78
+ this.eventEmitter.emit('fetchBlock');
79
+ return ret;
80
+ }
81
+ catch (e) {
82
+ throw this.handleError(e, blockNumber);
83
+ }
84
+ }
85
+ async fetchBlocks(bufferBlocks) {
86
+ return Promise.all(bufferBlocks.map(async (num) => this.fetchBlock(num, true)));
87
+ }
88
+ get api() {
89
+ return this.client;
90
+ }
91
+ getSafeApi(blockHeight) {
92
+ return new safe_api_1.default(this.client, blockHeight);
93
+ }
94
+ // eslint-disable-next-line @typescript-eslint/require-await
95
+ async connect() {
96
+ logger.error('Stellar API connect is not implemented');
97
+ throw new Error('Not implemented');
98
+ }
99
+ // eslint-disable-next-line @typescript-eslint/require-await
100
+ async disconnect() {
101
+ logger.error('Stellar API disconnect is not implemented');
102
+ throw new Error('Not implemented');
103
+ }
104
+ handleError(e, height) {
105
+ if (e.message === 'start is before oldest ledger') {
106
+ return new Error(`The requested ledger number ${height} is not available on the current blockchain node.
107
+ This is because you're trying to access a ledger that is older than the oldest ledger stored in this node.
108
+ To resolve this issue, you can either:
109
+ 1. Increase the start ledger to a more recent one, or
110
+ 2. Connect to a different node that might have a longer history of ledgers.`);
111
+ }
112
+ return e;
113
+ }
114
+ }
115
+ exports.StellarApi = StellarApi;
116
+ //# sourceMappingURL=api.stellar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.stellar.js","sourceRoot":"","sources":["../../src/stellar/api.stellar.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { getLogger } from '@subql/node-core';\nimport {\n ApiWrapper,\n StellarBlock,\n StellarBlockWrapper,\n} from '@subql/types-stellar';\nimport { Server, SorobanRpc, scValToNative, xdr } from 'soroban-client';\nimport { StellarBlockWrapped } from './block.stellar';\nimport SafeStellarProvider from './safe-api';\nimport { StellarServer } from './stellar.server';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../../package.json');\n\nconst logger = getLogger('api.Stellar');\n\nexport class StellarApi implements ApiWrapper<StellarBlockWrapper> {\n private client: Server;\n\n private chainId: string;\n private name: string;\n\n constructor(private endpoint: string, private eventEmitter: EventEmitter2) {\n const { hostname, protocol, searchParams } = new URL(endpoint);\n\n const protocolStr = protocol.replace(':', '');\n\n logger.info(`Api host: ${hostname}, method: ${protocolStr}`);\n if (protocolStr === 'https' || protocolStr === 'http') {\n const options: Server.Options = {\n //headers: {\n // 'User-Agent': `Subquery-Node ${packageVersion}`,\n //},\n allowHttp: protocolStr === 'http',\n };\n //searchParams.forEach((value, name, searchParams) => {\n // (connection.headers as any)[name] = value;\n //});\n this.client = new StellarServer(endpoint, options);\n } else {\n throw new Error(`Unsupported protocol: ${protocol}`);\n }\n }\n\n async init(): Promise<void> {\n const network = await this.client.getNetwork();\n this.chainId = network.passphrase;\n }\n\n async getFinalizedBlock(): Promise<SorobanRpc.GetLatestLedgerResponse> {\n return this.client.getLatestLedger();\n }\n\n async getFinalizedBlockHeight(): Promise<number> {\n return (await this.getFinalizedBlock()).sequence;\n }\n\n async getBestBlockHeight(): Promise<number> {\n return (await this.getFinalizedBlockHeight()) + 1;\n }\n\n getRuntimeChain(): string {\n return this.name;\n }\n\n getChainId(): string {\n return this.chainId;\n }\n\n getGenesisHash(): string {\n return this.getChainId();\n }\n\n getSpecName(): string {\n return 'Stellar';\n }\n\n async getEvents(height: number): Promise<SorobanRpc.GetEventsResponse> {\n return this.client.getEvents({ startLedger: height, filters: [] });\n }\n\n async fetchBlock(\n blockNumber: number,\n includeTx?: boolean,\n ): Promise<StellarBlockWrapped> {\n try {\n const rawEvents = (await this.getEvents(blockNumber)).events;\n\n const events = rawEvents.map((event) => ({\n ...event,\n value: {\n ...event.value,\n get decoded() {\n return scValToNative(xdr.ScVal.fromXDR(event.value.xdr, 'base64'));\n },\n },\n topic: event.topic.map((topic) =>\n StellarBlockWrapped.decodeScVals(xdr.ScVal.fromXDR(topic, 'base64')),\n ),\n }));\n\n const ret = new StellarBlockWrapped(events, {\n ledger: blockNumber,\n hash: blockNumber.toString(),\n } as StellarBlock);\n\n this.eventEmitter.emit('fetchBlock');\n return ret;\n } catch (e) {\n throw this.handleError(e, blockNumber);\n }\n }\n\n async fetchBlocks(bufferBlocks: number[]): Promise<StellarBlockWrapper[]> {\n return Promise.all(\n bufferBlocks.map(async (num) => this.fetchBlock(num, true)),\n );\n }\n\n get api(): Server {\n return this.client;\n }\n\n getSafeApi(blockHeight: number): SafeStellarProvider {\n return new SafeStellarProvider(this.client, blockHeight);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async connect(): Promise<void> {\n logger.error('Stellar API connect is not implemented');\n throw new Error('Not implemented');\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async disconnect(): Promise<void> {\n logger.error('Stellar API disconnect is not implemented');\n throw new Error('Not implemented');\n }\n\n handleError(e: Error, height: number): Error {\n if (e.message === 'start is before oldest ledger') {\n return new Error(`The requested ledger number ${height} is not available on the current blockchain node. \n This is because you're trying to access a ledger that is older than the oldest ledger stored in this node. \n To resolve this issue, you can either:\n 1. Increase the start ledger to a more recent one, or\n 2. Connect to a different node that might have a longer history of ledgers.`);\n }\n\n return e;\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ // Copyright 2020-2023 SubQuery Pte Ltd authors & contributors
3
+ // SPDX-License-Identifier: GPL-3.0
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const eventemitter2_1 = __importDefault(require("eventemitter2"));
9
+ const api_stellar_1 = require("./api.stellar");
10
+ const safe_api_1 = __importDefault(require("./safe-api"));
11
+ const HTTP_ENDPOINT = 'https://rpc-futurenet.stellar.org:443';
12
+ jest.setTimeout(60000);
13
+ const prepareStellarApi = async function () {
14
+ const api = new api_stellar_1.StellarApi(HTTP_ENDPOINT, new eventemitter2_1.default());
15
+ await api.init();
16
+ return api;
17
+ };
18
+ describe('StellarApi', function () {
19
+ let stellarApi;
20
+ beforeEach(async function () {
21
+ stellarApi = await prepareStellarApi();
22
+ });
23
+ it('should initialize chainId', function () {
24
+ expect(stellarApi.getChainId()).toEqual('Test SDF Future Network ; October 2022');
25
+ });
26
+ it('should get finalized block height', async function () {
27
+ expect(await stellarApi.getFinalizedBlockHeight()).not.toBeNaN();
28
+ });
29
+ it('should get best block height', async function () {
30
+ expect(await stellarApi.getBestBlockHeight()).not.toBeNaN();
31
+ });
32
+ it('should fetch block', async function () {
33
+ const latestHeight = await stellarApi.getFinalizedBlockHeight();
34
+ const block = (await stellarApi.fetchBlocks([latestHeight]))[0];
35
+ expect(block.block.ledger).toEqual(latestHeight);
36
+ });
37
+ it('throws error if getEvents throws error', async function () {
38
+ jest
39
+ .spyOn(stellarApi, 'getEvents')
40
+ .mockImplementation(() => Promise.reject(new Error('Test error')));
41
+ await expect(stellarApi.fetchBlock(1)).rejects.toThrow('Test error');
42
+ });
43
+ it('should return safe api instance', function () {
44
+ const height = 1;
45
+ const safeApi = stellarApi.getSafeApi(height);
46
+ expect(safeApi).toBeInstanceOf(safe_api_1.default);
47
+ });
48
+ it('should throw on calling connect', async function () {
49
+ await expect(stellarApi.connect()).rejects.toThrow('Not implemented');
50
+ });
51
+ it('should throw on calling disconnect', async function () {
52
+ await expect(stellarApi.disconnect()).rejects.toThrow('Not implemented');
53
+ });
54
+ it('handleError - pruned node errors', function () {
55
+ const error = new Error('start is before oldest ledger');
56
+ const handled = stellarApi.handleError(error, 1000);
57
+ expect(handled.message).toContain('The requested ledger number 1000 is not available on the current blockchain node');
58
+ });
59
+ it('handleError - non pruned node errors should return the same error', function () {
60
+ const error = new Error('Generic error');
61
+ const handled = stellarApi.handleError(error, 1000);
62
+ expect(handled).toBe(error);
63
+ });
64
+ it('should get runtime chain', function () {
65
+ const runtimeChain = stellarApi.getRuntimeChain();
66
+ expect(runtimeChain).toEqual(stellarApi.name);
67
+ });
68
+ it('should return chainId for genesis hash', function () {
69
+ const genesisHash = stellarApi.getGenesisHash();
70
+ expect(genesisHash).toEqual(stellarApi.getChainId());
71
+ });
72
+ it('should get spec name', function () {
73
+ const specName = stellarApi.getSpecName();
74
+ expect(specName).toEqual('Stellar');
75
+ });
76
+ it('should get client for api', function () {
77
+ const apiClient = stellarApi.api;
78
+ expect(apiClient).toEqual(stellarApi.client);
79
+ });
80
+ });
81
+ //# sourceMappingURL=api.stellar.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.stellar.spec.js","sourceRoot":"","sources":["../../src/stellar/api.stellar.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport EventEmitter2 from 'eventemitter2';\nimport { StellarApi } from './api.stellar';\nimport SafeStellarProvider from './safe-api';\n\nconst HTTP_ENDPOINT = 'https://rpc-futurenet.stellar.org:443';\n\njest.setTimeout(60000);\n\nconst prepareStellarApi = async function () {\n const api = new StellarApi(HTTP_ENDPOINT, new EventEmitter2());\n await api.init();\n return api;\n};\n\ndescribe('StellarApi', function () {\n let stellarApi: StellarApi;\n\n beforeEach(async function () {\n stellarApi = await prepareStellarApi();\n });\n\n it('should initialize chainId', function () {\n expect(stellarApi.getChainId()).toEqual(\n 'Test SDF Future Network ; October 2022',\n );\n });\n\n it('should get finalized block height', async function () {\n expect(await stellarApi.getFinalizedBlockHeight()).not.toBeNaN();\n });\n\n it('should get best block height', async function () {\n expect(await stellarApi.getBestBlockHeight()).not.toBeNaN();\n });\n\n it('should fetch block', async function () {\n const latestHeight = await stellarApi.getFinalizedBlockHeight();\n const block = (await stellarApi.fetchBlocks([latestHeight]))[0];\n expect(block.block.ledger).toEqual(latestHeight);\n });\n\n it('throws error if getEvents throws error', async function () {\n jest\n .spyOn(stellarApi, 'getEvents')\n .mockImplementation(() => Promise.reject(new Error('Test error')));\n await expect(stellarApi.fetchBlock(1)).rejects.toThrow('Test error');\n });\n\n it('should return safe api instance', function () {\n const height = 1;\n const safeApi = stellarApi.getSafeApi(height);\n expect(safeApi).toBeInstanceOf(SafeStellarProvider);\n });\n\n it('should throw on calling connect', async function () {\n await expect(stellarApi.connect()).rejects.toThrow('Not implemented');\n });\n\n it('should throw on calling disconnect', async function () {\n await expect(stellarApi.disconnect()).rejects.toThrow('Not implemented');\n });\n\n it('handleError - pruned node errors', function () {\n const error = new Error('start is before oldest ledger');\n const handled = stellarApi.handleError(error, 1000);\n expect(handled.message).toContain(\n 'The requested ledger number 1000 is not available on the current blockchain node',\n );\n });\n\n it('handleError - non pruned node errors should return the same error', function () {\n const error = new Error('Generic error');\n const handled = stellarApi.handleError(error, 1000);\n expect(handled).toBe(error);\n });\n\n it('should get runtime chain', function () {\n const runtimeChain = stellarApi.getRuntimeChain();\n expect(runtimeChain).toEqual((stellarApi as any).name);\n });\n\n it('should return chainId for genesis hash', function () {\n const genesisHash = stellarApi.getGenesisHash();\n expect(genesisHash).toEqual(stellarApi.getChainId());\n });\n\n it('should get spec name', function () {\n const specName = stellarApi.getSpecName();\n expect(specName).toEqual('Stellar');\n });\n\n it('should get client for api', function () {\n const apiClient = stellarApi.api;\n expect(apiClient).toEqual((stellarApi as any).client);\n });\n});\n"]}
@@ -0,0 +1,11 @@
1
+ import { StellarBlock, StellarBlockWrapper, StellarEvent, StellarEventFilter } from '@subql/types-stellar';
2
+ import { xdr } from 'soroban-client';
3
+ export declare class StellarBlockWrapped implements StellarBlockWrapper {
4
+ private _events;
5
+ private _block;
6
+ constructor(_events: StellarEvent[], _block: StellarBlock);
7
+ get block(): StellarBlock;
8
+ get events(): StellarEvent[];
9
+ static filterEventProcessor(event: StellarEvent, filter: StellarEventFilter, address?: string): boolean;
10
+ static decodeScVals(scVal: xdr.ScVal): any;
11
+ }
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ // Copyright 2020-2023 SubQuery Pte Ltd authors & contributors
3
+ // SPDX-License-Identifier: GPL-3.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.StellarBlockWrapped = void 0;
6
+ const soroban_client_1 = require("soroban-client");
7
+ const string_1 = require("../utils/string");
8
+ class StellarBlockWrapped {
9
+ constructor(_events, _block) {
10
+ this._events = _events;
11
+ this._block = _block;
12
+ }
13
+ get block() {
14
+ return this._block;
15
+ }
16
+ get events() {
17
+ return this._events;
18
+ }
19
+ static filterEventProcessor(event, filter, address) {
20
+ if (address && !(0, string_1.stringNormalizedEq)(address, event.contractId)) {
21
+ return false;
22
+ }
23
+ if (!filter)
24
+ return true;
25
+ if (filter.contractId && filter.contractId !== event.contractId) {
26
+ return false;
27
+ }
28
+ if (filter.topics) {
29
+ for (let i = 0; i < Math.min(filter.topics.length, 4); i++) {
30
+ const topic = filter.topics[i];
31
+ if (!topic) {
32
+ continue;
33
+ }
34
+ if (!event.topic[i]) {
35
+ return false;
36
+ }
37
+ if (topic !== event.topic[i]) {
38
+ return false;
39
+ }
40
+ }
41
+ }
42
+ return true;
43
+ }
44
+ static decodeScVals(scVal) {
45
+ switch (scVal.switch()) {
46
+ case soroban_client_1.xdr.ScValType.scvBool():
47
+ return scVal.b();
48
+ case soroban_client_1.xdr.ScValType.scvSymbol():
49
+ return scVal.sym().toString();
50
+ case soroban_client_1.xdr.ScValType.scvU64():
51
+ return scVal.u64().low;
52
+ case soroban_client_1.xdr.ScValType.scvAddress(): {
53
+ try {
54
+ return soroban_client_1.Address.account(scVal.address().accountId().value()).toString();
55
+ }
56
+ catch (error) {
57
+ return soroban_client_1.Address.contract(scVal.address().contractId()).toString();
58
+ }
59
+ }
60
+ case soroban_client_1.xdr.ScValType.scvString(): {
61
+ return Buffer.from(scVal.str().toString(), 'base64').toString();
62
+ }
63
+ case soroban_client_1.xdr.ScValType.scvBytes():
64
+ return scVal.bytes();
65
+ case soroban_client_1.xdr.ScValType.scvI128(): {
66
+ const low = scVal.i128().lo();
67
+ const high = scVal.i128().hi();
68
+ return BigInt(low.low) | (BigInt(low.high) << BigInt(32));
69
+ }
70
+ case soroban_client_1.xdr.ScValType.scvMap():
71
+ return Object.fromEntries(scVal.map().map((entry) => {
72
+ const key = entry.key().sym();
73
+ return [key, StellarBlockWrapped.decodeScVals(entry.val())];
74
+ }));
75
+ default:
76
+ return (0, soroban_client_1.scValToNative)(scVal);
77
+ }
78
+ }
79
+ }
80
+ exports.StellarBlockWrapped = StellarBlockWrapped;
81
+ //# sourceMappingURL=block.stellar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.stellar.js","sourceRoot":"","sources":["../../src/stellar/block.stellar.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport {\n StellarBlock,\n StellarBlockWrapper,\n StellarEvent,\n StellarEventFilter,\n} from '@subql/types-stellar';\nimport { Address, scValToNative, xdr } from 'soroban-client';\nimport { stringNormalizedEq } from '../utils/string';\n\nexport class StellarBlockWrapped implements StellarBlockWrapper {\n constructor(private _events: StellarEvent[], private _block: StellarBlock) {}\n\n get block(): StellarBlock {\n return this._block;\n }\n\n get events(): StellarEvent[] {\n return this._events;\n }\n\n static filterEventProcessor(\n event: StellarEvent,\n filter: StellarEventFilter,\n address?: string,\n ): boolean {\n if (address && !stringNormalizedEq(address, event.contractId)) {\n return false;\n }\n\n if (!filter) return true;\n\n if (filter.contractId && filter.contractId !== event.contractId) {\n return false;\n }\n\n if (filter.topics) {\n for (let i = 0; i < Math.min(filter.topics.length, 4); i++) {\n const topic = filter.topics[i];\n if (!topic) {\n continue;\n }\n\n if (!event.topic[i]) {\n return false;\n }\n\n if (topic !== event.topic[i]) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n static decodeScVals(scVal: xdr.ScVal): any {\n switch (scVal.switch()) {\n case xdr.ScValType.scvBool():\n return scVal.b();\n case xdr.ScValType.scvSymbol():\n return scVal.sym().toString();\n case xdr.ScValType.scvU64():\n return scVal.u64().low;\n case xdr.ScValType.scvAddress(): {\n try {\n return Address.account(\n scVal.address().accountId().value(),\n ).toString();\n } catch (error) {\n return Address.contract(scVal.address().contractId()).toString();\n }\n }\n case xdr.ScValType.scvString(): {\n return Buffer.from(scVal.str().toString(), 'base64').toString();\n }\n case xdr.ScValType.scvBytes():\n return scVal.bytes();\n case xdr.ScValType.scvI128(): {\n const low = scVal.i128().lo();\n const high = scVal.i128().hi();\n return BigInt(low.low) | (BigInt(low.high) << BigInt(32));\n }\n case xdr.ScValType.scvMap():\n return Object.fromEntries(\n scVal.map()!.map((entry) => {\n const key = entry.key().sym();\n return [key, StellarBlockWrapped.decodeScVals(entry.val())];\n }),\n );\n default:\n return scValToNative(scVal);\n }\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ // Copyright 2020-2023 SubQuery Pte Ltd authors & contributors
3
+ // SPDX-License-Identifier: GPL-3.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ const block_stellar_1 = require("./block.stellar");
6
+ describe('StellarBlockWrapped', function () {
7
+ const mockEvent = {
8
+ ledger: '2000',
9
+ ledgerClosedAt: null,
10
+ contractId: 'testaddress',
11
+ id: null,
12
+ pagingToken: null,
13
+ inSuccessfulContractCall: null,
14
+ topic: ['topic1', 'topic2'],
15
+ value: null,
16
+ };
17
+ const mockBlock = {
18
+ ledger: 2000,
19
+ hash: '2000',
20
+ events: [mockEvent],
21
+ };
22
+ const mockEventFilterValid = {
23
+ topics: ['topic1', 'topic2'],
24
+ };
25
+ const mockEventFilterInvalid = {
26
+ topics: ['topics3'],
27
+ };
28
+ it('should pass filter - valid address and topics', function () {
29
+ expect(block_stellar_1.StellarBlockWrapped.filterEventProcessor(mockEvent, mockEventFilterValid, 'testaddress')).toEqual(true);
30
+ });
31
+ it('should pass filter - no address and valid topics', function () {
32
+ expect(block_stellar_1.StellarBlockWrapped.filterEventProcessor(mockEvent, mockEventFilterValid)).toEqual(true);
33
+ });
34
+ it('should fail filter - valid address and invalid topics', function () {
35
+ expect(block_stellar_1.StellarBlockWrapped.filterEventProcessor(mockEvent, mockEventFilterInvalid, 'testaddress')).toEqual(false);
36
+ });
37
+ it('should fail filter - event not found', function () {
38
+ mockEventFilterInvalid.topics = ['topic1', 'topic2', 'topic3'];
39
+ expect(block_stellar_1.StellarBlockWrapped.filterEventProcessor(mockEvent, mockEventFilterInvalid)).toEqual(false);
40
+ });
41
+ it('should pass filter - skip null topics', function () {
42
+ mockEventFilterValid.topics = [null, 'topic2'];
43
+ expect(block_stellar_1.StellarBlockWrapped.filterEventProcessor(mockEvent, mockEventFilterValid)).toEqual(true);
44
+ });
45
+ it('should pass filer - valid contractId', function () {
46
+ mockEventFilterValid.contractId = 'testaddress';
47
+ expect(block_stellar_1.StellarBlockWrapped.filterEventProcessor(mockEvent, mockEventFilterValid)).toEqual(true);
48
+ });
49
+ it('should fail filter - invalid contractId', function () {
50
+ expect(block_stellar_1.StellarBlockWrapped.filterEventProcessor(mockEvent, {
51
+ contractId: 'invalidaddress',
52
+ })).toEqual(false);
53
+ });
54
+ it('should fail filter - invalid address', function () {
55
+ expect(block_stellar_1.StellarBlockWrapped.filterEventProcessor(mockEvent, mockEventFilterValid, 'invalidaddress')).toEqual(false);
56
+ });
57
+ });
58
+ //# sourceMappingURL=block.stellar.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.stellar.spec.js","sourceRoot":"","sources":["../../src/stellar/block.stellar.spec.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAQnC,mDAAsD;AAEtD,QAAQ,CAAC,qBAAqB,EAAE;IAC9B,MAAM,SAAS,GAAiB;QAC9B,MAAM,EAAE,MAAM;QACd,cAAc,EAAE,IAAI;QACpB,UAAU,EAAE,aAAa;QACzB,EAAE,EAAE,IAAI;QACR,WAAW,EAAE,IAAI;QACjB,wBAAwB,EAAE,IAAI;QAC9B,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC3B,KAAK,EAAE,IAAI;KACZ,CAAC;IACF,MAAM,SAAS,GAAiB;QAC9B,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,CAAC,SAAS,CAAC;KACpB,CAAC;IAEF,MAAM,oBAAoB,GAAuB;QAC/C,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;KAC7B,CAAC;IAEF,MAAM,sBAAsB,GAAuB;QACjD,MAAM,EAAE,CAAC,SAAS,CAAC;KACpB,CAAC;IAEF,EAAE,CAAC,+CAA+C,EAAE;QAClD,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CACtC,SAAS,EACT,oBAAoB,EACpB,aAAa,CACd,CACF,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE;QACrD,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAC1E,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE;QAC1D,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CACtC,SAAS,EACT,sBAAsB,EACtB,aAAa,CACd,CACF,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE;QACzC,sBAAsB,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/D,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CACtC,SAAS,EACT,sBAAsB,CACvB,CACF,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE;QAC1C,oBAAoB,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAC1E,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE;QACzC,oBAAoB,CAAC,UAAU,GAAG,aAAa,CAAC;QAChD,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAC1E,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE;QAC5C,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CAAC,SAAS,EAAE;YAClD,UAAU,EAAE,gBAAgB;SAC7B,CAAC,CACH,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE;QACzC,MAAM,CACJ,mCAAmB,CAAC,oBAAoB,CACtC,SAAS,EACT,oBAAoB,EACpB,gBAAgB,CACjB,CACF,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport {\n StellarBlock,\n StellarEvent,\n StellarEventFilter,\n} from '@subql/types-stellar';\nimport { xdr } from 'soroban-client';\nimport { StellarBlockWrapped } from './block.stellar';\n\ndescribe('StellarBlockWrapped', function () {\n const mockEvent: StellarEvent = {\n ledger: '2000',\n ledgerClosedAt: null,\n contractId: 'testaddress',\n id: null,\n pagingToken: null,\n inSuccessfulContractCall: null,\n topic: ['topic1', 'topic2'],\n value: null,\n };\n const mockBlock: StellarBlock = {\n ledger: 2000,\n hash: '2000',\n events: [mockEvent],\n };\n\n const mockEventFilterValid: StellarEventFilter = {\n topics: ['topic1', 'topic2'],\n };\n\n const mockEventFilterInvalid: StellarEventFilter = {\n topics: ['topics3'],\n };\n\n it('should pass filter - valid address and topics', function () {\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterValid,\n 'testaddress',\n ),\n ).toEqual(true);\n });\n\n it('should pass filter - no address and valid topics', function () {\n expect(\n StellarBlockWrapped.filterEventProcessor(mockEvent, mockEventFilterValid),\n ).toEqual(true);\n });\n\n it('should fail filter - valid address and invalid topics', function () {\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterInvalid,\n 'testaddress',\n ),\n ).toEqual(false);\n });\n\n it('should fail filter - event not found', function () {\n mockEventFilterInvalid.topics = ['topic1', 'topic2', 'topic3'];\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterInvalid,\n ),\n ).toEqual(false);\n });\n\n it('should pass filter - skip null topics', function () {\n mockEventFilterValid.topics = [null, 'topic2'];\n expect(\n StellarBlockWrapped.filterEventProcessor(mockEvent, mockEventFilterValid),\n ).toEqual(true);\n });\n\n it('should pass filer - valid contractId', function () {\n mockEventFilterValid.contractId = 'testaddress';\n expect(\n StellarBlockWrapped.filterEventProcessor(mockEvent, mockEventFilterValid),\n ).toEqual(true);\n });\n\n it('should fail filter - invalid contractId', function () {\n expect(\n StellarBlockWrapped.filterEventProcessor(mockEvent, {\n contractId: 'invalidaddress',\n }),\n ).toEqual(false);\n });\n\n it('should fail filter - invalid address', function () {\n expect(\n StellarBlockWrapped.filterEventProcessor(\n mockEvent,\n mockEventFilterValid,\n 'invalidaddress',\n ),\n ).toEqual(false);\n });\n});\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './api.stellar';
2
+ export * from './api.service.stellar';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ // Copyright 2020-2023 SubQuery Pte Ltd authors & contributors
3
+ // SPDX-License-Identifier: GPL-3.0
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ __exportStar(require("./api.stellar"), exports);
20
+ __exportStar(require("./api.service.stellar"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stellar/index.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;;AAEnC,gDAA8B;AAC9B,wDAAsC","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nexport * from './api.stellar';\nexport * from './api.service.stellar';\n"]}
@@ -0,0 +1,20 @@
1
+ import { Account, Address, Contract, FeeBumpTransaction, Server, SorobanRpc, Transaction, xdr } from 'soroban-client';
2
+ import { Durability, GetEventsRequest } from 'soroban-client/lib/server';
3
+ import { StellarServer } from './stellar.server';
4
+ export default class SafeStellarProvider extends StellarServer {
5
+ private blockHeight;
6
+ private baseApi;
7
+ constructor(baseApi: Server, blockHeight: number);
8
+ getAccount(address: string): Promise<Account>;
9
+ getHealth(): Promise<SorobanRpc.GetHealthResponse>;
10
+ getContractData(contract: string | Address | Contract, key: xdr.ScVal, durability?: Durability): Promise<SorobanRpc.LedgerEntryResult>;
11
+ getLedgerEntries(keys: xdr.LedgerKey[]): Promise<SorobanRpc.GetLedgerEntriesResponse>;
12
+ getTransaction(hash: string): Promise<SorobanRpc.GetTransactionResponse>;
13
+ getEvents(request: GetEventsRequest): Promise<SorobanRpc.GetEventsResponse>;
14
+ getNetwork(): Promise<SorobanRpc.GetNetworkResponse>;
15
+ getLatestLedger(): Promise<SorobanRpc.GetLatestLedgerResponse>;
16
+ simulateTransaction(transaction: Transaction | FeeBumpTransaction): Promise<SorobanRpc.SimulateTransactionResponse>;
17
+ prepareTransaction(transaction: Transaction | FeeBumpTransaction, networkPassphrase?: string): Promise<Transaction | FeeBumpTransaction>;
18
+ sendTransaction(transaction: Transaction | FeeBumpTransaction): Promise<SorobanRpc.SendTransactionResponse>;
19
+ requestAirdrop(address: string | Pick<Account, 'accountId'>, friendbotUrl?: string): Promise<Account>;
20
+ }
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ // Copyright 2020-2023 SubQuery Pte Ltd authors & contributors
3
+ // SPDX-License-Identifier: GPL-3.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ const node_core_1 = require("@subql/node-core");
6
+ const server_1 = require("soroban-client/lib/server");
7
+ const stellar_server_1 = require("./stellar.server");
8
+ const logger = (0, node_core_1.getLogger)('safe.api.stellar');
9
+ class SafeStellarProvider extends stellar_server_1.StellarServer {
10
+ constructor(baseApi, blockHeight) {
11
+ super(baseApi.serverURL);
12
+ this.blockHeight = blockHeight;
13
+ this.baseApi = baseApi;
14
+ }
15
+ //eslint-disable-next-line @typescript-eslint/require-await
16
+ async getAccount(address) {
17
+ throw new Error('Method getAccount is not implemented.');
18
+ }
19
+ //eslint-disable-next-line @typescript-eslint/require-await
20
+ async getHealth() {
21
+ throw new Error('Method getHealth is not implemented.');
22
+ }
23
+ //eslint-disable-next-line @typescript-eslint/require-await
24
+ async getContractData(contract, key, durability = server_1.Durability.Persistent) {
25
+ throw new Error('Method getContractData is not implemented.');
26
+ }
27
+ //eslint-disable-next-line @typescript-eslint/require-await
28
+ async getLedgerEntries(keys) {
29
+ throw new Error('Method getLedgerEntries is not implemented.');
30
+ }
31
+ //eslint-disable-next-line @typescript-eslint/require-await
32
+ async getTransaction(hash) {
33
+ throw new Error('Method getTransaction is not implemented.');
34
+ }
35
+ async getEvents(request) {
36
+ return this.baseApi.getEvents({
37
+ startLedger: this.blockHeight,
38
+ filters: [],
39
+ });
40
+ }
41
+ //eslint-disable-next-line @typescript-eslint/require-await
42
+ async getNetwork() {
43
+ throw new Error('Method getNetwork is not implemented.');
44
+ }
45
+ //eslint-disable-next-line @typescript-eslint/require-await
46
+ async getLatestLedger() {
47
+ throw new Error('Method getLatestLedger is not implemented.');
48
+ }
49
+ //eslint-disable-next-line @typescript-eslint/require-await
50
+ async simulateTransaction(transaction) {
51
+ throw new Error('Method simulateTransaction is not implemented.');
52
+ }
53
+ //eslint-disable-next-line @typescript-eslint/require-await
54
+ async prepareTransaction(transaction, networkPassphrase) {
55
+ throw new Error('Method prepareTransaction is not implemented.');
56
+ }
57
+ //eslint-disable-next-line @typescript-eslint/require-await
58
+ async sendTransaction(transaction) {
59
+ throw new Error('Method sendTransaction is not implemented.');
60
+ }
61
+ //eslint-disable-next-line @typescript-eslint/require-await
62
+ async requestAirdrop(address, friendbotUrl) {
63
+ throw new Error('Method requestAirdrop is not implemented.');
64
+ }
65
+ }
66
+ exports.default = SafeStellarProvider;
67
+ //# sourceMappingURL=safe-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-api.js","sourceRoot":"","sources":["../../src/stellar/safe-api.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAEnC,gDAA6C;AAW7C,sDAAyE;AACzE,qDAAiD;AAEjD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,kBAAkB,CAAC,CAAC;AAE7C,MAAqB,mBAAoB,SAAQ,8BAAa;IAI5D,YAAY,OAAe,EAAE,WAAmB;QAC9C,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,UAAU,CAAC,OAAe;QAC9B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,eAAe,CACnB,QAAqC,EACrC,GAAc,EACd,aAAyB,mBAAU,CAAC,UAAU;QAE9C,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,gBAAgB,CACpB,IAAqB;QAErB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,cAAc,CAClB,IAAY;QAEZ,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,SAAS,CACb,OAAyB;QAEzB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YAC5B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC;IACL,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,mBAAmB,CACvB,WAA6C;QAE7C,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,kBAAkB,CACtB,WAA6C,EAC7C,iBAA0B;QAE1B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,eAAe,CACnB,WAA6C;QAE7C,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,cAAc,CAClB,OAA4C,EAC5C,YAAqB;QAErB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;CACF;AA3FD,sCA2FC","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { getLogger } from '@subql/node-core';\nimport {\n Account,\n Address,\n Contract,\n FeeBumpTransaction,\n Server,\n SorobanRpc,\n Transaction,\n xdr,\n} from 'soroban-client';\nimport { Durability, GetEventsRequest } from 'soroban-client/lib/server';\nimport { StellarServer } from './stellar.server';\n\nconst logger = getLogger('safe.api.stellar');\n\nexport default class SafeStellarProvider extends StellarServer {\n private blockHeight: number;\n private baseApi: Server;\n\n constructor(baseApi: Server, blockHeight: number) {\n super(baseApi.serverURL);\n this.blockHeight = blockHeight;\n this.baseApi = baseApi;\n }\n\n //eslint-disable-next-line @typescript-eslint/require-await\n async getAccount(address: string): Promise<Account> {\n throw new Error('Method getAccount is not implemented.');\n }\n\n //eslint-disable-next-line @typescript-eslint/require-await\n async getHealth(): Promise<SorobanRpc.GetHealthResponse> {\n throw new Error('Method getHealth is not implemented.');\n }\n\n //eslint-disable-next-line @typescript-eslint/require-await\n async getContractData(\n contract: string | Address | Contract,\n key: xdr.ScVal,\n durability: Durability = Durability.Persistent,\n ): Promise<SorobanRpc.LedgerEntryResult> {\n throw new Error('Method getContractData is not implemented.');\n }\n\n //eslint-disable-next-line @typescript-eslint/require-await\n async getLedgerEntries(\n keys: xdr.LedgerKey[],\n ): Promise<SorobanRpc.GetLedgerEntriesResponse> {\n throw new Error('Method getLedgerEntries is not implemented.');\n }\n\n //eslint-disable-next-line @typescript-eslint/require-await\n async getTransaction(\n hash: string,\n ): Promise<SorobanRpc.GetTransactionResponse> {\n throw new Error('Method getTransaction is not implemented.');\n }\n\n async getEvents(\n request: GetEventsRequest,\n ): Promise<SorobanRpc.GetEventsResponse> {\n return this.baseApi.getEvents({\n startLedger: this.blockHeight,\n filters: [],\n });\n }\n\n //eslint-disable-next-line @typescript-eslint/require-await\n async getNetwork(): Promise<SorobanRpc.GetNetworkResponse> {\n throw new Error('Method getNetwork is not implemented.');\n }\n\n //eslint-disable-next-line @typescript-eslint/require-await\n async getLatestLedger(): Promise<SorobanRpc.GetLatestLedgerResponse> {\n throw new Error('Method getLatestLedger is not implemented.');\n }\n\n //eslint-disable-next-line @typescript-eslint/require-await\n async simulateTransaction(\n transaction: Transaction | FeeBumpTransaction,\n ): Promise<SorobanRpc.SimulateTransactionResponse> {\n throw new Error('Method simulateTransaction is not implemented.');\n }\n\n //eslint-disable-next-line @typescript-eslint/require-await\n async prepareTransaction(\n transaction: Transaction | FeeBumpTransaction,\n networkPassphrase?: string,\n ): Promise<Transaction | FeeBumpTransaction> {\n throw new Error('Method prepareTransaction is not implemented.');\n }\n\n //eslint-disable-next-line @typescript-eslint/require-await\n async sendTransaction(\n transaction: Transaction | FeeBumpTransaction,\n ): Promise<SorobanRpc.SendTransactionResponse> {\n throw new Error('Method sendTransaction is not implemented.');\n }\n\n //eslint-disable-next-line @typescript-eslint/require-await\n async requestAirdrop(\n address: string | Pick<Account, 'accountId'>,\n friendbotUrl?: string,\n ): Promise<Account> {\n throw new Error('Method requestAirdrop is not implemented.');\n }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { Server, SorobanRpc } from 'soroban-client';
2
+ import { GetEventsRequest } from 'soroban-client/lib/server';
3
+ export declare class StellarServer extends Server {
4
+ private eventsCache;
5
+ private fetchEventsForSequence;
6
+ private updateEventCache;
7
+ getEvents(request: GetEventsRequest): Promise<SorobanRpc.GetEventsResponse>;
8
+ }