@xyo-network/chain-bridge 1.17.2 → 1.17.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/dist/node/config/asChainId.d.ts +3 -0
  2. package/dist/node/config/asChainId.d.ts.map +1 -0
  3. package/dist/node/config/asToken.d.ts +3 -0
  4. package/dist/node/config/asToken.d.ts.map +1 -0
  5. package/dist/node/config/getBridgeEscrowAddress.d.ts +5 -0
  6. package/dist/node/config/getBridgeEscrowAddress.d.ts.map +1 -0
  7. package/dist/node/config/getBridgeFeesAddress.d.ts +5 -0
  8. package/dist/node/config/getBridgeFeesAddress.d.ts.map +1 -0
  9. package/dist/node/config/getBridgeSettings.d.ts +3 -0
  10. package/dist/node/config/getBridgeSettings.d.ts.map +1 -0
  11. package/dist/node/config/getBridgeWalletAccount.d.ts +6 -0
  12. package/dist/node/config/getBridgeWalletAccount.d.ts.map +1 -0
  13. package/dist/node/config/getFeeStructure.d.ts +4 -0
  14. package/dist/node/config/getFeeStructure.d.ts.map +1 -0
  15. package/dist/node/config/getGateway.d.ts +3 -0
  16. package/dist/node/config/getGateway.d.ts.map +1 -0
  17. package/dist/node/config/getMaxBridgeAmount.d.ts +4 -0
  18. package/dist/node/config/getMaxBridgeAmount.d.ts.map +1 -0
  19. package/dist/node/config/getMinBridgeAmount.d.ts +4 -0
  20. package/dist/node/config/getMinBridgeAmount.d.ts.map +1 -0
  21. package/dist/node/config/getRemoteChainId.d.ts +4 -0
  22. package/dist/node/config/getRemoteChainId.d.ts.map +1 -0
  23. package/dist/node/config/getRemoteTokenAddress.d.ts +4 -0
  24. package/dist/node/config/getRemoteTokenAddress.d.ts.map +1 -0
  25. package/dist/node/config/getTransferAddresses.d.ts +8 -0
  26. package/dist/node/config/getTransferAddresses.d.ts.map +1 -0
  27. package/dist/node/config/getXl1ChainId.d.ts +4 -0
  28. package/dist/node/config/getXl1ChainId.d.ts.map +1 -0
  29. package/dist/node/config/getXl1TokenAddress.d.ts +4 -0
  30. package/dist/node/config/getXl1TokenAddress.d.ts.map +1 -0
  31. package/dist/node/config/index.d.ts +16 -0
  32. package/dist/node/config/index.d.ts.map +1 -0
  33. package/dist/node/index.mjs +1155 -206
  34. package/dist/node/index.mjs.map +1 -1
  35. package/dist/node/interface/service/Observer/LiquidityPoolBridgeObserver/LiquidityPoolBridgeObserver.d.ts.map +1 -1
  36. package/dist/node/manifest/getLocator.d.ts.map +1 -1
  37. package/dist/node/manifest/public/index.d.ts +0 -4
  38. package/dist/node/manifest/public/index.d.ts.map +1 -1
  39. package/dist/node/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/EVMLiquidityBridgeTransactionCompletionMonitorSentinel.d.ts +77 -0
  40. package/dist/node/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/EVMLiquidityBridgeTransactionCompletionMonitorSentinel.d.ts.map +1 -0
  41. package/dist/node/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/index.d.ts +2 -0
  42. package/dist/node/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/index.d.ts.map +1 -0
  43. package/dist/node/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.d.ts +56 -0
  44. package/dist/node/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.d.ts.map +1 -0
  45. package/dist/node/modules/XL1TransactionCompletionMonitorSentinel/index.d.ts +2 -0
  46. package/dist/node/modules/XL1TransactionCompletionMonitorSentinel/index.d.ts.map +1 -0
  47. package/dist/node/modules/index.d.ts +2 -1
  48. package/dist/node/modules/index.d.ts.map +1 -1
  49. package/dist/node/server/app.d.ts +3 -1
  50. package/dist/node/server/app.d.ts.map +1 -1
  51. package/dist/node/server/routes/addRoutes.d.ts +2 -1
  52. package/dist/node/server/routes/addRoutes.d.ts.map +1 -1
  53. package/dist/node/server/routes/bridge/addBridgeRoutes.d.ts +2 -1
  54. package/dist/node/server/routes/bridge/addBridgeRoutes.d.ts.map +1 -1
  55. package/dist/node/server/routes/bridge/routeDefinitions/getRouteDefinitions.d.ts +2 -1
  56. package/dist/node/server/routes/bridge/routeDefinitions/getRouteDefinitions.d.ts.map +1 -1
  57. package/dist/node/server/routes/bridge/routeDefinitions/pathParams/ChainIdPathParam.d.ts +2 -1
  58. package/dist/node/server/routes/bridge/routeDefinitions/pathParams/ChainIdPathParam.d.ts.map +1 -1
  59. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeConfig.d.ts +4 -0
  60. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeConfig.d.ts.map +1 -0
  61. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeFromRemoteStatus.d.ts +2 -1
  62. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeFromRemoteStatus.d.ts.map +1 -1
  63. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.d.ts +2 -1
  64. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.d.ts.map +1 -1
  65. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.d.ts +2 -1
  66. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.d.ts.map +1 -1
  67. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.d.ts +2 -1
  68. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.d.ts.map +1 -1
  69. package/dist/node/server/routes/bridge/routeDefinitions/routes/index.d.ts +1 -0
  70. package/dist/node/server/routes/bridge/routeDefinitions/routes/index.d.ts.map +1 -1
  71. package/dist/node/server/routes/index.d.ts +0 -2
  72. package/dist/node/server/routes/index.d.ts.map +1 -1
  73. package/dist/node/server/server.d.ts +1 -1
  74. package/dist/node/server/server.d.ts.map +1 -1
  75. package/dist/node/util/calculateBridgeFees.d.ts +10 -0
  76. package/dist/node/util/calculateBridgeFees.d.ts.map +1 -0
  77. package/dist/node/util/generateBridgeEstimate.d.ts +5 -0
  78. package/dist/node/util/generateBridgeEstimate.d.ts.map +1 -0
  79. package/dist/node/util/index.d.ts +6 -0
  80. package/dist/node/util/index.d.ts.map +1 -0
  81. package/dist/node/util/validateBridgeEstimate.d.ts +13 -0
  82. package/dist/node/util/validateBridgeEstimate.d.ts.map +1 -0
  83. package/dist/node/util/validateBridgeEstimateExact.d.ts +12 -0
  84. package/dist/node/util/validateBridgeEstimateExact.d.ts.map +1 -0
  85. package/dist/node/util/validateBridgeTransaction.d.ts +15 -0
  86. package/dist/node/util/validateBridgeTransaction.d.ts.map +1 -0
  87. package/package.json +31 -15
  88. package/src/config/asChainId.ts +7 -0
  89. package/src/config/asToken.ts +7 -0
  90. package/src/config/getBridgeEscrowAddress.ts +13 -0
  91. package/src/config/getBridgeFeesAddress.ts +13 -0
  92. package/src/config/getBridgeSettings.ts +24 -0
  93. package/src/config/getBridgeWalletAccount.ts +34 -0
  94. package/src/config/getFeeStructure.ts +8 -0
  95. package/src/config/getGateway.ts +19 -0
  96. package/src/config/getMaxBridgeAmount.ts +7 -0
  97. package/src/config/getMinBridgeAmount.ts +7 -0
  98. package/src/config/getRemoteChainId.ts +10 -0
  99. package/src/config/getRemoteTokenAddress.ts +10 -0
  100. package/src/config/getTransferAddresses.ts +17 -0
  101. package/src/config/getXl1ChainId.ts +13 -0
  102. package/src/config/getXl1TokenAddress.ts +12 -0
  103. package/src/config/index.ts +15 -0
  104. package/src/interface/service/Observer/LiquidityPoolBridgeObserver/LiquidityPoolBridgeObserver.ts +1 -2
  105. package/src/manifest/getLocator.ts +97 -34
  106. package/src/manifest/public/Ethereum.json +24 -64
  107. package/src/manifest/public/XL1.json +24 -64
  108. package/src/manifest/public/index.ts +0 -6
  109. package/src/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/EVMLiquidityBridgeTransactionCompletionMonitorSentinel.ts +234 -0
  110. package/src/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/index.ts +1 -0
  111. package/src/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.ts +166 -0
  112. package/src/modules/XL1TransactionCompletionMonitorSentinel/index.ts +1 -0
  113. package/src/modules/index.ts +2 -1
  114. package/src/server/app.ts +5 -4
  115. package/src/server/routes/addRoutes.ts +3 -2
  116. package/src/server/routes/bridge/addBridgeRoutes.ts +3 -2
  117. package/src/server/routes/bridge/routeDefinitions/getRouteDefinitions.ts +8 -6
  118. package/src/server/routes/bridge/routeDefinitions/pathParams/ChainIdPathParam.ts +16 -13
  119. package/src/server/routes/bridge/routeDefinitions/routes/bridgeConfig.ts +43 -0
  120. package/src/server/routes/bridge/routeDefinitions/routes/bridgeFromRemoteStatus.ts +40 -37
  121. package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts +68 -45
  122. package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.ts +48 -75
  123. package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.ts +95 -47
  124. package/src/server/routes/bridge/routeDefinitions/routes/index.ts +1 -0
  125. package/src/server/routes/index.ts +0 -2
  126. package/src/server/server.ts +37 -31
  127. package/src/util/calculateBridgeFees.ts +39 -0
  128. package/src/util/generateBridgeEstimate.ts +64 -0
  129. package/src/util/index.ts +5 -0
  130. package/src/util/validateBridgeEstimate.ts +60 -0
  131. package/src/util/validateBridgeEstimateExact.ts +34 -0
  132. package/src/util/validateBridgeTransaction.ts +40 -0
  133. package/dist/node/modules/XL1toEvmBridgeSentinel/XL1toEvmBridgeSentinel.d.ts +0 -47
  134. package/dist/node/modules/XL1toEvmBridgeSentinel/XL1toEvmBridgeSentinel.d.ts.map +0 -1
  135. package/dist/node/modules/XL1toEvmBridgeSentinel/index.d.ts +0 -2
  136. package/dist/node/modules/XL1toEvmBridgeSentinel/index.d.ts.map +0 -1
  137. package/dist/node/server/routes/address/AddressPathParams.d.ts +0 -4
  138. package/dist/node/server/routes/address/AddressPathParams.d.ts.map +0 -1
  139. package/dist/node/server/routes/address/addNodeRoutes.d.ts +0 -3
  140. package/dist/node/server/routes/address/addNodeRoutes.d.ts.map +0 -1
  141. package/dist/node/server/routes/address/get/get.d.ts +0 -4
  142. package/dist/node/server/routes/address/get/get.d.ts.map +0 -1
  143. package/dist/node/server/routes/address/get/index.d.ts +0 -2
  144. package/dist/node/server/routes/address/get/index.d.ts.map +0 -1
  145. package/dist/node/server/routes/address/index.d.ts +0 -2
  146. package/dist/node/server/routes/address/index.d.ts.map +0 -1
  147. package/dist/node/server/routes/address/post/getQueryConfig.d.ts +0 -6
  148. package/dist/node/server/routes/address/post/getQueryConfig.d.ts.map +0 -1
  149. package/dist/node/server/routes/address/post/index.d.ts +0 -2
  150. package/dist/node/server/routes/address/post/index.d.ts.map +0 -1
  151. package/dist/node/server/routes/address/post/post.d.ts +0 -8
  152. package/dist/node/server/routes/address/post/post.d.ts.map +0 -1
  153. package/src/manifest/public/Chain.json +0 -32
  154. package/src/modules/XL1toEvmBridgeSentinel/XL1toEvmBridgeSentinel.ts +0 -156
  155. package/src/modules/XL1toEvmBridgeSentinel/index.ts +0 -1
  156. package/src/server/routes/address/AddressPathParams.ts +0 -3
  157. package/src/server/routes/address/addNodeRoutes.ts +0 -21
  158. package/src/server/routes/address/get/get.ts +0 -30
  159. package/src/server/routes/address/get/index.ts +0 -1
  160. package/src/server/routes/address/index.ts +0 -1
  161. package/src/server/routes/address/post/getQueryConfig.ts +0 -23
  162. package/src/server/routes/address/post/index.ts +0 -1
  163. package/src/server/routes/address/post/post.ts +0 -77
