@xyo-network/chain-bridge 1.19.17 → 1.20.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 (146) hide show
  1. package/dist/node/config/getTestGateway.d.ts +4 -0
  2. package/dist/node/config/getTestGateway.d.ts.map +1 -0
  3. package/dist/node/config/index.d.ts +1 -1
  4. package/dist/node/config/index.d.ts.map +1 -1
  5. package/dist/node/index.mjs +767 -520
  6. package/dist/node/index.mjs.map +1 -1
  7. package/dist/node/modules/index.d.ts +0 -1
  8. package/dist/node/modules/index.d.ts.map +1 -1
  9. package/dist/node/queue/flowProducer.d.ts +2 -1
  10. package/dist/node/queue/flowProducer.d.ts.map +1 -1
  11. package/dist/node/queue/flows/createEthToXl1BridgeJob.d.ts +10 -0
  12. package/dist/node/queue/flows/createEthToXl1BridgeJob.d.ts.map +1 -0
  13. package/dist/node/queue/flows/createXl1ToEthBridgeJob.d.ts.map +1 -1
  14. package/dist/node/queue/flows/index.d.ts +1 -0
  15. package/dist/node/queue/flows/index.d.ts.map +1 -1
  16. package/dist/node/queue/getXl1ToEthQueueJobs.d.ts +20 -0
  17. package/dist/node/queue/getXl1ToEthQueueJobs.d.ts.map +1 -0
  18. package/dist/node/queue/getXl1ToEthQueues.d.ts +14 -0
  19. package/dist/node/queue/getXl1ToEthQueues.d.ts.map +1 -0
  20. package/dist/node/queue/index.d.ts +4 -0
  21. package/dist/node/queue/index.d.ts.map +1 -1
  22. package/dist/node/queue/prefix.d.ts +2 -0
  23. package/dist/node/queue/prefix.d.ts.map +1 -0
  24. package/dist/node/queue/telemetry.d.ts +3 -0
  25. package/dist/node/queue/telemetry.d.ts.map +1 -0
  26. package/dist/node/queue/workers/EthToXl1BridgeParent.d.ts +8 -0
  27. package/dist/node/queue/workers/EthToXl1BridgeParent.d.ts.map +1 -0
  28. package/dist/node/queue/workers/EthTransactionMonitor.d.ts +11 -0
  29. package/dist/node/queue/workers/EthTransactionMonitor.d.ts.map +1 -1
  30. package/dist/node/queue/workers/EthTransactionPreparation.d.ts +9 -1
  31. package/dist/node/queue/workers/EthTransactionPreparation.d.ts.map +1 -1
  32. package/dist/node/queue/workers/EthTransactionSubmission.d.ts +10 -0
  33. package/dist/node/queue/workers/EthTransactionSubmission.d.ts.map +1 -1
  34. package/dist/node/queue/workers/EthTransactionSubmissionStorage.d.ts +13 -0
  35. package/dist/node/queue/workers/EthTransactionSubmissionStorage.d.ts.map +1 -0
  36. package/dist/node/queue/workers/WorkerDescription.d.ts +2 -1
  37. package/dist/node/queue/workers/WorkerDescription.d.ts.map +1 -1
  38. package/dist/node/queue/workers/Xl1ToEthBridgeParent.d.ts +8 -0
  39. package/dist/node/queue/workers/Xl1ToEthBridgeParent.d.ts.map +1 -1
  40. package/dist/node/queue/workers/Xl1TransactionMonitor.d.ts +10 -0
  41. package/dist/node/queue/workers/Xl1TransactionMonitor.d.ts.map +1 -1
  42. package/dist/node/queue/workers/Xl1TransactionPreparation.d.ts +9 -0
  43. package/dist/node/queue/workers/Xl1TransactionPreparation.d.ts.map +1 -1
  44. package/dist/node/queue/workers/Xl1TransactionSubmission.d.ts +10 -0
  45. package/dist/node/queue/workers/Xl1TransactionSubmission.d.ts.map +1 -1
  46. package/dist/node/queue/workers/Xl1TransactionSubmissionStorage.d.ts +13 -0
  47. package/dist/node/queue/workers/Xl1TransactionSubmissionStorage.d.ts.map +1 -0
  48. package/dist/node/queue/workers/createWorkers.d.ts +2 -1
  49. package/dist/node/queue/workers/createWorkers.d.ts.map +1 -1
  50. package/dist/node/queue/workers/index.d.ts +3 -0
  51. package/dist/node/queue/workers/index.d.ts.map +1 -1
  52. package/dist/node/queue/workers/util/index.d.ts +0 -2
  53. package/dist/node/queue/workers/util/index.d.ts.map +1 -1
  54. package/dist/node/server/addFlowProducer.d.ts.map +1 -1
  55. package/dist/node/server/addWorkers.d.ts.map +1 -1
  56. package/dist/node/server/index.d.ts +2 -0
  57. package/dist/node/server/index.d.ts.map +1 -1
  58. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.d.ts.map +1 -1
  59. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.d.ts +1 -1
  60. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.d.ts.map +1 -1
  61. package/dist/node/server/server.d.ts.map +1 -1
  62. package/dist/node/services/IBridgeServiceCollection.d.ts +1 -1
  63. package/dist/node/services/IBridgeServiceCollection.d.ts.map +1 -1
  64. package/dist/node/services/TxState.d.ts +0 -7
  65. package/dist/node/services/TxState.d.ts.map +1 -1
  66. package/dist/node/util/index.d.ts +0 -3
  67. package/dist/node/util/index.d.ts.map +1 -1
  68. package/dist/node/validation/AsyncLogger.d.ts +5 -0
  69. package/dist/node/validation/AsyncLogger.d.ts.map +1 -0
  70. package/dist/node/validation/index.d.ts +7 -0
  71. package/dist/node/validation/index.d.ts.map +1 -0
  72. package/dist/node/validation/validateBridgeEstimate.d.ts.map +1 -0
  73. package/dist/node/validation/validateBridgeEstimateExact.d.ts.map +1 -0
  74. package/dist/node/validation/validateBridgeTransaction.d.ts.map +1 -0
  75. package/dist/node/{queue/workers/util/validateSufficientAllowance.d.ts → validation/validateSufficientLiquiditySourceAllowance.d.ts} +3 -7
  76. package/dist/node/validation/validateSufficientLiquiditySourceAllowance.d.ts.map +1 -0
  77. package/dist/node/{queue/workers/util/validateSufficientBalance.d.ts → validation/validateSufficientLiquiditySourceBalance.d.ts} +3 -7
  78. package/dist/node/validation/validateSufficientLiquiditySourceBalance.d.ts.map +1 -0
  79. package/dist/node/validation/validateSufficientRunnerEthBalanceForGas.d.ts +14 -0
  80. package/dist/node/validation/validateSufficientRunnerEthBalanceForGas.d.ts.map +1 -0
  81. package/dist/node/validation/validateSufficientXL1SourceAddressBalance.d.ts +15 -0
  82. package/dist/node/validation/validateSufficientXL1SourceAddressBalance.d.ts.map +1 -0
  83. package/package.json +31 -35
  84. package/src/config/getBridgeWalletAccount.ts +1 -1
  85. package/src/config/getTestGateway.ts +24 -0
  86. package/src/config/index.ts +1 -1
  87. package/src/modules/index.ts +0 -1
  88. package/src/queue/flowProducer.ts +7 -2
  89. package/src/queue/flows/createEthToXl1BridgeJob.ts +71 -0
  90. package/src/queue/flows/createXl1ToEthBridgeJob.ts +48 -20
  91. package/src/queue/flows/index.ts +1 -0
  92. package/src/queue/getXl1ToEthQueueJobs.ts +57 -0
  93. package/src/queue/getXl1ToEthQueues.ts +39 -0
  94. package/src/queue/index.ts +4 -0
  95. package/src/queue/prefix.ts +1 -0
  96. package/src/queue/telemetry.ts +12 -0
  97. package/src/queue/workers/EthToXl1BridgeParent.ts +40 -0
  98. package/src/queue/workers/EthTransactionMonitor.ts +14 -6
  99. package/src/queue/workers/EthTransactionPreparation.ts +21 -9
  100. package/src/queue/workers/EthTransactionSubmission.ts +10 -38
  101. package/src/queue/workers/EthTransactionSubmissionStorage.ts +76 -0
  102. package/src/queue/workers/WorkerDescription.ts +2 -1
  103. package/src/queue/workers/Xl1ToEthBridgeParent.ts +13 -5
  104. package/src/queue/workers/Xl1TransactionMonitor.ts +18 -12
  105. package/src/queue/workers/Xl1TransactionPreparation.ts +11 -7
  106. package/src/queue/workers/Xl1TransactionSubmission.ts +12 -12
  107. package/src/queue/workers/Xl1TransactionSubmissionStorage.ts +77 -0
  108. package/src/queue/workers/createWorkers.ts +15 -8
  109. package/src/queue/workers/index.ts +3 -0
  110. package/src/queue/workers/util/index.ts +0 -2
  111. package/src/server/addFlowProducer.ts +5 -2
  112. package/src/server/addWorkers.ts +6 -2
  113. package/src/server/index.ts +3 -2
  114. package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts +11 -1
  115. package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.ts +27 -101
  116. package/src/server/server.ts +1 -0
  117. package/src/services/IBridgeServiceCollection.ts +1 -1
  118. package/src/services/TxState.ts +0 -18
  119. package/src/services/getServices.ts +1 -1
  120. package/src/util/index.ts +0 -3
  121. package/src/validation/AsyncLogger.ts +5 -0
  122. package/src/validation/index.ts +6 -0
  123. package/src/{util → validation}/validateBridgeEstimate.ts +1 -1
  124. package/src/{util → validation}/validateBridgeEstimateExact.ts +1 -1
  125. package/src/{util → validation}/validateBridgeTransaction.ts +1 -2
  126. package/src/{queue/workers/util/validateSufficientAllowance.ts → validation/validateSufficientLiquiditySourceAllowance.ts} +3 -6
  127. package/src/{queue/workers/util/validateSufficientBalance.ts → validation/validateSufficientLiquiditySourceBalance.ts} +3 -6
  128. package/src/validation/validateSufficientRunnerEthBalanceForGas.ts +57 -0
  129. package/src/validation/validateSufficientXL1SourceAddressBalance.ts +39 -0
  130. package/dist/node/config/getGateway.d.ts +0 -4
  131. package/dist/node/config/getGateway.d.ts.map +0 -1
  132. package/dist/node/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.d.ts +0 -60
  133. package/dist/node/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.d.ts.map +0 -1
  134. package/dist/node/modules/XL1TransactionCompletionMonitorSentinel/index.d.ts +0 -2
  135. package/dist/node/modules/XL1TransactionCompletionMonitorSentinel/index.d.ts.map +0 -1
  136. package/dist/node/queue/workers/util/validateSufficientAllowance.d.ts.map +0 -1
  137. package/dist/node/queue/workers/util/validateSufficientBalance.d.ts.map +0 -1
  138. package/dist/node/util/validateBridgeEstimate.d.ts.map +0 -1
  139. package/dist/node/util/validateBridgeEstimateExact.d.ts.map +0 -1
  140. package/dist/node/util/validateBridgeTransaction.d.ts.map +0 -1
  141. package/src/config/getGateway.ts +0 -23
  142. package/src/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.ts +0 -165
  143. package/src/modules/XL1TransactionCompletionMonitorSentinel/index.ts +0 -1
  144. /package/dist/node/{util → validation}/validateBridgeEstimate.d.ts +0 -0
  145. /package/dist/node/{util → validation}/validateBridgeEstimateExact.d.ts +0 -0
  146. /package/dist/node/{util → validation}/validateBridgeTransaction.d.ts +0 -0
