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