@@ -21,243 +21,595 @@ var addInstrumentation = /* @__PURE__ */ __name(() => {
21
21
  });
22
22
  }, "addInstrumentation");
23
23
 
24
- // src/server/routes/bridge/routeDefinitions/routes/bridgeFromRemoteStatus.ts
24
+ // src/server/routes/bridge/routeDefinitions/routes/bridgeConfig.ts
25
25
  import { requestHandlerValidator } from "@xylabs/express";
26
- import { toAddress as toAddress2, toHex } from "@xylabs/sdk-js";
26
+ import { BridgeSettingsZod } from "@xyo-network/xl1-protocol-sdk";
27
+
28
+ // src/config/asChainId.ts
29
+ import { asHex } from "@xylabs/sdk-js";
30
+ var asChainId = /* @__PURE__ */ __name((value) => {
31
+ const chainId = asHex(value);
32
+ return chainId;
33
+ }, "asChainId");
34
+
35
+ // src/config/asToken.ts
36
+ import { asAddress } from "@xylabs/sdk-js";
37
+ var asToken = /* @__PURE__ */ __name((value) => {
38
+ const token = asAddress(value);
39
+ return token;
40
+ }, "asToken");
41
+
42
+ // src/config/getBridgeEscrowAddress.ts
43
+ import { asAddress as asAddress2, assertEx } from "@xylabs/sdk-js";
44
+ var tryGetBridgeEscrowAddress = /* @__PURE__ */ __name((config) => {
45
+ const address = asAddress2(config.bridge.escrowAddress);
46
+ return address;
47
+ }, "tryGetBridgeEscrowAddress");
48
+
49
+ // src/config/getBridgeFeesAddress.ts
50
+ import { asAddress as asAddress3, assertEx as assertEx2 } from "@xylabs/sdk-js";
51
+ var tryGetBridgeFeesAddress = /* @__PURE__ */ __name((config) => {
52
+ const address = asAddress3(config.bridge.feesAddress);
53
+ return address;
54
+ }, "tryGetBridgeFeesAddress");
55
+
56
+ // src/config/getFeeStructure.ts
57
+ var getFeeStructure = /* @__PURE__ */ __name((config) => {
58
+ const { feeFixed, feeRateBasisPoints } = config.bridge;
59
+ return {
60
+ feeFixed,
61
+ feeRateBasisPoints
62
+ };
63
+ }, "getFeeStructure");
64
+
65
+ // src/config/getMaxBridgeAmount.ts
66
+ var getMaxBridgeAmount = /* @__PURE__ */ __name((config) => {
67
+ const { maxBridgeAmount } = config.bridge;
68
+ return maxBridgeAmount;
69
+ }, "getMaxBridgeAmount");
70
+
71
+ // src/config/getMinBridgeAmount.ts
72
+ var getMinBridgeAmount = /* @__PURE__ */ __name((config) => {
73
+ const { minBridgeAmount } = config.bridge;
74
+ return minBridgeAmount;
75
+ }, "getMinBridgeAmount");
76
+
77
+ // src/config/getRemoteChainId.ts
78
+ import { assertEx as assertEx3 } from "@xylabs/sdk-js";
79
+ var getRemoteChainId = /* @__PURE__ */ __name((config) => {
80
+ const remoteChainId = assertEx3(asChainId(config.bridge.remoteChainId), () => "Invalid remote chain ID in config");
81
+ return remoteChainId;
82
+ }, "getRemoteChainId");
83
+
84
+ // src/config/getRemoteTokenAddress.ts
85
+ import { assertEx as assertEx4 } from "@xylabs/sdk-js";
86
+ var getRemoteTokenAddress = /* @__PURE__ */ __name((config) => {
87
+ const token = asToken(config.bridge.remoteTokenAddress);
88
+ return assertEx4(token, () => "Remote token address is not defined in bridge configuration");
89
+ }, "getRemoteTokenAddress");
90
+
91
+ // src/config/getBridgeWalletAccount.ts
92
+ import { isDefined, isUndefined } from "@xylabs/sdk-js";
93
+ import { HDWallet } from "@xyo-network/wallet";
94
+ import { ADDRESS_INDEX, generateXyoBaseWalletFromPhrase } from "@xyo-network/xl1-protocol-sdk";
95
+ var accountServiceSingleton;
96
+ var getBridgeWalletAccount = /* @__PURE__ */ __name(async (config) => {
97
+ if (accountServiceSingleton) return accountServiceSingleton;
98
+ let walletPhrase = config.bridge.mnemonic;
99
+ if (isUndefined(walletPhrase)) {
100
+ console.log("[Bridge] No wallet mnemonic specified!");
101
+ const randomMnemonic = HDWallet.generateMnemonic();
102
+ console.log(`[Bridge] Using randomly generated mnemonic:
103
+
104
+ ${randomMnemonic}
105
+
106
+ `);
107
+ walletPhrase = randomMnemonic;
108
+ }
109
+ const wallet = await generateXyoBaseWalletFromPhrase(walletPhrase);
110
+ const account = await wallet.derivePath(ADDRESS_INDEX.XYO);
111
+ accountServiceSingleton = account;
112
+ return accountServiceSingleton;
113
+ }, "getBridgeWalletAccount");
114
+
115
+ // src/config/getTransferAddresses.ts
116
+ var getTransferAddresses = /* @__PURE__ */ __name(async (config) => {
117
+ const escrowAddress = tryGetBridgeEscrowAddress(config) ?? (await getBridgeWalletAccount(config)).address;
118
+ const feesAddress = tryGetBridgeFeesAddress(config) ?? (await getBridgeWalletAccount(config)).address;
119
+ return {
120
+ escrowAddress,
121
+ feesAddress
122
+ };
123
+ }, "getTransferAddresses");
124
+
125
+ // src/config/getXl1ChainId.ts
126
+ import { assertEx as assertEx5, isDefined as isDefined2 } from "@xylabs/sdk-js";
127
+ var getXl1ChainId = /* @__PURE__ */ __name((config) => {
128
+ const xl1ChainId = config.bridge.xl1ChainId;
129
+ if (isDefined2(xl1ChainId)) {
130
+ return assertEx5(asChainId(xl1ChainId), () => "Invalid xl1ChainId in bridge config");
131
+ }
132
+ return assertEx5(asChainId(config.chain.id), () => "Invalid chain.id in config");
133
+ }, "getXl1ChainId");
134
+
135
+ // src/config/getXl1TokenAddress.ts
136
+ import { isDefined as isDefined3 } from "@xylabs/sdk-js";
137
+ var getXl1TokenAddress = /* @__PURE__ */ __name((config) => {
138
+ const token = asToken(config.bridge.xl1TokenAddress);
139
+ if (isDefined3(token)) return token;
140
+ return getXl1ChainId(config);
141
+ }, "getXl1TokenAddress");
142
+
143
+ // src/config/getBridgeSettings.ts
144
+ var getBridgeSettings = /* @__PURE__ */ __name(async (config) => {
145
+ const { feeFixed, feeRateBasisPoints } = getFeeStructure(config);
146
+ const { feesAddress, escrowAddress } = await getTransferAddresses(config);
147
+ const maxBridgeAmount = getMaxBridgeAmount(config);
148
+ const minBridgeAmount = getMinBridgeAmount(config);
149
+ const remoteChainId = getRemoteChainId(config);
150
+ const remoteTokenAddress = getRemoteTokenAddress(config);
151
+ const xl1TokenAddress = getXl1TokenAddress(config);
152
+ const xl1ChainId = getXl1ChainId(config);
153
+ return {
154
+ feeFixed,
155
+ feeRateBasisPoints,
156
+ feesAddress,
157
+ escrowAddress,
158
+ maxBridgeAmount,
159
+ minBridgeAmount,
160
+ remoteChainId,
161
+ remoteTokenAddress,
162
+ xl1TokenAddress,
163
+ xl1ChainId
164
+ };
165
+ }, "getBridgeSettings");
166
+
167
+ // src/config/getGateway.ts
168
+ import { isDefined as isDefined4 } from "@xylabs/sdk-js";
169
+ import { HDWallet as HDWallet2 } from "@xyo-network/wallet";
170
+ import { SimpleXyoGatewayRunner, SimpleXyoSigner } from "@xyo-network/xl1-protocol-sdk";
171
+ import { HttpRpcXyoConnection } from "@xyo-network/xl1-rpc";
172
+ var gatewayInstance;
173
+ var getGateway = /* @__PURE__ */ __name(async (config) => {
174
+ if (isDefined4(gatewayInstance)) return gatewayInstance;
175
+ const { mnemonic, chainRpcApiUrl: endpoint } = config.bridge;
176
+ const walletPromise = isDefined4(mnemonic) ? HDWallet2.fromPhrase(mnemonic) : HDWallet2.random();
177
+ const account = await walletPromise;
178
+ const signer = new SimpleXyoSigner(account);
179
+ const connection = new HttpRpcXyoConnection({
180
+ endpoint
181
+ });
182
+ gatewayInstance = new SimpleXyoGatewayRunner(connection, signer);
183
+ return gatewayInstance;
184
+ }, "getGateway");
185
+
186
+ // src/server/routes/bridge/routeDefinitions/routes/bridgeConfig.ts
187
+ var response = BridgeSettingsZod;
188
+ var validateRequest = requestHandlerValidator({
189
+ response
190
+ });
191
+ var makeBridgeConfigRoute = /* @__PURE__ */ __name((config) => {
192
+ return {
193
+ method: "get",
194
+ path: "/bridge/chains/:chainId/config",
195
+ handlers: validateRequest(async (_, res) => {
196
+ const { escrowAddress, feeFixed, feeRateBasisPoints, feesAddress, maxBridgeAmount, minBridgeAmount, remoteChainId, remoteTokenAddress, xl1ChainId, xl1TokenAddress } = await getBridgeSettings(config);
197
+ const sanitizedConfig = {
198
+ escrowAddress,
199
+ feeFixed,
200
+ feeRateBasisPoints,
201
+ feesAddress,
202
+ maxBridgeAmount,
203
+ minBridgeAmount,
204
+ remoteChainId,
205
+ remoteTokenAddress,
206
+ xl1ChainId,
207
+ xl1TokenAddress
208
+ };
209
+ res.json(sanitizedConfig);
210
+ })
211
+ };
212
+ }, "makeBridgeConfigRoute");
213
+
214
+ // src/server/routes/bridge/routeDefinitions/routes/bridgeFromRemoteStatus.ts
215
+ import { requestHandlerValidator as requestHandlerValidator2 } from "@xylabs/express";
216
+ import { toAddress, toHex } from "@xylabs/sdk-js";
27
217
  import { PayloadZodStrictOfSchema } from "@xyo-network/payload-model";