@@ -31,27 +31,33 @@ var getConnection = /* @__PURE__ */ __name((config) => {
31
31
  // src/queue/flowProducer.ts
32
32
  import { isDefined as isDefined2 } from "@xylabs/sdk-js";
33
33
  import { FlowProducer } from "bullmq";
34
+
35
+ // src/queue/prefix.ts
36
+ var prefix = "xl1-bridge";
37
+
38
+ // src/queue/flowProducer.ts
34
39
  var flowProducer;
35
- var getFlowProducer = /* @__PURE__ */ __name((connection2) => {
40
+ var getFlowProducer = /* @__PURE__ */ __name((connection2, telemetry2) => {
36
41
  if (isDefined2(flowProducer)) return flowProducer;
37
42
  flowProducer = new FlowProducer({
38
- connection: connection2
43
+ connection: connection2,
44
+ telemetry: telemetry2,
45
+ prefix
39
46
  });
40
47
  return flowProducer;
41
48
  }, "getFlowProducer");
42
49
 
43
- // src/queue/flows/createXl1ToEthBridgeJob.ts
44
- import { PayloadBuilder as PayloadBuilder8 } from "@xyo-network/sdk-js";
45
-
46
50
  // src/queue/workers/createWorkers.ts
47
- var createWorkers = /* @__PURE__ */ __name((connection2, services) => {
48
- Xl1ToEthBridgeParent.createWorker(connection2);
49
- Xl1TransactionPreparation.createWorker(connection2, services);
50
- Xl1TransactionSubmission.createWorker(connection2, services);
51
- Xl1TransactionMonitor.createWorker(connection2, services);
52
- EthTransactionPreparation.createWorker(connection2, services);
53
- EthTransactionSubmission.createWorker(connection2, services);
54
- EthTransactionMonitor.createWorker(connection2, services);
51
+ var createWorkers = /* @__PURE__ */ __name((connection2, telemetry2, services) => {
52
+ EthTransactionMonitor.createWorker(connection2, telemetry2, services);
53
+ EthTransactionPreparation.createWorker(connection2, telemetry2, services);
54
+ EthTransactionSubmission.createWorker(connection2, telemetry2, services);
55
+ EthTransactionSubmissionStorage.createWorker(connection2, telemetry2, services);
56
+ Xl1ToEthBridgeParent.createWorker(connection2, telemetry2);
57
+ Xl1TransactionMonitor.createWorker(connection2, telemetry2, services);
58
+ Xl1TransactionPreparation.createWorker(connection2, telemetry2, services);
59
+ Xl1TransactionSubmission.createWorker(connection2, telemetry2, services);
60
+ Xl1TransactionSubmissionStorage.createWorker(connection2, telemetry2, services);
55
61
  }, "createWorkers");
56
62
 
57
63
  // src/queue/workers/EthTransactionMonitor.ts
@@ -60,7 +66,7 @@ import { PayloadBuilder } from "@xyo-network/sdk-js";
60
66
  import { Worker } from "bullmq";
61
67
  var name = "Monitor Submitted ETH Transaction";
62
68
  var queueName = "eth-tx-monitor";
63
- var createWorker = /* @__PURE__ */ __name((connection2, services) => {
69
+ var createWorker = /* @__PURE__ */ __name((connection2, telemetry2, services) => {
64
70
  const provider = assertEx(services?.provider, () => "provider service not provided");
65
71
  const stateMap = assertEx(services?.ethTxStateMap, () => "ethTxStateMap service not provided");
66
72
  const worker = new Worker(queueName, async (job) => {
@@ -75,10 +81,13 @@ var createWorker = /* @__PURE__ */ __name((connection2, services) => {
75
81
  await stateMap.set(hash, state);
76
82
  return {
77
83
  blockHash,
78
- blockNumber
84
+ blockNumber,
85
+ submissionHash
79
86
  };
80
87
  }, {
81
- connection: connection2
88
+ connection: connection2,
89
+ telemetry: telemetry2,
90
+ prefix
82
91
  });
83
92
  worker.on("failed", (job, err) => {
84
93
  console.error(`[${name}] Job ${job?.id} failed:`, err.message);
@@ -94,90 +103,359 @@ var EthTransactionMonitor = {
94
103
  };
95
104
 
96
105
  // src/queue/workers/EthTransactionPreparation.ts
97
- import { assertEx as assertEx5, hexToBigInt as hexToBigInt4 } from "@xylabs/sdk-js";
98
- import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/sdk-js";
99
- import { isBridgeIntent as isBridgeIntent4 } from "@xyo-network/xl1-sdk";
106
+ import { assertEx as assertEx11, hexToBigInt as hexToBigInt6 } from "@xylabs/sdk-js";
107
+ import { PayloadBuilder as PayloadBuilder5 } from "@xyo-network/sdk-js";
108
+ import { isBridgeIntent as isBridgeIntent3 } from "@xyo-network/xl1-sdk";
100
109
  import { Worker as Worker2 } from "bullmq";
101
110
  import { getAddress } from "ethers";
102
111
 
103
- // src/queue/workers/util/submitEthTransaction.ts
104
- import { assertEx as assertEx2, hexToBigInt, toEthAddress } from "@xylabs/sdk-js";
112
+ // src/validation/validateBridgeEstimateExact.ts
113
+ import { isUndefined as isUndefined2 } from "@xylabs/sdk-js";
114
+ import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/sdk-js";
115
+
116
+ // src/util/calculateBridgeFees.ts
117
+ import { hexToBigInt, toHex } from "@xylabs/sdk-js";
118
+ var calculateBridgeFees = /* @__PURE__ */ __name((srcAmount, feeStructure) => {
119
+ const { feeFixed, feeRateBasisPoints } = feeStructure;
120
+ const srcAmountBigInt = hexToBigInt(srcAmount);
121
+ const feeFixedBigInt = hexToBigInt(feeFixed);
122
+ const feeVariableBigInt = srcAmountBigInt * BigInt(feeRateBasisPoints) / 10000n;
123
+ const feeVariable = toHex(feeVariableBigInt);
124
+ const feeTotalBigInt = feeFixedBigInt + feeVariableBigInt;
125
+ const destAmountBigInt = srcAmountBigInt > feeTotalBigInt ? srcAmountBigInt - feeTotalBigInt : 0n;
126
+ const destAmount = toHex(destAmountBigInt);
127
+ return {
128
+ feeFixed,
129
+ feeVariable,
130
+ srcAmount
131
+ };
132
+ }, "calculateBridgeFees");
133
+
134
+ // src/util/createBridgeTransfer.ts
135
+ import { hexToBigInt as hexToBigInt2 } from "@xylabs/sdk-js";
136
+ import { createTransferPayload } from "@xyo-network/xl1-sdk";
137
+ var createBridgeTransfer = /* @__PURE__ */ __name((sender, srcAmount, escrowAddress, feesAddress, context) => {
138
+ const { feeFixed, feeVariable } = context;
139
+ const escrowAmount = hexToBigInt2(srcAmount);
140
+ const feesAmount = hexToBigInt2(feeFixed) + hexToBigInt2(feeVariable);
141
+ const transfers = escrowAddress === feesAddress ? {
142
+ [feesAddress]: escrowAmount + feesAmount
143
+ } : {
144
+ [escrowAddress]: escrowAmount,
145
+ [feesAddress]: feesAmount
146
+ };
147
+ const transfer = createTransferPayload(sender, transfers, context);
148
+ return transfer;
149
+ }, "createBridgeTransfer");
150
+
151
+ // src/util/generateBridgeEstimate.ts
152
+ import { toAddress } from "@xylabs/sdk-js";
105
153
  import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/sdk-js";
106
- import { isBridgeIntent } from "@xyo-network/xl1-sdk";
107
- var submitEthTransaction = /* @__PURE__ */ __name(async (tx, bridgeableToken, bridge, wallet) => {
108
- const xl1Transaction = assertEx2(tx[0], () => "No corresponding XL1 transaction found");
109
- const bridgeIntent = assertEx2(tx[1].find(isBridgeIntent), () => "No bridge intent found");
110
- const srcAddress = toEthAddress(bridgeIntent.srcAddress);
111
- const destAddress = toEthAddress(bridgeIntent.destAddress);
112
- const amount = hexToBigInt(bridgeIntent.destAmount);
113
- const nonce = hexToBigInt(await PayloadBuilder2.hash(xl1Transaction));
114
- const bridgeTx = await bridge.connect(wallet).bridgeFromRemote(srcAddress, destAddress, amount, nonce);
115
- const receipt = await bridgeTx.wait(1);
116
- return receipt?.hash;
117
- }, "submitEthTransaction");
154
+ import { BridgeIntentSchema } from "@xyo-network/xl1-sdk";
155
+ import { v4 } from "uuid";
118
156
 
119
- // src/queue/workers/util/submitXl1Transaction.ts
120
- import { isAllowedBlockPayload } from "@xyo-network/xl1-sdk";
121
- var submitXl1Transaction = /* @__PURE__ */ __name(async (preparedTx, gateway) => {
122
- const offChainPayloads = preparedTx[1].filter((p) => !isAllowedBlockPayload(p));
123
- const result = await gateway.addTransactionToChain(preparedTx, offChainPayloads);
124
- return result;
125
- }, "submitXl1Transaction");
157
+ // src/config/asChainId.ts
158
+ import { asHex } from "@xylabs/sdk-js";
159
+ var asChainId = /* @__PURE__ */ __name((value) => {
160
+ const chainId = asHex(value);
161
+ return chainId;
162
+ }, "asChainId");
126
163
 
127
- // src/queue/workers/util/validateSufficientAllowance.ts
128
- import { assertEx as assertEx3, hexToBigInt as hexToBigInt2 } from "@xylabs/sdk-js";
129
- import { isBridgeIntent as isBridgeIntent2 } from "@xyo-network/xl1-sdk";
130
- var validateSufficientAllowance = /* @__PURE__ */ __name(async (tx, bridgeableToken, bridge, logger) => {
131
- const bridgeIntent = assertEx3(tx[1].find(isBridgeIntent2), () => "No bridge intent found");
132
- const amount = hexToBigInt2(bridgeIntent.destAmount);
164
+ // src/config/asToken.ts
165
+ import { asAddress } from "@xylabs/sdk-js";
166
+ var asToken = /* @__PURE__ */ __name((value) => {
167
+ const token = asAddress(value);
168
+ return token;
169
+ }, "asToken");
170
+
171
+ // src/config/getBridgeEscrowAddress.ts
172
+ import { asAddress as asAddress2, assertEx as assertEx2 } from "@xylabs/sdk-js";
173
+ var tryGetBridgeEscrowAddress = /* @__PURE__ */ __name((config) => {
174
+ const address = asAddress2(config.escrowAddress);
175
+ return address;
176
+ }, "tryGetBridgeEscrowAddress");
177
+
178
+ // src/config/getBridgeFeesAddress.ts
179
+ import { asAddress as asAddress3, assertEx as assertEx3 } from "@xylabs/sdk-js";
180
+ var tryGetBridgeFeesAddress = /* @__PURE__ */ __name((config) => {
181
+ const address = asAddress3(config.feesAddress);
182
+ return address;
183
+ }, "tryGetBridgeFeesAddress");
184
+
185
+ // src/config/getFeeStructure.ts
186
+ var getFeeStructure = /* @__PURE__ */ __name((config) => {
187
+ const { feeFixed, feeRateBasisPoints } = config;
188
+ return {
189
+ feeFixed,
190
+ feeRateBasisPoints
191
+ };
192
+ }, "getFeeStructure");
193
+
194
+ // src/config/getMaxBridgeAmount.ts
195
+ var getMaxBridgeAmount = /* @__PURE__ */ __name((config) => {
196
+ const { maxBridgeAmount } = config;
197
+ return maxBridgeAmount;
198
+ }, "getMaxBridgeAmount");
199
+
200
+ // src/config/getMinBridgeAmount.ts
201
+ var getMinBridgeAmount = /* @__PURE__ */ __name((config) => {
202
+ const { minBridgeAmount } = config;
203
+ return minBridgeAmount;
204
+ }, "getMinBridgeAmount");
205
+
206
+ // src/config/getRemoteChainId.ts
207
+ import { assertEx as assertEx4 } from "@xylabs/sdk-js";
208
+ var getRemoteChainId = /* @__PURE__ */ __name((config) => {
209
+ const remoteChainId = assertEx4(asChainId(config.remoteChainId), () => "Invalid remote chain ID in config");
210
+ return remoteChainId;
211
+ }, "getRemoteChainId");
212
+
213
+ // src/config/getRemoteTokenAddress.ts
214
+ import { assertEx as assertEx5 } from "@xylabs/sdk-js";
215
+ var getRemoteTokenAddress = /* @__PURE__ */ __name((config) => {
216
+ const token = asToken(config.remoteTokenAddress);
217
+ return assertEx5(token, () => "Remote token address is not defined in bridge configuration");
218
+ }, "getRemoteTokenAddress");
219
+
220
+ // src/config/getBridgeWalletAccount.ts
221
+ import { isDefined as isDefined3, isUndefined } from "@xylabs/sdk-js";
222
+ import { HDWallet } from "@xyo-network/sdk-js";
223
+ import { ADDRESS_INDEX, generateXyoBaseWalletFromPhrase } from "@xyo-network/xl1-sdk";
224
+ var accountServiceSingleton;
225
+ var getBridgeWalletAccount = /* @__PURE__ */ __name(async (config) => {
226
+ if (accountServiceSingleton) return accountServiceSingleton;
227
+ let walletPhrase = config.mnemonic;
228
+ if (isUndefined(walletPhrase)) {
229
+ console.log("[Bridge] No wallet mnemonic specified!");
230
+ const randomMnemonic = HDWallet.generateMnemonic();
231
+ console.log(`[Bridge] Using randomly generated mnemonic:
232
+
233
+ ${randomMnemonic}
234
+
235
+ `);
236
+ walletPhrase = randomMnemonic;
237
+ }
238
+ const wallet = await generateXyoBaseWalletFromPhrase(walletPhrase);
239
+ const account = await wallet.derivePath(ADDRESS_INDEX.XYO);
240
+ accountServiceSingleton = account;
241
+ return accountServiceSingleton;
242
+ }, "getBridgeWalletAccount");
243
+
244
+ // src/config/getTransferAddresses.ts
245
+ var getTransferAddresses = /* @__PURE__ */ __name(async (config) => {
246
+ const escrowAddress = tryGetBridgeEscrowAddress(config) ?? (await getBridgeWalletAccount(config)).address;
247
+ const feesAddress = tryGetBridgeFeesAddress(config) ?? (await getBridgeWalletAccount(config)).address;
248
+ return {
249
+ escrowAddress,
250
+ feesAddress
251
+ };
252
+ }, "getTransferAddresses");
253
+
254
+ // src/config/getXl1ChainId.ts
255
+ import { assertEx as assertEx6, isDefined as isDefined4 } from "@xylabs/sdk-js";
256
+ var getXl1ChainId = /* @__PURE__ */ __name((config) => {
257
+ const xl1ChainId = config.xl1ChainId;
258
+ if (isDefined4(xl1ChainId)) {
259
+ return assertEx6(asChainId(xl1ChainId), () => "Invalid xl1ChainId in bridge config");
260
+ }
261
+ return assertEx6(asChainId(config.chain.id), () => "Invalid chain.id in config");
262
+ }, "getXl1ChainId");
263
+
264
+ // src/config/getXl1TokenAddress.ts
265
+ import { isDefined as isDefined5 } from "@xylabs/sdk-js";
266
+ var getXl1TokenAddress = /* @__PURE__ */ __name((config) => {
267
+ const token = asToken(config.xl1TokenAddress);
268
+ if (isDefined5(token)) return token;
269
+ return getXl1ChainId(config);
270
+ }, "getXl1TokenAddress");
271
+
272
+ // src/config/getBridgeSettings.ts
273
+ var getBridgeSettings = /* @__PURE__ */ __name(async (config) => {
274
+ const { feeFixed, feeRateBasisPoints } = getFeeStructure(config);
275
+ const { feesAddress, escrowAddress } = await getTransferAddresses(config);
276
+ const maxBridgeAmount = getMaxBridgeAmount(config);
277
+ const minBridgeAmount = getMinBridgeAmount(config);
278
+ const remoteChainId = getRemoteChainId(config);
279
+ const remoteTokenAddress = getRemoteTokenAddress(config);
280
+ const xl1TokenAddress = getXl1TokenAddress(config);
281
+ const xl1ChainId = getXl1ChainId(config);
282
+ return {
283
+ feeFixed,
284
+ feeRateBasisPoints,
285
+ feesAddress,
286
+ escrowAddress,
287
+ maxBridgeAmount,
288
+ minBridgeAmount,
289
+ remoteChainId,
290
+ remoteTokenAddress,
291
+ xl1TokenAddress,
292
+ xl1ChainId
293
+ };
294
+ }, "getBridgeSettings");
295
+
296
+ // src/util/generateBridgeEstimate.ts
297
+ var generateBridgeEstimate = /* @__PURE__ */ __name(async (srcAddress, srcAmount, destAddress, config, nonceOverride) => {
298
+ const { escrowAddress, feeFixed, feeRateBasisPoints, feesAddress, remoteChainId, remoteTokenAddress, xl1ChainId, xl1TokenAddress } = await getBridgeSettings(config);
299
+ const sender = toAddress(srcAddress);
300
+ const fees = calculateBridgeFees(srcAmount, {
301
+ feeFixed,
302
+ feeRateBasisPoints
303
+ });
304
+ const nonce = nonceOverride ?? v4();
305
+ const bridgeIntentFields = {
306
+ // Source
307
+ src: xl1ChainId,
308
+ srcAddress: sender,
309
+ srcAmount,
310
+ srcToken: xl1TokenAddress,
311
+ // Destination
312
+ dest: remoteChainId,
313
+ destAddress,
314
+ destAmount: srcAmount,
315
+ destToken: remoteTokenAddress,
316
+ nonce
317
+ };
318
+ const bridgeIntent = new PayloadBuilder2({
319
+ schema: BridgeIntentSchema
320
+ }).fields(bridgeIntentFields).build();
321
+ const transfer = createBridgeTransfer(sender, srcAmount, escrowAddress, feesAddress, fees);
322
+ return [
323
+ bridgeIntent,
324
+ transfer
325
+ ];
326
+ }, "generateBridgeEstimate");
327
+
328
+ // src/validation/validateBridgeEstimateExact.ts
329
+ var validateBridgeEstimateExact = /* @__PURE__ */ __name(async (intent, transfer, config) => {
330
+ const { srcAddress, srcAmount, destAddress } = intent;
331
+ const [calculatedIntent, calculatedTransfer] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config);
332
+ if (isUndefined2(calculatedIntent) || isUndefined2(calculatedTransfer)) return false;
333
+ const { nonce: expectedIntentNonce, ...expectedIntentStatic } = calculatedIntent;
334
+ const { nonce: actualIntentNonce, ...actualIntentStatic } = intent;
335
+ if (await PayloadBuilder3.dataHash(expectedIntentStatic) !== await PayloadBuilder3.dataHash(actualIntentStatic)) return false;
336
+ const { epoch: expectedTransferEpoch, ...expectedTransferStatic } = calculatedTransfer;
337
+ const { epoch: actualTransferEpoch, ...actualTransferStatic } = transfer;
338
+ if (await PayloadBuilder3.dataHash(expectedTransferStatic) !== await PayloadBuilder3.dataHash(actualTransferStatic)) return false;
339
+ return true;
340
+ }, "validateBridgeEstimateExact");
341
+
342
+ // src/validation/validateBridgeTransaction.ts
343
+ import { asAddress as asAddress4, isDefined as isDefined6 } from "@xylabs/sdk-js";
344
+ import { addressesContains, BoundWitnessValidator, payloadHashesContainsAll } from "@xyo-network/boundwitness-validator";
345
+ import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/sdk-js";
346
+ var validateBridgeTransaction = /* @__PURE__ */ __name(async (signedTxBw, intent, transfer, config) => {
347
+ const { srcAddress } = intent;
348
+ const chainId = getXl1ChainId(config);
349
+ if (signedTxBw.chain !== chainId) return false;
350
+ const errors = await new BoundWitnessValidator(signedTxBw).validate();
351
+ if (isDefined6(errors) && errors.length > 0) return false;
352
+ const sender = asAddress4(srcAddress, true);
353
+ if (!addressesContains(signedTxBw, sender)) return false;
354
+ const hashes = await PayloadBuilder4.hashes([
355
+ intent,
356
+ transfer
357
+ ]);
358
+ if (!payloadHashesContainsAll(signedTxBw, hashes)) return false;
359
+ return true;
360
+ }, "validateBridgeTransaction");
361
+
362
+ // src/validation/validateSufficientLiquiditySourceAllowance.ts
363
+ import { assertEx as assertEx7, hexToBigInt as hexToBigInt3 } from "@xylabs/sdk-js";
364
+ import { isBridgeIntent } from "@xyo-network/xl1-sdk";
365
+ var validateSufficientLiquiditySourceAllowance = /* @__PURE__ */ __name(async (tx, bridgeableToken, bridge, logger) => {
366
+ const bridgeIntent = assertEx7(tx[1].find(isBridgeIntent), () => "No bridge intent found");
367
+ const amount = hexToBigInt3(bridgeIntent.destAmount);
133
368
  const liquiditySourceAddress = await bridge.liquiditySource();
134
369
  const bridgeAddress = await bridge.getAddress();
135
370
  const remainingAllowance = await bridgeableToken.allowance(liquiditySourceAddress, bridgeAddress);
136
371
  await logger?.log(`Remaining allowance: ${remainingAllowance.toString()}`);
137
372
  return remainingAllowance >= amount;
138
- }, "validateSufficientAllowance");
373
+ }, "validateSufficientLiquiditySourceAllowance");
139
374
 
140
- // src/queue/workers/util/validateSufficientBalance.ts
141
- import { assertEx as assertEx4, hexToBigInt as hexToBigInt3 } from "@xylabs/sdk-js";
142
- import { isBridgeIntent as isBridgeIntent3 } from "@xyo-network/xl1-sdk";
143
- var validateSufficientBalance = /* @__PURE__ */ __name(async (tx, bridgeableToken, bridge, logger) => {
144
- const bridgeIntent = assertEx4(tx[1].find(isBridgeIntent3), () => "No bridge intent found");
145
- const amount = hexToBigInt3(bridgeIntent.destAmount);
375
+ // src/validation/validateSufficientLiquiditySourceBalance.ts
376
+ import { assertEx as assertEx8, hexToBigInt as hexToBigInt4 } from "@xylabs/sdk-js";
377
+ import { isBridgeIntent as isBridgeIntent2 } from "@xyo-network/xl1-sdk";
378
+ var validateSufficientLiquiditySourceBalance = /* @__PURE__ */ __name(async (tx, bridgeableToken, bridge, logger) => {
379
+ const bridgeIntent = assertEx8(tx[1].find(isBridgeIntent2), () => "No bridge intent found");
380
+ const amount = hexToBigInt4(bridgeIntent.destAmount);
146
381
  const liquiditySourceAddress = await bridge.liquiditySource();
147
382
  const balance = await bridgeableToken.balanceOf(liquiditySourceAddress);
148
383
  await logger?.log(`Remaining balance: ${balance.toString()}`);
149
384
  return balance >= amount;
150
- }, "validateSufficientBalance");
385
+ }, "validateSufficientLiquiditySourceBalance");
386
+
387
+ // src/validation/validateSufficientRunnerEthBalanceForGas.ts
388
+ import { assertEx as assertEx9 } from "@xylabs/sdk-js";
389
+ var DEFAULT_GAS_BUFFER_BPS = 2000n;
390
+ var validateSufficientRunnerEthBalanceForGas = /* @__PURE__ */ __name(async (preparedTx, wallet, logger, bufferBps = DEFAULT_GAS_BUFFER_BPS) => {
391
+ const provider = assertEx9(wallet.provider, () => "Wallet provider is not defined");
392
+ const feeData = await provider.getFeeData();
393
+ const perGas = feeData.maxFeePerGas ?? feeData.gasPrice;
394
+ if (perGas == null) {
395
+ await logger?.log("[gas] unable to resolve gas price / maxFeePerGas from provider");
396
+ return true;
397
+ }
398
+ const transactionRequest = {
399
+ ...preparedTx,
400
+ from: await wallet.getAddress()
401
+ };
402
+ const estGas = await provider.estimateGas(transactionRequest);
403
+ const txValue = preparedTx?.value ?? 0n;
404
+ const baseRequired = estGas * perGas + txValue;
405
+ const required = baseRequired * (10000n + bufferBps) / 10000n;
406
+ const balance = await provider.getBalance(await wallet.getAddress());
407
+ await logger?.log(`[gas] runner=${await wallet.getAddress()} balance=${balance.toString()} estGas=${estGas.toString()} perGas=${perGas.toString()} value=${txValue.toString()} requiredWithBuffer=${required.toString()} bufferBps=${bufferBps.toString()}`);
408
+ return balance >= required;
409
+ }, "validateSufficientRunnerEthBalanceForGas");
410
+
411
+ // src/validation/validateSufficientXL1SourceAddressBalance.ts
412
+ import { asAddress as asAddress5, assertEx as assertEx10, hexToBigInt as hexToBigInt5 } from "@xylabs/sdk-js";
413
+ var validateSufficientXL1SourceAddressBalance = /* @__PURE__ */ __name(async (bridgeIntent, gateway, config, logger) => {
414
+ const viewer = assertEx10(gateway.connection.viewer, () => "Gateway connection does not have a viewer");
415
+ const { srcAddress, srcAmount, destAddress } = bridgeIntent;
416
+ const srcAddressBranded = asAddress5(srcAddress, () => `Invalid source address in bridge intent: ${srcAddress}`);
417
+ const [_, calculatedTransfer] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config);
418
+ const totalAmount = Object.values(calculatedTransfer.transfers).reduce((acc, transfer) => acc + hexToBigInt5(transfer), 0n);
419
+ const accountBalance = await viewer.account.balance.accountBalance(srcAddressBranded);
420
+ await logger?.log(`Account balance for ${srcAddressBranded}: ${accountBalance.toString()}`);
421
+ return accountBalance >= totalAmount;
422
+ }, "validateSufficientXL1SourceAddressBalance");
151
423
 
152
424
  // src/queue/workers/EthTransactionPreparation.ts
153
425
  var name2 = "Prepare ETH Transaction";
154
426
  var queueName2 = "eth-tx-prepare";
155
- var createWorker2 = /* @__PURE__ */ __name((connection2, services) => {
156
- const bridge = assertEx5(services?.bridge, () => "bridge service not provided");
157
- const bridgeableToken = assertEx5(services?.bridgeableToken, () => "bridgeableToken service not provided");
158
- const stateMap = assertEx5(services?.ethTxStateMap, () => "ethTxStateMap service not provided");
427
+ var createWorker2 = /* @__PURE__ */ __name((connection2, telemetry2, services) => {
428
+ const bridge = assertEx11(services?.bridge, () => "bridge service not provided");
429
+ const bridgeableToken = assertEx11(services?.bridgeableToken, () => "bridgeableToken service not provided");
430
+ const stateMap = assertEx11(services?.ethTxStateMap, () => "ethTxStateMap service not provided");
431
+ const wallet = assertEx11(services?.wallet, () => "wallet service not provided");
159
432
  const worker = new Worker2(queueName2, async (job) => {
160
433
  const { tx } = job.data;
161
- const hash = await PayloadBuilder3.hash(tx[0]);
434
+ const hash = await PayloadBuilder5.hash(tx[0]);
162
435
  await job.log(`[${hash}] preparing ETH transaction`);
163
436
  await job.log(`[${hash}] validating liquiditySource has sufficient allowance`);
164
- if (!await validateSufficientAllowance(tx, bridgeableToken, bridge, job)) {
437
+ if (!await validateSufficientLiquiditySourceAllowance(tx, bridgeableToken, bridge, job)) {
165
438
  throw new Error("Liquidity source does not have sufficient allowance for the bridge to execute the transaction");
166
439
  }
167
440
  await job.log(`[${hash}] validated liquiditySource has sufficient allowance`);
168
441
  await job.log(`[${hash}] validating liquiditySource has sufficient balance`);
169
- if (!await validateSufficientBalance(tx, bridgeableToken, bridge, job)) {
442
+ if (!await validateSufficientLiquiditySourceBalance(tx, bridgeableToken, bridge, job)) {
170
443
  throw new Error("Liquidity source does not have sufficient balance for the bridge to execute the transaction");
171
444
  }
172
445
  await job.log(`[${hash}] validated liquiditySource has sufficient balance`);
173
446
  await job.log(`[${hash}] building ETH transaction`);
174
- const bridgeIntent = assertEx5(tx[1].find(isBridgeIntent4), () => "No bridge intent found");
175
- const amount = hexToBigInt4(bridgeIntent.destAmount);
447
+ const bridgeIntent = assertEx11(tx[1].find(isBridgeIntent3), () => "No bridge intent found");
448
+ const amount = hexToBigInt6(bridgeIntent.destAmount);
176
449
  const srcAddress = getAddress(bridgeIntent.srcAddress);
177
450
  const destAddress = getAddress(bridgeIntent.destAddress);
178
- const nonce = hexToBigInt4(await PayloadBuilder3.hash(tx[0]));
451
+ const nonce = hexToBigInt6(await PayloadBuilder5.hash(tx[0]));
179
452
  const preparedTx = await bridge.getFunction("bridgeFromRemote").populateTransaction(srcAddress, destAddress, amount, nonce);
180
453
  await job.log(`[${hash}] built ETH transaction`);
454
+ await job.log(`[${hash}] validating tx runner has sufficient ETH for gas`);
455
+ if (!await validateSufficientRunnerEthBalanceForGas(preparedTx, wallet, job)) {
456
+ throw new Error("Transaction runner does not have sufficient ETH to cover estimated gas (with buffer)");
457
+ }
458
+ await job.log(`[${hash}] validated tx runner has sufficient ETH for gas`);
181
459
  await job.log(`[${hash}] storing ETH preparedTx`);
182
460
  await stateMap.set(hash, {
183
461
  preparedTx
@@ -186,7 +464,9 @@ var createWorker2 = /* @__PURE__ */ __name((connection2, services) => {
186
464
  await job.log(`[${hash}] prepared ETH transaction`);
187
465
  return {};
188
466
  }, {
189
- connection: connection2
467
+ connection: connection2,
468
+ telemetry: telemetry2,
469
+ prefix
190
470
  });
191
471
  worker.on("failed", (job, err) => {
192
472
  console.error(`[${name2}] Job ${job?.id} failed:`, err.message);
@@ -202,41 +482,64 @@ var EthTransactionPreparation = {
202
482
  };
203
483
 
204
484
  // src/queue/workers/EthTransactionSubmission.ts
205
- import { assertEx as assertEx6, isDefined as isDefined3 } from "@xylabs/sdk-js";
206
- import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/sdk-js";
485
+ import { assertEx as assertEx13, isDefined as isDefined7 } from "@xylabs/sdk-js";
486
+ import { PayloadBuilder as PayloadBuilder7 } from "@xyo-network/sdk-js";
207
487
  import { Worker as Worker3 } from "bullmq";
488
+
489
+ // src/queue/workers/util/submitEthTransaction.ts
490
+ import { assertEx as assertEx12, hexToBigInt as hexToBigInt7, toEthAddress } from "@xylabs/sdk-js";
491
+ import { PayloadBuilder as PayloadBuilder6 } from "@xyo-network/sdk-js";
492
+ import { isBridgeIntent as isBridgeIntent4 } from "@xyo-network/xl1-sdk";
493
+ var submitEthTransaction = /* @__PURE__ */ __name(async (tx, bridgeableToken, bridge, wallet) => {
494
+ const xl1Transaction = assertEx12(tx[0], () => "No corresponding XL1 transaction found");
495
+ const bridgeIntent = assertEx12(tx[1].find(isBridgeIntent4), () => "No bridge intent found");
496
+ const srcAddress = toEthAddress(bridgeIntent.srcAddress);
497
+ const destAddress = toEthAddress(bridgeIntent.destAddress);
498
+ const amount = hexToBigInt7(bridgeIntent.destAmount);
499
+ const nonce = hexToBigInt7(await PayloadBuilder6.hash(xl1Transaction));
500
+ const bridgeTx = await bridge.connect(wallet).bridgeFromRemote(srcAddress, destAddress, amount, nonce);
501
+ const receipt = await bridgeTx.wait(1);
502
+ return receipt?.hash;
503
+ }, "submitEthTransaction");
504
+
505
+ // src/queue/workers/util/submitXl1Transaction.ts
506
+ import { isAllowedBlockPayload } from "@xyo-network/xl1-sdk";
507
+ var submitXl1Transaction = /* @__PURE__ */ __name(async (preparedTx, gateway) => {
508
+ const offChainPayloads = preparedTx[1].filter((p) => !isAllowedBlockPayload(p));
509
+ const result = await gateway.addTransactionToChain(preparedTx, offChainPayloads);
510
+ return result;
511
+ }, "submitXl1Transaction");
512
+
513
+ // src/queue/workers/EthTransactionSubmission.ts
208
514
  var name3 = "Submit ETH Transaction";
209
515
  var queueName3 = "eth-tx-submit";
210
- var createWorker3 = /* @__PURE__ */ __name((connection2, services) => {
211
- const bridge = assertEx6(services?.bridge, () => "bridge service not provided");
212
- const bridgeableToken = assertEx6(services?.bridgeableToken, () => "bridgeableToken service not provided");
213
- const wallet = assertEx6(services?.wallet, () => "wallet service not provided");
214
- const stateMap = assertEx6(services?.ethTxStateMap, () => "ethTxStateMap service not provided");
516
+ var createWorker3 = /* @__PURE__ */ __name((connection2, telemetry2, services) => {
517
+ const bridge = assertEx13(services?.bridge, () => "bridge service not provided");
518
+ const bridgeableToken = assertEx13(services?.bridgeableToken, () => "bridgeableToken service not provided");
519
+ const wallet = assertEx13(services?.wallet, () => "wallet service not provided");
520
+ const stateMap = assertEx13(services?.ethTxStateMap, () => "ethTxStateMap service not provided");
215
521
  const worker = new Worker3(queueName3, async (job) => {
216
522
  const { tx } = job.data;
217
- const hash = await PayloadBuilder4.hash(tx[0]);
218
- const state = assertEx6(await stateMap.get(hash), () => `[${hash}] state not found`);
219
- const preparedTx = assertEx6(state?.preparedTx, () => `[${hash}] preparedTx not found`);
523
+ const hash = await PayloadBuilder7.hash(tx[0]);
524
+ const state = assertEx13(await stateMap.get(hash), () => `[${hash}] state not found`);
220
525
  const { submissionHash: existingSubmissionHash } = state;
221
- if (isDefined3(existingSubmissionHash)) {
526
+ if (isDefined7(existingSubmissionHash)) {
222
527
  await job.log(`[${hash}] Tx already submitted with submission response hash ${existingSubmissionHash}`);
223
528
  return {
224
529
  submissionHash: existingSubmissionHash
225
530
  };
226
531
  }
227
532
  await job.log(`[${hash}] Submitting ETH tx`);
228
- const submissionHash = assertEx6(await submitEthTransaction(tx, bridgeableToken, bridge, wallet), () => `[${hash}] submissionHash not found in receipt`);
533
+ const submissionHash = assertEx13(await submitEthTransaction(tx, bridgeableToken, bridge, wallet), () => `[${hash}] submissionHash not found in receipt`);
229
534
  await job.log(`[${hash}] Submitted ETH tx and received submission response hash ${submissionHash}`);
230
- await job.log(`[${hash}] Storing ETH submissionHash`);
231
- state.submissionHash = submissionHash;
232
- await stateMap.set(hash, state);
233
- await job.log(`[${hash}] Stored ETH submissionHash`);
234
535
  return {
235
536
  submissionHash
236
537
  };
237
538
  }, {
238
539
  connection: connection2,
239
- concurrency: 1
540
+ telemetry: telemetry2,
541
+ concurrency: 1,
542
+ prefix
240
543
  });
241
544
  worker.on("failed", (job, err) => {
242
545
  console.error(`[${name3}] Job ${job?.id} failed:`, err.message);
@@ -251,19 +554,41 @@ var EthTransactionSubmission = {
251
554
  queueName: queueName3
252
555
  };
253
556
 
254
- // src/queue/workers/Xl1ToEthBridgeParent.ts
557
+ // src/queue/workers/EthTransactionSubmissionStorage.ts
558
+ import { assertEx as assertEx14, isDefined as isDefined8 } from "@xylabs/sdk-js";
559
+ import { PayloadBuilder as PayloadBuilder8 } from "@xyo-network/sdk-js";
255
560
  import { Worker as Worker4 } from "bullmq";
256
- var name4 = "Bridge XL1 to Ethereum";
257
- var queueName4 = "xl1-to-eth-bridge";
258
- var createWorker4 = /* @__PURE__ */ __name((connection2) => {
561
+ var name4 = "Store ETH Transaction Submission";
562
+ var queueName4 = "eth-tx-store-submission";
563
+ var createWorker4 = /* @__PURE__ */ __name((connection2, telemetry2, services) => {
564
+ const stateMap = assertEx14(services?.ethTxStateMap, () => "ethTxStateMap service not provided");
259
565
  const worker = new Worker4(queueName4, async (job) => {
260
- await job.log(`[${job.name}] start`);
261
- await job.log(`[${job.name}] done`);
566
+ const { tx } = job.data;
567
+ const hash = await PayloadBuilder8.hash(tx[0]);
568
+ const state = assertEx14(await stateMap.get(hash), () => `[${hash}] state not found`);
569
+ const { submissionHash: existingSubmissionHash } = state;
570
+ if (isDefined8(existingSubmissionHash)) {
571
+ await job.log(`[${hash}] submissionHash already stored as ${existingSubmissionHash}`);
572
+ return {
573
+ submissionHash: existingSubmissionHash
574
+ };
575
+ }
576
+ const childrenValues = await job.getChildrenValues();
577
+ const jobKey = `${prefix}:${EthTransactionSubmission.queueName}:${hash}`;
578
+ const childValues = childrenValues?.[jobKey];
579
+ const submissionHash = childValues?.submissionHash;
580
+ const resolvedSubmissionHash = assertEx14(submissionHash, () => `[${hash}] child submissionHash not found in children values`);
581
+ await job.log(`[${hash}] Storing ETH submissionHash`);
582
+ state.submissionHash = resolvedSubmissionHash;
583
+ await stateMap.set(hash, state);
584
+ await job.log(`[${hash}] Stored ETH submissionHash`);
262
585
  return {
263
- ok: true
586
+ submissionHash: resolvedSubmissionHash
264
587
  };
265
588
  }, {
266
- connection: connection2
589
+ connection: connection2,
590
+ telemetry: telemetry2,
591
+ prefix
267
592
  });
268
593
  worker.on("failed", (job, err) => {
269
594
  console.error(`[${name4}] Job ${job?.id} failed:`, err.message);
@@ -272,34 +597,62 @@ var createWorker4 = /* @__PURE__ */ __name((connection2) => {
272
597
  console.error(`[${name4}] Worker error:`, err);
273
598
  });
274
599
  }, "createWorker");
275
- var Xl1ToEthBridgeParent = {
600
+ var EthTransactionSubmissionStorage = {
276
601
  createWorker: createWorker4,
277
602
  name: name4,
278
603
  queueName: queueName4
279
604
  };
280
605
 
281
- // src/queue/workers/Xl1TransactionMonitor.ts
282
- import { assertEx as assertEx7, isDefined as isDefined4, isNull } from "@xylabs/sdk-js";
283
- import { PayloadBuilder as PayloadBuilder5 } from "@xyo-network/sdk-js";
284
- import { UnrecoverableError, Worker as Worker5 } from "bullmq";
285
- var name5 = "Monitor Submitted XL1 Transaction";
286
- var queueName5 = "xl1-tx-monitor";
287
- var createWorker5 = /* @__PURE__ */ __name((connection2, services) => {
288
- const gateway = assertEx7(services?.gateway, () => "gateway service not provided");
289
- const stateMap = assertEx7(services?.xl1TxStateMap, () => "xl1TxStateMap service not provided");
606
+ // src/queue/workers/Xl1ToEthBridgeParent.ts
607
+ import { Worker as Worker5 } from "bullmq";
608
+ var name5 = "Bridge XL1 to Ethereum";
609
+ var queueName5 = "xl1-to-eth-bridge";
610
+ var createWorker5 = /* @__PURE__ */ __name((connection2, telemetry2) => {
290
611
  const worker = new Worker5(queueName5, async (job) => {
612
+ await job.log(`[${job.name}] start`);
613
+ await job.log(`[${job.name}] done`);
614
+ return {};
615
+ }, {
616
+ connection: connection2,
617
+ telemetry: telemetry2,
618
+ prefix
619
+ });
620
+ worker.on("failed", (job, err) => {
621
+ console.error(`[${name5}] Job ${job?.id} failed:`, err.message);
622
+ });
623
+ worker.on("error", (err) => {
624
+ console.error(`[${name5}] Worker error:`, err);
625
+ });
626
+ }, "createWorker");
627
+ var Xl1ToEthBridgeParent = {
628
+ createWorker: createWorker5,
629
+ name: name5,
630
+ queueName: queueName5
631
+ };
632
+
633
+ // src/queue/workers/Xl1TransactionMonitor.ts
634
+ import { assertEx as assertEx15, isDefined as isDefined9, isNull } from "@xylabs/sdk-js";
635
+ import { PayloadBuilder as PayloadBuilder9 } from "@xyo-network/sdk-js";
636
+ import { UnrecoverableError, Worker as Worker6 } from "bullmq";
637
+ var name6 = "Monitor Submitted XL1 Transaction";
638
+ var queueName6 = "xl1-tx-monitor";
639
+ var createWorker6 = /* @__PURE__ */ __name((connection2, telemetry2, services) => {
640
+ const gateway = assertEx15(services?.gateway, () => "gateway service not provided");
641
+ const stateMap = assertEx15(services?.xl1TxStateMap, () => "xl1TxStateMap service not provided");
642
+ const viewer = assertEx15(gateway.connection.viewer, () => "viewer not defined on gateway");
643
+ const worker = new Worker6(queueName6, async (job) => {
291
644
  const { tx } = job.data;
292
- const hash = await PayloadBuilder5.hash(tx[0]);
293
- const viewer = assertEx7(gateway.connection.viewer, () => `[${hash}] viewer not defined on gateway`);
294
- const state = assertEx7(await stateMap.get(hash), () => `[${hash}] state not found`);
295
- const submissionHash = assertEx7(state?.submissionHash, () => `[${hash}] submissionHash not found`);
645
+ const hash = await PayloadBuilder9.hash(tx[0]);
646
+ const state = assertEx15(await stateMap.get(hash), () => `[${hash}] state not found`);
647
+ const submissionHash = assertEx15(state.submissionHash, () => `[${hash}] submissionHash not found`);
296
648
  await job.log(`[${hash}] Checking for XL1 transaction inclusion on chain`);
297
- const foundTx = await viewer.transactionByHash(submissionHash);
298
- if (isDefined4(foundTx) && !isNull(foundTx)) {
649
+ const foundTx = await viewer.transaction.byHash(submissionHash);
650
+ if (isDefined9(foundTx) && !isNull(foundTx)) {
299
651
  await job.log(`[${hash}] Found transaction on chain`);
300
- state.confirmationHash = await PayloadBuilder5.hash(foundTx[0]);
301
- await stateMap.set(hash, state);
302
- return {};
652
+ const submissionHash2 = await PayloadBuilder9.hash(foundTx[0]);
653
+ return {
654
+ submissionHash: submissionHash2
655
+ };
303
656
  }
304
657
  const currentBlockNumber = await viewer.currentBlockNumber();
305
658
  if (tx[0].exp < currentBlockNumber) {
@@ -309,32 +662,34 @@ var createWorker5 = /* @__PURE__ */ __name((connection2, services) => {
309
662
  await job.log(`[${hash}] Transaction not yet included, retrying later`);
310
663
  throw new Error(`[${hash}] Transaction not yet included`);
311
664
  }, {
312
- connection: connection2
665
+ connection: connection2,
666
+ telemetry: telemetry2,
667
+ prefix
313
668
  });
314
669
  worker.on("failed", (job, err) => {
315
- console.error(`[${name5}] Job ${job?.id} failed:`, err.message);
670
+ console.error(`[${name6}] Job ${job?.id} failed:`, err.message);
316
671
  });
317
672
  worker.on("error", (err) => {
318
- console.error(`[${name5}] Worker error:`, err);
673
+ console.error(`[${name6}] Worker error:`, err);
319
674
  });
320
675
  }, "createWorker");
321
676
  var Xl1TransactionMonitor = {
322
- createWorker: createWorker5,
323
- name: name5,
324
- queueName: queueName5
677
+ createWorker: createWorker6,
678
+ name: name6,
679
+ queueName: queueName6
325
680
  };
326
681
 
327
682
  // src/queue/workers/Xl1TransactionPreparation.ts
328
- import { assertEx as assertEx8 } from "@xylabs/sdk-js";
329
- import { PayloadBuilder as PayloadBuilder6 } from "@xyo-network/sdk-js";
330
- import { Worker as Worker6 } from "bullmq";
331
- var name6 = "Prepare XL1 Transaction";
332
- var queueName6 = "xl1-tx-prepare";
333
- var createWorker6 = /* @__PURE__ */ __name((connection2, services) => {
334
- const stateMap = assertEx8(services?.xl1TxStateMap, () => "xl1TxStateMap service not provided");
335
- const worker = new Worker6(queueName6, async (job) => {
683
+ import { assertEx as assertEx16 } from "@xylabs/sdk-js";
684
+ import { PayloadBuilder as PayloadBuilder10 } from "@xyo-network/sdk-js";
685
+ import { Worker as Worker7 } from "bullmq";
686
+ var name7 = "Prepare XL1 Transaction";
687
+ var queueName7 = "xl1-tx-prepare";
688
+ var createWorker7 = /* @__PURE__ */ __name((connection2, telemetry2, services) => {
689
+ const stateMap = assertEx16(services?.xl1TxStateMap, () => "xl1TxStateMap service not provided");
690
+ const worker = new Worker7(queueName7, async (job) => {
336
691
  const { tx } = job.data;
337
- const hash = await PayloadBuilder6.hash(tx[0]);
692
+ const hash = await PayloadBuilder10.hash(tx[0]);
338
693
  await job.log(`[${hash}] preparing XL1 transaction`);
339
694
  const preparedTx = tx;
340
695
  await job.log(`[${hash}] storing XL1 preparedTx`);
@@ -343,39 +698,43 @@ var createWorker6 = /* @__PURE__ */ __name((connection2, services) => {
343
698
  });
344
699
  await job.log(`[${hash}] stored XL1 preparedTx`);
345
700
  await job.log(`[${hash}] prepared XL1 transaction`);
346
- return {};
701
+ return {
702
+ preparedTx
703
+ };
347
704
  }, {
348
- connection: connection2
705
+ connection: connection2,
706
+ telemetry: telemetry2,
707
+ prefix
349
708
  });
350
709
  worker.on("failed", (job, err) => {
351
- console.error(`[${name6}] Job ${job?.id} failed:`, err.message);
710
+ console.error(`[${name7}] Job ${job?.id} failed:`, err.message);
352
711
  });
353
712
  worker.on("error", (err) => {
354
- console.error(`[${name6}] Worker error:`, err);
713
+ console.error(`[${name7}] Worker error:`, err);
355
714
  });
356
715
  }, "createWorker");
357
716
  var Xl1TransactionPreparation = {
358
- createWorker: createWorker6,
359
- name: name6,
360
- queueName: queueName6
717
+ createWorker: createWorker7,
718
+ name: name7,
719
+ queueName: queueName7
361
720
  };
362
721
 
363
722
  // src/queue/workers/Xl1TransactionSubmission.ts
364
- import { assertEx as assertEx9, isDefined as isDefined5 } from "@xylabs/sdk-js";
365
- import { PayloadBuilder as PayloadBuilder7 } from "@xyo-network/sdk-js";
366
- import { Worker as Worker7 } from "bullmq";
367
- var name7 = "Submit XL1 Transaction";
368
- var queueName7 = "xl1-tx-submit";
369
- var createWorker7 = /* @__PURE__ */ __name((connection2, services) => {
370
- const gateway = assertEx9(services?.gateway, () => "gateway service not provided");
371
- const stateMap = assertEx9(services?.xl1TxStateMap, () => "xl1TxStateMap service not provided");
372
- const worker = new Worker7(queueName7, async (job) => {
723
+ import { assertEx as assertEx17, isDefined as isDefined10 } from "@xylabs/sdk-js";
724
+ import { PayloadBuilder as PayloadBuilder11 } from "@xyo-network/sdk-js";
725
+ import { Worker as Worker8 } from "bullmq";
726
+ var name8 = "Submit XL1 Transaction";
727
+ var queueName8 = "xl1-tx-submit";
728
+ var createWorker8 = /* @__PURE__ */ __name((connection2, telemetry2, services) => {
729
+ const gateway = assertEx17(services?.gateway, () => "gateway service not provided");
730
+ const stateMap = assertEx17(services?.xl1TxStateMap, () => "xl1TxStateMap service not provided");
731
+ const worker = new Worker8(queueName8, async (job) => {
373
732
  const { tx } = job.data;
374
- const hash = await PayloadBuilder7.hash(tx[0]);
375
- const state = assertEx9(await stateMap.get(hash), () => `[${hash}] state not found`);
376
- const preparedTx = assertEx9(state?.preparedTx, () => `[${hash}] preparedTx not found`);
733
+ const hash = await PayloadBuilder11.hash(tx[0]);
734
+ const state = assertEx17(await stateMap.get(hash), () => `[${hash}] state not found`);
735
+ const preparedTx = assertEx17(state?.preparedTx, () => `[${hash}] preparedTx not found`);
377
736
  const { submissionHash: existingSubmissionHash } = state;
378
- if (isDefined5(existingSubmissionHash)) {
737
+ if (isDefined10(existingSubmissionHash)) {
379
738
  await job.log(`[${hash}] Tx already submitted with submission response hash ${existingSubmissionHash}`);
380
739
  return {
381
740
  submissionHash: existingSubmissionHash
@@ -384,33 +743,82 @@ var createWorker7 = /* @__PURE__ */ __name((connection2, services) => {
384
743
  await job.log(`[${hash}] Submitting XL1 tx`);
385
744
  const [submissionHash] = await submitXl1Transaction(preparedTx, gateway);
386
745
  await job.log(`[${hash}] Submitted XL1 tx`);
746
+ return {
747
+ submissionHash
748
+ };
749
+ }, {
750
+ connection: connection2,
751
+ telemetry: telemetry2,
752
+ prefix
753
+ });
754
+ worker.on("failed", (job, err) => {
755
+ console.error(`[${name8}] Job ${job?.id} failed:`, err.message);
756
+ });
757
+ worker.on("error", (err) => {
758
+ console.error(`[${name8}] Worker error:`, err);
759
+ });
760
+ }, "createWorker");
761
+ var Xl1TransactionSubmission = {
762
+ createWorker: createWorker8,
763
+ name: name8,
764
+ queueName: queueName8
765
+ };
766
+
767
+ // src/queue/workers/Xl1TransactionSubmissionStorage.ts
768
+ import { assertEx as assertEx18, isDefined as isDefined11 } from "@xylabs/sdk-js";
769
+ import { PayloadBuilder as PayloadBuilder12 } from "@xyo-network/sdk-js";
770
+ import { Worker as Worker9 } from "bullmq";
771
+ var name9 = "Store XL1 Transaction Submission";
772
+ var queueName9 = "xl1-tx-store-submission";
773
+ var createWorker9 = /* @__PURE__ */ __name((connection2, telemetry2, services) => {
774
+ const stateMap = assertEx18(services?.xl1TxStateMap, () => "xl1TxStateMap service not provided");
775
+ const worker = new Worker9(queueName9, async (job) => {
776
+ const { tx } = job.data;
777
+ const hash = await PayloadBuilder12.hash(tx[0]);
778
+ const state = assertEx18(await stateMap.get(hash), () => `[${hash}] state not found`);
779
+ const { submissionHash: existingSubmissionHash } = state;
780
+ if (isDefined11(existingSubmissionHash)) {
781
+ await job.log(`[${hash}] submissionHash already stored as ${existingSubmissionHash}`);
782
+ return {
783
+ submissionHash: existingSubmissionHash
784
+ };
785
+ }
786
+ const childrenValues = await job.getChildrenValues();
787
+ const jobKey = `${prefix}:${Xl1TransactionSubmission.queueName}:${hash}`;
788
+ const childValues = childrenValues?.[jobKey];
789
+ const submissionHash = childValues?.submissionHash;
790
+ const resolvedSubmissionHash = assertEx18(submissionHash, () => `[${hash}] child submissionHash not found in children values`);
387
791
  await job.log(`[${hash}] Storing XL1 submissionHash`);
388
- state.submissionHash = submissionHash;
792
+ state.submissionHash = resolvedSubmissionHash;
389
793
  await stateMap.set(hash, state);
390
794
  await job.log(`[${hash}] Stored XL1 submissionHash`);
391
795
  return {
392
- submissionHash
796
+ submissionHash: resolvedSubmissionHash
393
797
  };
394
798
  }, {
395
- connection: connection2
799
+ connection: connection2,
800
+ telemetry: telemetry2,
801
+ prefix
396
802
  });
397
803
  worker.on("failed", (job, err) => {
398
- console.error(`[${name7}] Job ${job?.id} failed:`, err.message);
804
+ console.error(`[${name9}] Job ${job?.id} failed:`, err.message);
399
805
  });
400
806
  worker.on("error", (err) => {
401
- console.error(`[${name7}] Worker error:`, err);
807
+ console.error(`[${name9}] Worker error:`, err);
402
808
  });
403
809
  }, "createWorker");
404
- var Xl1TransactionSubmission = {
405
- createWorker: createWorker7,
406
- name: name7,
407
- queueName: queueName7
810
+ var Xl1TransactionSubmissionStorage = {
811
+ createWorker: createWorker9,
812
+ name: name9,
813
+ queueName: queueName9
408
814
  };
409
815
 
410
816
  // src/queue/flows/createXl1ToEthBridgeJob.ts
817
+ import { PayloadBuilder as PayloadBuilder13 } from "@xyo-network/sdk-js";
411
818
  var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) => {
412
- const jobId = await PayloadBuilder8.hash(tx[0]);
819
+ const jobId = await PayloadBuilder13.hash(tx[0]);
413
820
  const flow = await flowProducer2.add({
821
+ // Step 0 (runs first as parent job)
414
822
  name: Xl1ToEthBridgeParent.name,
415
823
  queueName: Xl1ToEthBridgeParent.queueName,
416
824
  data: {
@@ -421,7 +829,7 @@ var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) =
421
829
  },
422
830
  children: [
423
831
  {
424
- // Step 6 (runs after child completes)
832
+ // Step 8
425
833
  name: EthTransactionMonitor.name,
426
834
  queueName: EthTransactionMonitor.queueName,
427
835
  data: {
@@ -437,17 +845,25 @@ var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) =
437
845
  },
438
846
  children: [
439
847
  {
440
- // Step 5
441
- name: EthTransactionSubmission.name,
442
- queueName: EthTransactionSubmission.queueName,
848
+ // Step 7
849
+ name: EthTransactionSubmissionStorage.name,
850
+ queueName: EthTransactionSubmissionStorage.queueName,
443
851
  data: {
444
852
  tx
445
853
  },
854
+ opts: {
855
+ jobId,
856
+ attempts: 60,
857
+ backoff: {
858
+ type: "fixed",
859
+ delay: 5e3
860
+ }
861
+ },
446
862
  children: [
447
863
  {
448
- // Step 4
449
- name: EthTransactionPreparation.name,
450
- queueName: EthTransactionPreparation.queueName,
864
+ // Step 6
865
+ name: EthTransactionSubmission.name,
866
+ queueName: EthTransactionSubmission.queueName,
451
867
  data: {
452
868
  tx
453
869
  },
@@ -456,9 +872,9 @@ var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) =
456
872
  },
457
873
  children: [
458
874
  {
459
- // Step 3
460
- name: Xl1TransactionMonitor.name,
461
- queueName: Xl1TransactionMonitor.queueName,
875
+ // Step 5
876
+ name: EthTransactionPreparation.name,
877
+ queueName: EthTransactionPreparation.queueName,
462
878
  data: {
463
879
  tx
464
880
  },
@@ -472,26 +888,67 @@ var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) =
472
888
  },
473
889
  children: [
474
890
  {
475
- // Step 2
476
- name: Xl1TransactionSubmission.name,
477
- queueName: Xl1TransactionSubmission.queueName,
891
+ // Step 4
892
+ name: Xl1TransactionMonitor.name,
893
+ queueName: Xl1TransactionMonitor.queueName,
478
894
  data: {
479
895
  tx
480
896
  },
481
897
  opts: {
482
- jobId
898
+ jobId,
899
+ attempts: 60,
900
+ backoff: {
901
+ type: "fixed",
902
+ delay: 5e3
903
+ }
483
904
  },
484
905
  children: [
485
906
  {
486
- // Step 1 (runs first as deepest child)
487
- name: Xl1TransactionPreparation.name,
488
- queueName: Xl1TransactionPreparation.queueName,
907
+ // Step 3
908
+ name: Xl1TransactionSubmissionStorage.name,
909
+ queueName: Xl1TransactionSubmissionStorage.queueName,
489
910
  data: {
490
911
  tx
491
912
  },
492
913
  opts: {
493
- jobId
494
- }
914
+ jobId,
915
+ attempts: 60,
916
+ backoff: {
917
+ type: "fixed",
918
+ delay: 5e3
919
+ }
920
+ },
921
+ children: [
922
+ {
923
+ // Step 2
924
+ name: Xl1TransactionSubmission.name,
925
+ queueName: Xl1TransactionSubmission.queueName,
926
+ data: {
927
+ tx
928
+ },
929
+ opts: {
930
+ jobId
931
+ },
932
+ children: [
933
+ {
934
+ // Step 1 (runs first as deepest child)
935
+ name: Xl1TransactionPreparation.name,
936
+ queueName: Xl1TransactionPreparation.queueName,
937
+ data: {
938
+ tx
939
+ },
940
+ opts: {
941
+ jobId,
942
+ attempts: 60,
943
+ backoff: {
944
+ type: "fixed",
945
+ delay: 5e3
946
+ }
947
+ }
948
+ }
949
+ ]
950
+ }
951
+ ]
495
952
  }
496
953
  ]
497
954
  }
@@ -508,10 +965,91 @@ var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) =
508
965
  return flow;
509
966
  }, "createXl1ToEthBridgeJob");
510
967
 
968
+ // src/queue/getXl1ToEthQueueJobs.ts
969
+ var getStatusQueueJobs = /* @__PURE__ */ __name(async (queues, jobId) => {
970
+ const [ethTransactionMonitorJob, ethTransactionPreparationJob, ethTransactionSubmissionJob, xl1ToEthBridgeParentJob, xl1TransactionMonitorJob, xl1TransactionPreparationJob, xl1TransactionSubmissionJob, xl1TransactionSubmissionStorageJob] = await Promise.all([
971
+ queues.ethTransactionMonitor.getJob(jobId),
972
+ queues.ethTransactionPreparation.getJob(jobId),
973
+ queues.ethTransactionSubmission.getJob(jobId),
974
+ queues.xl1ToEthBridgeParent.getJob(jobId),
975
+ queues.xl1TransactionMonitor.getJob(jobId),
976
+ queues.xl1TransactionPreparation.getJob(jobId),
977
+ queues.xl1TransactionSubmission.getJob(jobId),
978
+ queues.xl1TransactionSubmissionStorage.getJob(jobId)
979
+ ]);
980
+ return {
981
+ ethTransactionMonitorJob,
982
+ ethTransactionPreparationJob,
983
+ ethTransactionSubmissionJob,
984
+ xl1ToEthBridgeParentJob,
985
+ xl1TransactionMonitorJob,
986
+ xl1TransactionPreparationJob,
987
+ xl1TransactionSubmissionStorageJob,
988
+ xl1TransactionSubmissionJob
989
+ };
990
+ }, "getStatusQueueJobs");
991
+
992
+ // src/queue/getXl1ToEthQueues.ts
993
+ import { Queue } from "bullmq";
994
+ var xl1ToEthQueues;
995
+ var getXl1ToEthQueues = /* @__PURE__ */ __name((config) => {
996
+ if (xl1ToEthQueues) return xl1ToEthQueues;
997
+ const connection2 = getConnection(config);
998
+ xl1ToEthQueues = {
999
+ ethTransactionMonitor: new Queue(EthTransactionMonitor.queueName, {
1000
+ connection: connection2,
1001
+ prefix
1002
+ }),
1003
+ ethTransactionPreparation: new Queue(EthTransactionPreparation.queueName, {
1004
+ connection: connection2,
1005
+ prefix
1006
+ }),
1007
+ ethTransactionSubmission: new Queue(EthTransactionSubmission.queueName, {
1008
+ connection: connection2,
1009
+ prefix
1010
+ }),
1011
+ xl1ToEthBridgeParent: new Queue(Xl1ToEthBridgeParent.queueName, {
1012
+ connection: connection2,
1013
+ prefix
1014
+ }),
1015
+ xl1TransactionMonitor: new Queue(Xl1TransactionMonitor.queueName, {
1016
+ connection: connection2,
1017
+ prefix
1018
+ }),
1019
+ xl1TransactionPreparation: new Queue(Xl1TransactionPreparation.queueName, {
1020
+ connection: connection2,
1021
+ prefix
1022
+ }),
1023
+ xl1TransactionSubmission: new Queue(Xl1TransactionSubmission.queueName, {
1024
+ connection: connection2,
1025
+ prefix
1026
+ }),
1027
+ xl1TransactionSubmissionStorage: new Queue(Xl1TransactionSubmissionStorage.queueName, {
1028
+ connection: connection2,
1029
+ prefix
1030
+ })
1031
+ };
1032
+ return xl1ToEthQueues;
1033
+ }, "getXl1ToEthQueues");
1034
+
1035
+ // src/queue/telemetry.ts
1036
+ import { isDefined as isDefined12 } from "@xylabs/sdk-js";
1037
+ import { BullMQOtel } from "bullmq-otel";
1038
+ var telemetry;
1039
+ var options = {
1040
+ enableMetrics: true
1041
+ };
1042
+ var getTelemetry = /* @__PURE__ */ __name(() => {
1043
+ if (isDefined12(telemetry)) return telemetry;
1044
+ telemetry = new BullMQOtel(options);
1045
+ return telemetry;
1046
+ }, "getTelemetry");
1047
+
511
1048
  // src/server/addFlowProducer.ts
512
1049
  var addFlowProducer = /* @__PURE__ */ __name((app, config) => {
513
1050
  const connection2 = getConnection(config);
514
- const flowProducer2 = getFlowProducer(connection2);
1051
+ const telemetry2 = getTelemetry();
1052
+ const flowProducer2 = getFlowProducer(connection2, telemetry2);
515
1053
  app.flowProducer = flowProducer2;
516
1054
  return app;
517
1055
  }, "addFlowProducer");
@@ -533,147 +1071,6 @@ var addInstrumentation = /* @__PURE__ */ __name(() => {
533
1071
  // src/server/routes/bridge/routeDefinitions/routes/bridgeConfig.ts
534
1072
  import { requestHandlerValidator } from "@xylabs/express";
535
1073
  import { BridgeSettingsZod } from "@xyo-network/chain-orchestration";
536
-
537
- // src/config/asChainId.ts
538
- import { asHex } from "@xylabs/sdk-js";
539
- var asChainId = /* @__PURE__ */ __name((value) => {
540
- const chainId = asHex(value);
541
- return chainId;
542
- }, "asChainId");
543
-
544
- // src/config/asToken.ts
545
- import { asAddress } from "@xylabs/sdk-js";
546
- var asToken = /* @__PURE__ */ __name((value) => {
547
- const token = asAddress(value);
548
- return token;
549
- }, "asToken");
550
-
551
- // src/config/getBridgeEscrowAddress.ts
552
- import { asAddress as asAddress2, assertEx as assertEx10 } from "@xylabs/sdk-js";
553
- var tryGetBridgeEscrowAddress = /* @__PURE__ */ __name((config) => {
554
- const address = asAddress2(config.escrowAddress);
555
- return address;
556
- }, "tryGetBridgeEscrowAddress");
557
-
558
- // src/config/getBridgeFeesAddress.ts
559
- import { asAddress as asAddress3, assertEx as assertEx11 } from "@xylabs/sdk-js";
560
- var tryGetBridgeFeesAddress = /* @__PURE__ */ __name((config) => {
561
- const address = asAddress3(config.feesAddress);
562
- return address;
563
- }, "tryGetBridgeFeesAddress");
564
-
565
- // src/config/getFeeStructure.ts
566
- var getFeeStructure = /* @__PURE__ */ __name((config) => {
567
- const { feeFixed, feeRateBasisPoints } = config;
568
- return {
569
- feeFixed,
570
- feeRateBasisPoints
571
- };
572
- }, "getFeeStructure");
573
-
574
- // src/config/getMaxBridgeAmount.ts
575
- var getMaxBridgeAmount = /* @__PURE__ */ __name((config) => {
576
- const { maxBridgeAmount } = config;
577
- return maxBridgeAmount;
578
- }, "getMaxBridgeAmount");
579
-
580
- // src/config/getMinBridgeAmount.ts
581
- var getMinBridgeAmount = /* @__PURE__ */ __name((config) => {
582
- const { minBridgeAmount } = config;
583
- return minBridgeAmount;
584
- }, "getMinBridgeAmount");
585
-
586
- // src/config/getRemoteChainId.ts
587
- import { assertEx as assertEx12 } from "@xylabs/sdk-js";
588
- var getRemoteChainId = /* @__PURE__ */ __name((config) => {
589
- const remoteChainId = assertEx12(asChainId(config.remoteChainId), () => "Invalid remote chain ID in config");
590
- return remoteChainId;
591
- }, "getRemoteChainId");
592
-
593
- // src/config/getRemoteTokenAddress.ts
594
- import { assertEx as assertEx13 } from "@xylabs/sdk-js";
595
- var getRemoteTokenAddress = /* @__PURE__ */ __name((config) => {
596
- const token = asToken(config.remoteTokenAddress);
597
- return assertEx13(token, () => "Remote token address is not defined in bridge configuration");
598
- }, "getRemoteTokenAddress");
599
-
600
- // src/config/getBridgeWalletAccount.ts
601
- import { isDefined as isDefined6, isUndefined } from "@xylabs/sdk-js";
602
- import { HDWallet } from "@xyo-network/wallet";
603
- import { ADDRESS_INDEX, generateXyoBaseWalletFromPhrase } from "@xyo-network/xl1-sdk";
604
- var accountServiceSingleton;
605
- var getBridgeWalletAccount = /* @__PURE__ */ __name(async (config) => {
606
- if (accountServiceSingleton) return accountServiceSingleton;
607
- let walletPhrase = config.mnemonic;
608
- if (isUndefined(walletPhrase)) {
609
- console.log("[Bridge] No wallet mnemonic specified!");
610
- const randomMnemonic = HDWallet.generateMnemonic();
611
- console.log(`[Bridge] Using randomly generated mnemonic:
612
-
613
- ${randomMnemonic}
614
-
615
- `);
616
- walletPhrase = randomMnemonic;
617
- }
618
- const wallet = await generateXyoBaseWalletFromPhrase(walletPhrase);
619
- const account = await wallet.derivePath(ADDRESS_INDEX.XYO);
620
- accountServiceSingleton = account;
621
- return accountServiceSingleton;
622
- }, "getBridgeWalletAccount");
623
-
624
- // src/config/getTransferAddresses.ts
625
- var getTransferAddresses = /* @__PURE__ */ __name(async (config) => {
626
- const escrowAddress = tryGetBridgeEscrowAddress(config) ?? (await getBridgeWalletAccount(config)).address;
627
- const feesAddress = tryGetBridgeFeesAddress(config) ?? (await getBridgeWalletAccount(config)).address;
628
- return {
629
- escrowAddress,
630
- feesAddress
631
- };
632
- }, "getTransferAddresses");
633
-
634
- // src/config/getXl1ChainId.ts
635
- import { assertEx as assertEx14, isDefined as isDefined7 } from "@xylabs/sdk-js";
636
- var getXl1ChainId = /* @__PURE__ */ __name((config) => {
637
- const xl1ChainId = config.xl1ChainId;
638
- if (isDefined7(xl1ChainId)) {
639
- return assertEx14(asChainId(xl1ChainId), () => "Invalid xl1ChainId in bridge config");
640
- }
641
- return assertEx14(asChainId(config.chain.id), () => "Invalid chain.id in config");
642
- }, "getXl1ChainId");
643
-
644
- // src/config/getXl1TokenAddress.ts
645
- import { isDefined as isDefined8 } from "@xylabs/sdk-js";
646
- var getXl1TokenAddress = /* @__PURE__ */ __name((config) => {
647
- const token = asToken(config.xl1TokenAddress);
648
- if (isDefined8(token)) return token;
649
- return getXl1ChainId(config);
650
- }, "getXl1TokenAddress");
651
-
652
- // src/config/getBridgeSettings.ts
653
- var getBridgeSettings = /* @__PURE__ */ __name(async (config) => {
654
- const { feeFixed, feeRateBasisPoints } = getFeeStructure(config);
655
- const { feesAddress, escrowAddress } = await getTransferAddresses(config);
656
- const maxBridgeAmount = getMaxBridgeAmount(config);
657
- const minBridgeAmount = getMinBridgeAmount(config);
658
- const remoteChainId = getRemoteChainId(config);
659
- const remoteTokenAddress = getRemoteTokenAddress(config);
660
- const xl1TokenAddress = getXl1TokenAddress(config);
661
- const xl1ChainId = getXl1ChainId(config);
662
- return {
663
- feeFixed,
664
- feeRateBasisPoints,
665
- feesAddress,
666
- escrowAddress,
667
- maxBridgeAmount,
668
- minBridgeAmount,
669
- remoteChainId,
670
- remoteTokenAddress,
671
- xl1TokenAddress,
672
- xl1ChainId
673
- };
674
- }, "getBridgeSettings");
675
-
676
- // src/server/routes/bridge/routeDefinitions/routes/bridgeConfig.ts
677
1074
  var BridgeConfigResponseZod = BridgeSettingsZod;
678
1075
  var validateRequest = requestHandlerValidator({
679
1076
  response: BridgeConfigResponseZod
@@ -703,18 +1100,18 @@ var makeBridgeConfigRoute = /* @__PURE__ */ __name((config) => {
703
1100
 
704
1101
  // src/server/routes/bridge/routeDefinitions/routes/bridgeFromRemoteStatus.ts
705
1102
  import { requestHandlerValidator as requestHandlerValidator2 } from "@xylabs/express";
706
- import { toAddress, toHex } from "@xylabs/sdk-js";
1103
+ import { toAddress as toAddress2, toHex as toHex2 } from "@xylabs/sdk-js";
707
1104
  import { PayloadZodStrictOfSchema } from "@xyo-network/sdk-js";
708
1105
  import { BridgeDestinationObservationFieldsZod, BridgeDestinationObservationSchema } from "@xyo-network/xl1-sdk";
709
1106
  import { z } from "zod";
710
1107
 
711
1108
  // src/server/routes/bridge/routeDefinitions/pathParams/ChainIdPathParam.ts
712
- import { asHex as asHex2, HexZod, isUndefined as isUndefined2 } from "@xylabs/sdk-js";
1109
+ import { asHex as asHex2, HexZod, isUndefined as isUndefined3 } from "@xylabs/sdk-js";
713
1110
  var getRemoteChainIdZod = /* @__PURE__ */ __name((config) => {
714
1111
  const remoteChainId = getRemoteChainId(config);
715
1112
  return HexZod.superRefine((val, ctx) => {
716
1113
  const chainId = asHex2(val);
717
- if (isUndefined2(chainId)) {
1114
+ if (isUndefined3(chainId)) {
718
1115
  ctx.addIssue("Not a valid chain id");
719
1116
  return;
720
1117
  }
@@ -748,14 +1145,14 @@ var makeBridgeFromRemoteStatusRoute = /* @__PURE__ */ __name((config) => {
748
1145
  const observation = {
749
1146
  schema: BridgeDestinationObservationSchema,
750
1147
  dest: xl1ChainId,
751
- destAddress: toAddress("0xabc"),
752
- destAmount: toHex("0x100"),
1148
+ destAddress: toAddress2("0xabc"),
1149
+ destAmount: toHex2("0x100"),
753
1150
  destToken: xl1TokenAddress,
754
1151
  src: remoteChainId,
755
- srcAddress: toAddress("0x123"),
756
- srcAmount: toHex("0x200"),
1152
+ srcAddress: toAddress2("0x123"),
1153
+ srcAmount: toHex2("0x200"),
757
1154
  srcToken: remoteTokenAddress,
758
- destConfirmation: toHex("0x9999")
1155
+ destConfirmation: toHex2("0x9999")
759
1156
  };
760
1157
  res.json(observation);
761
1158
  })
@@ -764,118 +1161,9 @@ var makeBridgeFromRemoteStatusRoute = /* @__PURE__ */ __name((config) => {
764
1161
 
765
1162
  // src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts
766
1163
  import { requestHandlerValidator as requestHandlerValidator3 } from "@xylabs/express";
767
- import { PayloadBuilder as PayloadBuilder12, PayloadZodLooseOfSchema, PayloadZodStrictOfSchema as PayloadZodStrictOfSchema2 } from "@xyo-network/sdk-js";
1164
+ import { PayloadBuilder as PayloadBuilder14, PayloadZodLooseOfSchema, PayloadZodStrictOfSchema as PayloadZodStrictOfSchema2 } from "@xyo-network/sdk-js";
768
1165
  import { BridgeIntentFieldsZod, BridgeIntentSchema as BridgeIntentSchema2, BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, SignedTransactionBoundWitnessZod, TransferZod } from "@xyo-network/xl1-sdk";
769
1166
  import { z as z2 } from "zod";
770
-
771
- // src/util/calculateBridgeFees.ts
772
- import { hexToBigInt as hexToBigInt5, toHex as toHex2 } from "@xylabs/sdk-js";
773
- var calculateBridgeFees = /* @__PURE__ */ __name((srcAmount, feeStructure) => {
774
- const { feeFixed, feeRateBasisPoints } = feeStructure;
775
- const srcAmountBigInt = hexToBigInt5(srcAmount);
776
- const feeFixedBigInt = hexToBigInt5(feeFixed);
777
- const feeVariableBigInt = srcAmountBigInt * BigInt(feeRateBasisPoints) / 10000n;
778
- const feeVariable = toHex2(feeVariableBigInt);
779
- const feeTotalBigInt = feeFixedBigInt + feeVariableBigInt;
780
- const destAmountBigInt = srcAmountBigInt > feeTotalBigInt ? srcAmountBigInt - feeTotalBigInt : 0n;
781
- const destAmount = toHex2(destAmountBigInt);
782
- return {
783
- feeFixed,
784
- feeVariable,
785
- srcAmount
786
- };
787
- }, "calculateBridgeFees");
788
-
789
- // src/util/createBridgeTransfer.ts
790
- import { hexToBigInt as hexToBigInt6 } from "@xylabs/sdk-js";
791
- import { createTransferPayload } from "@xyo-network/xl1-sdk";
792
- var createBridgeTransfer = /* @__PURE__ */ __name((sender, srcAmount, escrowAddress, feesAddress, context) => {
793
- const { feeFixed, feeVariable } = context;
794
- const escrowAmount = hexToBigInt6(srcAmount);
795
- const feesAmount = hexToBigInt6(feeFixed) + hexToBigInt6(feeVariable);
796
- const transfers = escrowAddress === feesAddress ? {
797
- [feesAddress]: escrowAmount + feesAmount
798
- } : {
799
- [escrowAddress]: escrowAmount,
800
- [feesAddress]: feesAmount
801
- };
802
- const transfer = createTransferPayload(sender, transfers, context);
803
- return transfer;
804
- }, "createBridgeTransfer");
805
-
806
- // src/util/generateBridgeEstimate.ts
807
- import { toAddress as toAddress2 } from "@xylabs/sdk-js";
808
- import { PayloadBuilder as PayloadBuilder9 } from "@xyo-network/sdk-js";
809
- import { BridgeIntentSchema } from "@xyo-network/xl1-sdk";
810
- import { v4 } from "uuid";
811
- var generateBridgeEstimate = /* @__PURE__ */ __name(async (srcAddress, srcAmount, destAddress, config, nonceOverride) => {
812
- const { escrowAddress, feeFixed, feeRateBasisPoints, feesAddress, remoteChainId, remoteTokenAddress, xl1ChainId, xl1TokenAddress } = await getBridgeSettings(config);
813
- const sender = toAddress2(srcAddress);
814
- const fees = calculateBridgeFees(srcAmount, {
815
- feeFixed,
816
- feeRateBasisPoints
817
- });
818
- const nonce = nonceOverride ?? v4();
819
- const bridgeIntentFields = {
820
- // Source
821
- src: xl1ChainId,
822
- srcAddress: sender,
823
- srcAmount,
824
- srcToken: xl1TokenAddress,
825
- // Destination
826
- dest: remoteChainId,
827
- destAddress,
828
- destAmount: srcAmount,
829
- destToken: remoteTokenAddress,
830
- nonce
831
- };
832
- const bridgeIntent = new PayloadBuilder9({
833
- schema: BridgeIntentSchema
834
- }).fields(bridgeIntentFields).build();
835
- const transfer = createBridgeTransfer(sender, srcAmount, escrowAddress, feesAddress, fees);
836
- return [
837
- bridgeIntent,
838
- transfer
839
- ];
840
- }, "generateBridgeEstimate");
841
-
842
- // src/util/validateBridgeEstimateExact.ts
843
- import { isUndefined as isUndefined3 } from "@xylabs/sdk-js";
844
- import { PayloadBuilder as PayloadBuilder10 } from "@xyo-network/sdk-js";
845
- var validateBridgeEstimateExact = /* @__PURE__ */ __name(async (intent, transfer, config) => {
846
- const { srcAddress, srcAmount, destAddress } = intent;
847
- const [calculatedIntent, calculatedTransfer] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config);
848
- if (isUndefined3(calculatedIntent) || isUndefined3(calculatedTransfer)) return false;
849
- const { nonce: expectedIntentNonce, ...expectedIntentStatic } = calculatedIntent;
850
- const { nonce: actualIntentNonce, ...actualIntentStatic } = intent;
851
- if (await PayloadBuilder10.dataHash(expectedIntentStatic) !== await PayloadBuilder10.dataHash(actualIntentStatic)) return false;
852
- const { epoch: expectedTransferEpoch, ...expectedTransferStatic } = calculatedTransfer;
853
- const { epoch: actualTransferEpoch, ...actualTransferStatic } = transfer;
854
- if (await PayloadBuilder10.dataHash(expectedTransferStatic) !== await PayloadBuilder10.dataHash(actualTransferStatic)) return false;
855
- return true;
856
- }, "validateBridgeEstimateExact");
857
-
858
- // src/util/validateBridgeTransaction.ts
859
- import { asAddress as asAddress4, isDefined as isDefined9 } from "@xylabs/sdk-js";
860
- import { addressesContains, BoundWitnessValidator, payloadHashesContainsAll } from "@xyo-network/boundwitness-validator";
861
- import { PayloadBuilder as PayloadBuilder11 } from "@xyo-network/sdk-js";
862
- var validateBridgeTransaction = /* @__PURE__ */ __name(async (signedTxBw, intent, transfer, config) => {
863
- const { srcAddress } = intent;
864
- const chainId = getXl1ChainId(config);
865
- if (signedTxBw.chain !== chainId) return false;
866
- const errors = await new BoundWitnessValidator(signedTxBw).validate();
867
- if (isDefined9(errors) && errors.length > 0) return false;
868
- const sender = asAddress4(srcAddress, true);
869
- if (!addressesContains(signedTxBw, sender)) return false;
870
- const hashes = await PayloadBuilder11.hashes([
871
- intent,
872
- transfer
873
- ]);
874
- if (!payloadHashesContainsAll(signedTxBw, hashes)) return false;
875
- return true;
876
- }, "validateBridgeTransaction");
877
-
878
- // src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts
879
1167
  var BridgeToRemoteBodyZod = z2.tuple([
880
1168
  SignedTransactionBoundWitnessZod,
881
1169
  PayloadZodLooseOfSchema(BridgeIntentSchema2).extend(BridgeIntentFieldsZod.shape),
@@ -897,6 +1185,7 @@ var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
897
1185
  handlers: validateRequest2(async (req, res) => {
898
1186
  const [signedTxBw, bridgeIntent, transfer] = req.body;
899
1187
  const { flowProducer: flowProducer2 } = req.app;
1188
+ const { gateway } = req.app.services;
900
1189
  const transactionValid = await validateBridgeTransaction(signedTxBw, bridgeIntent, transfer, config);
901
1190
  if (!transactionValid) {
902
1191
  res.status(400).send();
@@ -907,6 +1196,11 @@ var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
907
1196
  res.status(400).send();
908
1197
  return;
909
1198
  }
1199
+ const sufficientBalance = await validateSufficientXL1SourceAddressBalance(bridgeIntent, gateway, config);
1200
+ if (!sufficientBalance) {
1201
+ res.status(400).send();
1202
+ return;
1203
+ }
910
1204
  const singedHydratedTransaction = [
911
1205
  signedTxBw,
912
1206
  [
@@ -915,14 +1209,14 @@ var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
915
1209
  ]
916
1210
  ];
917
1211
  await createXl1ToEthBridgeJob(flowProducer2, singedHydratedTransaction);
918
- const srcConfirmation = await PayloadBuilder12.hash(signedTxBw);
1212
+ const srcConfirmation = await PayloadBuilder14.hash(signedTxBw);
919
1213
  const bridgeCommonFieldsZod = z2.object({}).extend(BridgeSourceObservationFieldsZod.shape);
920
1214
  const bridgeCommonFields = bridgeCommonFieldsZod.parse(bridgeIntent);
921
1215
  const bridgeObservationFields = {
922
1216
  ...bridgeCommonFields,
923
1217
  srcConfirmation
924
1218
  };
925
- const bridgeObservation = new PayloadBuilder12({
1219
+ const bridgeObservation = new PayloadBuilder14({
926
1220
  schema: BridgeSourceObservationSchema
927
1221
  }).fields(bridgeObservationFields).build();
928
1222
  res.json(bridgeObservation);
@@ -932,7 +1226,7 @@ var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
932
1226
 
933
1227
  // src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.ts
934
1228
  import { requestHandlerValidator as requestHandlerValidator4 } from "@xylabs/express";
935
- import { assertEx as assertEx15, toAddress as toAddress3 } from "@xylabs/sdk-js";
1229
+ import { assertEx as assertEx19, toAddress as toAddress3 } from "@xylabs/sdk-js";
936
1230
  import { PayloadZodStrictOfSchema as PayloadZodStrictOfSchema3 } from "@xyo-network/sdk-js";
937
1231
  import { BridgeIntentFieldsZod as BridgeIntentFieldsZod2, BridgeIntentSchema as BridgeIntentSchema3, buildUnsignedTransaction, toXL1BlockNumber, TransactionBoundWitnessZod, TransferZod as TransferZod2 } from "@xyo-network/xl1-sdk";
938
1232
  import { z as z3 } from "zod";
@@ -963,7 +1257,7 @@ var makeBridgeToRemoteEstimateRoute = /* @__PURE__ */ __name((config, gateway) =
963
1257
  const { srcAddress, srcAmount, destAddress } = req.body;
964
1258
  const [bridgeIntent, transfer] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config);
965
1259
  const sender = toAddress3(srcAddress);
966
- const viewer = assertEx15(gateway.connection.viewer, () => new Error("Viewer not available on gateway connection"));
1260
+ const viewer = assertEx19(gateway.connection.viewer, () => new Error("Viewer not available on gateway connection"));
967
1261
  const currentBlockNumber = await viewer.currentBlockNumber();
968
1262
  const nbf = toXL1BlockNumber(currentBlockNumber, true);
969
1263
  const exp = toXL1BlockNumber(currentBlockNumber + 1e3, true);
@@ -983,10 +1277,9 @@ var makeBridgeToRemoteEstimateRoute = /* @__PURE__ */ __name((config, gateway) =
983
1277
 
984
1278
  // src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.ts
985
1279
  import { requestHandlerValidator as requestHandlerValidator5 } from "@xylabs/express";
986
- import { asHex as asHex3, isDefined as isDefined10 } from "@xylabs/sdk-js";
987
- import { PayloadBuilder as PayloadBuilder13, PayloadZodStrictOfSchema as PayloadZodStrictOfSchema4 } from "@xyo-network/sdk-js";
1280
+ import { asHex as asHex3, isDefined as isDefined13 } from "@xylabs/sdk-js";
1281
+ import { PayloadBuilder as PayloadBuilder15, PayloadZodStrictOfSchema as PayloadZodStrictOfSchema4 } from "@xyo-network/sdk-js";
988
1282
  import { asBridgeIntent, BridgeDestinationObservationFieldsZod as BridgeDestinationObservationFieldsZod2, BridgeDestinationObservationSchema as BridgeDestinationObservationSchema2, BridgeIntentFieldsZod as BridgeIntentFieldsZod3, BridgeIntentSchema as BridgeIntentSchema4, BridgeSourceObservationFieldsZod as BridgeSourceObservationFieldsZod2, BridgeSourceObservationSchema as BridgeSourceObservationSchema2, isBridgeIntent as isBridgeIntent5 } from "@xyo-network/xl1-sdk";
989
- import { Queue } from "bullmq";
990
1283
  import { z as z4 } from "zod";
991
1284
  var BridgeIntentResponseZod = PayloadZodStrictOfSchema4(BridgeIntentSchema4).extend(BridgeIntentFieldsZod3.shape);
992
1285
  var BridgeSourceResponseZod = PayloadZodStrictOfSchema4(BridgeSourceObservationSchema2).extend(BridgeSourceObservationFieldsZod2.shape);
@@ -1006,55 +1299,6 @@ var BridgeToRemoteStatusResponseZod = z4.union([
1006
1299
  BridgeDestinationResponseZod
1007
1300
  ])
1008
1301
  ]);
1009
- var statusQueues;
1010
- var getStatusQueues = /* @__PURE__ */ __name((config) => {
1011
- if (statusQueues) return statusQueues;
1012
- const connection2 = getConnection(config);
1013
- statusQueues = {
1014
- ethTransactionMonitor: new Queue(EthTransactionMonitor.queueName, {
1015
- connection: connection2
1016
- }),
1017
- ethTransactionPreparation: new Queue(EthTransactionPreparation.queueName, {
1018
- connection: connection2
1019
- }),
1020
- ethTransactionSubmission: new Queue(EthTransactionSubmission.queueName, {
1021
- connection: connection2
1022
- }),
1023
- xl1ToEthBridgeParent: new Queue(Xl1ToEthBridgeParent.queueName, {
1024
- connection: connection2
1025
- }),
1026
- xl1TransactionMonitor: new Queue(Xl1TransactionMonitor.queueName, {
1027
- connection: connection2
1028
- }),
1029
- xl1TransactionPreparation: new Queue(Xl1TransactionPreparation.queueName, {
1030
- connection: connection2
1031
- }),
1032
- xl1TransactionSubmission: new Queue(Xl1TransactionSubmission.queueName, {
1033
- connection: connection2
1034
- })
1035
- };
1036
- return statusQueues;
1037
- }, "getStatusQueues");
1038
- var getStatusQueueJobs = /* @__PURE__ */ __name(async (queues, jobId) => {
1039
- const [ethTransactionMonitorJob, ethTransactionPreparationJob, ethTransactionSubmissionJob, xl1ToEthBridgeParentJob, xl1TransactionMonitorJob, xl1TransactionPreparationJob, xl1TransactionSubmissionJob] = await Promise.all([
1040
- queues.ethTransactionMonitor.getJob(jobId),
1041
- queues.ethTransactionPreparation.getJob(jobId),
1042
- queues.ethTransactionSubmission.getJob(jobId),
1043
- queues.xl1ToEthBridgeParent.getJob(jobId),
1044
- queues.xl1TransactionMonitor.getJob(jobId),
1045
- queues.xl1TransactionPreparation.getJob(jobId),
1046
- queues.xl1TransactionSubmission.getJob(jobId)
1047
- ]);
1048
- return {
1049
- ethTransactionMonitorJob,
1050
- ethTransactionPreparationJob,
1051
- ethTransactionSubmissionJob,
1052
- xl1ToEthBridgeParentJob,
1053
- xl1TransactionMonitorJob,
1054
- xl1TransactionPreparationJob,
1055
- xl1TransactionSubmissionJob
1056
- };
1057
- }, "getStatusQueueJobs");
1058
1302
  var makeBridgeToRemoteStatusRoute = /* @__PURE__ */ __name((config) => {
1059
1303
  const params = z4.object({
1060
1304
  chainId: getRemoteChainIdZod(config),
@@ -1070,41 +1314,42 @@ var makeBridgeToRemoteStatusRoute = /* @__PURE__ */ __name((config) => {
1070
1314
  handlers: validateRequest2(async (req, res) => {
1071
1315
  const jobId = req.params.nonce;
1072
1316
  const result = [];
1073
- const queues = getStatusQueues(config);
1317
+ const queues = getXl1ToEthQueues(config);
1074
1318
  const statusQueueJobs = await getStatusQueueJobs(queues, jobId);
1075
- const tx = Object.values(statusQueueJobs).map((job) => job?.data?.tx).find((tx2) => isDefined10(tx2));
1319
+ const tx = statusQueueJobs.xl1ToEthBridgeParentJob?.data?.tx;
1076
1320
  if (!tx) return res.sendStatus(404);
1077
1321
  const bridgeIntent = tx[1].find(isBridgeIntent5);
1078
1322
  if (!bridgeIntent) return res.sendStatus(404);
1079
- result[0] = asBridgeIntent(PayloadBuilder13.omitMeta(bridgeIntent));
1323
+ result[0] = asBridgeIntent(PayloadBuilder15.omitMeta(bridgeIntent));
1080
1324
  const { xl1TransactionMonitorJob } = statusQueueJobs;
1081
1325
  const xl1MonitorState = xl1TransactionMonitorJob ? await xl1TransactionMonitorJob.getState() : void 0;
1082
- const srcConfirmation = asHex3(jobId);
1083
- if (xl1MonitorState === "completed" && isDefined10(srcConfirmation)) {
1084
- const bridgeCommonFieldsZod = z4.object({}).extend(BridgeSourceObservationFieldsZod2.shape);
1085
- const bridgeCommonFields = bridgeCommonFieldsZod.parse(bridgeIntent);
1086
- const observation = {
1087
- schema: BridgeSourceObservationSchema2,
1088
- ...bridgeCommonFields,
1089
- srcConfirmation
1090
- };
1091
- result[1] = observation;
1326
+ if (xl1MonitorState === "completed") {
1327
+ const srcConfirmation = xl1TransactionMonitorJob?.returnvalue?.submissionHash;
1328
+ if (isDefined13(srcConfirmation)) {
1329
+ const schema = BridgeSourceObservationSchema2;
1330
+ const bridgeSourceObservationFields = BridgeSourceObservationFieldsZod2.parse(bridgeIntent);
1331
+ const observation = {
1332
+ schema,
1333
+ ...bridgeSourceObservationFields,
1334
+ srcConfirmation
1335
+ };
1336
+ result[1] = observation;
1337
+ }
1092
1338
  }
1093
1339
  const { ethTransactionMonitorJob } = statusQueueJobs;
1094
1340
  const ethMonitorState = ethTransactionMonitorJob ? await ethTransactionMonitorJob.getState() : void 0;
1095
- const blockHash = ethTransactionMonitorJob?.returnvalue?.blockHash;
1096
- const destConfirmation = asHex3(blockHash);
1097
- if (ethMonitorState === "completed" && isDefined10(blockHash)) {
1098
- const bridgeDestinationFieldsZod = z4.object({}).extend(BridgeDestinationObservationFieldsZod2.shape);
1099
- const bridgeDestinationFields = bridgeDestinationFieldsZod.parse({
1100
- ...bridgeIntent,
1101
- destConfirmation
1102
- });
1103
- const observation = {
1104
- schema: BridgeDestinationObservationSchema2,
1105
- ...bridgeDestinationFields
1106
- };
1107
- result[2] = observation;
1341
+ if (ethMonitorState === "completed") {
1342
+ const destConfirmation = asHex3(ethTransactionMonitorJob?.returnvalue?.submissionHash);
1343
+ if (isDefined13(destConfirmation)) {
1344
+ const schema = BridgeDestinationObservationSchema2;
1345
+ const bridgeDestinationObservationFields = BridgeDestinationObservationFieldsZod2.parse(bridgeIntent);
1346
+ const observation = {
1347
+ schema,
1348
+ ...bridgeDestinationObservationFields,
1349
+ destConfirmation
1350
+ };
1351
+ result[2] = observation;
1352
+ }
1108
1353
  }
1109
1354
  res.json(result);
1110
1355
  })
@@ -1157,10 +1402,10 @@ var getApp = /* @__PURE__ */ __name((config, gateway) => {
1157
1402
  }, "getApp");
1158
1403
 
1159
1404
  // src/services/getServices.ts
1160
- import { assertEx as assertEx16, isDefined as isDefined11 } from "@xylabs/sdk-js";
1405
+ import { assertEx as assertEx20, isDefined as isDefined14 } from "@xylabs/sdk-js";
1161
1406
  import { initEvmProvider } from "@xyo-network/chain-orchestration";
1407
+ import { HDWallet as HDWallet2 } from "@xyo-network/sdk-js";
1162
1408
  import { BridgeableToken__factory, LiquidityPoolBridge__factory } from "@xyo-network/typechain";
1163
- import { HDWallet as HDWallet2 } from "@xyo-network/wallet";
1164
1409
  import { getAddress as getAddress2, Wallet } from "ethers";
1165
1410
 
1166
1411
  // src/services/getIterableMap.ts
@@ -1202,12 +1447,12 @@ var getServices = /* @__PURE__ */ __name(async (context, gateway) => {
1202
1447
  const xl1TxStateMap = await getIterableMap(config, "liquidity_bridge_xl1_to_eth_xl1_tx_state");
1203
1448
  const provider = await initEvmProvider(context);
1204
1449
  const { remoteBridgeContractAddress, remoteChainWalletPrivateKey, remoteTokenAddress, mnemonic } = config;
1205
- const account = isDefined11(mnemonic) ? await HDWallet2.fromPhrase(mnemonic) : await HDWallet2.random();
1450
+ const account = isDefined14(mnemonic) ? await HDWallet2.fromPhrase(mnemonic) : await HDWallet2.random();
1206
1451
  const wallet = new Wallet(remoteChainWalletPrivateKey, provider);
1207
1452
  const bridgeableToken = BridgeableToken__factory.connect(getAddress2(remoteTokenAddress), wallet);
1208
1453
  const bridge = LiquidityPoolBridge__factory.connect(getAddress2(remoteBridgeContractAddress), wallet);
1209
1454
  const bridgeOwner = await bridge.owner();
1210
- assertEx16(bridgeOwner.toLowerCase() === wallet.address.toLowerCase(), () => "Wallet is not the owner of the bridge contract");
1455
+ assertEx20(bridgeOwner.toLowerCase() === wallet.address.toLowerCase(), () => "Wallet is not the owner of the bridge contract");
1211
1456
  return {
1212
1457
  account,
1213
1458
  bridge,
@@ -1223,7 +1468,8 @@ var getServices = /* @__PURE__ */ __name(async (context, gateway) => {
1223
1468
  // src/server/addWorkers.ts
1224
1469
  var addWorkers = /* @__PURE__ */ __name((config, services) => {
1225
1470
  const connection2 = getConnection(config);
1226
- createWorkers(connection2, services);
1471
+ const telemetry2 = getTelemetry();
1472
+ createWorkers(connection2, telemetry2, services);
1227
1473
  }, "addWorkers");
1228
1474
 
1229
1475
  // src/server/server.ts
@@ -1233,6 +1479,7 @@ var getServer = /* @__PURE__ */ __name(async (context, gateway) => {
1233
1479
  const { port } = config;
1234
1480
  const app = getApp(config, gateway);
1235
1481
  const services = await getServices(context, gateway);
1482
+ app.services = services;
1236
1483
  addWorkers(config, services);
1237
1484
  const server = app.listen(port, hostname, () => logger?.log(`[Bridge] Server listening at http://${hostname}:${port}`));
1238
1485
  server.setTimeout(2e4);