@socket.tech/dl-common 1.0.3-test.11 → 1.0.3-test.13

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 (233) hide show
  1. package/dist/constants/confirmations.d.ts +5 -0
  2. package/dist/constants/confirmations.js +17 -0
  3. package/dist/constants/enums.d.ts +1 -0
  4. package/dist/constants/enums.js +1 -0
  5. package/dist/constants/waitTime.d.ts +1 -0
  6. package/dist/constants/waitTime.js +8 -3
  7. package/dist/dl-common/constants/confirmations.d.ts +5 -0
  8. package/dist/dl-common/constants/confirmations.js +18 -0
  9. package/dist/dl-common/constants/confirmations.js.map +1 -0
  10. package/dist/dl-common/constants/enums.d.ts +38 -0
  11. package/dist/dl-common/constants/enums.js +46 -0
  12. package/dist/dl-common/constants/enums.js.map +1 -0
  13. package/dist/dl-common/constants/index.d.ts +3 -0
  14. package/dist/dl-common/constants/index.js +7 -0
  15. package/dist/dl-common/constants/index.js.map +1 -0
  16. package/dist/dl-common/constants/types.d.ts +117 -0
  17. package/dist/dl-common/constants/types.js +38 -0
  18. package/dist/dl-common/constants/types.js.map +1 -0
  19. package/dist/dl-common/constants/waitTime.d.ts +8 -0
  20. package/dist/dl-common/constants/waitTime.js +56 -0
  21. package/dist/dl-common/constants/waitTime.js.map +1 -0
  22. package/dist/dl-common/index.d.ts +4 -0
  23. package/dist/dl-common/index.js +8 -0
  24. package/dist/dl-common/index.js.map +1 -0
  25. package/dist/dl-common/models/attestSignature.d.ts +35 -0
  26. package/dist/dl-common/models/attestSignature.js +54 -0
  27. package/dist/dl-common/models/attestSignature.js.map +1 -0
  28. package/dist/dl-common/models/attestation.d.ts +70 -0
  29. package/dist/dl-common/models/attestation.js +87 -0
  30. package/dist/dl-common/models/attestation.js.map +1 -0
  31. package/dist/dl-common/models/index.d.ts +6 -0
  32. package/dist/dl-common/models/index.js +10 -0
  33. package/dist/dl-common/models/index.js.map +1 -0
  34. package/dist/dl-common/models/message.d.ts +166 -0
  35. package/dist/dl-common/models/message.js +184 -0
  36. package/dist/dl-common/models/message.js.map +1 -0
  37. package/dist/dl-common/models/packet.d.ts +241 -0
  38. package/dist/dl-common/models/packet.js +247 -0
  39. package/dist/dl-common/models/packet.js.map +1 -0
  40. package/dist/dl-common/models/proposal.d.ts +127 -0
  41. package/dist/dl-common/models/proposal.js +142 -0
  42. package/dist/dl-common/models/proposal.js.map +1 -0
  43. package/dist/dl-common/models/switchboard.d.ts +69 -0
  44. package/dist/dl-common/models/switchboard.js +94 -0
  45. package/dist/dl-common/models/switchboard.js.map +1 -0
  46. package/dist/dl-common/services/cacheService.d.ts +14 -0
  47. package/dist/dl-common/services/cacheService.js +79 -0
  48. package/dist/dl-common/services/cacheService.js.map +1 -0
  49. package/dist/dl-common/services/index.d.ts +2 -0
  50. package/dist/dl-common/services/index.js +6 -0
  51. package/dist/dl-common/services/index.js.map +1 -0
  52. package/dist/dl-common/services/queueService.d.ts +10 -0
  53. package/dist/dl-common/services/queueService.js +53 -0
  54. package/dist/dl-common/services/queueService.js.map +1 -0
  55. package/dist/dl-common/utils/address.d.ts +2 -0
  56. package/dist/dl-common/utils/address.js +9 -0
  57. package/dist/dl-common/utils/address.js.map +1 -0
  58. package/dist/dl-common/utils/axios.d.ts +2 -0
  59. package/dist/dl-common/utils/axios.js +43 -0
  60. package/dist/dl-common/utils/axios.js.map +1 -0
  61. package/dist/dl-common/utils/dataStructHelper.d.ts +2 -0
  62. package/dist/dl-common/utils/dataStructHelper.js +11 -0
  63. package/dist/dl-common/utils/dataStructHelper.js.map +1 -0
  64. package/dist/dl-common/utils/discord.d.ts +2 -0
  65. package/dist/dl-common/utils/discord.js +36 -0
  66. package/dist/dl-common/utils/discord.js.map +1 -0
  67. package/dist/dl-common/utils/ethersAwsKmsSigner.d.ts +2 -0
  68. package/dist/dl-common/utils/ethersAwsKmsSigner.js +24 -0
  69. package/dist/dl-common/utils/ethersAwsKmsSigner.js.map +1 -0
  70. package/dist/dl-common/utils/eventGetter.d.ts +4 -0
  71. package/dist/dl-common/utils/eventGetter.js +52 -0
  72. package/dist/dl-common/utils/eventGetter.js.map +1 -0
  73. package/dist/dl-common/utils/extraUtils.d.ts +25 -0
  74. package/dist/dl-common/utils/extraUtils.js +96 -0
  75. package/dist/dl-common/utils/extraUtils.js.map +1 -0
  76. package/dist/dl-common/utils/idUtils.d.ts +14 -0
  77. package/dist/dl-common/utils/idUtils.js +48 -0
  78. package/dist/dl-common/utils/idUtils.js.map +1 -0
  79. package/dist/dl-common/utils/index.d.ts +11 -0
  80. package/dist/dl-common/utils/index.js +15 -0
  81. package/dist/dl-common/utils/index.js.map +1 -0
  82. package/dist/dl-common/utils/relaySigner.d.ts +21 -0
  83. package/dist/dl-common/utils/relaySigner.js +68 -0
  84. package/dist/dl-common/utils/relaySigner.js.map +1 -0
  85. package/dist/dl-common/utils/secretManagerService.d.ts +2 -0
  86. package/dist/dl-common/utils/secretManagerService.js +35 -0
  87. package/dist/dl-common/utils/secretManagerService.js.map +1 -0
  88. package/dist/dl-common/utils/time.d.ts +1 -0
  89. package/dist/dl-common/utils/time.js +6 -0
  90. package/dist/dl-common/utils/time.js.map +1 -0
  91. package/dist/models/packet.d.ts +4 -0
  92. package/dist/models/packet.js +6 -0
  93. package/dist/models/switchboard.d.ts +8 -0
  94. package/dist/models/switchboard.js +20 -3
  95. package/dist/src/constants/batcherModes.d.ts +6 -0
  96. package/dist/src/constants/batcherModes.js +10 -0
  97. package/dist/src/constants/batcherModes.js.map +1 -0
  98. package/dist/src/constants/config.d.ts +27 -0
  99. package/dist/src/constants/config.js +62 -0
  100. package/dist/src/constants/config.js.map +1 -0
  101. package/dist/src/constants/enums.d.ts +15 -0
  102. package/dist/src/constants/enums.js +22 -0
  103. package/dist/src/constants/enums.js.map +1 -0
  104. package/dist/src/constants/gasEstimation.d.ts +8 -0
  105. package/dist/src/constants/gasEstimation.js +66 -0
  106. package/dist/src/constants/gasEstimation.js.map +1 -0
  107. package/dist/src/constants/index.d.ts +10 -0
  108. package/dist/src/constants/index.js +14 -0
  109. package/dist/src/constants/index.js.map +1 -0
  110. package/dist/src/constants/limits.d.ts +18 -0
  111. package/dist/src/constants/limits.js +61 -0
  112. package/dist/src/constants/limits.js.map +1 -0
  113. package/dist/src/constants/prometheus.config.d.ts +43 -0
  114. package/dist/src/constants/prometheus.config.js +123 -0
  115. package/dist/src/constants/prometheus.config.js.map +1 -0
  116. package/dist/src/constants/relayer.d.ts +6 -0
  117. package/dist/src/constants/relayer.js +16 -0
  118. package/dist/src/constants/relayer.js.map +1 -0
  119. package/dist/src/constants/stageConfig.d.ts +10 -0
  120. package/dist/src/constants/stageConfig.js +52 -0
  121. package/dist/src/constants/stageConfig.js.map +1 -0
  122. package/dist/src/constants/types.d.ts +45 -0
  123. package/dist/src/constants/types.js +3 -0
  124. package/dist/src/constants/types.js.map +1 -0
  125. package/dist/src/constants/watchers.d.ts +16 -0
  126. package/dist/src/constants/watchers.js +70 -0
  127. package/dist/src/constants/watchers.js.map +1 -0
  128. package/dist/src/controllers/index.d.ts +0 -0
  129. package/dist/src/controllers/index.js +2 -0
  130. package/dist/src/controllers/index.js.map +1 -0
  131. package/dist/src/db/associations.d.ts +1 -0
  132. package/dist/src/db/associations.js +24 -0
  133. package/dist/src/db/associations.js.map +1 -0
  134. package/dist/src/db/connection.d.ts +4 -0
  135. package/dist/src/db/connection.js +72 -0
  136. package/dist/src/db/connection.js.map +1 -0
  137. package/dist/src/db/index.d.ts +2 -0
  138. package/dist/src/db/index.js +6 -0
  139. package/dist/src/db/index.js.map +1 -0
  140. package/dist/src/db/init.d.ts +2 -0
  141. package/dist/src/db/init.js +30 -0
  142. package/dist/src/db/init.js.map +1 -0
  143. package/dist/src/handlers/common.d.ts +2 -0
  144. package/dist/src/handlers/common.js +45 -0
  145. package/dist/src/handlers/common.js.map +1 -0
  146. package/dist/src/handlers/cronHandler.d.ts +10 -0
  147. package/dist/src/handlers/cronHandler.js +142 -0
  148. package/dist/src/handlers/cronHandler.js.map +1 -0
  149. package/dist/src/handlers/executeHandler.d.ts +3 -0
  150. package/dist/src/handlers/executeHandler.js +70 -0
  151. package/dist/src/handlers/executeHandler.js.map +1 -0
  152. package/dist/src/handlers/handler.d.ts +2 -0
  153. package/dist/src/handlers/handler.js +25 -0
  154. package/dist/src/handlers/handler.js.map +1 -0
  155. package/dist/src/handlers/proposeHandler.d.ts +3 -0
  156. package/dist/src/handlers/proposeHandler.js +65 -0
  157. package/dist/src/handlers/proposeHandler.js.map +1 -0
  158. package/dist/src/handlers/routes.d.ts +6 -0
  159. package/dist/src/handlers/routes.js +25 -0
  160. package/dist/src/handlers/routes.js.map +1 -0
  161. package/dist/src/handlers/sealHandler.d.ts +4 -0
  162. package/dist/src/handlers/sealHandler.js +154 -0
  163. package/dist/src/handlers/sealHandler.js.map +1 -0
  164. package/dist/src/handlers/statusHandler.d.ts +4 -0
  165. package/dist/src/handlers/statusHandler.js +90 -0
  166. package/dist/src/handlers/statusHandler.js.map +1 -0
  167. package/dist/src/handlers/taskHandler.d.ts +2 -0
  168. package/dist/src/handlers/taskHandler.js +88 -0
  169. package/dist/src/handlers/taskHandler.js.map +1 -0
  170. package/dist/src/handlers/testHandler.d.ts +3 -0
  171. package/dist/src/handlers/testHandler.js +57 -0
  172. package/dist/src/handlers/testHandler.js.map +1 -0
  173. package/dist/src/main.d.ts +0 -0
  174. package/dist/src/main.js +2 -0
  175. package/dist/src/main.js.map +1 -0
  176. package/dist/src/relayers/common.d.ts +5 -0
  177. package/dist/src/relayers/common.js +39 -0
  178. package/dist/src/relayers/common.js.map +1 -0
  179. package/dist/src/relayers/index.d.ts +2 -0
  180. package/dist/src/relayers/index.js +6 -0
  181. package/dist/src/relayers/index.js.map +1 -0
  182. package/dist/src/relayers/proposeRelayer.d.ts +5 -0
  183. package/dist/src/relayers/proposeRelayer.js +423 -0
  184. package/dist/src/relayers/proposeRelayer.js.map +1 -0
  185. package/dist/src/relayers/sealRelayer.d.ts +5 -0
  186. package/dist/src/relayers/sealRelayer.js +165 -0
  187. package/dist/src/relayers/sealRelayer.js.map +1 -0
  188. package/dist/src/services/attestService.d.ts +10 -0
  189. package/dist/src/services/attestService.js +180 -0
  190. package/dist/src/services/attestService.js.map +1 -0
  191. package/dist/src/services/batcherService.d.ts +2 -0
  192. package/dist/src/services/batcherService.js +139 -0
  193. package/dist/src/services/batcherService.js.map +1 -0
  194. package/dist/src/services/executeService.d.ts +16 -0
  195. package/dist/src/services/executeService.js +149 -0
  196. package/dist/src/services/executeService.js.map +1 -0
  197. package/dist/src/services/gasEstimationService.d.ts +3 -0
  198. package/dist/src/services/gasEstimationService.js +13 -0
  199. package/dist/src/services/gasEstimationService.js.map +1 -0
  200. package/dist/src/services/index.d.ts +4 -0
  201. package/dist/src/services/index.js +8 -0
  202. package/dist/src/services/index.js.map +1 -0
  203. package/dist/src/services/indexSealService.d.ts +16 -0
  204. package/dist/src/services/indexSealService.js +92 -0
  205. package/dist/src/services/indexSealService.js.map +1 -0
  206. package/dist/src/services/proposalCheckService.d.ts +9 -0
  207. package/dist/src/services/proposalCheckService.js +91 -0
  208. package/dist/src/services/proposalCheckService.js.map +1 -0
  209. package/dist/src/services/sealService.d.ts +2 -0
  210. package/dist/src/services/sealService.js +120 -0
  211. package/dist/src/services/sealService.js.map +1 -0
  212. package/dist/src/statusTrackers/index.d.ts +3 -0
  213. package/dist/src/statusTrackers/index.js +14 -0
  214. package/dist/src/statusTrackers/index.js.map +1 -0
  215. package/dist/src/statusTrackers/message.d.ts +4 -0
  216. package/dist/src/statusTrackers/message.js +210 -0
  217. package/dist/src/statusTrackers/message.js.map +1 -0
  218. package/dist/src/statusTrackers/packet.d.ts +22 -0
  219. package/dist/src/statusTrackers/packet.js +370 -0
  220. package/dist/src/statusTrackers/packet.js.map +1 -0
  221. package/dist/src/utils/chain-utils.d.ts +6 -0
  222. package/dist/src/utils/chain-utils.js +47 -0
  223. package/dist/src/utils/chain-utils.js.map +1 -0
  224. package/dist/src/utils/contract.d.ts +5 -0
  225. package/dist/src/utils/contract.js +17 -0
  226. package/dist/src/utils/contract.js.map +1 -0
  227. package/dist/src/utils/index.d.ts +4 -0
  228. package/dist/src/utils/index.js +8 -0
  229. package/dist/src/utils/index.js.map +1 -0
  230. package/dist/src/utils/logger.d.ts +1 -0
  231. package/dist/src/utils/logger.js +6 -0
  232. package/dist/src/utils/logger.js.map +1 -0
  233. package/package.json +5 -5
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.saveMessageSimulationResponse = exports.sendPendingSimulationRequest = exports.sendRetrySimulationRequest = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const utils_1 = require("@dl-common/utils");
6
+ const utils_2 = require("../utils");
7
+ const constants_1 = require("../constants");
8
+ const models_1 = require("@dl-common/models");
9
+ const sequelize_1 = require("sequelize");
10
+ const prometheus_config_1 = require("src/constants/prometheus.config");
11
+ const ethers_1 = require("ethers");
12
+ const sendRequest = (messages) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
13
+ const executeRequestData = [];
14
+ let start = Date.now();
15
+ for (const message of messages) {
16
+ executeRequestData.push({
17
+ messageId: message.messageId,
18
+ destPlug: message.destPlug,
19
+ srcPlug: message.srcPlug,
20
+ dstChainSlug: message.dstChainSlug,
21
+ srcChainSlug: message.srcChainSlug,
22
+ payload: message.payload,
23
+ minMsgGasLimit: message.minMsgGasLimit,
24
+ executionParams: message.executionParams,
25
+ packedMessage: message.packedMessage,
26
+ });
27
+ }
28
+ if (constants_1.EXECUTOR_URL) {
29
+ const response = yield (0, utils_1.axiosPost)(constants_1.EXECUTOR_URL, { messageData: executeRequestData }, { headers: { "x-auth-token": constants_1.EXECUTOR_AUTH_TOKEN } });
30
+ console.log("execute response : ", response);
31
+ if (!response.success)
32
+ console.log("execute request failed");
33
+ }
34
+ else {
35
+ console.log("no executer url found");
36
+ }
37
+ console.log("time taken to get execute signatures: ", Date.now() - start);
38
+ });
39
+ const sendRetrySimulationRequest = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
40
+ try {
41
+ const messages = yield getRetrySimulationMessages();
42
+ if (messages.length) {
43
+ console.log("sending retry simulation request count : ", messages.length);
44
+ const messagesAsChunks = [...(0, utils_1.chunks)(messages, constants_1.executeBatchRelayLimit)];
45
+ for (const chunk of messagesAsChunks)
46
+ yield sendRequest(chunk);
47
+ }
48
+ }
49
+ catch (error) {
50
+ console.log("error while sending retry simulation request: ", error);
51
+ }
52
+ });
53
+ exports.sendRetrySimulationRequest = sendRetrySimulationRequest;
54
+ const sendPendingSimulationRequest = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
55
+ try {
56
+ const messages = yield getPendingSimulationMessages();
57
+ if (messages.length) {
58
+ console.log("sending pending simulation request count : ", messages.length);
59
+ const messagesAsChunks = [...(0, utils_1.chunks)(messages, constants_1.executeBatchRelayLimit)];
60
+ for (const chunk of messagesAsChunks)
61
+ yield sendRequest(chunk);
62
+ }
63
+ }
64
+ catch (error) {
65
+ console.log("error while sendMessageSimulationRequest request: ", error);
66
+ }
67
+ });
68
+ exports.sendPendingSimulationRequest = sendPendingSimulationRequest;
69
+ const saveMessageSimulationResponse = (executeResponseData) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
70
+ let messageIds = [];
71
+ if (executeResponseData === null || executeResponseData === void 0 ? void 0 : executeResponseData.length) {
72
+ executeResponseData = executeResponseData.map((data) => {
73
+ messageIds.push(data.messageId);
74
+ if (ethers_1.BigNumber.from(data.executeMsgGasLimit).gt(constants_1.MaxMsgGasLimit)) {
75
+ return Object.assign(Object.assign({}, data), { firstSimulationTimestamp: Math.floor(Date.now() / 1000), executeRelayStatus: models_1.ExecutionRelayStatus.IGNORED });
76
+ }
77
+ else {
78
+ return Object.assign(Object.assign({}, data), { firstSimulationTimestamp: Math.floor(Date.now() / 1000), executeRelayStatus: models_1.ExecutionRelayStatus.NO });
79
+ }
80
+ });
81
+ yield saveMessageUpdates(executeResponseData);
82
+ }
83
+ const messages = yield models_1.Message.findAll({
84
+ where: {
85
+ messageId: { [sequelize_1.Op.in]: messageIds },
86
+ },
87
+ });
88
+ messages.forEach((message) => {
89
+ (0, prometheus_config_1.observeHistogram)(prometheus_config_1.relayMetrics.executeRelay.signHistogram, {
90
+ labels: {
91
+ [prometheus_config_1.Labels.SRC_CHAIN_SLUG]: message.srcChainSlug,
92
+ [prometheus_config_1.Labels.DST_CHAIN_SLUG]: message.dstChainSlug,
93
+ },
94
+ timeDiff: (0, utils_2.currentTimestampInSeconds)() - message.outboundTime,
95
+ });
96
+ });
97
+ });
98
+ exports.saveMessageSimulationResponse = saveMessageSimulationResponse;
99
+ const saveMessageUpdates = (dbUpdates) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
100
+ try {
101
+ yield models_1.Message.bulkCreate(dbUpdates, {
102
+ updateOnDuplicate: [
103
+ "retry",
104
+ "inboundSuccess",
105
+ "inboundRevertString",
106
+ "firstSimulationTimestamp",
107
+ "executeSignature",
108
+ "executeMsgGasLimit",
109
+ "executeRelayStatus",
110
+ ],
111
+ });
112
+ }
113
+ catch (error) {
114
+ utils_2.logger.error("Error while saving execute signature updates", error);
115
+ throw new Error(`Error while saving execute signature updates ${error === null || error === void 0 ? void 0 : error.message}`);
116
+ }
117
+ });
118
+ const getPendingSimulationMessages = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
119
+ const result = yield models_1.Message.findAll({
120
+ limit: constants_1.executeBatchQueryLimit,
121
+ where: {
122
+ isExecuted: false,
123
+ executeRelayStatus: {
124
+ [sequelize_1.Op.not]: models_1.ExecutionRelayStatus.IGNORED,
125
+ },
126
+ firstSimulationTimestamp: 0,
127
+ },
128
+ order: [["updatedAt", "ASC"]],
129
+ });
130
+ console.log("pending simulation messages count: ", result.length);
131
+ return result;
132
+ });
133
+ const getRetrySimulationMessages = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
134
+ const result = yield models_1.Message.findAll({
135
+ limit: constants_1.executeBatchQueryLimit,
136
+ where: {
137
+ isExecuted: false,
138
+ firstSimulationTimestamp: {
139
+ [sequelize_1.Op.gt]: Math.floor(Date.now() / 1000) - constants_1.retryInterval,
140
+ },
141
+ inboundSuccess: false,
142
+ executeRelayStatus: models_1.ExecutionRelayStatus.NO,
143
+ },
144
+ order: [["updatedAt", "ASC"]],
145
+ });
146
+ console.log("retry simulation messages count: ", result.length);
147
+ return result;
148
+ });
149
+ //# sourceMappingURL=executeService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executeService.js","sourceRoot":"","sources":["../../../src/services/executeService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ChainSlug } from "@socket.tech/dl-core";
2
+ export declare const getProposeGasLimit: (dstChainSlug: ChainSlug) => Promise<number>;
3
+ export declare const getAttestGasLimit: (dstChainSlug: ChainSlug) => Promise<number>;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAttestGasLimit = exports.getProposeGasLimit = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const getProposeGasLimit = (dstChainSlug) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
6
+ return 100000;
7
+ });
8
+ exports.getProposeGasLimit = getProposeGasLimit;
9
+ const getAttestGasLimit = (dstChainSlug) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
10
+ return 100000;
11
+ });
12
+ exports.getAttestGasLimit = getAttestGasLimit;
13
+ //# sourceMappingURL=gasEstimationService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gasEstimationService.js","sourceRoot":"","sources":["../../../src/services/gasEstimationService.ts"],"names":[],"mappings":";;;;AAGO,MAAM,kBAAkB,GAAG,CAAO,YAAuB,EAAE,EAAE;IAClE,OAAO,MAAM,CAAC;AAChB,CAAC,CAAA,CAAC;AAFW,QAAA,kBAAkB,sBAE7B;AAEK,MAAM,iBAAiB,GAAG,CAAO,YAAuB,EAAE,EAAE;IACjE,OAAO,MAAM,CAAC;AAChB,CAAC,CAAA,CAAC;AAFW,QAAA,iBAAiB,qBAE5B"}
@@ -0,0 +1,4 @@
1
+ export * from "./sealService";
2
+ export * from "./attestService";
3
+ export * from "./executeService";
4
+ export * from "./sealService";
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./sealService"), exports);
5
+ tslib_1.__exportStar(require("./attestService"), exports);
6
+ tslib_1.__exportStar(require("./executeService"), exports);
7
+ tslib_1.__exportStar(require("./sealService"), exports);
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":";;;AAGA,wDAA8B;AAC9B,0DAAgC;AAChC,2DAAiC;AACjC,wDAA8B"}
@@ -0,0 +1,16 @@
1
+ import { SealRelayStatus } from "@dl-common/models";
2
+ import { SealIndexedParams } from "@dl-common/constants";
3
+ export type SealIndexedUpdate = {
4
+ srcChainSlug: number;
5
+ sealer: string;
6
+ isSealed: boolean;
7
+ sealTime: number;
8
+ sealIndexTime: number;
9
+ sealTxHash: string;
10
+ rootSealed: string;
11
+ sealRelayStatus: SealRelayStatus;
12
+ dstSwitchboard: string;
13
+ sealSignature: string;
14
+ packetId: string;
15
+ };
16
+ export declare const indexSeal: (sealIndexedUpdates: SealIndexedParams[]) => Promise<any>;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.indexSeal = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const utils_1 = require("../utils");
6
+ const constants_1 = require("../constants");
7
+ const models_1 = require("@dl-common/models");
8
+ const services_1 = require("@dl-common/services");
9
+ const stageConfig_1 = require("../constants/stageConfig");
10
+ const sequelize_1 = require("sequelize");
11
+ const indexSeal = (sealIndexedUpdates) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
12
+ var _a;
13
+ try {
14
+ const chainSlug = (_a = sealIndexedUpdates[0]) === null || _a === void 0 ? void 0 : _a.srcChainSlug;
15
+ let indexSealRequestPacketIds = sealIndexedUpdates.map((s) => s.packetId);
16
+ console.log({ indexSealRequestPacketIds });
17
+ let packets = yield models_1.Packet.findAll({
18
+ where: { packetId: { [sequelize_1.Op.in]: indexSealRequestPacketIds } },
19
+ attributes: ["packetId", "sealIndexTime"],
20
+ });
21
+ let packetIdToSealIndexTime = {};
22
+ packets.forEach((packet) => {
23
+ packetIdToSealIndexTime[packet.packetId] = packet.sealIndexTime;
24
+ });
25
+ const packetDbUpdates = [];
26
+ sealIndexedUpdates.map((sealIndexData) => {
27
+ const { srcChainSlug, packetId } = sealIndexData;
28
+ packetDbUpdates.push(Object.assign({ isSealed: true, sealRelayStatus: models_1.SealRelayStatus.SEALED, sealIndexTime: packetIdToSealIndexTime[packetId] > 0
29
+ ? packetIdToSealIndexTime[packetId]
30
+ : (0, utils_1.currentTimestampInSeconds)() }, sealIndexData));
31
+ });
32
+ if (packetDbUpdates.length > 0)
33
+ yield savePacketUpdates(packetDbUpdates);
34
+ yield (0, services_1.sendStandardSqsMessage)(stageConfig_1.stageConfig.SQS_BASE_URL + constants_1.QueueName.BATCHER_TASK_QUEUE, {
35
+ type: constants_1.TaskNames.RELAY_PROPOSE,
36
+ data: { counter: Math.floor(Math.random() * 100) },
37
+ });
38
+ yield observeMetrics(indexSealRequestPacketIds, chainSlug);
39
+ console.log("message added to queue for relay propose");
40
+ }
41
+ catch (error) {
42
+ utils_1.logger.error("Error", error);
43
+ throw error;
44
+ }
45
+ });
46
+ exports.indexSeal = indexSeal;
47
+ const observeMetrics = (packetIds, chainSlug) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
48
+ try {
49
+ let packetsIndexed = yield models_1.Packet.findAll({
50
+ where: {
51
+ packetId: {
52
+ [sequelize_1.Op.in]: packetIds,
53
+ },
54
+ },
55
+ attributes: ["srcChainSlug", "outboundTime", "dstChainSlug"],
56
+ });
57
+ packetsIndexed.forEach((packet) => {
58
+ (0, constants_1.observeHistogram)(constants_1.relayMetrics.sealRelay.statusUpdateHistogram, {
59
+ labels: {
60
+ [constants_1.Labels.SRC_CHAIN_SLUG]: packet.srcChainSlug,
61
+ [constants_1.Labels.DST_CHAIN_SLUG]: packet.dstChainSlug,
62
+ },
63
+ timeDiff: (0, utils_1.currentTimestampInSeconds)() - packet.outboundTime,
64
+ });
65
+ });
66
+ }
67
+ catch (error) {
68
+ console.log("erorr in observing metrics : ", chainSlug, " ", error);
69
+ }
70
+ });
71
+ const savePacketUpdates = (dbUpdates) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
72
+ try {
73
+ yield models_1.Packet.bulkCreate(dbUpdates, {
74
+ updateOnDuplicate: [
75
+ "sealer",
76
+ "isSealed",
77
+ "sealTime",
78
+ "sealIndexTime",
79
+ "sealTxHash",
80
+ "rootSealed",
81
+ "dstSwitchboard",
82
+ "sealRelayStatus",
83
+ "sealSignature",
84
+ ],
85
+ });
86
+ }
87
+ catch (error) {
88
+ utils_1.logger.error("Error while saving seal index updates", error);
89
+ throw new Error(`Error while saving seal index updates ${error === null || error === void 0 ? void 0 : error.message}`);
90
+ }
91
+ });
92
+ //# sourceMappingURL=indexSealService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexSealService.js","sourceRoot":"","sources":["../../../src/services/indexSealService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Packet, Proposal } from "@dl-common/models";
2
+ import { ChainSlug } from "@socket.tech/dl-core";
3
+ interface PacketJoinResult extends Packet {
4
+ Proposals?: Proposal[];
5
+ }
6
+ export declare const getIncompletePackets: (dstChainSlug: ChainSlug) => Promise<PacketJoinResult[]>;
7
+ export declare const updateSelectedProposalCountForPackets: (chainSlug?: ChainSlug) => Promise<void>;
8
+ export declare const updateSelectedProposalCount: (dstChainSlug: ChainSlug) => Promise<void>;
9
+ export {};
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateSelectedProposalCount = exports.updateSelectedProposalCountForPackets = exports.getIncompletePackets = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const utils_1 = require("../utils");
6
+ const constants_1 = require("../constants");
7
+ const models_1 = require("@dl-common/models");
8
+ const sequelize_1 = require("sequelize");
9
+ const savePacketDbUpdates = (updates) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
10
+ try {
11
+ yield models_1.Packet.bulkCreate(updates, {
12
+ updateOnDuplicate: ["selectedProposalCount"],
13
+ });
14
+ }
15
+ catch (error) {
16
+ utils_1.logger.error("Error while saving selectedProposalCount updates", error);
17
+ throw new Error("Error while saving selectedProposalCount updates");
18
+ }
19
+ });
20
+ const getIncompletePackets = (dstChainSlug) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
21
+ const packets = yield models_1.Packet.findAll({
22
+ limit: constants_1.rootMatchIndexerQueryLimit,
23
+ attributes: [
24
+ "packetId",
25
+ "root",
26
+ "rootSealed",
27
+ "dstSwitchboard",
28
+ "srcChainSlug",
29
+ ],
30
+ where: {
31
+ selectedProposalCount: null,
32
+ srcChainSlug: {
33
+ [sequelize_1.Op.in]: constants_1.supportedChainSlugs,
34
+ },
35
+ dstChainSlug: dstChainSlug,
36
+ },
37
+ include: [
38
+ {
39
+ model: models_1.Proposal,
40
+ attributes: ["root", "packetId", "switchboard", "proposalCount"],
41
+ },
42
+ ],
43
+ });
44
+ console.log(dstChainSlug, "incomplete packets count", packets.length);
45
+ return packets;
46
+ });
47
+ exports.getIncompletePackets = getIncompletePackets;
48
+ const updateSelectedProposalCountForPackets = (chainSlug) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
49
+ let chains = chainSlug ? [chainSlug] : constants_1.supportedChainSlugs;
50
+ for (let chain of chains) {
51
+ yield (0, exports.updateSelectedProposalCount)(chain);
52
+ }
53
+ });
54
+ exports.updateSelectedProposalCountForPackets = updateSelectedProposalCountForPackets;
55
+ const updateSelectedProposalCount = (dstChainSlug) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
56
+ let packetDbUpdates = [];
57
+ let packetIdsWithoutValidProposals = [];
58
+ try {
59
+ let packets = yield (0, exports.getIncompletePackets)(dstChainSlug);
60
+ for (let packet of packets) {
61
+ let proposals = packet.Proposals;
62
+ if (!proposals || !proposals.length) {
63
+ packetIdsWithoutValidProposals.push(packet.packetId);
64
+ continue;
65
+ }
66
+ let isValidProposalFound = false;
67
+ for (let proposal of proposals) {
68
+ if (packet.dstSwitchboard === proposal.switchboard &&
69
+ packet.rootSealed === proposal.root) {
70
+ isValidProposalFound = true;
71
+ packetDbUpdates.push({
72
+ packetId: packet.packetId,
73
+ selectedProposalCount: proposal.proposalCount,
74
+ });
75
+ break;
76
+ }
77
+ }
78
+ if (!isValidProposalFound) {
79
+ packetIdsWithoutValidProposals.push(packet.packetId);
80
+ }
81
+ }
82
+ console.log({ packetIdsWithoutValidProposals });
83
+ yield savePacketDbUpdates(packetDbUpdates);
84
+ }
85
+ catch (error) {
86
+ utils_1.logger.error(`error in updateSelectedProposalCount: ${error}`);
87
+ throw new Error(`error in updateSelectedProposalCount`);
88
+ }
89
+ });
90
+ exports.updateSelectedProposalCount = updateSelectedProposalCount;
91
+ //# sourceMappingURL=proposalCheckService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposalCheckService.js","sourceRoot":"","sources":["../../../src/services/proposalCheckService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { SealParams } from "@dl-common/constants";
2
+ export declare const seal: (sealRequests: SealParams[]) => Promise<any>;
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.seal = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const utils_1 = require("../utils");
6
+ const constants_1 = require("../constants");
7
+ const models_1 = require("@dl-common/models");
8
+ const services_1 = require("@dl-common/services");
9
+ const stageConfig_1 = require("../constants/stageConfig");
10
+ const constants_2 = require("@dl-common/constants");
11
+ const constants_3 = require("@dl-common/constants");
12
+ const seal = (sealRequests) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
13
+ var _a;
14
+ try {
15
+ const chainSlug = (_a = sealRequests[0]) === null || _a === void 0 ? void 0 : _a.srcChainSlug;
16
+ let sealRequestPacketIds = sealRequests.map((s) => s.packet.packetId);
17
+ console.log({ sealRequestPacketIds });
18
+ const packetDbUpdates = [];
19
+ const messageDbUpdates = [];
20
+ sealRequests.map((sealRequest) => {
21
+ const { srcChainSlug, dstChainSlug, dstSwitchboard, integrationType } = sealRequest;
22
+ const { root, capacitorPacketCount } = sealRequest.packet;
23
+ const { outboundTime, outboundTxHash } = sealRequest.message;
24
+ if (!constants_1.supportedChainSlugs.includes(srcChainSlug) ||
25
+ !constants_1.supportedChainSlugs.includes(dstChainSlug)) {
26
+ throw (0, constants_3.BadRequestError)("srcChainSlug or dstChainSlug not supported");
27
+ }
28
+ messageDbUpdates.push(Object.assign(Object.assign({}, sealRequest.message), { srcChainSlug,
29
+ dstChainSlug, packetId: sealRequest.packet.packetId, rootHash: root, capacitorPacketCount }));
30
+ packetDbUpdates.push(Object.assign(Object.assign({ srcChainSlug,
31
+ dstChainSlug, switchboardId: `${srcChainSlug}-${dstChainSlug}-${dstSwitchboard.toLowerCase()}`, dstSwitchboard,
32
+ integrationType }, sealRequest.packet), { outboundTime,
33
+ outboundTxHash, isFilled: true, executionWaitTime: Date.now() / 1000 +
34
+ (0, constants_2.getWaitTime)(integrationType, srcChainSlug, dstChainSlug) }));
35
+ });
36
+ if (packetDbUpdates.length > 0)
37
+ yield savePacketUpdates(packetDbUpdates);
38
+ if (messageDbUpdates.length > 0)
39
+ yield saveMessageUpdates(messageDbUpdates);
40
+ let counter = Math.floor(Math.random() * 100);
41
+ console.log("seal queue message counter: ", counter);
42
+ yield (0, services_1.sendStandardSqsMessage)(stageConfig_1.stageConfig.SQS_BASE_URL + constants_1.QueueName.BATCHER_TASK_QUEUE, {
43
+ type: constants_1.TaskNames.RELAY_SEAL,
44
+ data: {
45
+ chainSlug,
46
+ counter,
47
+ },
48
+ });
49
+ yield (0, services_1.sendStandardSqsMessage)(stageConfig_1.stageConfig.SQS_BASE_URL + constants_1.QueueName.BATCHER_TASK_QUEUE, {
50
+ type: constants_1.TaskNames.SIMULATE_MESSAGES,
51
+ data: {
52
+ chainSlug,
53
+ counter,
54
+ },
55
+ });
56
+ }
57
+ catch (error) {
58
+ utils_1.logger.error("Error", error);
59
+ throw error;
60
+ }
61
+ });
62
+ exports.seal = seal;
63
+ const saveMessageUpdates = (dbUpdates) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
64
+ try {
65
+ yield models_1.Message.bulkCreate(dbUpdates, {
66
+ updateOnDuplicate: [
67
+ "srcChainSlug",
68
+ "dstChainSlug",
69
+ "srcPlug",
70
+ "destPlug",
71
+ "executionParams",
72
+ "transmissionParams",
73
+ "minMsgGasLimit",
74
+ "executionFee",
75
+ "transmissionFees",
76
+ "switchboardFees",
77
+ "fees",
78
+ "payload",
79
+ "decapacitorProof",
80
+ "packedMessage",
81
+ "outboundTime",
82
+ "outboundTxHash",
83
+ "capacitorMsgCount",
84
+ "capacitorPacketCount",
85
+ "rootHash",
86
+ "packetId",
87
+ ],
88
+ });
89
+ }
90
+ catch (error) {
91
+ utils_1.logger.error("Error while saving new message updates", error);
92
+ throw new Error(`Error while saving new message updates ${error === null || error === void 0 ? void 0 : error.message}`);
93
+ }
94
+ });
95
+ const savePacketUpdates = (dbUpdates) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
96
+ try {
97
+ yield models_1.Packet.bulkCreate(dbUpdates, {
98
+ updateOnDuplicate: [
99
+ "srcChainSlug",
100
+ "dstChainSlug",
101
+ "srcCapacitor",
102
+ "dstSwitchboard",
103
+ "switchboardId",
104
+ "capacitorPacketCount",
105
+ "integrationType",
106
+ "root",
107
+ "isFilled",
108
+ "outboundTime",
109
+ "executionWaitTime",
110
+ "outboundTxHash",
111
+ "sealSignature",
112
+ ],
113
+ });
114
+ }
115
+ catch (error) {
116
+ utils_1.logger.error("Error while saving new packet updates", error);
117
+ throw new Error(`Error while saving new packet updates ${error === null || error === void 0 ? void 0 : error.message}`);
118
+ }
119
+ });
120
+ //# sourceMappingURL=sealService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sealService.js","sourceRoot":"","sources":["../../../src/services/sealService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./message";
2
+ export * from "./packet";
3
+ export declare const checkAndUpdateStatus: () => Promise<void>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkAndUpdateStatus = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const message_1 = require("./message");
6
+ const packet_1 = require("./packet");
7
+ tslib_1.__exportStar(require("./message"), exports);
8
+ tslib_1.__exportStar(require("./packet"), exports);
9
+ const checkAndUpdateStatus = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
10
+ yield (0, message_1.checkAndUpdateMessageRelayStatus)();
11
+ yield (0, packet_1.checkAndUpdatePacketRelayStatus)();
12
+ });
13
+ exports.checkAndUpdateStatus = checkAndUpdateStatus;
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/statusTrackers/index.ts"],"names":[],"mappings":";;;;AAAA,uCAA6D;AAC7D,qCAA2D;AAE3D,oDAA0B;AAC1B,mDAAyB;AAElB,MAAM,oBAAoB,GAAG,GAAS,EAAE;IAC7C,MAAM,IAAA,0CAAgC,GAAE,CAAC;IACzC,MAAM,IAAA,wCAA+B,GAAE,CAAC;AAC1C,CAAC,CAAA,CAAC;AAHW,QAAA,oBAAoB,wBAG/B"}
@@ -0,0 +1,4 @@
1
+ import { TxStatusUpdate } from "../constants";
2
+ export declare const checkAndUpdateMessageRelayStatus: () => Promise<void>;
3
+ export declare const getMessagesByTxId: (txIds: string[]) => Promise<any[]>;
4
+ export declare const updateMessageTxStatus: (updates: TxStatusUpdate[]) => Promise<void>;