@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.
- package/dist/node/config/getTestGateway.d.ts +4 -0
- package/dist/node/config/getTestGateway.d.ts.map +1 -0
- package/dist/node/config/index.d.ts +1 -1
- package/dist/node/config/index.d.ts.map +1 -1
- package/dist/node/index.mjs +767 -520
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/modules/index.d.ts +0 -1
- package/dist/node/modules/index.d.ts.map +1 -1
- package/dist/node/queue/flowProducer.d.ts +2 -1
- package/dist/node/queue/flowProducer.d.ts.map +1 -1
- package/dist/node/queue/flows/createEthToXl1BridgeJob.d.ts +10 -0
- package/dist/node/queue/flows/createEthToXl1BridgeJob.d.ts.map +1 -0
- package/dist/node/queue/flows/createXl1ToEthBridgeJob.d.ts.map +1 -1
- package/dist/node/queue/flows/index.d.ts +1 -0
- package/dist/node/queue/flows/index.d.ts.map +1 -1
- package/dist/node/queue/getXl1ToEthQueueJobs.d.ts +20 -0
- package/dist/node/queue/getXl1ToEthQueueJobs.d.ts.map +1 -0
- package/dist/node/queue/getXl1ToEthQueues.d.ts +14 -0
- package/dist/node/queue/getXl1ToEthQueues.d.ts.map +1 -0
- package/dist/node/queue/index.d.ts +4 -0
- package/dist/node/queue/index.d.ts.map +1 -1
- package/dist/node/queue/prefix.d.ts +2 -0
- package/dist/node/queue/prefix.d.ts.map +1 -0
- package/dist/node/queue/telemetry.d.ts +3 -0
- package/dist/node/queue/telemetry.d.ts.map +1 -0
- package/dist/node/queue/workers/EthToXl1BridgeParent.d.ts +8 -0
- package/dist/node/queue/workers/EthToXl1BridgeParent.d.ts.map +1 -0
- package/dist/node/queue/workers/EthTransactionMonitor.d.ts +11 -0
- package/dist/node/queue/workers/EthTransactionMonitor.d.ts.map +1 -1
- package/dist/node/queue/workers/EthTransactionPreparation.d.ts +9 -1
- package/dist/node/queue/workers/EthTransactionPreparation.d.ts.map +1 -1
- package/dist/node/queue/workers/EthTransactionSubmission.d.ts +10 -0
- package/dist/node/queue/workers/EthTransactionSubmission.d.ts.map +1 -1
- package/dist/node/queue/workers/EthTransactionSubmissionStorage.d.ts +13 -0
- package/dist/node/queue/workers/EthTransactionSubmissionStorage.d.ts.map +1 -0
- package/dist/node/queue/workers/WorkerDescription.d.ts +2 -1
- package/dist/node/queue/workers/WorkerDescription.d.ts.map +1 -1
- package/dist/node/queue/workers/Xl1ToEthBridgeParent.d.ts +8 -0
- package/dist/node/queue/workers/Xl1ToEthBridgeParent.d.ts.map +1 -1
- package/dist/node/queue/workers/Xl1TransactionMonitor.d.ts +10 -0
- package/dist/node/queue/workers/Xl1TransactionMonitor.d.ts.map +1 -1
- package/dist/node/queue/workers/Xl1TransactionPreparation.d.ts +9 -0
- package/dist/node/queue/workers/Xl1TransactionPreparation.d.ts.map +1 -1
- package/dist/node/queue/workers/Xl1TransactionSubmission.d.ts +10 -0
- package/dist/node/queue/workers/Xl1TransactionSubmission.d.ts.map +1 -1
- package/dist/node/queue/workers/Xl1TransactionSubmissionStorage.d.ts +13 -0
- package/dist/node/queue/workers/Xl1TransactionSubmissionStorage.d.ts.map +1 -0
- package/dist/node/queue/workers/createWorkers.d.ts +2 -1
- package/dist/node/queue/workers/createWorkers.d.ts.map +1 -1
- package/dist/node/queue/workers/index.d.ts +3 -0
- package/dist/node/queue/workers/index.d.ts.map +1 -1
- package/dist/node/queue/workers/util/index.d.ts +0 -2
- package/dist/node/queue/workers/util/index.d.ts.map +1 -1
- package/dist/node/server/addFlowProducer.d.ts.map +1 -1
- package/dist/node/server/addWorkers.d.ts.map +1 -1
- package/dist/node/server/index.d.ts +2 -0
- package/dist/node/server/index.d.ts.map +1 -1
- package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.d.ts.map +1 -1
- package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.d.ts +1 -1
- package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.d.ts.map +1 -1
- package/dist/node/server/server.d.ts.map +1 -1
- package/dist/node/services/IBridgeServiceCollection.d.ts +1 -1
- package/dist/node/services/IBridgeServiceCollection.d.ts.map +1 -1
- package/dist/node/services/TxState.d.ts +0 -7
- package/dist/node/services/TxState.d.ts.map +1 -1
- package/dist/node/util/index.d.ts +0 -3
- package/dist/node/util/index.d.ts.map +1 -1
- package/dist/node/validation/AsyncLogger.d.ts +5 -0
- package/dist/node/validation/AsyncLogger.d.ts.map +1 -0
- package/dist/node/validation/index.d.ts +7 -0
- package/dist/node/validation/index.d.ts.map +1 -0
- package/dist/node/validation/validateBridgeEstimate.d.ts.map +1 -0
- package/dist/node/validation/validateBridgeEstimateExact.d.ts.map +1 -0
- package/dist/node/validation/validateBridgeTransaction.d.ts.map +1 -0
- package/dist/node/{queue/workers/util/validateSufficientAllowance.d.ts → validation/validateSufficientLiquiditySourceAllowance.d.ts} +3 -7
- package/dist/node/validation/validateSufficientLiquiditySourceAllowance.d.ts.map +1 -0
- package/dist/node/{queue/workers/util/validateSufficientBalance.d.ts → validation/validateSufficientLiquiditySourceBalance.d.ts} +3 -7
- package/dist/node/validation/validateSufficientLiquiditySourceBalance.d.ts.map +1 -0
- package/dist/node/validation/validateSufficientRunnerEthBalanceForGas.d.ts +14 -0
- package/dist/node/validation/validateSufficientRunnerEthBalanceForGas.d.ts.map +1 -0
- package/dist/node/validation/validateSufficientXL1SourceAddressBalance.d.ts +15 -0
- package/dist/node/validation/validateSufficientXL1SourceAddressBalance.d.ts.map +1 -0
- package/package.json +31 -35
- package/src/config/getBridgeWalletAccount.ts +1 -1
- package/src/config/getTestGateway.ts +24 -0
- package/src/config/index.ts +1 -1
- package/src/modules/index.ts +0 -1
- package/src/queue/flowProducer.ts +7 -2
- package/src/queue/flows/createEthToXl1BridgeJob.ts +71 -0
- package/src/queue/flows/createXl1ToEthBridgeJob.ts +48 -20
- package/src/queue/flows/index.ts +1 -0
- package/src/queue/getXl1ToEthQueueJobs.ts +57 -0
- package/src/queue/getXl1ToEthQueues.ts +39 -0
- package/src/queue/index.ts +4 -0
- package/src/queue/prefix.ts +1 -0
- package/src/queue/telemetry.ts +12 -0
- package/src/queue/workers/EthToXl1BridgeParent.ts +40 -0
- package/src/queue/workers/EthTransactionMonitor.ts +14 -6
- package/src/queue/workers/EthTransactionPreparation.ts +21 -9
- package/src/queue/workers/EthTransactionSubmission.ts +10 -38
- package/src/queue/workers/EthTransactionSubmissionStorage.ts +76 -0
- package/src/queue/workers/WorkerDescription.ts +2 -1
- package/src/queue/workers/Xl1ToEthBridgeParent.ts +13 -5
- package/src/queue/workers/Xl1TransactionMonitor.ts +18 -12
- package/src/queue/workers/Xl1TransactionPreparation.ts +11 -7
- package/src/queue/workers/Xl1TransactionSubmission.ts +12 -12
- package/src/queue/workers/Xl1TransactionSubmissionStorage.ts +77 -0
- package/src/queue/workers/createWorkers.ts +15 -8
- package/src/queue/workers/index.ts +3 -0
- package/src/queue/workers/util/index.ts +0 -2
- package/src/server/addFlowProducer.ts +5 -2
- package/src/server/addWorkers.ts +6 -2
- package/src/server/index.ts +3 -2
- package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts +11 -1
- package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.ts +27 -101
- package/src/server/server.ts +1 -0
- package/src/services/IBridgeServiceCollection.ts +1 -1
- package/src/services/TxState.ts +0 -18
- package/src/services/getServices.ts +1 -1
- package/src/util/index.ts +0 -3
- package/src/validation/AsyncLogger.ts +5 -0
- package/src/validation/index.ts +6 -0
- package/src/{util → validation}/validateBridgeEstimate.ts +1 -1
- package/src/{util → validation}/validateBridgeEstimateExact.ts +1 -1
- package/src/{util → validation}/validateBridgeTransaction.ts +1 -2
- package/src/{queue/workers/util/validateSufficientAllowance.ts → validation/validateSufficientLiquiditySourceAllowance.ts} +3 -6
- package/src/{queue/workers/util/validateSufficientBalance.ts → validation/validateSufficientLiquiditySourceBalance.ts} +3 -6
- package/src/validation/validateSufficientRunnerEthBalanceForGas.ts +57 -0
- package/src/validation/validateSufficientXL1SourceAddressBalance.ts +39 -0
- package/dist/node/config/getGateway.d.ts +0 -4
- package/dist/node/config/getGateway.d.ts.map +0 -1
- package/dist/node/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.d.ts +0 -60
- package/dist/node/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.d.ts.map +0 -1
- package/dist/node/modules/XL1TransactionCompletionMonitorSentinel/index.d.ts +0 -2
- package/dist/node/modules/XL1TransactionCompletionMonitorSentinel/index.d.ts.map +0 -1
- package/dist/node/queue/workers/util/validateSufficientAllowance.d.ts.map +0 -1
- package/dist/node/queue/workers/util/validateSufficientBalance.d.ts.map +0 -1
- package/dist/node/util/validateBridgeEstimate.d.ts.map +0 -1
- package/dist/node/util/validateBridgeEstimateExact.d.ts.map +0 -1
- package/dist/node/util/validateBridgeTransaction.d.ts.map +0 -1
- package/src/config/getGateway.ts +0 -23
- package/src/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.ts +0 -165
- package/src/modules/XL1TransactionCompletionMonitorSentinel/index.ts +0 -1
- /package/dist/node/{util → validation}/validateBridgeEstimate.d.ts +0 -0
- /package/dist/node/{util → validation}/validateBridgeEstimateExact.d.ts +0 -0
- /package/dist/node/{util → validation}/validateBridgeTransaction.d.ts +0 -0
package/dist/node/index.mjs
CHANGED
|
@@ -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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
|
98
|
-
import { PayloadBuilder as
|
|
99
|
-
import { isBridgeIntent as
|
|
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/
|
|
104
|
-
import {
|
|
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 {
|
|
107
|
-
|
|
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/
|
|
120
|
-
import {
|
|
121
|
-
var
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
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/
|
|
128
|
-
import {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
}, "
|
|
373
|
+
}, "validateSufficientLiquiditySourceAllowance");
|
|
139
374
|
|
|
140
|
-
// src/
|
|
141
|
-
import { assertEx as
|
|
142
|
-
import { isBridgeIntent as
|
|
143
|
-
var
|
|
144
|
-
const bridgeIntent =
|
|
145
|
-
const amount =
|
|
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
|
-
}, "
|
|
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 =
|
|
157
|
-
const bridgeableToken =
|
|
158
|
-
const stateMap =
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
175
|
-
const amount =
|
|
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 =
|
|
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
|
|
206
|
-
import { PayloadBuilder as
|
|
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 =
|
|
212
|
-
const bridgeableToken =
|
|
213
|
-
const wallet =
|
|
214
|
-
const stateMap =
|
|
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
|
|
218
|
-
const state =
|
|
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 (
|
|
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 =
|
|
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
|
-
|
|
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/
|
|
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 = "
|
|
257
|
-
var queueName4 = "
|
|
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
|
-
|
|
261
|
-
await
|
|
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
|
-
|
|
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
|
|
600
|
+
var EthTransactionSubmissionStorage = {
|
|
276
601
|
createWorker: createWorker4,
|
|
277
602
|
name: name4,
|
|
278
603
|
queueName: queueName4
|
|
279
604
|
};
|
|
280
605
|
|
|
281
|
-
// src/queue/workers/
|
|
282
|
-
import {
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
var
|
|
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
|
|
293
|
-
const
|
|
294
|
-
const
|
|
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.
|
|
298
|
-
if (
|
|
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
|
-
|
|
301
|
-
|
|
302
|
-
|
|
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(`[${
|
|
670
|
+
console.error(`[${name6}] Job ${job?.id} failed:`, err.message);
|
|
316
671
|
});
|
|
317
672
|
worker.on("error", (err) => {
|
|
318
|
-
console.error(`[${
|
|
673
|
+
console.error(`[${name6}] Worker error:`, err);
|
|
319
674
|
});
|
|
320
675
|
}, "createWorker");
|
|
321
676
|
var Xl1TransactionMonitor = {
|
|
322
|
-
createWorker:
|
|
323
|
-
name:
|
|
324
|
-
queueName:
|
|
677
|
+
createWorker: createWorker6,
|
|
678
|
+
name: name6,
|
|
679
|
+
queueName: queueName6
|
|
325
680
|
};
|
|
326
681
|
|
|
327
682
|
// src/queue/workers/Xl1TransactionPreparation.ts
|
|
328
|
-
import { assertEx as
|
|
329
|
-
import { PayloadBuilder as
|
|
330
|
-
import { Worker as
|
|
331
|
-
var
|
|
332
|
-
var
|
|
333
|
-
var
|
|
334
|
-
const stateMap =
|
|
335
|
-
const worker = new
|
|
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
|
|
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(`[${
|
|
710
|
+
console.error(`[${name7}] Job ${job?.id} failed:`, err.message);
|
|
352
711
|
});
|
|
353
712
|
worker.on("error", (err) => {
|
|
354
|
-
console.error(`[${
|
|
713
|
+
console.error(`[${name7}] Worker error:`, err);
|
|
355
714
|
});
|
|
356
715
|
}, "createWorker");
|
|
357
716
|
var Xl1TransactionPreparation = {
|
|
358
|
-
createWorker:
|
|
359
|
-
name:
|
|
360
|
-
queueName:
|
|
717
|
+
createWorker: createWorker7,
|
|
718
|
+
name: name7,
|
|
719
|
+
queueName: queueName7
|
|
361
720
|
};
|
|
362
721
|
|
|
363
722
|
// src/queue/workers/Xl1TransactionSubmission.ts
|
|
364
|
-
import { assertEx as
|
|
365
|
-
import { PayloadBuilder as
|
|
366
|
-
import { Worker as
|
|
367
|
-
var
|
|
368
|
-
var
|
|
369
|
-
var
|
|
370
|
-
const gateway =
|
|
371
|
-
const stateMap =
|
|
372
|
-
const worker = new
|
|
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
|
|
375
|
-
const state =
|
|
376
|
-
const preparedTx =
|
|
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 (
|
|
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 =
|
|
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(`[${
|
|
804
|
+
console.error(`[${name9}] Job ${job?.id} failed:`, err.message);
|
|
399
805
|
});
|
|
400
806
|
worker.on("error", (err) => {
|
|
401
|
-
console.error(`[${
|
|
807
|
+
console.error(`[${name9}] Worker error:`, err);
|
|
402
808
|
});
|
|
403
809
|
}, "createWorker");
|
|
404
|
-
var
|
|
405
|
-
createWorker:
|
|
406
|
-
name:
|
|
407
|
-
queueName:
|
|
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
|
|
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
|
|
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
|
|
441
|
-
name:
|
|
442
|
-
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
|
|
449
|
-
name:
|
|
450
|
-
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
|
|
460
|
-
name:
|
|
461
|
-
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
|
|
476
|
-
name:
|
|
477
|
-
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
|
|
487
|
-
name:
|
|
488
|
-
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
|
|
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
|
|
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 (
|
|
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:
|
|
752
|
-
destAmount:
|
|
1148
|
+
destAddress: toAddress2("0xabc"),
|
|
1149
|
+
destAmount: toHex2("0x100"),
|
|
753
1150
|
destToken: xl1TokenAddress,
|
|
754
1151
|
src: remoteChainId,
|
|
755
|
-
srcAddress:
|
|
756
|
-
srcAmount:
|
|
1152
|
+
srcAddress: toAddress2("0x123"),
|
|
1153
|
+
srcAmount: toHex2("0x200"),
|
|
757
1154
|
srcToken: remoteTokenAddress,
|
|
758
|
-
destConfirmation:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
987
|
-
import { PayloadBuilder as
|
|
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 =
|
|
1317
|
+
const queues = getXl1ToEthQueues(config);
|
|
1074
1318
|
const statusQueueJobs = await getStatusQueueJobs(queues, jobId);
|
|
1075
|
-
const tx =
|
|
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(
|
|
1323
|
+
result[0] = asBridgeIntent(PayloadBuilder15.omitMeta(bridgeIntent));
|
|
1080
1324
|
const { xl1TransactionMonitorJob } = statusQueueJobs;
|
|
1081
1325
|
const xl1MonitorState = xl1TransactionMonitorJob ? await xl1TransactionMonitorJob.getState() : void 0;
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
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
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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);
|