28
218
  import { BridgeDestinationObservationFieldsZod, BridgeDestinationObservationSchema } from "@xyo-network/xl1-protocol";
29
219
  import { z } from "zod";
30
220
 
31
221
  // src/server/routes/bridge/routeDefinitions/pathParams/ChainIdPathParam.ts
32
- import { hexFromHexString, HexZod, isAddress, isUndefined, toAddress } from "@xylabs/sdk-js";
33
- var remoteChainId = toAddress("0x01");
34
- var ChainIdPathParam = HexZod.refine((val) => {
35
- const chainIdHex = hexFromHexString(val, {
36
- prefix: true
222
+ import { asHex as asHex2, HexZod, isUndefined as isUndefined2 } from "@xylabs/sdk-js";
223
+ var getRemoteChainIdZod = /* @__PURE__ */ __name((config) => {
224
+ const remoteChainId = getRemoteChainId(config);
225
+ return HexZod.superRefine((val, ctx) => {
226
+ const chainId = asHex2(val);
227
+ if (isUndefined2(chainId)) {
228
+ ctx.addIssue("Not a valid chain id");
229
+ return;
230
+ }
231
+ if (chainId !== remoteChainId) {
232
+ ctx.addIssue(`Only ${remoteChainId} is supported`);
233
+ }
37
234
  });
38
- if (isAddress(chainIdHex)) return false;
39
- const suppliedChainId = toAddress(chainIdHex);
40
- if (isUndefined(suppliedChainId)) return false;
41
- return suppliedChainId === remoteChainId;
42
- }, {
43
- message: `Only ${remoteChainId} is supported`
44
- });
235
+ }, "getRemoteChainIdZod");
45
236
 
46
237
  // src/server/routes/bridge/routeDefinitions/routes/bridgeFromRemoteStatus.ts
47
- var params = z.object({
48
- chainId: ChainIdPathParam,
49
- nonce: z.string()
50
- });
51
- var response = PayloadZodStrictOfSchema(BridgeDestinationObservationSchema).extend(BridgeDestinationObservationFieldsZod.shape);
52
- var validateRequest = requestHandlerValidator({
53
- params,
54
- response
55
- });
56
- var bridgeFromRemoteStatus = {
57
- method: "get",
58
- path: "/bridge/chains/:chainId/bridgeFromRemote/status/:nonce",
59
- handlers: validateRequest(async (req, res) => {
60
- const { chainId } = req.params;
61
- const rand = await Promise.resolve(Math.random());
62
- const found = rand > 0.5;
63
- if (!found) return res.sendStatus(404);
64
- const confirmed = rand > 0.8;
65
- if (!confirmed) return res.sendStatus(204);
66
- const observation = {
67
- schema: BridgeDestinationObservationSchema,
68
- dest: chainId,
69
- destAddress: toAddress2("0xabc"),
70
- destAmount: toHex("0x100"),
71
- destToken: toAddress2("0xdef"),
72
- src: toAddress2("0x02"),
73
- srcAddress: toAddress2("0x123"),
74
- srcAmount: toHex("0x200"),
75
- srcToken: toHex("0x456"),
76
- destConfirmation: toHex("0x9999")
77
- };
78
- res.json(observation);
79
- })
80
- };
238
+ var makeBridgeFromRemoteStatusRoute = /* @__PURE__ */ __name((config) => {
239
+ const params = z.object({
240
+ chainId: getRemoteChainIdZod(config),
241
+ nonce: z.string().nonempty()
242
+ });
243
+ const response2 = PayloadZodStrictOfSchema(BridgeDestinationObservationSchema).extend(BridgeDestinationObservationFieldsZod.shape);
244
+ const validateRequest2 = requestHandlerValidator2({
245
+ params,
246
+ response: response2
247
+ });
248
+ return {
249
+ method: "get",
250
+ path: "/bridge/chains/:chainId/bridgeFromRemote/status/:nonce",
251
+ handlers: validateRequest2(async (req, res) => {
252
+ const { remoteChainId, remoteTokenAddress, xl1ChainId, xl1TokenAddress } = await getBridgeSettings(config);
253
+ const rand = await Promise.resolve(Math.random());
254
+ const found = rand > 0.5;
255
+ if (!found) return res.sendStatus(404);
256
+ const confirmed = rand > 0.8;
257
+ if (!confirmed) return res.sendStatus(204);
258
+ const observation = {
259
+ schema: BridgeDestinationObservationSchema,
260
+ dest: xl1ChainId,
261
+ destAddress: toAddress("0xabc"),
262
+ destAmount: toHex("0x100"),
263
+ destToken: xl1TokenAddress,
264
+ src: remoteChainId,
265
+ srcAddress: toAddress("0x123"),
266
+ srcAmount: toHex("0x200"),
267
+ srcToken: remoteTokenAddress,
268
+ destConfirmation: toHex("0x9999")
269
+ };
270
+ res.json(observation);
271
+ })
272
+ };
273
+ }, "makeBridgeFromRemoteStatusRoute");
81
274
 
82
275
  // src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts
83
- import { requestHandlerValidator as requestHandlerValidator2 } from "@xylabs/express";
84
- import { asHash } from "@xylabs/sdk-js";
85
- import { PayloadBuilder } from "@xyo-network/payload-builder";
86
- import { PayloadZodLooseOfSchema, PayloadZodStrictOfSchema as PayloadZodStrictOfSchema2 } from "@xyo-network/payload-model";
87
- import { BridgeIntentFieldsZod, BridgeIntentSchema, BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, TransferSchema } from "@xyo-network/xl1-protocol";
276
+ import { requestHandlerValidator as requestHandlerValidator3 } from "@xylabs/express";
277
+ import { assertEx as assertEx6 } from "@xylabs/sdk-js";
278
+ import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
279
+ import { PayloadZodStrictOfSchema as PayloadZodStrictOfSchema2 } from "@xyo-network/payload-model";
280
+ import { asSentinelInstance } from "@xyo-network/sentinel-model";
281
+ import { BridgeIntentFieldsZod, BridgeIntentSchema as BridgeIntentSchema2, BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, SignedTransactionBoundWitnessZod, TransferZod } from "@xyo-network/xl1-protocol";
282
+ import { flattenHydratedTransaction } from "@xyo-network/xl1-protocol-sdk";
88
283
  import { z as z2 } from "zod";
89
- var params2 = z2.object({
90
- chainId: ChainIdPathParam
91
- });
92
- var body = z2.tuple([
93
- // TODO: TransactionBoundWitness
94
- PayloadZodStrictOfSchema2(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),
95
- PayloadZodLooseOfSchema(TransferSchema)
96
- ]);
97
- var response2 = PayloadZodStrictOfSchema2(BridgeSourceObservationSchema).extend(BridgeSourceObservationFieldsZod.shape);
98
- var validateRequest2 = requestHandlerValidator2({
99
- params: params2,
100
- body,
101
- response: response2
102
- });
103
- var bridgeToRemote = {
104
- method: "post",
105
- path: "/bridge/chains/:chainId/bridgeToRemote",
106
- handlers: validateRequest2(async (req, res) => {
107
- const { body: body3 } = req;
108
- const [bridgeIntent] = body3;
109
- const srcConfirmation = await Promise.resolve(asHash("0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"));
110
- const bridgeCommonFieldsZod = z2.object({}).extend(BridgeSourceObservationFieldsZod.shape);
111
- const bridgeCommonFields = bridgeCommonFieldsZod.parse(bridgeIntent);
112
- const bridgeObservationFields = {
113
- ...bridgeCommonFields,
114
- srcConfirmation
115
- };
116
- const bridgeObservation = new PayloadBuilder({
117
- schema: BridgeSourceObservationSchema
118
- }).fields(bridgeObservationFields).build();
119
- res.json(bridgeObservation);
120
- })
121
- };
122
284
 
123
- // src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.ts
124
- import { requestHandlerValidator as requestHandlerValidator3 } from "@xylabs/express";
125
- import { hexToBigInt, toAddress as toAddress3, toHex as toHex2 } from "@xylabs/sdk-js";
285
+ // src/util/calculateBridgeFees.ts
286
+ import { hexToBigInt, toHex as toHex2 } from "@xylabs/sdk-js";
287
+ var calculateBridgeFees = /* @__PURE__ */ __name((srcAmount, feeStructure) => {
288
+ const { feeFixed, feeRateBasisPoints } = feeStructure;
289
+ const srcAmountBigInt = hexToBigInt(srcAmount);
290
+ const feeFixedBigInt = hexToBigInt(feeFixed);
291
+ const feeVariableBigInt = srcAmountBigInt * BigInt(feeRateBasisPoints) / 10000n;
292
+ const feeVariable = toHex2(feeVariableBigInt);
293
+ const feeTotalBigInt = feeFixedBigInt + feeVariableBigInt;
294
+ const destAmountBigInt = srcAmountBigInt > feeTotalBigInt ? srcAmountBigInt - feeTotalBigInt : 0n;
295
+ const destAmount = toHex2(destAmountBigInt);
296
+ return {
297
+ destAmount,
298
+ feeFixed,
299
+ feeVariable
300
+ };
301
+ }, "calculateBridgeFees");
302
+
303
+ // src/util/generateBridgeEstimate.ts
304
+ import { hexToBigInt as hexToBigInt2, toAddress as toAddress2 } from "@xylabs/sdk-js";
126
305
  import { createTransferPayload } from "@xyo-network/chain-protocol";
127
- import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
128
- import { PayloadZodLooseOfSchema as PayloadZodLooseOfSchema2, PayloadZodStrictOfSchema as PayloadZodStrictOfSchema3 } from "@xyo-network/payload-model";
129
- import { BridgeIntentFieldsZod as BridgeIntentFieldsZod2, BridgeIntentSchema as BridgeIntentSchema2, TransferSchema as TransferSchema2 } from "@xyo-network/xl1-protocol";
306
+ import { PayloadBuilder } from "@xyo-network/payload-builder";
307
+ import { BridgeIntentSchema } from "@xyo-network/xl1-protocol";
130
308
  import { v4 } from "uuid";
309
+ var generateBridgeEstimate = /* @__PURE__ */ __name(async (srcAddress, srcAmount, destAddress, config, nonceOverride) => {
310
+ const { escrowAddress, feeFixed, feeRateBasisPoints, feesAddress, remoteChainId, remoteTokenAddress, xl1ChainId, xl1TokenAddress } = await getBridgeSettings(config);
311
+ const sender = toAddress2(srcAddress);
312
+ const fees = calculateBridgeFees(srcAmount, {
313
+ feeFixed,
314
+ feeRateBasisPoints
315
+ });
316
+ const { destAmount, feeFixed: feeFixedAmount, feeVariable } = fees;
317
+ const nonce = nonceOverride ?? v4();
318
+ const bridgeIntentFields = {
319
+ // Source
320
+ src: xl1ChainId,
321
+ srcAddress: sender,
322
+ srcAmount,
323
+ srcToken: xl1TokenAddress,
324
+ // Destination
325
+ dest: remoteChainId,
326
+ destAddress,
327
+ destAmount,
328
+ destToken: remoteTokenAddress,
329
+ nonce
330
+ };
331
+ const bridgeIntent = new PayloadBuilder({
332
+ schema: BridgeIntentSchema
333
+ }).fields(bridgeIntentFields).build();
334
+ const context = {
335
+ destAmount,
336
+ feeFixed: feeFixedAmount,
337
+ feeVariable
338
+ };
339
+ const transfer = createTransferPayload(sender, {
340
+ [escrowAddress]: hexToBigInt2(destAmount),
341
+ [feesAddress]: hexToBigInt2(feeFixedAmount) + hexToBigInt2(feeVariable)
342
+ }, context);
343
+ return [
344
+ bridgeIntent,
345
+ transfer
346
+ ];
347
+ }, "generateBridgeEstimate");
348
+
349
+ // src/util/validateBridgeEstimateExact.ts
350
+ import { isUndefined as isUndefined3 } from "@xylabs/sdk-js";
351
+ import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
352
+ var validateBridgeEstimateExact = /* @__PURE__ */ __name(async (intent, transfer, config) => {
353
+ const { srcAddress, srcAmount, destAddress } = intent;
354
+ const [calculatedIntent, calculatedTransfer] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config);
355
+ if (isUndefined3(calculatedIntent) || isUndefined3(calculatedTransfer)) return false;
356
+ const { nonce: expectedIntentNonce, ...expectedIntentStatic } = calculatedIntent;
357
+ const { nonce: actualIntentNonce, ...actualIntentStatic } = intent;
358
+ if (await PayloadBuilder2.dataHash(expectedIntentStatic) !== await PayloadBuilder2.dataHash(actualIntentStatic)) return false;
359
+ const { epoch: expectedTransferEpoch, ...expectedTransferStatic } = calculatedTransfer;
360
+ const { epoch: actualTransferEpoch, ...actualTransferStatic } = transfer;
361
+ if (await PayloadBuilder2.dataHash(expectedTransferStatic) !== await PayloadBuilder2.dataHash(actualTransferStatic)) return false;
362
+ return true;
363
+ }, "validateBridgeEstimateExact");
364
+
365
+ // src/util/validateBridgeTransaction.ts
366
+ import { asAddress as asAddress4, isDefined as isDefined5 } from "@xylabs/sdk-js";
367
+ import { addressesContains, BoundWitnessValidator, payloadHashesContainsAll } from "@xyo-network/boundwitness-validator";
368
+ import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
369
+ var validateBridgeTransaction = /* @__PURE__ */ __name(async (signedTxBw, intent, transfer, config) => {
370
+ const { srcAddress } = intent;
371
+ const errors = await new BoundWitnessValidator(signedTxBw).validate();
372
+ if (isDefined5(errors) && errors.length > 0) return false;
373
+ const sender = asAddress4(srcAddress, true);
374
+ if (!addressesContains(signedTxBw, sender)) return false;
375
+ const hashes = await PayloadBuilder3.hashes([
376
+ intent,
377
+ transfer
378
+ ]);
379
+ if (!payloadHashesContainsAll(signedTxBw, hashes)) return false;
380
+ return true;
381
+ }, "validateBridgeTransaction");
382
+
383
+ // src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts
384
+ var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
385
+ const params = z2.object({
386
+ chainId: getRemoteChainIdZod(config)
387
+ });
388
+ const body = z2.tuple([
389
+ SignedTransactionBoundWitnessZod,
390
+ PayloadZodStrictOfSchema2(BridgeIntentSchema2).extend(BridgeIntentFieldsZod.shape),
391
+ TransferZod
392
+ ]);
393
+ const response2 = PayloadZodStrictOfSchema2(BridgeSourceObservationSchema).extend(BridgeSourceObservationFieldsZod.shape);
394
+ const validateRequest2 = requestHandlerValidator3({
395
+ params,
396
+ body,
397
+ response: response2
398
+ });
399
+ return {
400
+ method: "post",
401
+ path: "/bridge/chains/:chainId/bridgeToRemote",
402
+ handlers: validateRequest2(async (req, res) => {
403
+ const [signedTxBw, bridgeIntent, transfer] = req.body;
404
+ const { node } = req.app;
405
+ const transactionValid = await validateBridgeTransaction(signedTxBw, bridgeIntent, transfer, config);
406
+ if (!transactionValid) {
407
+ res.status(400).send();
408
+ return;
409
+ }
410
+ const estimateValid = await validateBridgeEstimateExact(bridgeIntent, transfer, config);
411
+ if (!estimateValid) {
412
+ res.status(400).send();
413
+ return;
414
+ }
415
+ const mod = await node.resolve("XL1BridgeIntentTransactionCompletionMonitorSentinel");
416
+ const sentinel = assertEx6(asSentinelInstance(mod), () => "Error resolving XL1BridgeIntentTransactionCompletionMonitorSentinel");
417
+ const singedHydratedTransaction = [
418
+ signedTxBw,
419
+ [
420
+ transfer,
421
+ bridgeIntent
422
+ ]
423
+ ];
424
+ const observation = await sentinel.report(flattenHydratedTransaction(singedHydratedTransaction));
425
+ if (observation.length === 0) {
426
+ console.error("Error submitting bridge intent transaction to sentinel");
427
+ res.status(500).send();
428
+ return;
429
+ }
430
+ const srcConfirmation = await PayloadBuilder4.hash(signedTxBw);
431
+ const bridgeCommonFieldsZod = z2.object({}).extend(BridgeSourceObservationFieldsZod.shape);
432
+ const bridgeCommonFields = bridgeCommonFieldsZod.parse(bridgeIntent);
433
+ const bridgeObservationFields = {
434
+ ...bridgeCommonFields,
435
+ srcConfirmation
436
+ };
437
+ const bridgeObservation = new PayloadBuilder4({
438
+ schema: BridgeSourceObservationSchema
439
+ }).fields(bridgeObservationFields).build();
440
+ res.json(bridgeObservation);
441
+ })
442
+ };
443
+ }, "makeBridgeToRemoteRoute");
444
+
445
+ // src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.ts
446
+ import { requestHandlerValidator as requestHandlerValidator4 } from "@xylabs/express";
447
+ import { assertEx as assertEx7, toAddress as toAddress3 } from "@xylabs/sdk-js";
448
+ import { PayloadZodLooseOfSchema, PayloadZodStrictOfSchema as PayloadZodStrictOfSchema3 } from "@xyo-network/payload-model";
449
+ import { BridgeIntentFieldsZod as BridgeIntentFieldsZod2, BridgeIntentSchema as BridgeIntentSchema3, toXL1BlockNumber, TransactionBoundWitnessZod, TransferSchema } from "@xyo-network/xl1-protocol";
450
+ import { buildUnsignedTransaction } from "@xyo-network/xl1-protocol-sdk";
131
451
  import { z as z3 } from "zod";
