@xyo-network/chain-bridge 1.17.7 → 1.18.0

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 (119) hide show
  1. package/dist/node/config/getGateway.d.ts +1 -1
  2. package/dist/node/config/getGateway.d.ts.map +1 -1
  3. package/dist/node/index.mjs +534 -108
  4. package/dist/node/index.mjs.map +1 -1
  5. package/dist/node/interface/service/Observer/ERC20TransferObserver/ERC20TransferObserver.d.ts.map +1 -1
  6. package/dist/node/interface/service/Observer/LiquidityPoolBridgeObserver/LiquidityPoolBridgeObserver.d.ts.map +1 -1
  7. package/dist/node/interface/service/Relay/LiquidityPoolBridgeRelay/LiquidityPoolBridgeRelay.d.ts.map +1 -1
  8. package/dist/node/manifest/getServices.d.ts +13 -0
  9. package/dist/node/manifest/getServices.d.ts.map +1 -0
  10. package/dist/node/manifest/index.d.ts +1 -0
  11. package/dist/node/manifest/index.d.ts.map +1 -1
  12. package/dist/node/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/EVMLiquidityBridgeTransactionCompletionMonitorSentinel.d.ts.map +1 -1
  13. package/dist/node/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.d.ts.map +1 -1
  14. package/dist/node/queue/connection.d.ts +4 -0
  15. package/dist/node/queue/connection.d.ts.map +1 -0
  16. package/dist/node/queue/flowProducer.d.ts +4 -0
  17. package/dist/node/queue/flowProducer.d.ts.map +1 -0
  18. package/dist/node/queue/flows/createXl1ToEthBridgeJob.d.ts +4 -0
  19. package/dist/node/queue/flows/createXl1ToEthBridgeJob.d.ts.map +1 -0
  20. package/dist/node/queue/flows/index.d.ts +2 -0
  21. package/dist/node/queue/flows/index.d.ts.map +1 -0
  22. package/dist/node/queue/index.d.ts +5 -0
  23. package/dist/node/queue/index.d.ts.map +1 -0
  24. package/dist/node/queue/workers/WorkerDescription.d.ts +7 -0
  25. package/dist/node/queue/workers/WorkerDescription.d.ts.map +1 -0
  26. package/dist/node/queue/workers/createWorkers.d.ts +3 -0
  27. package/dist/node/queue/workers/createWorkers.d.ts.map +1 -0
  28. package/dist/node/queue/workers/ethTransactionMonitor.d.ts +3 -0
  29. package/dist/node/queue/workers/ethTransactionMonitor.d.ts.map +1 -0
  30. package/dist/node/queue/workers/ethTransactionPreparation.d.ts +5 -0
  31. package/dist/node/queue/workers/ethTransactionPreparation.d.ts.map +1 -0
  32. package/dist/node/queue/workers/ethTransactionSubmission.d.ts +3 -0
  33. package/dist/node/queue/workers/ethTransactionSubmission.d.ts.map +1 -0
  34. package/dist/node/queue/workers/index.d.ts +9 -0
  35. package/dist/node/queue/workers/index.d.ts.map +1 -0
  36. package/dist/node/queue/workers/xl1ToEthBridgeParent.d.ts +3 -0
  37. package/dist/node/queue/workers/xl1ToEthBridgeParent.d.ts.map +1 -0
  38. package/dist/node/queue/workers/xl1TransactionMonitor.d.ts +3 -0
  39. package/dist/node/queue/workers/xl1TransactionMonitor.d.ts.map +1 -0
  40. package/dist/node/queue/workers/xl1TransactionPreparation.d.ts +3 -0
  41. package/dist/node/queue/workers/xl1TransactionPreparation.d.ts.map +1 -0
  42. package/dist/node/queue/workers/xl1TransactionSubmission.d.ts +3 -0
  43. package/dist/node/queue/workers/xl1TransactionSubmission.d.ts.map +1 -0
  44. package/dist/node/server/app.d.ts.map +1 -1
  45. package/dist/node/server/flowProducer.d.ts +4 -0
  46. package/dist/node/server/flowProducer.d.ts.map +1 -0
  47. package/dist/node/server/index.d.ts +4 -0
  48. package/dist/node/server/index.d.ts.map +1 -1
  49. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.d.ts.map +1 -1
  50. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.d.ts.map +1 -1
  51. package/dist/node/server/server.d.ts.map +1 -1
  52. package/dist/node/services/EthTxState.d.ts +5 -0
  53. package/dist/node/services/EthTxState.d.ts.map +1 -0
  54. package/dist/node/services/IBridgeServiceCollection.d.ts +17 -0
  55. package/dist/node/services/IBridgeServiceCollection.d.ts.map +1 -0
  56. package/dist/node/services/TxState.d.ts +22 -0
  57. package/dist/node/services/TxState.d.ts.map +1 -0
  58. package/dist/node/services/Xl1TxState.d.ts +6 -0
  59. package/dist/node/services/Xl1TxState.d.ts.map +1 -0
  60. package/dist/node/services/index.d.ts +5 -0
  61. package/dist/node/services/index.d.ts.map +1 -0
  62. package/dist/node/util/generateBridgeEstimate.d.ts.map +1 -1
  63. package/dist/node/util/validateBridgeTransaction.d.ts.map +1 -1
  64. package/package.json +19 -18
  65. package/src/config/getGateway.ts +10 -3
  66. package/src/interface/service/Observer/ERC20TransferObserver/ERC20TransferObserver.ts +1 -1
  67. package/src/interface/service/Observer/LiquidityPoolBridgeObserver/LiquidityPoolBridgeObserver.ts +1 -2
  68. package/src/interface/service/Relay/LiquidityPoolBridgeRelay/LiquidityPoolBridgeRelay.ts +1 -1
  69. package/src/manifest/getLocator.ts +4 -4
  70. package/src/manifest/getServices.ts +102 -0
  71. package/src/manifest/index.ts +1 -0
  72. package/src/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/EVMLiquidityBridgeTransactionCompletionMonitorSentinel.ts +1 -1
  73. package/src/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.ts +1 -1
  74. package/src/queue/connection.ts +16 -0
  75. package/src/queue/flowProducer.ts +11 -0
  76. package/src/queue/flows/createXl1ToEthBridgeJob.ts +60 -0
  77. package/src/queue/flows/index.ts +1 -0
  78. package/src/queue/index.ts +4 -0
  79. package/src/queue/workers/WorkerDescription.ts +7 -0
  80. package/src/queue/workers/createWorkers.ts +15 -0
  81. package/src/queue/workers/ethTransactionMonitor.ts +42 -0
  82. package/src/queue/workers/ethTransactionPreparation.ts +47 -0
  83. package/src/queue/workers/ethTransactionSubmission.ts +77 -0
  84. package/src/queue/workers/index.ts +8 -0
  85. package/src/queue/workers/xl1ToEthBridgeParent.ts +25 -0
  86. package/src/queue/workers/xl1TransactionMonitor.ts +66 -0
  87. package/src/queue/workers/xl1TransactionPreparation.ts +36 -0
  88. package/src/queue/workers/xl1TransactionSubmission.ts +60 -0
  89. package/src/server/app.ts +2 -0
  90. package/src/server/flowProducer.ts +11 -0
  91. package/src/server/index.ts +5 -0
  92. package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts +6 -14
  93. package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.ts +1 -0
  94. package/src/server/server.ts +2 -1
  95. package/src/services/EthTxState.ts +5 -0
  96. package/src/services/IBridgeServiceCollection.ts +18 -0
  97. package/src/services/TxState.ts +32 -0
  98. package/src/services/Xl1TxState.ts +6 -0
  99. package/src/services/index.ts +4 -0
  100. package/src/util/generateBridgeEstimate.ts +1 -2
  101. package/src/util/validateBridgeTransaction.ts +5 -0
  102. package/dist/node/driver/index.d.ts +0 -2
  103. package/dist/node/driver/index.d.ts.map +0 -1
  104. package/dist/node/driver/indexer/ChainBlockIteration/ChainHashIterationService.d.ts +0 -24
  105. package/dist/node/driver/indexer/ChainBlockIteration/ChainHashIterationService.d.ts.map +0 -1
  106. package/dist/node/driver/indexer/ChainBlockIteration/index.d.ts +0 -2
  107. package/dist/node/driver/indexer/ChainBlockIteration/index.d.ts.map +0 -1
  108. package/dist/node/driver/indexer/ChainBlocksObservable.d.ts +0 -6
  109. package/dist/node/driver/indexer/ChainBlocksObservable.d.ts.map +0 -1
  110. package/dist/node/driver/indexer/ChainHydratedBlocksObservable.d.ts +0 -11
  111. package/dist/node/driver/indexer/ChainHydratedBlocksObservable.d.ts.map +0 -1
  112. package/dist/node/driver/indexer/index.d.ts +0 -2
  113. package/dist/node/driver/indexer/index.d.ts.map +0 -1
  114. package/src/driver/index.ts +0 -1
  115. package/src/driver/indexer/ChainBlockIteration/ChainHashIterationService.ts +0 -89
  116. package/src/driver/indexer/ChainBlockIteration/index.ts +0 -1
  117. package/src/driver/indexer/ChainBlocksObservable.ts +0 -46
  118. package/src/driver/indexer/ChainHydratedBlocksObservable.ts +0 -23
  119. package/src/driver/indexer/index.ts +0 -1
