@xyo-network/chain-bridge 1.19.16 → 1.19.17

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.
@@ -40,6 +40,9 @@ var getFlowProducer = /* @__PURE__ */ __name((connection2) => {
40
40
  return flowProducer;
41
41
  }, "getFlowProducer");
42
42
 
43
+ // src/queue/flows/createXl1ToEthBridgeJob.ts
44
+ import { PayloadBuilder as PayloadBuilder8 } from "@xyo-network/sdk-js";
45
+
43
46
  // src/queue/workers/createWorkers.ts
44
47
  var createWorkers = /* @__PURE__ */ __name((connection2, services) => {
45
48
  Xl1ToEthBridgeParent.createWorker(connection2);
@@ -406,12 +409,16 @@ var Xl1TransactionSubmission = {
406
409
 
407
410
  // src/queue/flows/createXl1ToEthBridgeJob.ts
408
411
  var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) => {
412
+ const jobId = await PayloadBuilder8.hash(tx[0]);
409
413
  const flow = await flowProducer2.add({
410
414
  name: Xl1ToEthBridgeParent.name,
411
415
  queueName: Xl1ToEthBridgeParent.queueName,
412
416
  data: {
413
417
  tx
414
418
  },
419
+ opts: {
420
+ jobId
421
+ },
415
422
  children: [
416
423
  {
417
424
  // Step 6 (runs after child completes)
@@ -421,6 +428,7 @@ var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) =
421
428
  tx
422
429
  },
423
430
  opts: {
431
+ jobId,
424
432
  attempts: 60,
425
433
  backoff: {
426
434
  type: "fixed",
@@ -443,6 +451,9 @@ var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) =
443
451
  data: {
444
452
  tx
445
453
  },
454
+ opts: {
455
+ jobId
456
+ },
446
457
  children: [
447
458
  {
448
459
  // Step 3
@@ -452,6 +463,7 @@ var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) =
452
463
  tx
453
464
  },
454
465
  opts: {
466
+ jobId,
455
467
  attempts: 60,
456
468
  backoff: {
457
469
  type: "fixed",
@@ -466,6 +478,9 @@ var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) =
466
478
  data: {
467
479
  tx
468
480
  },
481
+ opts: {
482
+ jobId
483
+ },
469
484
  children: [
470
485
  {
471
486
  // Step 1 (runs first as deepest child)
@@ -473,6 +488,9 @@ var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) =
473
488
  queueName: Xl1TransactionPreparation.queueName,
474
489
  data: {
475
490
  tx
491
+ },
492
+ opts: {
493
+ jobId
476
494
  }
477
495
  }
478
496
  ]
@@ -746,7 +764,7 @@ var makeBridgeFromRemoteStatusRoute = /* @__PURE__ */ __name((config) => {
746
764
 
747
765
  // src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts
748
766
  import { requestHandlerValidator as requestHandlerValidator3 } from "@xylabs/express";
749
- import { PayloadBuilder as PayloadBuilder11, PayloadZodLooseOfSchema, PayloadZodStrictOfSchema as PayloadZodStrictOfSchema2 } from "@xyo-network/sdk-js";
767
+ import { PayloadBuilder as PayloadBuilder12, PayloadZodLooseOfSchema, PayloadZodStrictOfSchema as PayloadZodStrictOfSchema2 } from "@xyo-network/sdk-js";
750
768
  import { BridgeIntentFieldsZod, BridgeIntentSchema as BridgeIntentSchema2, BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, SignedTransactionBoundWitnessZod, TransferZod } from "@xyo-network/xl1-sdk";
751
769
  import { z as z2 } from "zod";
752
770
 
@@ -787,7 +805,7 @@ var createBridgeTransfer = /* @__PURE__ */ __name((sender, srcAmount, escrowAddr
787
805
 
788
806
  // src/util/generateBridgeEstimate.ts
789
807
  import { toAddress as toAddress2 } from "@xylabs/sdk-js";
790
- import { PayloadBuilder as PayloadBuilder8 } from "@xyo-network/sdk-js";
808
+ import { PayloadBuilder as PayloadBuilder9 } from "@xyo-network/sdk-js";
791
809
  import { BridgeIntentSchema } from "@xyo-network/xl1-sdk";
792
810
  import { v4 } from "uuid";
793
811
  var generateBridgeEstimate = /* @__PURE__ */ __name(async (srcAddress, srcAmount, destAddress, config, nonceOverride) => {
@@ -811,7 +829,7 @@ var generateBridgeEstimate = /* @__PURE__ */ __name(async (srcAddress, srcAmount
811
829
  destToken: remoteTokenAddress,
812
830
  nonce
813
831
  };
814
- const bridgeIntent = new PayloadBuilder8({
832
+ const bridgeIntent = new PayloadBuilder9({
815
833
  schema: BridgeIntentSchema
816
834
  }).fields(bridgeIntentFields).build();
817
835
  const transfer = createBridgeTransfer(sender, srcAmount, escrowAddress, feesAddress, fees);
@@ -823,24 +841,24 @@ var generateBridgeEstimate = /* @__PURE__ */ __name(async (srcAddress, srcAmount
823
841
 
824
842
  // src/util/validateBridgeEstimateExact.ts
825
843
  import { isUndefined as isUndefined3 } from "@xylabs/sdk-js";
826
- import { PayloadBuilder as PayloadBuilder9 } from "@xyo-network/sdk-js";
844
+ import { PayloadBuilder as PayloadBuilder10 } from "@xyo-network/sdk-js";
827
845
  var validateBridgeEstimateExact = /* @__PURE__ */ __name(async (intent, transfer, config) => {
828
846
  const { srcAddress, srcAmount, destAddress } = intent;
829
847
  const [calculatedIntent, calculatedTransfer] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config);
830
848
  if (isUndefined3(calculatedIntent) || isUndefined3(calculatedTransfer)) return false;
831
849
  const { nonce: expectedIntentNonce, ...expectedIntentStatic } = calculatedIntent;
832
850
  const { nonce: actualIntentNonce, ...actualIntentStatic } = intent;
833
- if (await PayloadBuilder9.dataHash(expectedIntentStatic) !== await PayloadBuilder9.dataHash(actualIntentStatic)) return false;
851
+ if (await PayloadBuilder10.dataHash(expectedIntentStatic) !== await PayloadBuilder10.dataHash(actualIntentStatic)) return false;
834
852
  const { epoch: expectedTransferEpoch, ...expectedTransferStatic } = calculatedTransfer;
835
853
  const { epoch: actualTransferEpoch, ...actualTransferStatic } = transfer;
836
- if (await PayloadBuilder9.dataHash(expectedTransferStatic) !== await PayloadBuilder9.dataHash(actualTransferStatic)) return false;
854
+ if (await PayloadBuilder10.dataHash(expectedTransferStatic) !== await PayloadBuilder10.dataHash(actualTransferStatic)) return false;
837
855
  return true;
838
856
  }, "validateBridgeEstimateExact");
839
857
 
840
858
  // src/util/validateBridgeTransaction.ts
841
859
  import { asAddress as asAddress4, isDefined as isDefined9 } from "@xylabs/sdk-js";
842
860
  import { addressesContains, BoundWitnessValidator, payloadHashesContainsAll } from "@xyo-network/boundwitness-validator";
843
- import { PayloadBuilder as PayloadBuilder10 } from "@xyo-network/sdk-js";
861
+ import { PayloadBuilder as PayloadBuilder11 } from "@xyo-network/sdk-js";
844
862
  var validateBridgeTransaction = /* @__PURE__ */ __name(async (signedTxBw, intent, transfer, config) => {
845
863
  const { srcAddress } = intent;
846
864
  const chainId = getXl1ChainId(config);
@@ -849,7 +867,7 @@ var validateBridgeTransaction = /* @__PURE__ */ __name(async (signedTxBw, intent
849
867
  if (isDefined9(errors) && errors.length > 0) return false;
850
868
  const sender = asAddress4(srcAddress, true);
851
869
  if (!addressesContains(signedTxBw, sender)) return false;
852
- const hashes = await PayloadBuilder10.hashes([
870
+ const hashes = await PayloadBuilder11.hashes([
853
871
  intent,
854
872
  transfer
855
873
  ]);
@@ -897,14 +915,14 @@ var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
897
915
  ]
898
916
  ];
899
917
  await createXl1ToEthBridgeJob(flowProducer2, singedHydratedTransaction);
900
- const srcConfirmation = await PayloadBuilder11.hash(signedTxBw);
918
+ const srcConfirmation = await PayloadBuilder12.hash(signedTxBw);
901
919
  const bridgeCommonFieldsZod = z2.object({}).extend(BridgeSourceObservationFieldsZod.shape);
902
920
  const bridgeCommonFields = bridgeCommonFieldsZod.parse(bridgeIntent);
903
921
  const bridgeObservationFields = {
904
922
  ...bridgeCommonFields,
905
923
  srcConfirmation
906
924
  };
907
- const bridgeObservation = new PayloadBuilder11({
925
+ const bridgeObservation = new PayloadBuilder12({
908
926
  schema: BridgeSourceObservationSchema
909
927
  }).fields(bridgeObservationFields).build();
910
928
  res.json(bridgeObservation);
@@ -965,86 +983,126 @@ var makeBridgeToRemoteEstimateRoute = /* @__PURE__ */ __name((config, gateway) =
965
983
 
966
984
  // src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.ts
967
985
  import { requestHandlerValidator as requestHandlerValidator5 } from "@xylabs/express";
968
- import { asAddress as asAddress5, asHex as asHex3, toHex as toHex3 } from "@xylabs/sdk-js";
969
- import { PayloadZodStrictOfSchema as PayloadZodStrictOfSchema4 } from "@xyo-network/sdk-js";
970
- import { BridgeDestinationObservationFieldsZod as BridgeDestinationObservationFieldsZod2, BridgeDestinationObservationSchema as BridgeDestinationObservationSchema2, BridgeIntentFieldsZod as BridgeIntentFieldsZod3, BridgeIntentSchema as BridgeIntentSchema4, BridgeSourceObservationFieldsZod as BridgeSourceObservationFieldsZod2, BridgeSourceObservationSchema as BridgeSourceObservationSchema2 } from "@xyo-network/xl1-sdk";
986
+ import { asHex as asHex3, isDefined as isDefined10 } from "@xylabs/sdk-js";
987
+ import { PayloadBuilder as PayloadBuilder13, PayloadZodStrictOfSchema as PayloadZodStrictOfSchema4 } from "@xyo-network/sdk-js";
988
+ import { asBridgeIntent, BridgeDestinationObservationFieldsZod as BridgeDestinationObservationFieldsZod2, BridgeDestinationObservationSchema as BridgeDestinationObservationSchema2, BridgeIntentFieldsZod as BridgeIntentFieldsZod3, BridgeIntentSchema as BridgeIntentSchema4, BridgeSourceObservationFieldsZod as BridgeSourceObservationFieldsZod2, BridgeSourceObservationSchema as BridgeSourceObservationSchema2, isBridgeIntent as isBridgeIntent5 } from "@xyo-network/xl1-sdk";
989
+ import { Queue } from "bullmq";
971
990
  import { z as z4 } from "zod";
991
+ var BridgeIntentResponseZod = PayloadZodStrictOfSchema4(BridgeIntentSchema4).extend(BridgeIntentFieldsZod3.shape);
992
+ var BridgeSourceResponseZod = PayloadZodStrictOfSchema4(BridgeSourceObservationSchema2).extend(BridgeSourceObservationFieldsZod2.shape);
993
+ var BridgeDestinationResponseZod = PayloadZodStrictOfSchema4(BridgeDestinationObservationSchema2).extend(BridgeDestinationObservationFieldsZod2.shape);
972
994
  var BridgeToRemoteStatusResponseZod = z4.union([
973
995
  z4.tuple([]),
974
996
  z4.tuple([
975
- PayloadZodStrictOfSchema4(BridgeIntentSchema4).extend(BridgeIntentFieldsZod3.shape)
997
+ BridgeIntentResponseZod
976
998
  ]),
977
999
  z4.tuple([
978
- PayloadZodStrictOfSchema4(BridgeIntentSchema4).extend(BridgeIntentFieldsZod3.shape),
979
- PayloadZodStrictOfSchema4(BridgeSourceObservationSchema2).extend(BridgeSourceObservationFieldsZod2.shape)
1000
+ BridgeIntentResponseZod,
1001
+ BridgeSourceResponseZod
980
1002
  ]),
981
1003
  z4.tuple([
982
- PayloadZodStrictOfSchema4(BridgeIntentSchema4).extend(BridgeIntentFieldsZod3.shape),
983
- PayloadZodStrictOfSchema4(BridgeSourceObservationSchema2).extend(BridgeSourceObservationFieldsZod2.shape),
984
- PayloadZodStrictOfSchema4(BridgeDestinationObservationSchema2).extend(BridgeDestinationObservationFieldsZod2.shape)
1004
+ BridgeIntentResponseZod,
1005
+ BridgeSourceResponseZod,
1006
+ BridgeDestinationResponseZod
985
1007
  ])
986
1008
  ]);
1009
+ var statusQueues;
1010
+ var getStatusQueues = /* @__PURE__ */ __name((config) => {
1011
+ if (statusQueues) return statusQueues;
1012
+ const connection2 = getConnection(config);
1013
+ statusQueues = {
1014
+ ethTransactionMonitor: new Queue(EthTransactionMonitor.queueName, {
1015
+ connection: connection2
1016
+ }),
1017
+ ethTransactionPreparation: new Queue(EthTransactionPreparation.queueName, {
1018
+ connection: connection2
1019
+ }),
1020
+ ethTransactionSubmission: new Queue(EthTransactionSubmission.queueName, {
1021
+ connection: connection2
1022
+ }),
1023
+ xl1ToEthBridgeParent: new Queue(Xl1ToEthBridgeParent.queueName, {
1024
+ connection: connection2
1025
+ }),
1026
+ xl1TransactionMonitor: new Queue(Xl1TransactionMonitor.queueName, {
1027
+ connection: connection2
1028
+ }),
1029
+ xl1TransactionPreparation: new Queue(Xl1TransactionPreparation.queueName, {
1030
+ connection: connection2
1031
+ }),
1032
+ xl1TransactionSubmission: new Queue(Xl1TransactionSubmission.queueName, {
1033
+ connection: connection2
1034
+ })
1035
+ };
1036
+ return statusQueues;
1037
+ }, "getStatusQueues");
1038
+ var getStatusQueueJobs = /* @__PURE__ */ __name(async (queues, jobId) => {
1039
+ const [ethTransactionMonitorJob, ethTransactionPreparationJob, ethTransactionSubmissionJob, xl1ToEthBridgeParentJob, xl1TransactionMonitorJob, xl1TransactionPreparationJob, xl1TransactionSubmissionJob] = await Promise.all([
1040
+ queues.ethTransactionMonitor.getJob(jobId),
1041
+ queues.ethTransactionPreparation.getJob(jobId),
1042
+ queues.ethTransactionSubmission.getJob(jobId),
1043
+ queues.xl1ToEthBridgeParent.getJob(jobId),
1044
+ queues.xl1TransactionMonitor.getJob(jobId),
1045
+ queues.xl1TransactionPreparation.getJob(jobId),
1046
+ queues.xl1TransactionSubmission.getJob(jobId)
1047
+ ]);
1048
+ return {
1049
+ ethTransactionMonitorJob,
1050
+ ethTransactionPreparationJob,
1051
+ ethTransactionSubmissionJob,
1052
+ xl1ToEthBridgeParentJob,
1053
+ xl1TransactionMonitorJob,
1054
+ xl1TransactionPreparationJob,
1055
+ xl1TransactionSubmissionJob
1056
+ };
1057
+ }, "getStatusQueueJobs");
987
1058
  var makeBridgeToRemoteStatusRoute = /* @__PURE__ */ __name((config) => {
988
1059
  const params = z4.object({
989
1060
  chainId: getRemoteChainIdZod(config),
990
1061
  nonce: z4.string().nonempty()
991
1062
  });
992
- const query = z4.object({
993
- mockStatus: z4.coerce.number().default(0)
994
- });
995
1063
  const validateRequest2 = requestHandlerValidator5({
996
1064
  params,
997
- query,
998
1065
  response: BridgeToRemoteStatusResponseZod
999
1066
  });
1000
1067
  return {
1001
1068
  method: "get",
1002
1069
  path: "/bridge/chains/:chainId/bridgeToRemote/status/:nonce",
1003
1070
  handlers: validateRequest2(async (req, res) => {
1004
- const { chainId } = req.params;
1005
- const { mockStatus = 0 } = req.query;
1071
+ const jobId = req.params.nonce;
1006
1072
  const result = [];
1007
- const { remoteTokenAddress, xl1ChainId, xl1TokenAddress } = await getBridgeSettings(config);
1008
- const src = xl1ChainId;
1009
- const srcAddress = asAddress5("2222222222222222222222222222222222222222", true);
1010
- const srcAmount = asHex3("0x200", true);
1011
- const srcToken = xl1TokenAddress;
1012
- const dest = chainId;
1013
- const destAddress = asAddress5("3333333333333333333333333333333333333333", true);
1014
- const destAmount = asHex3("0x100", true);
1015
- const destToken = remoteTokenAddress;
1016
- if (mockStatus === 0) return res.sendStatus(404);
1017
- if (mockStatus > 0) {
1018
- const [observation] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config, req.params.nonce);
1019
- result[0] = observation;
1020
- }
1021
- if (mockStatus > 1) {
1073
+ const queues = getStatusQueues(config);
1074
+ const statusQueueJobs = await getStatusQueueJobs(queues, jobId);
1075
+ const tx = Object.values(statusQueueJobs).map((job) => job?.data?.tx).find((tx2) => isDefined10(tx2));
1076
+ if (!tx) return res.sendStatus(404);
1077
+ const bridgeIntent = tx[1].find(isBridgeIntent5);
1078
+ if (!bridgeIntent) return res.sendStatus(404);
1079
+ result[0] = asBridgeIntent(PayloadBuilder13.omitMeta(bridgeIntent));
1080
+ const { xl1TransactionMonitorJob } = statusQueueJobs;
1081
+ const xl1MonitorState = xl1TransactionMonitorJob ? await xl1TransactionMonitorJob.getState() : void 0;
1082
+ const srcConfirmation = asHex3(jobId);
1083
+ if (xl1MonitorState === "completed" && isDefined10(srcConfirmation)) {
1084
+ const bridgeCommonFieldsZod = z4.object({}).extend(BridgeSourceObservationFieldsZod2.shape);
1085
+ const bridgeCommonFields = bridgeCommonFieldsZod.parse(bridgeIntent);
1022
1086
  const observation = {
1023
1087
  schema: BridgeSourceObservationSchema2,
1024
- dest,
1025
- destAddress,
1026
- destAmount,
1027
- destToken,
1028
- src,
1029
- srcAddress,
1030
- srcAmount,
1031
- srcToken,
1032
- srcConfirmation: toHex3("0x8888")
1088
+ ...bridgeCommonFields,
1089
+ srcConfirmation
1033
1090
  };
1034
1091
  result[1] = observation;
1035
1092
  }
1036
- if (mockStatus > 2) {
1093
+ const { ethTransactionMonitorJob } = statusQueueJobs;
1094
+ const ethMonitorState = ethTransactionMonitorJob ? await ethTransactionMonitorJob.getState() : void 0;
1095
+ const blockHash = ethTransactionMonitorJob?.returnvalue?.blockHash;
1096
+ const destConfirmation = asHex3(blockHash);
1097
+ if (ethMonitorState === "completed" && isDefined10(blockHash)) {
1098
+ const bridgeDestinationFieldsZod = z4.object({}).extend(BridgeDestinationObservationFieldsZod2.shape);
1099
+ const bridgeDestinationFields = bridgeDestinationFieldsZod.parse({
1100
+ ...bridgeIntent,
1101
+ destConfirmation
1102
+ });
1037
1103
  const observation = {
1038
1104
  schema: BridgeDestinationObservationSchema2,
1039
- dest,
1040
- destAddress,
1041
- destAmount,
1042
- destToken,
1043
- src,
1044
- srcAddress,
1045
- srcAmount,
1046
- srcToken,
1047
- destConfirmation: toHex3("0x9999")
1105
+ ...bridgeDestinationFields
1048
1106
  };
1049
1107
  result[2] = observation;
1050
1108
  }
@@ -1099,7 +1157,7 @@ var getApp = /* @__PURE__ */ __name((config, gateway) => {
1099
1157
  }, "getApp");
1100
1158
 
1101
1159
  // src/services/getServices.ts
1102
- import { assertEx as assertEx16, isDefined as isDefined10 } from "@xylabs/sdk-js";
1160
+ import { assertEx as assertEx16, isDefined as isDefined11 } from "@xylabs/sdk-js";
1103
1161
  import { initEvmProvider } from "@xyo-network/chain-orchestration";
1104
1162
  import { BridgeableToken__factory, LiquidityPoolBridge__factory } from "@xyo-network/typechain";
1105
1163
  import { HDWallet as HDWallet2 } from "@xyo-network/wallet";
@@ -1144,7 +1202,7 @@ var getServices = /* @__PURE__ */ __name(async (context, gateway) => {
1144
1202
  const xl1TxStateMap = await getIterableMap(config, "liquidity_bridge_xl1_to_eth_xl1_tx_state");
1145
1203
  const provider = await initEvmProvider(context);
1146
1204
  const { remoteBridgeContractAddress, remoteChainWalletPrivateKey, remoteTokenAddress, mnemonic } = config;
1147
- const account = isDefined10(mnemonic) ? await HDWallet2.fromPhrase(mnemonic) : await HDWallet2.random();
1205
+ const account = isDefined11(mnemonic) ? await HDWallet2.fromPhrase(mnemonic) : await HDWallet2.random();
1148
1206
  const wallet = new Wallet(remoteChainWalletPrivateKey, provider);
1149
1207
  const bridgeableToken = BridgeableToken__factory.connect(getAddress2(remoteTokenAddress), wallet);
1150
1208
  const bridge = LiquidityPoolBridge__factory.connect(getAddress2(remoteBridgeContractAddress), wallet);