132
- var TOKEN_ADDRESS = "0x5FbDB2315678afecb367f032d93F642f64180aa3";
133
- var bridgeableTokenContract = toHex2(TOKEN_ADDRESS);
134
- var xl1ChainId = toAddress3("0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9");
135
- var fixedFee = 1000000000000000n;
136
- var percentFee = 5n;
137
- var bridgeEscrowAddress = toAddress3("0x0a");
138
- var bridgeFeesAddress = toAddress3("0x0b");
139
- var remoteChainId2 = toHex2("0x01");
140
- var params3 = z3.object({
141
- chainId: ChainIdPathParam
142
- });
143
- var body2 = BridgeIntentFieldsZod2.pick({
144
- destAddress: true,
145
- srcAddress: true,
146
- srcAmount: true
147
- });
148
- var response3 = z3.tuple([
149
- PayloadZodStrictOfSchema3(BridgeIntentSchema2).extend(BridgeIntentFieldsZod2.shape),
150
- PayloadZodLooseOfSchema2(TransferSchema2)
151
- ]);
152
- var validateRequest3 = requestHandlerValidator3({
153
- params: params3,
154
- body: body2,
155
- response: response3
156
- });
157
- var bridgeToRemoteEstimate = {
158
- method: "post",
159
- path: "/bridge/chains/:chainId/bridgeToRemote/estimate",
160
- handlers: validateRequest3((req, res) => {
161
- const { srcAddress, srcAmount, destAddress } = req.body;
162
- const srcAmountBigInt = hexToBigInt(srcAmount);
163
- const feeAmount = fixedFee + srcAmountBigInt * percentFee / 100n;
164
- const destAmountBigInt = srcAmountBigInt > feeAmount ? srcAmountBigInt - feeAmount : 0n;
165
- const destAmount = toHex2(destAmountBigInt);
166
- const nonce = v4();
167
- const sender = toAddress3(srcAddress);
168
- const bridgeIntentFields = {
169
- // Source
170
- src: xl1ChainId,
171
- srcAddress,
172
- srcAmount,
173
- srcToken: xl1ChainId,
174
- // Destination
175
- dest: remoteChainId2,
176
- destAddress,
177
- destAmount,
178
- destToken: bridgeableTokenContract,
179
- nonce
180
- };
181
- const bridgeIntent = new PayloadBuilder2({
182
- schema: BridgeIntentSchema2
183
- }).fields(bridgeIntentFields).build();
184
- const transfer = createTransferPayload(sender, {
185
- [bridgeEscrowAddress]: destAmountBigInt,
186
- [bridgeFeesAddress]: feeAmount
187
- });
188
- res.json([
189
- bridgeIntent,
190
- transfer
191
- ]);
192
- })
193
- };
452
+ var makeBridgeToRemoteEstimateRoute = /* @__PURE__ */ __name((config) => {
453
+ const params = z3.object({
454
+ chainId: getRemoteChainIdZod(config)
455
+ });
456
+ const body = BridgeIntentFieldsZod2.pick({
457
+ destAddress: true,
458
+ srcAddress: true,
459
+ srcAmount: true
460
+ });
461
+ const response2 = z3.tuple([
462
+ TransactionBoundWitnessZod,
463
+ PayloadZodStrictOfSchema3(BridgeIntentSchema3).extend(BridgeIntentFieldsZod2.shape),
464
+ PayloadZodLooseOfSchema(TransferSchema)
465
+ ]);
466
+ const validateRequest2 = requestHandlerValidator4({
467
+ params,
468
+ body,
469
+ response: response2
470
+ });
471
+ return {
472
+ method: "post",
473
+ path: "/bridge/chains/:chainId/bridgeToRemote/estimate",
474
+ handlers: validateRequest2(async (req, res) => {
475
+ const xl1ChainId = getXl1ChainId(config);
476
+ const { srcAddress, srcAmount, destAddress } = req.body;
477
+ const [bridgeIntent, transfer] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config);
478
+ const sender = toAddress3(srcAddress);
479
+ const gateway = await getGateway(config);
480
+ const viewer = assertEx7(gateway.connectionInstance.viewer, () => new Error("Viewer not available on gateway connection"));
481
+ const currentBlockNumber = await viewer.currentBlockNumber();
482
+ const nbf = toXL1BlockNumber(currentBlockNumber, true);
483
+ const exp = toXL1BlockNumber(currentBlockNumber + 1e3, true);
484
+ const [txBw] = await buildUnsignedTransaction(xl1ChainId, [
485
+ transfer
486
+ ], [
487
+ bridgeIntent
488
+ ], nbf, exp, sender);
489
+ res.json([
490
+ txBw,
491
+ bridgeIntent,
492
+ transfer
493
+ ]);
494
+ })
495
+ };
496
+ }, "makeBridgeToRemoteEstimateRoute");
194
497
 