@@ -7,6 +7,357 @@ import compression from "compression";
7
7
  import cors from "cors";
8
8
  import express from "express";
9
9
 
10
+ // src/queue/connection.ts
11
+ import { isDefined } from "@xylabs/sdk-js";
12
+ import { Redis } from "ioredis";
13
+ var connection;
14
+ var maxRetriesPerRequest = null;
15
+ var getConnection = /* @__PURE__ */ __name((config) => {
16
+ if (isDefined(connection)) return connection;
17
+ const { redisHost: host, redisPort: port } = config.bridge;
18
+ connection = new Redis({
19
+ host,
20
+ port,
21
+ maxRetriesPerRequest
22
+ });
23
+ return connection;
24
+ }, "getConnection");
25
+
26
+ // src/queue/flowProducer.ts
27
+ import { isDefined as isDefined2 } from "@xylabs/sdk-js";
28
+ import { FlowProducer } from "bullmq";
29
+ var flowProducer;
30
+ var getFlowProducer = /* @__PURE__ */ __name((connection2) => {
31
+ if (isDefined2(flowProducer)) return flowProducer;
32
+ flowProducer = new FlowProducer({
33
+ connection: connection2
34
+ });
35
+ return flowProducer;
36
+ }, "getFlowProducer");
37
+
38
+ // src/queue/workers/ethTransactionMonitor.ts
39
+ import { assertEx } from "@xylabs/sdk-js";
40
+ import { PayloadBuilder } from "@xyo-network/payload-builder";
41
+ import { Worker } from "bullmq";
42
+ var name = "Monitor Submitted ETH Transaction";
43
+ var queueName = "eth-tx-monitor";
44
+ var createWorker = /* @__PURE__ */ __name((connection2) => {
45
+ new Worker(queueName, async (job) => {
46
+ const { provider, ethTxStateMap: stateMap, tx } = job.data;
47
+ const hash = await PayloadBuilder.hash(tx[0]);
48
+ const state = assertEx(await stateMap.get(hash), () => "State not found");
49
+ const submissionHash = assertEx(state?.submissionHash, () => "submissionHash not found");
50
+ const receipt = assertEx(await provider.getTransactionReceipt(submissionHash), () => "Transaction receipt not found");
51
+ await job.log(`[${hash}] confirmed ETH tx ${submissionHash} in block ${receipt.blockNumber}`);
52
+ const { blockHash, blockNumber } = receipt;
53
+ state.confirmationHash = blockHash;
54
+ await stateMap.set(hash, state);
55
+ return {
56
+ blockHash,
57
+ blockNumber
58
+ };
59
+ }, {
60
+ connection: connection2
61
+ });
62
+ }, "createWorker");
63
+ var ethTransactionMonitor = {
64
+ createWorker,
65
+ name,
66
+ queueName
67
+ };
68
+
69
+ // src/queue/workers/ethTransactionPreparation.ts
70
+ import { assertEx as assertEx2, hexToBigInt } from "@xylabs/sdk-js";
71
+ import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
72
+ import { isBridgeIntent } from "@xyo-network/xl1-protocol";
73
+ import { Worker as Worker2 } from "bullmq";
74
+ import { getAddress } from "ethers";
75
+ var name2 = "Prepare ETH Transaction";
76
+ var queueName2 = "eth-tx-prepare";
77
+ var createWorker2 = /* @__PURE__ */ __name((connection2) => {
78
+ new Worker2(queueName2, async (job) => {
79
+ const { bridge, ethTxStateMap: stateMap, tx } = job.data;
80
+ const hash = await PayloadBuilder2.hash(tx[0]);
81
+ await job.log(`[${hash}] preparing ETH transaction`);
82
+ await job.log(`[${hash}] building ETH transaction`);
83
+ const bridgeIntent = assertEx2(tx[1].find(isBridgeIntent), () => "No bridge intent found");
84
+ const amount = hexToBigInt(bridgeIntent.destAmount);
85
+ const srcAddress = getAddress(bridgeIntent.srcAddress);
86
+ const destAddress = getAddress(bridgeIntent.destAddress);
87
+ const preparedTx = await bridge.getFunction("bridgeFromRemote").populateTransaction(srcAddress, destAddress, amount);
88
+ await job.log(`[${hash}] built ETH transaction`);
89
+ await job.log(`[${hash}] storing ETH preparedTx`);
90
+ await stateMap.set(hash, {
91
+ preparedTx
92
+ });
93
+ await job.log(`[${hash}] stored ETH preparedTx`);
94
+ await job.log(`[${hash}] prepared ETH transaction`);
95
+ return {};
96
+ }, {
97
+ connection: connection2
98
+ });
99
+ }, "createWorker");
100
+ var ethTransactionPreparation = {
101
+ createWorker: createWorker2,
102
+ name: name2,
103
+ queueName: queueName2
104
+ };
105
+
106
+ // src/queue/workers/ethTransactionSubmission.ts
107
+ import { assertEx as assertEx3, isDefined as isDefined3 } from "@xylabs/sdk-js";
108
+ import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
109
+ import { Worker as Worker3 } from "bullmq";
110
+ var name3 = "Submit ETH Transaction";
111
+ var queueName3 = "eth-tx-submit";
112
+ var createWorker3 = /* @__PURE__ */ __name((connection2) => {
113
+ new Worker3(queueName3, async (job) => {
114
+ const { ethTxStateMap: stateMap, tx, wallet } = job.data;
115
+ const hash = await PayloadBuilder3.hash(tx[0]);
116
+ const state = assertEx3(await stateMap.get(hash), () => `[${hash}] state not found`);
117
+ const preparedTx = assertEx3(state?.preparedTx, () => `[${hash}] preparedTx not found`);
118
+ const { submissionHash: existingSubmissionHash } = state;
119
+ if (isDefined3(existingSubmissionHash)) {
120
+ await job.log(`[${hash}] Tx already submitted with submission response hash ${existingSubmissionHash}`);
121
+ return {
122
+ submissionHash: existingSubmissionHash
123
+ };
124
+ }
125
+ await job.log(`[${hash}] Submitting ETH tx`);
126
+ const submissionResponse = await wallet.sendTransaction(preparedTx);
127
+ const submissionHash = submissionResponse.hash;
128
+ await job.log(`[${hash}] Submitted ETH tx and received submission response hash ${submissionHash}`);
129
+ await job.log(`[${hash}] Storing ETH submissionHash`);
130
+ state.submissionHash = submissionHash;
131
+ await stateMap.set(hash, state);
132
+ await job.log(`[${hash}] Stored ETH submissionHash`);
133
+ return {
134
+ submissionHash
135
+ };
136
+ }, {
137
+ connection: connection2,
138
+ concurrency: 1
139
+ });
140
+ }, "createWorker");
141
+ var ethTransactionSubmission = {
142
+ createWorker: createWorker3,
143
+ name: name3,
144
+ queueName: queueName3
145
+ };
146
+
147
+ // src/queue/workers/xl1ToEthBridgeParent.ts
148
+ import { Worker as Worker4 } from "bullmq";
149
+ var name4 = "Bridge XL1 to Ethereum";
150
+ var queueName4 = "xl1-to-eth-bridge";
151
+ var createWorker4 = /* @__PURE__ */ __name((connection2) => {
152
+ new Worker4(queueName4, async (job) => {
153
+ await job.log(`[${job.name}] start`);
154
+ await job.log(`[${job.name}] done`);
155
+ return {
156
+ ok: true
157
+ };
158
+ }, {
159
+ connection: connection2
160
+ });
161
+ }, "createWorker");
162
+ var xl1ToEthBridgeParent = {
163
+ createWorker: createWorker4,
164
+ name: name4,
165
+ queueName: queueName4
166
+ };
167
+
168
+ // src/queue/workers/xl1TransactionMonitor.ts
169
+ import { assertEx as assertEx4, isDefined as isDefined4, isNull } from "@xylabs/sdk-js";
170
+ import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
171
+ import { UnrecoverableError, Worker as Worker5 } from "bullmq";
172
+ var name5 = "Monitor Submitted XL1 Transaction";
173
+ var queueName5 = "xl1-tx-monitor";
174
+ var createWorker5 = /* @__PURE__ */ __name((connection2) => {
175
+ new Worker5(queueName5, async (job) => {
176
+ const { gateway, tx, xl1TxStateMap: stateMap } = job.data;
177
+ const hash = await PayloadBuilder4.hash(tx[0]);
178
+ const viewer = assertEx4(gateway.connectionInstance.viewer, () => `[${hash}] viewer not defined on gateway`);
179
+ const state = assertEx4(await stateMap.get(hash), () => `[${hash}] state not found`);
180
+ await job.log(`[${hash}] Checking for XL1 transaction inclusion on chain`);
181
+ const foundTx = await viewer.transactionByHash(hash);
182
+ if (isDefined4(foundTx) && !isNull(foundTx)) {
183
+ await job.log(`[${hash}] Found transaction on chain`);
184
+ state.confirmationHash = hash;
185
+ await stateMap.set(hash, state);
186
+ return {};
187
+ }
188
+ const currentBlockNumber = await viewer.currentBlockNumber();
189
+ if (tx[0].exp < currentBlockNumber) {
190
+ await job.log(`[${hash}] Transaction expired at block ${tx[0].exp}, current block ${currentBlockNumber}`);
191
+ throw new UnrecoverableError(`[${hash}] Transaction expired and will never be included`);
192
+ }
193
+ await job.log(`[${hash}] Transaction not yet included, retrying later`);
194
+ throw new Error(`[${hash}] Transaction not yet included`);
195
+ }, {
196
+ connection: connection2
197
+ });
198
+ }, "createWorker");
199
+ var xl1TransactionMonitor = {
200
+ createWorker: createWorker5,
201
+ name: name5,
202
+ queueName: queueName5
203
+ };
204
+
205
+ // src/queue/workers/xl1TransactionPreparation.ts
206
+ import { PayloadBuilder as PayloadBuilder5 } from "@xyo-network/payload-builder";
207
+ import { Worker as Worker6 } from "bullmq";
208
+ var name6 = "Prepare XL1 Transaction";
209
+ var queueName6 = "xl1-tx-prepare";
210
+ var createWorker6 = /* @__PURE__ */ __name((connection2) => {
211
+ new Worker6(queueName6, async (job) => {
212
+ const { tx, xl1TxStateMap: stateMap } = job.data;
213
+ const hash = await PayloadBuilder5.hash(tx[0]);
214
+ await job.log(`[${hash}] preparing XL1 transaction`);
215
+ const preparedTx = tx;
216
+ await job.log(`[${hash}] storing XL1 preparedTx`);
217
+ await stateMap.set(hash, {
218
+ preparedTx
219
+ });
220
+ await job.log(`[${hash}] stored XL1 preparedTx`);
221
+ await job.log(`[${hash}] prepared XL1 transaction`);
222
+ return {};
223
+ }, {
224
+ connection: connection2
225
+ });
226
+ }, "createWorker");
227
+ var xl1TransactionPreparation = {
228
+ createWorker: createWorker6,
229
+ name: name6,
230
+ queueName: queueName6
231
+ };
232
+
233
+ // src/queue/workers/xl1TransactionSubmission.ts
234
+ import { assertEx as assertEx5, isDefined as isDefined5 } from "@xylabs/sdk-js";
235
+ import { PayloadBuilder as PayloadBuilder6 } from "@xyo-network/payload-builder";
236
+ import { Worker as Worker7 } from "bullmq";
237
+ var name7 = "Submit XL1 Transaction";
238
+ var queueName7 = "xl1-tx-submit";
239
+ var createWorker7 = /* @__PURE__ */ __name((connection2) => {
240
+ new Worker7(queueName7, async (job) => {
241
+ const { gateway, tx, xl1TxStateMap: stateMap } = job.data;
242
+ const hash = await PayloadBuilder6.hash(tx[0]);
243
+ const state = assertEx5(await stateMap.get(hash), () => `[${hash}] state not found`);
244
+ const preparedTx = assertEx5(state?.preparedTx, () => `[${hash}] preparedTx not found`);
245
+ const { submissionHash: existingSubmissionHash } = state;
246
+ if (isDefined5(existingSubmissionHash)) {
247
+ await job.log(`[${hash}] Tx already submitted with submission response hash ${existingSubmissionHash}`);
248
+ return {
249
+ submissionHash: existingSubmissionHash
250
+ };
251
+ }
252
+ await job.log(`[${hash}] Submitting XL1 tx`);
253
+ const [submissionHash] = await gateway.addTransactionToChain(preparedTx);
254
+ assertEx5(submissionHash === hash, () => `[${hash}] Submitted transaction hash ${submissionHash} does not match expected hash`);
255
+ await job.log(`[${hash}] Submitted XL1 tx`);
256
+ await job.log(`[${hash}] Storing XL1 submissionHash`);
257
+ state.submissionHash = submissionHash;
258
+ await stateMap.set(hash, state);
259
+ await job.log(`[${hash}] Stored XL1 submissionHash`);
260
+ return {
261
+ submissionHash
262
+ };
263
+ }, {
264
+ connection: connection2
265
+ });
266
+ }, "createWorker");
267
+ var xl1TransactionSubmission = {
268
+ createWorker: createWorker7,
269
+ name: name7,
270
+ queueName: queueName7
271
+ };
272
+
273
+ // src/queue/flows/createXl1ToEthBridgeJob.ts
274
+ var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) => {
275
+ const flow = await flowProducer2.add({
276
+ name: xl1ToEthBridgeParent.name,
277
+ queueName: xl1ToEthBridgeParent.queueName,
278
+ data: {
279
+ tx
280
+ },
281
+ children: [
282
+ {
283
+ name: xl1TransactionPreparation.name,
284
+ queueName: xl1TransactionPreparation.queueName,
285
+ data: {
286
+ tx
287
+ },
288
+ children: [
289
+ {
290
+ name: xl1TransactionSubmission.name,
291
+ queueName: xl1TransactionSubmission.queueName,
292
+ data: {
293
+ tx
294
+ },
295
+ children: [
296
+ {
297
+ name: xl1TransactionMonitor.name,
298
+ queueName: xl1TransactionMonitor.queueName,
299
+ data: {
300
+ tx
301
+ },
302
+ opts: {
303
+ attempts: 60,
304
+ backoff: {
305
+ type: "fixed",
306
+ delay: 5e3
307
+ }
308
+ },
309
+ children: [
310
+ {
311
+ name: ethTransactionPreparation.name,
312
+ queueName: ethTransactionPreparation.queueName,
313
+ data: {
314
+ tx
315
+ },
316
+ children: [
317
+ {
318
+ name: ethTransactionSubmission.name,
319
+ queueName: ethTransactionSubmission.queueName,
320
+ data: {
321
+ tx
322
+ },
323
+ children: [
324
+ {
325
+ name: ethTransactionMonitor.name,
326
+ queueName: ethTransactionMonitor.queueName,
327
+ data: {
328
+ tx
329
+ },
330
+ opts: {
331
+ attempts: 60,
332
+ backoff: {
333
+ type: "fixed",
334
+ delay: 5e3
335
+ }
336
+ }
337
+ }
338
+ ]
339
+ }
340
+ ]
341
+ }
342
+ ]
343
+ }
344
+ ]
345
+ }
346
+ ]
347
+ }
348
+ ]
349
+ });
350
+ return flow;
351
+ }, "createXl1ToEthBridgeJob");
352
+
353
+ // src/server/flowProducer.ts
354
+ var addFlowProducer = /* @__PURE__ */ __name((app, config) => {
355
+ const connection2 = getConnection(config);
356
+ const flowProducer2 = getFlowProducer(connection2);
357
+ app.flowProducer = flowProducer2;
358
+ return app;
359
+ }, "addFlowProducer");
360
+
10
361
  // src/server/instrumentation.ts