195
498
  // src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.ts
196
- import { requestHandlerValidator as requestHandlerValidator4 } from "@xylabs/express";
197
- import { toAddress as toAddress4, toHex as toHex3 } from "@xylabs/sdk-js";
499
+ import { requestHandlerValidator as requestHandlerValidator5 } from "@xylabs/express";
500
+ import { asAddress as asAddress5, asHex as asHex3, toHex as toHex3 } from "@xylabs/sdk-js";
198
501
  import { PayloadZodStrictOfSchema as PayloadZodStrictOfSchema4 } from "@xyo-network/payload-model";
199
- import { BridgeDestinationObservationFieldsZod as BridgeDestinationObservationFieldsZod2, BridgeDestinationObservationSchema as BridgeDestinationObservationSchema2 } from "@xyo-network/xl1-protocol";
502
+ import { BridgeDestinationObservationFieldsZod as BridgeDestinationObservationFieldsZod2, BridgeDestinationObservationSchema as BridgeDestinationObservationSchema2, BridgeIntentFieldsZod as BridgeIntentFieldsZod3, BridgeIntentSchema as BridgeIntentSchema4, BridgeSourceObservationFieldsZod as BridgeSourceObservationFieldsZod2, BridgeSourceObservationSchema as BridgeSourceObservationSchema2 } from "@xyo-network/xl1-protocol";
200
503
  import { z as z4 } from "zod";
201
- var params4 = z4.object({
202
- chainId: ChainIdPathParam,
203
- nonce: z4.string()
204
- });
205
- var response4 = PayloadZodStrictOfSchema4(BridgeDestinationObservationSchema2).extend(BridgeDestinationObservationFieldsZod2.shape);
206
- var validateRequest4 = requestHandlerValidator4({
207
- params: params4,
208
- response: response4
209
- });
210
- var bridgeToRemoteStatus = {
211
- method: "get",
212
- path: "/bridge/chains/:chainId/bridgeToRemote/status/:nonce",
213
- handlers: validateRequest4(async (req, res) => {
214
- const { chainId } = req.params;
215
- const rand = await Promise.resolve(Math.random());
216
- const found = rand > 0.5;
217
- if (!found) return res.sendStatus(404);
218
- const confirmed = rand > 0.8;
219
- if (!confirmed) return res.sendStatus(204);
220
- const observation = {
221
- schema: BridgeDestinationObservationSchema2,
222
- dest: chainId,
223
- destAddress: toAddress4("0xabc"),
224
- destAmount: toHex3("0x100"),
225
- destToken: toAddress4("0xdef"),
226
- src: toAddress4("0x02"),
227
- srcAddress: toAddress4("0x123"),
228
- srcAmount: toHex3("0x200"),
229
- srcToken: toHex3("0x456"),
230
- destConfirmation: toHex3("0x9999")
231
- };
232
- res.json(observation);
233
- })
234
- };
504
+ var makeBridgeToRemoteStatusRoute = /* @__PURE__ */ __name((config) => {
505
+ const params = z4.object({
506
+ chainId: getRemoteChainIdZod(config),
507
+ nonce: z4.string().nonempty()
508
+ });
509
+ const query = z4.object({
510
+ mockStatus: z4.coerce.number().default(0)
511
+ });
512
+ const response2 = z4.union([
513
+ z4.tuple([]),
514
+ z4.tuple([
515
+ PayloadZodStrictOfSchema4(BridgeIntentSchema4).extend(BridgeIntentFieldsZod3.shape)
516
+ ]),
517
+ z4.tuple([
518
+ PayloadZodStrictOfSchema4(BridgeIntentSchema4).extend(BridgeIntentFieldsZod3.shape),
519
+ PayloadZodStrictOfSchema4(BridgeSourceObservationSchema2).extend(BridgeSourceObservationFieldsZod2.shape)
520
+ ]),
521
+ z4.tuple([
522
+ PayloadZodStrictOfSchema4(BridgeIntentSchema4).extend(BridgeIntentFieldsZod3.shape),
523
+ PayloadZodStrictOfSchema4(BridgeSourceObservationSchema2).extend(BridgeSourceObservationFieldsZod2.shape),
524
+ PayloadZodStrictOfSchema4(BridgeDestinationObservationSchema2).extend(BridgeDestinationObservationFieldsZod2.shape)
525
+ ])
526
+ ]);
527
+ const validateRequest2 = requestHandlerValidator5({
528
+ params,
529
+ query,
530
+ response: response2
531
+ });
532
+ return {
533
+ method: "get",
534
+ path: "/bridge/chains/:chainId/bridgeToRemote/status/:nonce",
535
+ handlers: validateRequest2(async (req, res) => {
536
+ const { chainId } = req.params;
537
+ const { mockStatus = 0 } = req.query;
538
+ const result = [];
539
+ const { remoteTokenAddress, xl1ChainId, xl1TokenAddress } = await getBridgeSettings(config);
540
+ const src = xl1ChainId;
541
+ const srcAddress = asAddress5("2222222222222222222222222222222222222222", true);
542
+ const srcAmount = asHex3("0x200", true);
543
+ const srcToken = xl1TokenAddress;
544
+ const dest = chainId;
545
+ const destAddress = asAddress5("3333333333333333333333333333333333333333", true);
546
+ const destAmount = asHex3("0x100", true);
547
+ const destToken = remoteTokenAddress;
548
+ if (mockStatus === 0) return res.sendStatus(404);
549
+ if (mockStatus > 0) {
550
+ const [observation] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config, req.params.nonce);
551
+ result[0] = observation;
552
+ }
553
+ if (mockStatus > 1) {
554
+ const observation = {
555
+ schema: BridgeSourceObservationSchema2,
556
+ dest,
557
+ destAddress,
558
+ destAmount,
559
+ destToken,
560
+ src,
561
+ srcAddress,
562
+ srcAmount,
563
+ srcToken
564
+ };
565
+ result[1] = observation;
566
+ }
567
+ if (mockStatus > 2) {
568
+ const observation = {
569
+ schema: BridgeDestinationObservationSchema2,
570
+ dest,
571
+ destAddress,
572
+ destAmount,
573
+ destToken,
574
+ src,
575
+ srcAddress,
576
+ srcAmount,
577
+ srcToken,
578
+ destConfirmation: toHex3("0x9999")
579
+ };
580
+ result[2] = observation;
581
+ }
582
+ res.json(result);
583
+ })
584
+ };
585
+ }, "makeBridgeToRemoteStatusRoute");
235
586
 
236
587
  // src/server/routes/bridge/routeDefinitions/getRouteDefinitions.ts
237
- var getRouteDefinitions = /* @__PURE__ */ __name(() => {
588
+ var getRouteDefinitions = /* @__PURE__ */ __name((config) => {
238
589
  return [
239
- bridgeFromRemoteStatus,
240
- bridgeToRemote,
241
- bridgeToRemoteEstimate,
242
- bridgeToRemoteStatus
590
+ makeBridgeConfigRoute(config),
591
+ makeBridgeToRemoteEstimateRoute(config),
592
+ makeBridgeToRemoteRoute(config),
593
+ makeBridgeToRemoteStatusRoute(config),
594
+ makeBridgeFromRemoteStatusRoute(config)
243
595
  ];
244
596
  }, "getRouteDefinitions");
245
597
 
246
598
  // src/server/routes/bridge/addBridgeRoutes.ts
247
- var addBridgeRoutes = /* @__PURE__ */ __name((app) => {
248
- const routeDefinitions = getRouteDefinitions();
599
+ var addBridgeRoutes = /* @__PURE__ */ __name((app, config) => {
600
+ const routeDefinitions = getRouteDefinitions(config);
249
601
  for (const definition of routeDefinitions) {
250
602
  app[definition.method](definition.path, definition.handlers);
251
603
  }
252
604
  }, "addBridgeRoutes");
253
605
 
254
606
  // src/server/routes/addRoutes.ts
255
- var addRoutes = /* @__PURE__ */ __name((app) => {
256
- addBridgeRoutes(app);
607
+ var addRoutes = /* @__PURE__ */ __name((app, config) => {
608
+ addBridgeRoutes(app, config);
257
609
  }, "addRoutes");
258
610
 
259
611
  // src/server/app.ts
260
- var getApp = /* @__PURE__ */ __name(() => {
612
+ var getApp = /* @__PURE__ */ __name((node, config) => {
261
613
  addInstrumentation();
262
614
  const app = express();
263
615
  app.set("etag", false);
@@ -271,18 +623,615 @@ var getApp = /* @__PURE__ */ __name(() => {
271
623
  disableExpressDefaultPoweredByHeader(app);
272
624
  app.use(customPoweredByHeader);
273
625
  disableCaseSensitiveRouting(app);
274
- addRoutes(app);
626
+ app.node = node;
627
+ addRoutes(app, config);
275
628
  app.use(standardErrors);
276
629
  return app;
277
630
  }, "getApp");
278
631
 
632
+ // src/server/server.ts
633
+ import { assertEx as assertEx11, isDefined as isDefined9, isString } from "@xylabs/sdk-js";
634
+ import { boot } from "@xyo-network/bios";
635
+ import { HDWallet as HDWallet4 } from "@xyo-network/wallet";
636
+
637
+ // src/manifest/getLocator.ts
638
+ import { BaseMongoSdk } from "@xylabs/mongo";
639
+ import { assertEx as assertEx10, isDefined as isDefined8 } from "@xylabs/sdk-js";
640
+ import { MemoryArchivist } from "@xyo-network/archivist-memory";
641
+ import { MongoDBArchivistV2 } from "@xyo-network/archivist-mongodb";
642
+ import { ViewArchivist } from "@xyo-network/archivist-view";
643
+ import { mapToMapType, MongoMap } from "@xyo-network/chain-protocol";
644
+ import { initEvmProvider } from "@xyo-network/chain-services";
645
+ import { initTelemetry } from "@xyo-network/chain-telemetry";
646
+ import { AbstractModule, LoggerModuleStatusReporter } from "@xyo-network/module-abstract";
647
+ import { ModuleFactoryLocator } from "@xyo-network/module-factory-locator";
648
+ import { MemorySentinel } from "@xyo-network/sentinel-memory";
649
+ import { HDWallet as HDWallet3 } from "@xyo-network/wallet";
650
+ import { hasMongoConfig, SimpleXyoGatewayRunner as SimpleXyoGatewayRunner2, SimpleXyoSigner as SimpleXyoSigner2 } from "@xyo-network/xl1-protocol-sdk";
651
+ import { HttpRpcXyoConnection as HttpRpcXyoConnection2 } from "@xyo-network/xl1-rpc";
652
+
653
+ // src/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/EVMLiquidityBridgeTransactionCompletionMonitorSentinel.ts
654
+ import { asAddress as asAddress6, asHex as asHex4, assertEx as assertEx8, delay, hexFromBigInt, hexToBigInt as hexToBigInt3, isDefined as isDefined6, isUndefined as isUndefined4 } from "@xylabs/sdk-js";
655
+ import { PayloadBuilder as PayloadBuilder5 } from "@xyo-network/payload-builder";
656
+ import { AbstractSentinel } from "@xyo-network/sentinel-abstract";
657
+ import { LiquidityPoolBridge__factory } from "@xyo-network/typechain";
658
+ import { BridgeDestinationObservationSchema as BridgeDestinationObservationSchema3, isBridgeIntent } from "@xyo-network/xl1-protocol";
659
+ import { flattenHydratedTransaction as flattenHydratedTransaction2, flattenHydratedTransactions, tryUnflattenHydratedTransaction } from "@xyo-network/xl1-protocol-sdk";
660
+ import { Mutex } from "async-mutex";
661
+ import { getAddress } from "ethers/address";
662
+ import { Wallet } from "ethers/wallet";
663
+ var EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema = "network.xyo.sentinel.chain.evm.liquidity.bridge.transaction.completion.monitor.config";
664
+ var defaultJobCheckIntervalMs = 15e3;
665
+ var EVMLiquidityBridgeTransactionCompletionMonitorSentinel = class extends AbstractSentinel {
666
+ static {
667
+ __name(this, "EVMLiquidityBridgeTransactionCompletionMonitorSentinel");
668
+ }
669
+ static configSchemas = [
670
+ EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema
671
+ ];
672
+ static defaultConfigSchema = EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema;
673
+ _attemptsCounter;
674
+ _bridge;
675
+ _bridgeChainId;
676
+ _bridgeRemoteChainId;
677
+ _bridgeTokenAddress;
678
+ _checkCounter;
679
+ _errorCounter;
680
+ _reportMutex = new Mutex();
681
+ _successCounter;
682
+ _wallet;
683
+ get bridge() {
684
+ return assertEx8(this._bridge, () => new Error("Bridge contract not initialized"));
685
+ }
686
+ get completedTransactions() {
687
+ return assertEx8(this.params.completedTransactions, () => "Completed transactions map is not defined");
688
+ }
689
+ get jobCheckInterval() {
690
+ return isDefined6(this.config.jobCheckInterval) ? this.config.jobCheckInterval : defaultJobCheckIntervalMs;
691
+ }
692
+ get pendingTransactions() {
693
+ return assertEx8(this.params.pendingTransactions, () => "Pending transactions map is not defined");
694
+ }
695
+ get wallet() {
696
+ return assertEx8(this._wallet, () => "wallet is required");
697
+ }
698
+ async createHandler() {
699
+ await super.createHandler();
700
+ this._attemptsCounter = this.meter?.createCounter("evm_liquidity_bridge_transaction_completion_monitor_sentinel_attempts_total", {
701
+ description: "Number of attempts"
702
+ });
703
+ this._checkCounter = this.meter?.createCounter("evm_liquidity_bridge_transaction_completion_monitor_sentinel_check_total", {
704
+ description: "Number of checks"
705
+ });
706
+ this._successCounter = this.meter?.createCounter("evm_liquidity_bridge_transaction_completion_monitor_sentinel_success_total", {
707
+ description: "Number of successes"
708
+ });
709
+ this._errorCounter = this.meter?.createCounter("evm_liquidity_bridge_transaction_completion_monitor_sentinel_errors_total", {
710
+ description: "Number of errors"
711
+ });
712
+ const { provider, bridgeAddress } = this.params;
713
+ const key = assertEx8(this.account?.private?.hex, () => new Error("Account private key is required"));
714
+ this._wallet = new Wallet(key, provider);
715
+ this._bridge = LiquidityPoolBridge__factory.connect(getAddress(bridgeAddress), this._wallet);
716
+ const network = await provider.getNetwork();
717
+ this._bridgeChainId = assertEx8(hexFromBigInt(network.chainId), () => new Error("Failed to parse bridgeChainId"));
718
+ const tokenAddress = await this.bridge.token();
719
+ this._bridgeTokenAddress = asAddress6(tokenAddress, true);
720
+ const bridgeRemoteChain = await this.bridge.remoteChain();
721
+ this._bridgeRemoteChainId = asHex4(bridgeRemoteChain);
722
+ }
723
+ async reportHandler(payloads) {
724
+ if (isDefined6(payloads) && payloads.length > 0) {
725
+ const signedHydratedTransaction = tryUnflattenHydratedTransaction(payloads);
726
+ if (isDefined6(signedHydratedTransaction)) {
727
+ const txHash = await PayloadBuilder5.hash(signedHydratedTransaction[0]);
728
+ this.logger?.info(`Adding transaction ${signedHydratedTransaction[0]} with hash ${txHash} to pending transactions for monitoring`);
729
+ await this.pendingTransactions.set(txHash, signedHydratedTransaction);
730
+ return flattenHydratedTransaction2(signedHydratedTransaction);
731
+ }
732
+ return [];
733
+ } else {
734
+ if (this._reportMutex.isLocked()) {
735
+ this.logger?.debug(`EVMLiquidityBridgeTransactionCompletionMonitorSentinel [${this.id}] is already running, skipping report [${Date.now()}]`);
736
+ return [];
737
+ }
738
+ return await this._reportMutex.runExclusive(async () => {
739
+ const response2 = [];
740
+ if (isUndefined4(payloads) || payloads.length === 0) {
741
+ await this.processAllTransactions();
742
+ }
743
+ return response2;
744
+ });
745
+ }
746
+ }
747
+ async processAllTransactions() {
748
+ const results = [];
749
+ for await (const [hash, signedHydratedTransaction] of this.pendingTransactions) {
750
+ const result = await this.processTransaction([
751
+ hash,
752
+ signedHydratedTransaction
753
+ ]);
754
+ if (isDefined6(result)) results.push(result[1]);
755
+ await delay(this.jobCheckInterval);
756
+ }
757
+ return flattenHydratedTransactions(results);
758
+ }
759
+ async processTransaction([hash, signedHydratedTransaction]) {
760
+ this.logger?.info(`Checking for transaction ${signedHydratedTransaction[0]} with hash ${hash}`);
761
+ try {
762
+ let ret = void 0;
763
+ this._checkCounter?.add(1);
764
+ const bridgeIntents = signedHydratedTransaction[1].filter(isBridgeIntent);
765
+ if (bridgeIntents.length !== 1) {
766
+ await this.pendingTransactions.delete(hash);
767
+ return ret;
768
+ }
769
+ const bridgeIntent = bridgeIntents[0];
770
+ this._attemptsCounter?.add(1);
771
+ const bridgeDestinationObservation = await this.relayBridgeIntentSync(bridgeIntent);
772
+ await this.completedTransactions.set(hash, bridgeDestinationObservation);
773
+ await this.pendingTransactions.delete(hash);
774
+ this._successCounter?.add(1);
775
+ return ret;
776
+ } catch (error) {
777
+ this._errorCounter?.add(1);
778
+ this.logger?.error(`Error checking for transaction ${signedHydratedTransaction[0]} with hash ${hash}:`, error);
779
+ }
780
+ }
781
+ /**
782
+ * Relays a given BridgeIntent.
783
+ * @param bridgeIntent The BridgeIntent to relay
784
+ * @returns Relays the intent in a blocking manner, returning the resulting BridgeDestinationObservation if successful
785
+ */
786
+ async relayBridgeIntentSync(bridgeIntent) {
787
+ const amount = hexToBigInt3(bridgeIntent.destAmount);
788
+ const nonce = await this.wallet.getNonce();
789
+ const srcAddress = getAddress(bridgeIntent.srcAddress);
790
+ const destAddress = getAddress(bridgeIntent.destAddress);
791
+ const tx = await this.bridge.bridgeFromRemote(srcAddress, destAddress, amount, {
792
+ nonce
793
+ });
794
+ const confirmation = await tx.wait();
795
+ const transactionResponse = await confirmation?.getTransaction();
796
+ const destConfirmation = asHex4(transactionResponse?.hash ?? "", true);
797
+ const { schema, ...rest } = bridgeIntent;
798
+ const result = new PayloadBuilder5({
799
+ schema: BridgeDestinationObservationSchema3
800
+ }).fields({
801
+ ...rest,
802
+ destConfirmation
803
+ }).build();
804
+ return result;
805
+ }
806
+ };
807
+
808
+ // src/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.ts
809
+ import { assertEx as assertEx9, delay as delay2, isDefined as isDefined7, isNull, isUndefined as isUndefined5 } from "@xylabs/sdk-js";
810
+ import { PayloadBuilder as PayloadBuilder6 } from "@xyo-network/payload-builder";
811
+ import { AbstractSentinel as AbstractSentinel2 } from "@xyo-network/sentinel-abstract";
812
+ import { flattenHydratedTransaction as flattenHydratedTransaction3, flattenHydratedTransactions as flattenHydratedTransactions2, tryUnflattenHydratedTransaction as tryUnflattenHydratedTransaction2 } from "@xyo-network/xl1-protocol-sdk";
813
+ import { Mutex as Mutex2 } from "async-mutex";
814
+ var XL1TransactionCompletionMonitorSentinelConfigSchema = "network.xyo.sentinel.chain.transaction.completion.monitor.config";
815
+ var defaultJobCheckIntervalMs2 = 15e3;
816
+ var XL1TransactionCompletionMonitorSentinel = class extends AbstractSentinel2 {
817
+ static {
818
+ __name(this, "XL1TransactionCompletionMonitorSentinel");
819
+ }
820
+ static configSchemas = [
821
+ XL1TransactionCompletionMonitorSentinelConfigSchema
822
+ ];
823
+ static defaultConfigSchema = XL1TransactionCompletionMonitorSentinelConfigSchema;
824
+ _attemptsCounter;
825
+ _checkCounter;
826
+ _errorCounter;
827
+ _reportMutex = new Mutex2();
828
+ _successCounter;
829
+ get completedTransactions() {
830
+ return assertEx9(this.params.completedTransactions, () => "Completed transactions map is not defined");
831
+ }
832
+ get jobCheckInterval() {
833
+ return isDefined7(this.config.jobCheckInterval) ? this.config.jobCheckInterval : defaultJobCheckIntervalMs2;
834
+ }
835
+ get pendingTransactions() {
836
+ return assertEx9(this.params.pendingTransactions, () => "Pending transactions map is not defined");
837
+ }
838
+ get viewer() {
839
+ return assertEx9(this.params.viewer, () => "Viewer is not defined in params");
840
+ }
841
+ async createHandler() {
842
+ await super.createHandler();
843
+ this._attemptsCounter = this.meter?.createCounter("xl1_transaction_completion_monitor_sentinel_attempts_total", {
844
+ description: "Number of attempts"
845
+ });
846
+ this._checkCounter = this.meter?.createCounter("xl1_transaction_completion_monitor_sentinel_check_total", {
847
+ description: "Number of checks"
848
+ });
849
+ this._successCounter = this.meter?.createCounter("xl1_transaction_completion_monitor_sentinel_success_total", {
850
+ description: "Number of successes"
851
+ });
852
+ this._errorCounter = this.meter?.createCounter("xl1_transaction_completion_monitor_sentinel_errors_total", {
853
+ description: "Number of errors"
854
+ });
855
+ }
856
+ async reportHandler(payloads) {
857
+ if (isDefined7(payloads) && payloads.length > 0) {
858
+ const signedHydratedTransaction = tryUnflattenHydratedTransaction2(payloads);
859
+ if (isDefined7(signedHydratedTransaction)) {
860
+ const txHash = await PayloadBuilder6.hash(signedHydratedTransaction[0]);
861
+ this.logger?.info(`Adding transaction ${signedHydratedTransaction[0]} with hash ${txHash} to pending transactions for monitoring`);
862
+ await this.pendingTransactions.set(txHash, signedHydratedTransaction);
863
+ return flattenHydratedTransaction3(signedHydratedTransaction);
864
+ }
865
+ return [];
866
+ } else {
867
+ if (this._reportMutex.isLocked()) {
868
+ this.logger?.debug(`XL1TransactionCompletionMonitorSentinel [${this.id}] is already running, skipping report [${Date.now()}]`);
869
+ return [];
870
+ }
871
+ return await this._reportMutex.runExclusive(async () => {
872
+ const response2 = [];
873
+ if (isUndefined5(payloads) || payloads.length === 0) {
874
+ await this.processAllTransactions();
875
+ }
876
+ return response2;
877
+ });
878
+ }
879
+ }
880
+ async processAllTransactions() {
881
+ const results = [];
882
+ for await (const [hash, signedHydratedTransaction] of this.pendingTransactions) {
883
+ const result = await this.processTransaction([
884
+ hash,
885
+ signedHydratedTransaction
886
+ ]);
887
+ if (isDefined7(result)) results.push(result[1]);
888
+ await delay2(this.jobCheckInterval);
889
+ }
890
+ return flattenHydratedTransactions2(results);
891
+ }
892
+ async processTransaction([hash, signedHydratedTransaction]) {
893
+ this.logger?.info(`Checking for transaction ${signedHydratedTransaction[0]} with hash ${hash}`);
894
+ try {
895
+ let ret = void 0;
896
+ this._checkCounter?.add(1);
897
+ this._attemptsCounter?.add(1);
898
+ const tx = await this.viewer.transactionByHash(hash);
899
+ if (isDefined7(tx) && !isNull(tx)) {
900
+ await this.completedTransactions.set(hash, signedHydratedTransaction);
901
+ this.logger?.info(`Found transaction ${signedHydratedTransaction[0]} with hash ${hash}`);
902
+ this.logger?.info(`Removing completed transaction ${signedHydratedTransaction[0]} with hash ${hash}`);
903
+ await this.pendingTransactions.delete(hash);
904
+ ret = [
905
+ hash,
906
+ signedHydratedTransaction
907
+ ];
908
+ } else {
909
+ const currentBlockNumber = await this.viewer.currentBlockNumber();
910
+ if (signedHydratedTransaction[0].exp < currentBlockNumber) {
911
+ this.logger?.info(`Removing expired transaction ${signedHydratedTransaction[0]} with hash ${hash}`);
912
+ await this.pendingTransactions.delete(hash);
913
+ }
914
+ }
915
+ this._successCounter?.add(1);
916
+ return ret;
917
+ } catch (error) {
918
+ this._errorCounter?.add(1);
919
+ this.logger?.error(`Error checking for transaction ${signedHydratedTransaction[0]} with hash ${hash}:`, error);
920
+ }
921
+ }
922
+ };
923
+
924
+ // src/manifest/getLocator.ts
925
+ var getLocator = /* @__PURE__ */ __name(async (context) => {
926
+ const { config, logger } = context;
927
+ const { otlpEndpoint } = config.telemetry?.otel ?? {};
928
+ const { path: endpoint = "/metrics", port = 9468 } = config.telemetry?.metrics?.scrape ?? {};
929
+ const { traceProvider, meterProvider } = await initTelemetry({
930
+ attributes: {
931
+ serviceName: "xl1-bridge",
932
+ serviceVersion: "1.0.0"
933
+ },
934
+ otlpEndpoint,
935
+ metricsConfig: {
936
+ endpoint,
937
+ port
938
+ }
939
+ });
940
+ if (isDefined8(logger)) AbstractModule.defaultLogger = logger;
941
+ const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : void 0;
942
+ const locator = new ModuleFactoryLocator();
943
+ const mongoConfig = config.storage?.mongo;
944
+ if (hasMongoConfig(mongoConfig)) {
945
+ const { connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName } = mongoConfig;
946
+ const payloadSdkConfig = {
947
+ dbConnectionString,
948
+ dbDomain,
949
+ dbName,
950
+ dbPassword,
951
+ dbUserName
952
+ };
953
+ const params = {
954
+ meterProvider,
955
+ payloadSdkConfig,
956
+ statusReporter,
957
+ traceProvider
958
+ };
959
+ locator.register(MongoDBArchivistV2.factory(params), void 0, true);
960
+ }
961
+ locator.register(MemoryArchivist.factory({
962
+ traceProvider,
963
+ meterProvider,
964
+ statusReporter
965
+ }));
966
+ locator.register(MemorySentinel.factory({
967
+ traceProvider,
968
+ meterProvider,
969
+ statusReporter
970
+ }));
971
+ locator.register(ViewArchivist.factory({
972
+ traceProvider,
973
+ meterProvider,
974
+ statusReporter
975
+ }));
976
+ const gateway = await getGateway2(config);
977
+ const viewer = assertEx10(gateway.connectionInstance.viewer, () => "Gateway viewer is not defined");
978
+ const pendingXl1ToEthXl1BridgeIntentTransactions = await getIterableMap(config, "liquidity_bridge_xl1_to_eth_xl1_pending");
979
+ const completedXl1ToEthXl1BridgeIntentTransactions = await getIterableMap(config, "liquidity_bridge_xl1_to_eth_xl1_completed");
980
+ const xl1TransactionCompletionMonitorSentinelParams = {
981
+ completedTransactions: completedXl1ToEthXl1BridgeIntentTransactions,
982
+ config: {
983
+ schema: XL1TransactionCompletionMonitorSentinelConfigSchema
984
+ },
985
+ meterProvider,
986
+ pendingTransactions: pendingXl1ToEthXl1BridgeIntentTransactions,
987
+ statusReporter,
988
+ traceProvider,
989
+ viewer
990
+ };
991
+ locator.register(XL1TransactionCompletionMonitorSentinel.factory(xl1TransactionCompletionMonitorSentinelParams));
992
+ const completedEthXl1BridgeTransactions = await getIterableMap(config, "liquidity_bridge_eth_xl1_bridge_completed");
993
+ const provider = await initEvmProvider({
994
+ config
995
+ });
996
+ const bridgeAddress = config.bridge.remoteBridgeContractAddress;
997
+ const evmLiquidityBridgeTransactionCompletionMonitorSentinelParams = {
998
+ bridgeAddress,
999
+ completedTransactions: completedEthXl1BridgeTransactions,
1000
+ config: {
1001
+ schema: EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema
1002
+ },
1003
+ meterProvider,
1004
+ pendingTransactions: completedXl1ToEthXl1BridgeIntentTransactions,
1005
+ provider,
1006
+ statusReporter,
1007
+ traceProvider
1008
+ };
1009
+ locator.register(EVMLiquidityBridgeTransactionCompletionMonitorSentinel.factory(evmLiquidityBridgeTransactionCompletionMonitorSentinelParams));
1010
+ return locator;
1011
+ }, "getLocator");
1012
+ var getGateway2 = /* @__PURE__ */ __name(async (config) => {
1013
+ const { mnemonic, chainRpcApiUrl: endpoint } = config.bridge;
1014
+ const walletPromise = isDefined8(mnemonic) ? HDWallet3.fromPhrase(mnemonic) : HDWallet3.random();
1015
+ const account = await walletPromise;
1016
+ const signer = new SimpleXyoSigner2(account);
1017
+ const connection = new HttpRpcXyoConnection2({
1018
+ endpoint
1019
+ });
1020
+ const gateway = new SimpleXyoGatewayRunner2(connection, signer);
1021
+ return gateway;
1022
+ }, "getGateway");
1023
+ var getIterableMap = /* @__PURE__ */ __name(async (config, collection) => {
1024
+ const mongoConfig = config.storage?.mongo;
1025
+ if (hasMongoConfig(mongoConfig)) {
1026
+ const { connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName } = mongoConfig;
1027
+ const payloadSdkConfig = {
1028
+ dbConnectionString,
1029
+ dbDomain,
1030
+ dbName,
1031
+ dbPassword,
1032
+ dbUserName
1033
+ };
1034
+ const sdkBalanceSummaryMap = new BaseMongoSdk({
1035
+ ...payloadSdkConfig,
1036
+ collection
1037
+ });
1038
+ const result = await MongoMap.create({
1039
+ sdk: sdkBalanceSummaryMap,
1040
+ getCache: {
1041
+ enabled: true,
1042
+ maxEntries: 5e3
1043
+ }
1044
+ });
1045
+ return result;
1046
+ } else {
1047
+ return mapToMapType(/* @__PURE__ */ new Map());
1048
+ }
1049
+ }, "getIterableMap");
1050
+
1051
+ // src/manifest/getNode.ts
1052
+ import { ManifestWrapper } from "@xyo-network/manifest-wrapper";
1053
+
1054
+ // src/manifest/node.json
1055
+ var node_default = {
1056
+ $schema: "https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json",
1057
+ nodes: [
1058
+ {
1059
+ config: {
1060
+ accountPath: "44'/60'/1",
1061
+ name: "XYOEthereumBridge",
1062
+ schema: "network.xyo.node.config"
1063
+ },
1064
+ modules: {
1065
+ private: [],
1066
+ public: []
1067
+ }
1068
+ }
1069
+ ],
1070
+ schema: "network.xyo.manifest"
1071
+ };
1072
+
1073
+ // src/manifest/nodeManifest.ts
1074
+ var NodeManifest = node_default;
1075
+
1076
+ // src/manifest/private/index.ts
1077
+ var PrivateChildManifests = [];
1078
+
1079
+ // src/manifest/public/XL1.json
1080
+ var XL1_default = {
1081
+ $schema: "https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json",
1082
+ nodes: [
1083
+ {
1084
+ config: {
1085
+ accountPath: "2",
1086
+ name: "XL1",
1087
+ schema: "network.xyo.node.config"
1088
+ },
1089
+ modules: {
1090
+ private: [
1091
+ {
1092
+ config: {
1093
+ accountPath: "1/1'/1'",
1094
+ automations: [
1095
+ {
1096
+ frequency: 6e4,
1097
+ frequencyUnits: "millis",
1098
+ schema: "network.xyo.automation.interval",
1099
+ type: "interval"
1100
+ }
1101
+ ],
1102
+ name: "XL1BridgeIntentTransactionCompletionMonitorSentinelIntervalSentinel",
1103
+ schema: "network.xyo.sentinel.config",
1104
+ synchronous: true,
1105
+ tasks: [
1106
+ {
1107
+ mod: "XL1BridgeIntentTransactionCompletionMonitorSentinel",
1108
+ endPoint: "report"
1109
+ }
1110
+ ]
1111
+ }
1112
+ }
1113
+ ],
1114
+ public: [
1115
+ {
1116
+ config: {
1117
+ accountPath: "1/1/1",
1118
+ name: "XL1BridgeIntentTransactionCompletionMonitorSentinel",
1119
+ schema: "network.xyo.sentinel.chain.transaction.completion.monitor.config"
1120
+ }
1121
+ }
1122
+ ]
1123
+ }
1124
+ }
1125
+ ],
1126
+ schema: "network.xyo.manifest"
1127
+ };
1128
+
1129
+ // src/manifest/public/Ethereum.json
1130
+ var Ethereum_default = {
1131
+ $schema: "https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json",
1132
+ nodes: [
1133
+ {
1134
+ config: {
1135
+ accountPath: "3",
1136
+ name: "Ethereum",
1137
+ schema: "network.xyo.node.config"
1138
+ },
1139
+ modules: {
1140
+ private: [
1141
+ {
1142
+ config: {
1143
+ accountPath: "1/1'/1'",
1144
+ automations: [
1145
+ {
1146
+ frequency: 6e4,
1147
+ frequencyUnits: "millis",
1148
+ schema: "network.xyo.automation.interval",
1149
+ type: "interval"
1150
+ }
1151
+ ],
1152
+ name: "EVMLiquidityBridgeTransactionCompletionMonitorSentinelIntervalSentinel",
1153
+ schema: "network.xyo.sentinel.config",
1154
+ synchronous: true,
1155
+ tasks: [
1156
+ {
1157
+ mod: "EVMLiquidityBridgeTransactionCompletionMonitorSentinel",
1158
+ endPoint: "report"
1159
+ }
1160
+ ]
1161
+ }
1162
+ }
1163
+ ],
1164
+ public: [
1165
+ {
1166
+ config: {
1167
+ accountPath: "1/1/1",
1168
+ name: "EVMLiquidityBridgeTransactionCompletionMonitorSentinel",
1169
+ schema: "network.xyo.sentinel.chain.evm.liquidity.bridge.transaction.completion.monitor.config"
1170
+ }
1171
+ }
1172
+ ]
1173
+ }
1174
+ }
1175
+ ],
1176
+ schema: "network.xyo.manifest"
1177
+ };
1178
+
1179
+ // src/manifest/public/index.ts
1180
+ var XL1NodeManifest = XL1_default;
1181
+ var EthereumNodeManifest = Ethereum_default;
1182
+ var PublicChildManifests = [
1183
+ ...XL1NodeManifest.nodes,
1184
+ ...EthereumNodeManifest.nodes
1185
+ ];
1186
+
1187
+ // src/manifest/getNode.ts
1188
+ var getNode = /* @__PURE__ */ __name(async (context) => {
1189
+ const { wallet } = context;
1190
+ const locator = await getLocator(context);
1191
+ const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests);
1192
+ const [node, ...childNodes] = await wrapper.loadNodes();
1193
+ if (childNodes?.length > 0) {
1194
+ await Promise.all(childNodes.map((childNode) => node.register(childNode)));
1195
+ await Promise.all(childNodes.map((childNode) => node.attach(childNode.address, true)));
1196
+ }
1197
+ return node;
1198
+ }, "getNode");
1199
+
279
1200
  // src/server/server.ts
280
1201
  var hostname = "::";
1202
+ var getSeedPhrase = /* @__PURE__ */ __name(async (bios, config, logger) => {
1203
+ const storedSeedPhrase = await bios.seedPhraseStore.get("os");
1204
+ logger?.debug(`[Bridge] Stored mnemonic: ${storedSeedPhrase}`);
1205
+ const { mnemonic } = config.api;
1206
+ if (isString(storedSeedPhrase) && isString(mnemonic)) {
1207
+ logger?.warn("[Bridge] Stored mnemonic does not match supplied. Updating stored mnemonic to supplied.");
1208
+ await bios.seedPhraseStore.set("os", mnemonic);
1209
+ } else {
1210
+ let seedPhrase;
1211
+ if (isString(mnemonic)) {
1212
+ seedPhrase = mnemonic;
1213
+ } else {
1214
+ seedPhrase = HDWallet4.generateMnemonic();
1215
+ logger?.log("[Bridge] No mnemonic provided, using random mnemonic. This is not recommended for production use.");
1216
+ logger?.log(`[Bridge] Mnemonic: ${seedPhrase}`);
1217
+ }
1218
+ await bios.seedPhraseStore.set("os", seedPhrase);
1219
+ }
1220
+ return assertEx11(await bios.seedPhraseStore.get("os"), () => "Unable to acquire mnemonic from bios");
1221
+ }, "getSeedPhrase");
281
1222
  var getServer = /* @__PURE__ */ __name(async (context) => {
282
- const { logger } = context;
283
- const { port } = context.config.bridge;
284
- await Promise.resolve();
285
- const app = getApp();
1223
+ const { logger, config } = context;
1224
+ const { port, mnemonic } = config.bridge;
1225
+ const bios = await boot();
1226
+ const seedPhrase = isDefined9(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger);
1227
+ const wallet = await HDWallet4.fromPhrase(seedPhrase);
1228
+ const nodeContext = {
1229
+ wallet,
1230
+ logger,
1231
+ config
1232
+ };
1233
+ const node = context.node ?? await getNode(nodeContext);
1234
+ const app = getApp(node, config);
286
1235
  const server = app.listen(port, hostname, () => logger?.log(`[Bridge] Server listening at http://${hostname}:${port}`));
287
1236
  server.setTimeout(2e4);
288
1237
  return server;