11
362
  import { registerInstrumentations } from "@opentelemetry/instrumentation";
12
363
  import { ExpressInstrumentation } from "@opentelemetry/instrumentation-express";
@@ -40,14 +391,14 @@ var asToken = /* @__PURE__ */ __name((value) => {
40
391
  }, "asToken");
41
392
 
42
393
  // src/config/getBridgeEscrowAddress.ts
43
- import { asAddress as asAddress2, assertEx } from "@xylabs/sdk-js";
394
+ import { asAddress as asAddress2, assertEx as assertEx6 } from "@xylabs/sdk-js";
44
395
  var tryGetBridgeEscrowAddress = /* @__PURE__ */ __name((config) => {
45
396
  const address = asAddress2(config.bridge.escrowAddress);
46
397
  return address;
47
398
  }, "tryGetBridgeEscrowAddress");
48
399
 
49
400
  // src/config/getBridgeFeesAddress.ts
50
- import { asAddress as asAddress3, assertEx as assertEx2 } from "@xylabs/sdk-js";
401
+ import { asAddress as asAddress3, assertEx as assertEx7 } from "@xylabs/sdk-js";
51
402
  var tryGetBridgeFeesAddress = /* @__PURE__ */ __name((config) => {
52
403
  const address = asAddress3(config.bridge.feesAddress);
53
404
  return address;
@@ -75,21 +426,21 @@ var getMinBridgeAmount = /* @__PURE__ */ __name((config) => {
75
426
  }, "getMinBridgeAmount");
76
427
 
77
428
  // src/config/getRemoteChainId.ts
78
- import { assertEx as assertEx3 } from "@xylabs/sdk-js";
429
+ import { assertEx as assertEx8 } from "@xylabs/sdk-js";
79
430
  var getRemoteChainId = /* @__PURE__ */ __name((config) => {
80
- const remoteChainId = assertEx3(asChainId(config.bridge.remoteChainId), () => "Invalid remote chain ID in config");
431
+ const remoteChainId = assertEx8(asChainId(config.bridge.remoteChainId), () => "Invalid remote chain ID in config");
81
432
  return remoteChainId;
82
433
  }, "getRemoteChainId");
83
434
 
84
435
  // src/config/getRemoteTokenAddress.ts
85
- import { assertEx as assertEx4 } from "@xylabs/sdk-js";
436
+ import { assertEx as assertEx9 } from "@xylabs/sdk-js";
86
437
  var getRemoteTokenAddress = /* @__PURE__ */ __name((config) => {
87
438
  const token = asToken(config.bridge.remoteTokenAddress);
88
- return assertEx4(token, () => "Remote token address is not defined in bridge configuration");
439
+ return assertEx9(token, () => "Remote token address is not defined in bridge configuration");
89
440
  }, "getRemoteTokenAddress");
90
441
 
91
442
  // src/config/getBridgeWalletAccount.ts
92
- import { isDefined, isUndefined } from "@xylabs/sdk-js";
443
+ import { isDefined as isDefined6, isUndefined } from "@xylabs/sdk-js";
93
444
  import { HDWallet } from "@xyo-network/wallet";
94
445
  import { ADDRESS_INDEX, generateXyoBaseWalletFromPhrase } from "@xyo-network/xl1-protocol-sdk";
95
446
  var accountServiceSingleton;
@@ -123,20 +474,20 @@ var getTransferAddresses = /* @__PURE__ */ __name(async (config) => {
123
474
  }, "getTransferAddresses");
124
475
 
125
476
  // src/config/getXl1ChainId.ts
126
- import { assertEx as assertEx5, isDefined as isDefined2 } from "@xylabs/sdk-js";
477
+ import { assertEx as assertEx10, isDefined as isDefined7 } from "@xylabs/sdk-js";
127
478
  var getXl1ChainId = /* @__PURE__ */ __name((config) => {
128
479
  const xl1ChainId = config.bridge.xl1ChainId;
129
- if (isDefined2(xl1ChainId)) {
130
- return assertEx5(asChainId(xl1ChainId), () => "Invalid xl1ChainId in bridge config");
480
+ if (isDefined7(xl1ChainId)) {
481
+ return assertEx10(asChainId(xl1ChainId), () => "Invalid xl1ChainId in bridge config");
131
482
  }
132
- return assertEx5(asChainId(config.chain.id), () => "Invalid chain.id in config");
483
+ return assertEx10(asChainId(config.chain.id), () => "Invalid chain.id in config");
133
484
  }, "getXl1ChainId");
134
485
 
135
486
  // src/config/getXl1TokenAddress.ts
136
- import { isDefined as isDefined3 } from "@xylabs/sdk-js";
487
+ import { isDefined as isDefined8 } from "@xylabs/sdk-js";
137
488
  var getXl1TokenAddress = /* @__PURE__ */ __name((config) => {
138
489
  const token = asToken(config.bridge.xl1TokenAddress);
139
- if (isDefined3(token)) return token;
490
+ if (isDefined8(token)) return token;
140
491
  return getXl1ChainId(config);
141
492
  }, "getXl1TokenAddress");
142
493
 
@@ -165,21 +516,24 @@ var getBridgeSettings = /* @__PURE__ */ __name(async (config) => {
165
516
  }, "getBridgeSettings");
166
517
 
167
518
  // src/config/getGateway.ts
168
- import { isDefined as isDefined4 } from "@xylabs/sdk-js";
519
+ import { isDefined as isDefined9 } from "@xylabs/sdk-js";
169
520
  import { HDWallet as HDWallet2 } from "@xyo-network/wallet";
170
- import { SimpleXyoGatewayRunner, SimpleXyoSigner } from "@xyo-network/xl1-protocol-sdk";
171
- import { HttpRpcXyoConnection } from "@xyo-network/xl1-rpc";
521
+ import { SimpleXyoGatewayRunner, SimpleXyoSigner, XyoConnectionMoniker } from "@xyo-network/xl1-protocol-sdk";
522
+ import { buildJsonRpcProviderLocator } from "@xyo-network/xl1-providers";
523
+ import { HttpRpcTransport } from "@xyo-network/xl1-rpc";
172
524
  var gatewayInstance;
173
525
  var getGateway = /* @__PURE__ */ __name(async (config) => {
174
- if (isDefined4(gatewayInstance)) return gatewayInstance;
526
+ if (isDefined9(gatewayInstance)) return gatewayInstance;
175
527
  const { mnemonic, chainRpcApiUrl: endpoint } = config.bridge;
176
- const walletPromise = isDefined4(mnemonic) ? HDWallet2.fromPhrase(mnemonic) : HDWallet2.random();
528
+ const walletPromise = isDefined9(mnemonic) ? HDWallet2.fromPhrase(mnemonic) : HDWallet2.random();
177
529
  const account = await walletPromise;
178
530
  const signer = new SimpleXyoSigner(account);
179
- const connection = new HttpRpcXyoConnection({
180
- endpoint
531
+ const transportFactory = /* @__PURE__ */ __name((schemas) => new HttpRpcTransport(endpoint, schemas), "transportFactory");
532
+ const locator = await buildJsonRpcProviderLocator({
533
+ transportFactory
181
534
  });
182
- gatewayInstance = new SimpleXyoGatewayRunner(connection, signer);
535
+ const connection2 = await locator.getInstance(XyoConnectionMoniker);
536
+ gatewayInstance = new SimpleXyoGatewayRunner(connection2, signer);
183
537
  return gatewayInstance;
184
538
  }, "getGateway");
185
539
 
@@ -274,20 +628,17 @@ var makeBridgeFromRemoteStatusRoute = /* @__PURE__ */ __name((config) => {
274
628
 
275
629
  // src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts
276
630
  import { requestHandlerValidator as requestHandlerValidator3 } from "@xylabs/express";
277
- import { assertEx as assertEx6 } from "@xylabs/sdk-js";
278
- import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
631
+ import { PayloadBuilder as PayloadBuilder10 } from "@xyo-network/payload-builder";
279
632
  import { PayloadZodStrictOfSchema as PayloadZodStrictOfSchema2 } from "@xyo-network/payload-model";
280
- import { asSentinelInstance } from "@xyo-network/sentinel-model";
281
633
  import { BridgeIntentFieldsZod, BridgeIntentSchema as BridgeIntentSchema2, BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, SignedTransactionBoundWitnessZod, TransferZod } from "@xyo-network/xl1-protocol";
282
- import { flattenHydratedTransaction } from "@xyo-network/xl1-protocol-sdk";
283
634
  import { z as z2 } from "zod";
284
635
 
285
636
  // src/util/calculateBridgeFees.ts
286
- import { hexToBigInt, toHex as toHex2 } from "@xylabs/sdk-js";
637
+ import { hexToBigInt as hexToBigInt2, toHex as toHex2 } from "@xylabs/sdk-js";
287
638
  var calculateBridgeFees = /* @__PURE__ */ __name((srcAmount, feeStructure) => {
288
639
  const { feeFixed, feeRateBasisPoints } = feeStructure;
289
- const srcAmountBigInt = hexToBigInt(srcAmount);
290
- const feeFixedBigInt = hexToBigInt(feeFixed);
640
+ const srcAmountBigInt = hexToBigInt2(srcAmount);
641
+ const feeFixedBigInt = hexToBigInt2(feeFixed);
291
642
  const feeVariableBigInt = srcAmountBigInt * BigInt(feeRateBasisPoints) / 10000n;
292
643
  const feeVariable = toHex2(feeVariableBigInt);
293
644
  const feeTotalBigInt = feeFixedBigInt + feeVariableBigInt;
@@ -301,10 +652,10 @@ var calculateBridgeFees = /* @__PURE__ */ __name((srcAmount, feeStructure) => {
301
652
  }, "calculateBridgeFees");
302
653
 
303
654
  // src/util/generateBridgeEstimate.ts
304
- import { hexToBigInt as hexToBigInt2, toAddress as toAddress2 } from "@xylabs/sdk-js";
305
- import { createTransferPayload } from "@xyo-network/chain-protocol";
306
- import { PayloadBuilder } from "@xyo-network/payload-builder";
655
+ import { hexToBigInt as hexToBigInt3, toAddress as toAddress2 } from "@xylabs/sdk-js";
656
+ import { PayloadBuilder as PayloadBuilder7 } from "@xyo-network/payload-builder";
307
657
  import { BridgeIntentSchema } from "@xyo-network/xl1-protocol";
658
+ import { createTransferPayload } from "@xyo-network/xl1-protocol-sdk";
308
659
  import { v4 } from "uuid";
309
660
  var generateBridgeEstimate = /* @__PURE__ */ __name(async (srcAddress, srcAmount, destAddress, config, nonceOverride) => {
310
661
  const { escrowAddress, feeFixed, feeRateBasisPoints, feesAddress, remoteChainId, remoteTokenAddress, xl1ChainId, xl1TokenAddress } = await getBridgeSettings(config);
@@ -328,7 +679,7 @@ var generateBridgeEstimate = /* @__PURE__ */ __name(async (srcAddress, srcAmount
328
679
  destToken: remoteTokenAddress,
329
680
  nonce
330
681
  };
331
- const bridgeIntent = new PayloadBuilder({
682
+ const bridgeIntent = new PayloadBuilder7({
332
683
  schema: BridgeIntentSchema
333
684
  }).fields(bridgeIntentFields).build();
334
685
  const context = {
@@ -337,8 +688,8 @@ var generateBridgeEstimate = /* @__PURE__ */ __name(async (srcAddress, srcAmount
337
688
  feeVariable
338
689
  };
339
690
  const transfer = createTransferPayload(sender, {
340
- [escrowAddress]: hexToBigInt2(destAmount),
341
- [feesAddress]: hexToBigInt2(feeFixedAmount) + hexToBigInt2(feeVariable)
691
+ [escrowAddress]: hexToBigInt3(destAmount),
692
+ [feesAddress]: hexToBigInt3(feeFixedAmount) + hexToBigInt3(feeVariable)
342
693
  }, context);
343
694
  return [
344
695
  bridgeIntent,
@@ -348,31 +699,33 @@ var generateBridgeEstimate = /* @__PURE__ */ __name(async (srcAddress, srcAmount
348
699
 
349
700
  // src/util/validateBridgeEstimateExact.ts
350
701
  import { isUndefined as isUndefined3 } from "@xylabs/sdk-js";
351
- import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
702
+ import { PayloadBuilder as PayloadBuilder8 } from "@xyo-network/payload-builder";
352
703
  var validateBridgeEstimateExact = /* @__PURE__ */ __name(async (intent, transfer, config) => {
353
704
  const { srcAddress, srcAmount, destAddress } = intent;
354
705
  const [calculatedIntent, calculatedTransfer] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config);
355
706
  if (isUndefined3(calculatedIntent) || isUndefined3(calculatedTransfer)) return false;
356
707
  const { nonce: expectedIntentNonce, ...expectedIntentStatic } = calculatedIntent;
357
708
  const { nonce: actualIntentNonce, ...actualIntentStatic } = intent;
358
- if (await PayloadBuilder2.dataHash(expectedIntentStatic) !== await PayloadBuilder2.dataHash(actualIntentStatic)) return false;
709
+ if (await PayloadBuilder8.dataHash(expectedIntentStatic) !== await PayloadBuilder8.dataHash(actualIntentStatic)) return false;
359
710
  const { epoch: expectedTransferEpoch, ...expectedTransferStatic } = calculatedTransfer;
360
711
  const { epoch: actualTransferEpoch, ...actualTransferStatic } = transfer;
361
- if (await PayloadBuilder2.dataHash(expectedTransferStatic) !== await PayloadBuilder2.dataHash(actualTransferStatic)) return false;
712
+ if (await PayloadBuilder8.dataHash(expectedTransferStatic) !== await PayloadBuilder8.dataHash(actualTransferStatic)) return false;
362
713
  return true;
363
714
  }, "validateBridgeEstimateExact");
364
715
 
365
716
  // src/util/validateBridgeTransaction.ts
366
- import { asAddress as asAddress4, isDefined as isDefined5 } from "@xylabs/sdk-js";
717
+ import { asAddress as asAddress4, isDefined as isDefined10 } from "@xylabs/sdk-js";
367
718
  import { addressesContains, BoundWitnessValidator, payloadHashesContainsAll } from "@xyo-network/boundwitness-validator";
368
- import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
719
+ import { PayloadBuilder as PayloadBuilder9 } from "@xyo-network/payload-builder";
369
720
  var validateBridgeTransaction = /* @__PURE__ */ __name(async (signedTxBw, intent, transfer, config) => {
370
721
  const { srcAddress } = intent;
722
+ const chainId = getXl1ChainId(config);
723
+ if (signedTxBw.chain !== chainId) return false;
371
724
  const errors = await new BoundWitnessValidator(signedTxBw).validate();
372
- if (isDefined5(errors) && errors.length > 0) return false;
725
+ if (isDefined10(errors) && errors.length > 0) return false;
373
726
  const sender = asAddress4(srcAddress, true);
374
727
  if (!addressesContains(signedTxBw, sender)) return false;
375
- const hashes = await PayloadBuilder3.hashes([
728
+ const hashes = await PayloadBuilder9.hashes([
376
729
  intent,
377
730
  transfer
378
731
  ]);
@@ -401,7 +754,7 @@ var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
401
754
  path: "/bridge/chains/:chainId/bridgeToRemote",
402
755
  handlers: validateRequest2(async (req, res) => {
403
756
  const [signedTxBw, bridgeIntent, transfer] = req.body;
404
- const { node } = req.app;
757
+ const { flowProducer: flowProducer2 } = req.app;
405
758
  const transactionValid = await validateBridgeTransaction(signedTxBw, bridgeIntent, transfer, config);
406
759
  if (!transactionValid) {
407
760
  res.status(400).send();
@@ -412,8 +765,6 @@ var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
412
765
  res.status(400).send();
413
766
  return;
414
767
  }
415
- const mod = await node.resolve("XL1BridgeIntentTransactionCompletionMonitorSentinel");
416
- const sentinel = assertEx6(asSentinelInstance(mod), () => "Error resolving XL1BridgeIntentTransactionCompletionMonitorSentinel");
417
768
  const singedHydratedTransaction = [
418
769
  signedTxBw,
419
770
  [
@@ -421,20 +772,15 @@ var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
421
772
  bridgeIntent
422
773
  ]
423
774
  ];
424
- const observation = await sentinel.report(flattenHydratedTransaction(singedHydratedTransaction));
425
- if (observation.length === 0) {
426
- console.error("Error submitting bridge intent transaction to sentinel");
427
- res.status(500).send();
428
- return;
429
- }
430
- const srcConfirmation = await PayloadBuilder4.hash(signedTxBw);
775
+ await createXl1ToEthBridgeJob(flowProducer2, singedHydratedTransaction);
776
+ const srcConfirmation = await PayloadBuilder10.hash(signedTxBw);
431
777
  const bridgeCommonFieldsZod = z2.object({}).extend(BridgeSourceObservationFieldsZod.shape);
432
778
  const bridgeCommonFields = bridgeCommonFieldsZod.parse(bridgeIntent);
433
779
  const bridgeObservationFields = {
434
780
  ...bridgeCommonFields,
435
781
  srcConfirmation
436
782
  };
437
- const bridgeObservation = new PayloadBuilder4({
783
+ const bridgeObservation = new PayloadBuilder10({
438
784
  schema: BridgeSourceObservationSchema
439
785
  }).fields(bridgeObservationFields).build();
440
786
  res.json(bridgeObservation);
@@ -444,7 +790,7 @@ var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
444
790
 
445
791
  // src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.ts
446
792
  import { requestHandlerValidator as requestHandlerValidator4 } from "@xylabs/express";
447
- import { assertEx as assertEx7, toAddress as toAddress3 } from "@xylabs/sdk-js";
793
+ import { assertEx as assertEx11, toAddress as toAddress3 } from "@xylabs/sdk-js";
448
794
  import { PayloadZodLooseOfSchema, PayloadZodStrictOfSchema as PayloadZodStrictOfSchema3 } from "@xyo-network/payload-model";
449
795
  import { BridgeIntentFieldsZod as BridgeIntentFieldsZod2, BridgeIntentSchema as BridgeIntentSchema3, toXL1BlockNumber, TransactionBoundWitnessZod, TransferSchema } from "@xyo-network/xl1-protocol";
450
796
  import { buildUnsignedTransaction } from "@xyo-network/xl1-protocol-sdk";
@@ -477,7 +823,7 @@ var makeBridgeToRemoteEstimateRoute = /* @__PURE__ */ __name((config) => {
477
823
  const [bridgeIntent, transfer] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config);
478
824
  const sender = toAddress3(srcAddress);
479
825
  const gateway = await getGateway(config);
480
- const viewer = assertEx7(gateway.connectionInstance.viewer, () => new Error("Viewer not available on gateway connection"));
826
+ const viewer = assertEx11(gateway.connectionInstance.viewer, () => new Error("Viewer not available on gateway connection"));
481
827
  const currentBlockNumber = await viewer.currentBlockNumber();
482
828
  const nbf = toXL1BlockNumber(currentBlockNumber, true);
483
829
  const exp = toXL1BlockNumber(currentBlockNumber + 1e3, true);
@@ -560,7 +906,8 @@ var makeBridgeToRemoteStatusRoute = /* @__PURE__ */ __name((config) => {
560
906
  src,
561
907
  srcAddress,
562
908
  srcAmount,
563
- srcToken
909
+ srcToken,
910
+ srcConfirmation: toHex3("0x8888")
564
911
  };
565
912
  result[1] = observation;
566
913
  }
@@ -624,41 +971,42 @@ var getApp = /* @__PURE__ */ __name((node, config) => {
624
971
  app.use(customPoweredByHeader);
625
972
  disableCaseSensitiveRouting(app);
626
973
  app.node = node;
974
+ addFlowProducer(app, config);
627
975
  addRoutes(app, config);
628
976
  app.use(standardErrors);
629
977
  return app;
630
978
  }, "getApp");
631
979
 
632
980
  // src/server/server.ts
633
- import { assertEx as assertEx11, isDefined as isDefined9, isString } from "@xylabs/sdk-js";
981
+ import { assertEx as assertEx16, isDefined as isDefined15, isString } from "@xylabs/sdk-js";
634
982
  import { boot } from "@xyo-network/bios";
635
- import { HDWallet as HDWallet4 } from "@xyo-network/wallet";
983
+ import { HDWallet as HDWallet5 } from "@xyo-network/wallet";
636
984
 
637
985
  // src/manifest/getLocator.ts
638
986
  import { BaseMongoSdk } from "@xylabs/mongo";
639
- import { assertEx as assertEx10, isDefined as isDefined8 } from "@xylabs/sdk-js";
987
+ import { assertEx as assertEx14, isDefined as isDefined13 } from "@xylabs/sdk-js";
640
988
  import { MemoryArchivist } from "@xyo-network/archivist-memory";
641
989
  import { MongoDBArchivistV2 } from "@xyo-network/archivist-mongodb";
642
990
  import { ViewArchivist } from "@xyo-network/archivist-view";
643
- import { mapToMapType, MongoMap } from "@xyo-network/chain-protocol";
991
+ import { MongoMap } from "@xyo-network/chain-protocol";
644
992
  import { initEvmProvider } from "@xyo-network/chain-services";
645
993
  import { initTelemetry } from "@xyo-network/chain-telemetry";
646
994
  import { AbstractModule, LoggerModuleStatusReporter } from "@xyo-network/module-abstract";
647
995
  import { ModuleFactoryLocator } from "@xyo-network/module-factory-locator";
648
996
  import { MemorySentinel } from "@xyo-network/sentinel-memory";
649
997
  import { HDWallet as HDWallet3 } from "@xyo-network/wallet";
650
- import { hasMongoConfig, SimpleXyoGatewayRunner as SimpleXyoGatewayRunner2, SimpleXyoSigner as SimpleXyoSigner2 } from "@xyo-network/xl1-protocol-sdk";
651
- import { HttpRpcXyoConnection as HttpRpcXyoConnection2 } from "@xyo-network/xl1-rpc";
998
+ import { hasMongoConfig, mapToMapType, SimpleXyoGatewayRunner as SimpleXyoGatewayRunner2, SimpleXyoSigner as SimpleXyoSigner2 } from "@xyo-network/xl1-protocol-sdk";
999
+ import { SimpleXyoConnection } from "@xyo-network/xl1-providers";
652
1000
 
653
1001
  // src/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/EVMLiquidityBridgeTransactionCompletionMonitorSentinel.ts
654
- import { asAddress as asAddress6, asHex as asHex4, assertEx as assertEx8, delay, hexFromBigInt, hexToBigInt as hexToBigInt3, isDefined as isDefined6, isUndefined as isUndefined4 } from "@xylabs/sdk-js";
655
- import { PayloadBuilder as PayloadBuilder5 } from "@xyo-network/payload-builder";
1002
+ import { asAddress as asAddress6, asHex as asHex4, assertEx as assertEx12, delay, hexFromBigInt, hexToBigInt as hexToBigInt4, isDefined as isDefined11, isUndefined as isUndefined4 } from "@xylabs/sdk-js";
1003
+ import { PayloadBuilder as PayloadBuilder11 } from "@xyo-network/payload-builder";
656
1004
  import { AbstractSentinel } from "@xyo-network/sentinel-abstract";
657
1005
  import { LiquidityPoolBridge__factory } from "@xyo-network/typechain";
658
- import { BridgeDestinationObservationSchema as BridgeDestinationObservationSchema3, isBridgeIntent } from "@xyo-network/xl1-protocol";
659
- import { flattenHydratedTransaction as flattenHydratedTransaction2, flattenHydratedTransactions, tryUnflattenHydratedTransaction } from "@xyo-network/xl1-protocol-sdk";
1006
+ import { BridgeDestinationObservationSchema as BridgeDestinationObservationSchema3, isBridgeIntent as isBridgeIntent2 } from "@xyo-network/xl1-protocol";
1007
+ import { flattenHydratedTransaction, flattenHydratedTransactions, tryUnflattenHydratedTransaction } from "@xyo-network/xl1-protocol-sdk";
660
1008
  import { Mutex } from "async-mutex";
661
- import { getAddress } from "ethers/address";
1009
+ import { getAddress as getAddress2 } from "ethers/address";
662
1010
  import { Wallet } from "ethers/wallet";
663
1011
  var EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema = "network.xyo.sentinel.chain.evm.liquidity.bridge.transaction.completion.monitor.config";
664
1012
  var defaultJobCheckIntervalMs = 15e3;
@@ -681,19 +1029,19 @@ var EVMLiquidityBridgeTransactionCompletionMonitorSentinel = class extends Abstr
681
1029
  _successCounter;
682
1030
  _wallet;
683
1031
  get bridge() {
684
- return assertEx8(this._bridge, () => new Error("Bridge contract not initialized"));
1032
+ return assertEx12(this._bridge, () => new Error("Bridge contract not initialized"));
685
1033
  }
686
1034
  get completedTransactions() {
687
- return assertEx8(this.params.completedTransactions, () => "Completed transactions map is not defined");
1035
+ return assertEx12(this.params.completedTransactions, () => "Completed transactions map is not defined");
688
1036
  }
689
1037
  get jobCheckInterval() {
690
- return isDefined6(this.config.jobCheckInterval) ? this.config.jobCheckInterval : defaultJobCheckIntervalMs;
1038
+ return isDefined11(this.config.jobCheckInterval) ? this.config.jobCheckInterval : defaultJobCheckIntervalMs;
691
1039
  }
692
1040
  get pendingTransactions() {
693
- return assertEx8(this.params.pendingTransactions, () => "Pending transactions map is not defined");
1041
+ return assertEx12(this.params.pendingTransactions, () => "Pending transactions map is not defined");
694
1042
  }
695
1043
  get wallet() {
696
- return assertEx8(this._wallet, () => "wallet is required");
1044
+ return assertEx12(this._wallet, () => "wallet is required");
697
1045
  }
698
1046
  async createHandler() {
699
1047
  await super.createHandler();
@@ -710,24 +1058,24 @@ var EVMLiquidityBridgeTransactionCompletionMonitorSentinel = class extends Abstr
710
1058
  description: "Number of errors"
711
1059
  });
712
1060
  const { provider, bridgeAddress } = this.params;
713
- const key = assertEx8(this.account?.private?.hex, () => new Error("Account private key is required"));
1061
+ const key = assertEx12(this.account?.private?.hex, () => new Error("Account private key is required"));
714
1062
  this._wallet = new Wallet(key, provider);
715
- this._bridge = LiquidityPoolBridge__factory.connect(getAddress(bridgeAddress), this._wallet);
1063
+ this._bridge = LiquidityPoolBridge__factory.connect(getAddress2(bridgeAddress), this._wallet);
716
1064
  const network = await provider.getNetwork();
717
- this._bridgeChainId = assertEx8(hexFromBigInt(network.chainId), () => new Error("Failed to parse bridgeChainId"));
1065
+ this._bridgeChainId = assertEx12(hexFromBigInt(network.chainId), () => new Error("Failed to parse bridgeChainId"));
718
1066
  const tokenAddress = await this.bridge.token();
719
1067
  this._bridgeTokenAddress = asAddress6(tokenAddress, true);
720
1068
  const bridgeRemoteChain = await this.bridge.remoteChain();
721
1069
  this._bridgeRemoteChainId = asHex4(bridgeRemoteChain);
722
1070
  }
723
1071
  async reportHandler(payloads) {
724
- if (isDefined6(payloads) && payloads.length > 0) {
1072
+ if (isDefined11(payloads) && payloads.length > 0) {
725
1073
  const signedHydratedTransaction = tryUnflattenHydratedTransaction(payloads);
726
- if (isDefined6(signedHydratedTransaction)) {
727
- const txHash = await PayloadBuilder5.hash(signedHydratedTransaction[0]);
1074
+ if (isDefined11(signedHydratedTransaction)) {
1075
+ const txHash = await PayloadBuilder11.hash(signedHydratedTransaction[0]);
728
1076
  this.logger?.info(`Adding transaction ${signedHydratedTransaction[0]} with hash ${txHash} to pending transactions for monitoring`);
729
1077
  await this.pendingTransactions.set(txHash, signedHydratedTransaction);
730
- return flattenHydratedTransaction2(signedHydratedTransaction);
1078
+ return flattenHydratedTransaction(signedHydratedTransaction);
731
1079
  }
732
1080
  return [];
733
1081
  } else {
@@ -751,7 +1099,7 @@ var EVMLiquidityBridgeTransactionCompletionMonitorSentinel = class extends Abstr
751
1099
  hash,
752
1100
  signedHydratedTransaction
753
1101
  ]);
754
- if (isDefined6(result)) results.push(result[1]);
1102
+ if (isDefined11(result)) results.push(result[1]);
755
1103
  await delay(this.jobCheckInterval);
756
1104
  }
757
1105
  return flattenHydratedTransactions(results);
@@ -761,7 +1109,7 @@ var EVMLiquidityBridgeTransactionCompletionMonitorSentinel = class extends Abstr
761
1109
  try {
762
1110
  let ret = void 0;
763
1111
  this._checkCounter?.add(1);
764
- const bridgeIntents = signedHydratedTransaction[1].filter(isBridgeIntent);
1112
+ const bridgeIntents = signedHydratedTransaction[1].filter(isBridgeIntent2);
765
1113
  if (bridgeIntents.length !== 1) {
766
1114
  await this.pendingTransactions.delete(hash);
767
1115
  return ret;
@@ -784,10 +1132,10 @@ var EVMLiquidityBridgeTransactionCompletionMonitorSentinel = class extends Abstr
784
1132
  * @returns Relays the intent in a blocking manner, returning the resulting BridgeDestinationObservation if successful
785
1133
  */
786
1134
  async relayBridgeIntentSync(bridgeIntent) {
787
- const amount = hexToBigInt3(bridgeIntent.destAmount);
1135
+ const amount = hexToBigInt4(bridgeIntent.destAmount);
788
1136
  const nonce = await this.wallet.getNonce();
789
- const srcAddress = getAddress(bridgeIntent.srcAddress);
790
- const destAddress = getAddress(bridgeIntent.destAddress);
1137
+ const srcAddress = getAddress2(bridgeIntent.srcAddress);
1138
+ const destAddress = getAddress2(bridgeIntent.destAddress);
791
1139
  const tx = await this.bridge.bridgeFromRemote(srcAddress, destAddress, amount, {
792
1140
  nonce
793
1141
  });
@@ -795,7 +1143,7 @@ var EVMLiquidityBridgeTransactionCompletionMonitorSentinel = class extends Abstr
795
1143
  const transactionResponse = await confirmation?.getTransaction();
796
1144
  const destConfirmation = asHex4(transactionResponse?.hash ?? "", true);
797
1145
  const { schema, ...rest } = bridgeIntent;
798
- const result = new PayloadBuilder5({
1146
+ const result = new PayloadBuilder11({
799
1147
  schema: BridgeDestinationObservationSchema3
800
1148
  }).fields({
801
1149
  ...rest,
@@ -806,10 +1154,10 @@ var EVMLiquidityBridgeTransactionCompletionMonitorSentinel = class extends Abstr
806
1154
  };
807
1155
 
808
1156
  // src/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.ts
809
- import { assertEx as assertEx9, delay as delay2, isDefined as isDefined7, isNull, isUndefined as isUndefined5 } from "@xylabs/sdk-js";
810
- import { PayloadBuilder as PayloadBuilder6 } from "@xyo-network/payload-builder";
1157
+ import { assertEx as assertEx13, delay as delay2, isDefined as isDefined12, isNull as isNull2, isUndefined as isUndefined5 } from "@xylabs/sdk-js";
1158
+ import { PayloadBuilder as PayloadBuilder12 } from "@xyo-network/payload-builder";
811
1159
  import { AbstractSentinel as AbstractSentinel2 } from "@xyo-network/sentinel-abstract";
812
- import { flattenHydratedTransaction as flattenHydratedTransaction3, flattenHydratedTransactions as flattenHydratedTransactions2, tryUnflattenHydratedTransaction as tryUnflattenHydratedTransaction2 } from "@xyo-network/xl1-protocol-sdk";
1160
+ import { flattenHydratedTransaction as flattenHydratedTransaction2, flattenHydratedTransactions as flattenHydratedTransactions2, tryUnflattenHydratedTransaction as tryUnflattenHydratedTransaction2 } from "@xyo-network/xl1-protocol-sdk";
813
1161
  import { Mutex as Mutex2 } from "async-mutex";
814
1162
  var XL1TransactionCompletionMonitorSentinelConfigSchema = "network.xyo.sentinel.chain.transaction.completion.monitor.config";
815
1163
  var defaultJobCheckIntervalMs2 = 15e3;
@@ -827,16 +1175,16 @@ var XL1TransactionCompletionMonitorSentinel = class extends AbstractSentinel2 {
827
1175
  _reportMutex = new Mutex2();
828
1176
  _successCounter;
829
1177
  get completedTransactions() {
830
- return assertEx9(this.params.completedTransactions, () => "Completed transactions map is not defined");
1178
+ return assertEx13(this.params.completedTransactions, () => "Completed transactions map is not defined");
831
1179
  }
832
1180
  get jobCheckInterval() {
833
- return isDefined7(this.config.jobCheckInterval) ? this.config.jobCheckInterval : defaultJobCheckIntervalMs2;
1181
+ return isDefined12(this.config.jobCheckInterval) ? this.config.jobCheckInterval : defaultJobCheckIntervalMs2;
834
1182
  }
835
1183
  get pendingTransactions() {
836
- return assertEx9(this.params.pendingTransactions, () => "Pending transactions map is not defined");
1184
+ return assertEx13(this.params.pendingTransactions, () => "Pending transactions map is not defined");
837
1185
  }
838
1186
  get viewer() {
839
- return assertEx9(this.params.viewer, () => "Viewer is not defined in params");
1187
+ return assertEx13(this.params.viewer, () => "Viewer is not defined in params");
840
1188
  }
841
1189
  async createHandler() {
842
1190
  await super.createHandler();
@@ -854,13 +1202,13 @@ var XL1TransactionCompletionMonitorSentinel = class extends AbstractSentinel2 {
854
1202
  });
855
1203
  }
856
1204
  async reportHandler(payloads) {
857
- if (isDefined7(payloads) && payloads.length > 0) {
1205
+ if (isDefined12(payloads) && payloads.length > 0) {
858
1206
  const signedHydratedTransaction = tryUnflattenHydratedTransaction2(payloads);
859
- if (isDefined7(signedHydratedTransaction)) {
860
- const txHash = await PayloadBuilder6.hash(signedHydratedTransaction[0]);
1207
+ if (isDefined12(signedHydratedTransaction)) {
1208
+ const txHash = await PayloadBuilder12.hash(signedHydratedTransaction[0]);
861
1209
  this.logger?.info(`Adding transaction ${signedHydratedTransaction[0]} with hash ${txHash} to pending transactions for monitoring`);
862
1210
  await this.pendingTransactions.set(txHash, signedHydratedTransaction);
863
- return flattenHydratedTransaction3(signedHydratedTransaction);
1211
+ return flattenHydratedTransaction2(signedHydratedTransaction);
864
1212
  }
865
1213
  return [];
866
1214
  } else {
@@ -884,7 +1232,7 @@ var XL1TransactionCompletionMonitorSentinel = class extends AbstractSentinel2 {
884
1232
  hash,
885
1233
  signedHydratedTransaction
886
1234
  ]);
887
- if (isDefined7(result)) results.push(result[1]);
1235
+ if (isDefined12(result)) results.push(result[1]);
888
1236
  await delay2(this.jobCheckInterval);
889
1237
  }
890
1238
  return flattenHydratedTransactions2(results);
@@ -896,7 +1244,7 @@ var XL1TransactionCompletionMonitorSentinel = class extends AbstractSentinel2 {
896
1244
  this._checkCounter?.add(1);
897
1245
  this._attemptsCounter?.add(1);
898
1246
  const tx = await this.viewer.transactionByHash(hash);
899
- if (isDefined7(tx) && !isNull(tx)) {
1247
+ if (isDefined12(tx) && !isNull2(tx)) {
900
1248
  await this.completedTransactions.set(hash, signedHydratedTransaction);
901
1249
  this.logger?.info(`Found transaction ${signedHydratedTransaction[0]} with hash ${hash}`);
902
1250
  this.logger?.info(`Removing completed transaction ${signedHydratedTransaction[0]} with hash ${hash}`);
@@ -937,7 +1285,7 @@ var getLocator = /* @__PURE__ */ __name(async (context) => {
937
1285
  port
938
1286
  }
939
1287
  });
940
- if (isDefined8(logger)) AbstractModule.defaultLogger = logger;
1288
+ if (isDefined13(logger)) AbstractModule.defaultLogger = logger;
941
1289
  const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : void 0;
942
1290
  const locator = new ModuleFactoryLocator();
943
1291
  const mongoConfig = config.storage?.mongo;
@@ -974,7 +1322,7 @@ var getLocator = /* @__PURE__ */ __name(async (context) => {
974
1322
  statusReporter
975
1323
  }));
976
1324
  const gateway = await getGateway2(config);
977
- const viewer = assertEx10(gateway.connectionInstance.viewer, () => "Gateway viewer is not defined");
1325
+ const viewer = assertEx14(gateway.connectionInstance.viewer, () => "Gateway viewer is not defined");
978
1326
  const pendingXl1ToEthXl1BridgeIntentTransactions = await getIterableMap(config, "liquidity_bridge_xl1_to_eth_xl1_pending");
979
1327
  const completedXl1ToEthXl1BridgeIntentTransactions = await getIterableMap(config, "liquidity_bridge_xl1_to_eth_xl1_completed");
980
1328
  const xl1TransactionCompletionMonitorSentinelParams = {
@@ -1011,13 +1359,11 @@ var getLocator = /* @__PURE__ */ __name(async (context) => {
1011
1359
  }, "getLocator");
1012
1360
  var getGateway2 = /* @__PURE__ */ __name(async (config) => {
1013
1361
  const { mnemonic, chainRpcApiUrl: endpoint } = config.bridge;
1014
- const walletPromise = isDefined8(mnemonic) ? HDWallet3.fromPhrase(mnemonic) : HDWallet3.random();
1362
+ const walletPromise = isDefined13(mnemonic) ? HDWallet3.fromPhrase(mnemonic) : HDWallet3.random();
1015
1363
  const account = await walletPromise;
1016
1364
  const signer = new SimpleXyoSigner2(account);
1017
- const connection = new HttpRpcXyoConnection2({
1018
- endpoint
1019
- });
1020
- const gateway = new SimpleXyoGatewayRunner2(connection, signer);
1365
+ const connection2 = await SimpleXyoConnection.create();
1366
+ const gateway = new SimpleXyoGatewayRunner2(connection2, signer);
1021
1367
  return gateway;
1022
1368
  }, "getGateway");
1023
1369
  var getIterableMap = /* @__PURE__ */ __name(async (config, collection) => {
@@ -1197,6 +1543,82 @@ var getNode = /* @__PURE__ */ __name(async (context) => {
1197
1543
  return node;
1198
1544
  }, "getNode");
1199
1545
 
1546
+ // src/manifest/getServices.ts
1547
+ import { BaseMongoSdk as BaseMongoSdk2 } from "@xylabs/mongo";
1548
+ import { assertEx as assertEx15, isDefined as isDefined14 } from "@xylabs/sdk-js";
1549
+ import { MongoMap as MongoMap2 } from "@xyo-network/chain-protocol";
1550
+ import { initEvmProvider as initEvmProvider2 } from "@xyo-network/chain-services";
1551
+ import { LiquidityPoolBridge__factory as LiquidityPoolBridge__factory2 } from "@xyo-network/typechain";
1552
+ import { HDWallet as HDWallet4 } from "@xyo-network/wallet";
1553
+ import { hasMongoConfig as hasMongoConfig2, mapToMapType as mapToMapType2, SimpleXyoGatewayRunner as SimpleXyoGatewayRunner3, SimpleXyoSigner as SimpleXyoSigner3, XyoConnectionMoniker as XyoConnectionMoniker2 } from "@xyo-network/xl1-protocol-sdk";
1554
+ import { buildJsonRpcProviderLocator as buildJsonRpcProviderLocator2 } from "@xyo-network/xl1-providers";
1555
+ import { HttpRpcTransport as HttpRpcTransport2 } from "@xyo-network/xl1-rpc";
1556
+ import { getAddress as getAddress3, Wallet as Wallet2 } from "ethers";
1557
+ var getServices = /* @__PURE__ */ __name(async (context) => {
1558
+ const { config } = context;
1559
+ const gateway = await getGateway3(config);
1560
+ const ethTxStateMap = await getIterableMap2(config, "liquidity_bridge_xl1_to_eth_eth_tx_state");
1561
+ const xl1TxStateMap = await getIterableMap2(config, "liquidity_bridge_xl1_to_eth_xl1_tx_state");
1562
+ const provider = await initEvmProvider2({
1563
+ config
1564
+ });
1565
+ const { remoteBridgeContractAddress, remoteChainWalletPrivateKey, mnemonic } = config.bridge;
1566
+ const account = isDefined14(mnemonic) ? await HDWallet4.fromPhrase(mnemonic) : await HDWallet4.random();
1567
+ const wallet = new Wallet2(remoteChainWalletPrivateKey, provider);
1568
+ const bridge = LiquidityPoolBridge__factory2.connect(getAddress3(remoteBridgeContractAddress), wallet);
1569
+ const bridgeOwner = await bridge.owner();
1570
+ assertEx15(bridgeOwner.toLowerCase() === wallet.address.toLowerCase(), () => "Wallet is not the owner of the bridge contract");
1571
+ return {
1572
+ account,
1573
+ bridge,
1574
+ ethTxStateMap,
1575
+ gateway,
1576
+ provider,
1577
+ wallet,
1578
+ xl1TxStateMap
1579
+ };
1580
+ }, "getServices");
1581
+ var getGateway3 = /* @__PURE__ */ __name(async (config) => {
1582
+ const { mnemonic, chainRpcApiUrl: endpoint } = config.bridge;
1583
+ const walletPromise = isDefined14(mnemonic) ? HDWallet4.fromPhrase(mnemonic) : HDWallet4.random();
1584
+ const account = await walletPromise;
1585
+ const signer = new SimpleXyoSigner3(account);
1586
+ const transportFactory = /* @__PURE__ */ __name((schemas) => new HttpRpcTransport2(endpoint, schemas), "transportFactory");
1587
+ const locator = await buildJsonRpcProviderLocator2({
1588
+ transportFactory
1589
+ });
1590
+ const connection2 = await locator.getInstance(XyoConnectionMoniker2);
1591
+ const gateway = new SimpleXyoGatewayRunner3(connection2, signer);
1592
+ return gateway;
1593
+ }, "getGateway");
1594
+ var getIterableMap2 = /* @__PURE__ */ __name(async (config, collection) => {
1595
+ const mongoConfig = config.storage?.mongo;
1596
+ if (hasMongoConfig2(mongoConfig)) {
1597
+ const { connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName } = mongoConfig;
1598
+ const payloadSdkConfig = {
1599
+ dbConnectionString,
1600
+ dbDomain,
1601
+ dbName,
1602
+ dbPassword,
1603
+ dbUserName
1604
+ };
1605
+ const sdkBalanceSummaryMap = new BaseMongoSdk2({
1606
+ ...payloadSdkConfig,
1607
+ collection
1608
+ });
1609
+ const result = await MongoMap2.create({
1610
+ sdk: sdkBalanceSummaryMap,
1611
+ getCache: {
1612
+ enabled: true,
1613
+ maxEntries: 5e3
1614
+ }
1615
+ });
1616
+ return result;
1617
+ } else {
1618
+ return mapToMapType2(/* @__PURE__ */ new Map());
1619
+ }
1620
+ }, "getIterableMap");
1621
+
1200
1622
  // src/server/server.ts
1201
1623
  var hostname = "::";
1202
1624
  var getSeedPhrase = /* @__PURE__ */ __name(async (bios, config, logger) => {
@@ -1211,20 +1633,20 @@ var getSeedPhrase = /* @__PURE__ */ __name(async (bios, config, logger) => {
1211
1633
  if (isString(mnemonic)) {
1212
1634
  seedPhrase = mnemonic;
1213
1635
  } else {
1214
- seedPhrase = HDWallet4.generateMnemonic();
1636
+ seedPhrase = HDWallet5.generateMnemonic();
1215
1637
  logger?.log("[Bridge] No mnemonic provided, using random mnemonic. This is not recommended for production use.");
1216
1638
  logger?.log(`[Bridge] Mnemonic: ${seedPhrase}`);
1217
1639
  }
1218
1640
  await bios.seedPhraseStore.set("os", seedPhrase);
1219
1641
  }
1220
- return assertEx11(await bios.seedPhraseStore.get("os"), () => "Unable to acquire mnemonic from bios");
1642
+ return assertEx16(await bios.seedPhraseStore.get("os"), () => "Unable to acquire mnemonic from bios");
1221
1643
  }, "getSeedPhrase");
1222
1644
  var getServer = /* @__PURE__ */ __name(async (context) => {
1223
1645
  const { logger, config } = context;
1224
1646
  const { port, mnemonic } = config.bridge;
1225
1647
  const bios = await boot();
1226
- const seedPhrase = isDefined9(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger);
1227
- const wallet = await HDWallet4.fromPhrase(seedPhrase);
1648
+ const seedPhrase = isDefined15(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger);
1649
+ const wallet = await HDWallet5.fromPhrase(seedPhrase);
1228
1650
  const nodeContext = {
1229
1651
  wallet,
1230
1652
  logger,
@@ -1232,6 +1654,10 @@ var getServer = /* @__PURE__ */ __name(async (context) => {
1232
1654
  };
1233
1655
  const node = context.node ?? await getNode(nodeContext);
1234
1656
  const app = getApp(node, config);
1657
+ app.services = await getServices({
1658
+ config,
1659
+ logger
1660
+ });
1235
1661
  const server = app.listen(port, hostname, () => logger?.log(`[Bridge] Server listening at http://${hostname}:${port}`));
1236
1662
  server.setTimeout(2e4);
1237
1663
  return server;