@xyo-network/chain-bridge 1.20.1 → 1.20.3

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 (24) hide show
  1. package/dist/node/index.mjs +55 -27
  2. package/dist/node/index.mjs.map +1 -1
  3. package/dist/node/queue/flows/createXl1ToEthBridgeJob/createXl1ToEthBridgeJob.d.ts.map +1 -0
  4. package/dist/node/queue/flows/createXl1ToEthBridgeJob/getJobIdForXl1ToEthBridgeJob.d.ts +14 -0
  5. package/dist/node/queue/flows/createXl1ToEthBridgeJob/getJobIdForXl1ToEthBridgeJob.d.ts.map +1 -0
  6. package/dist/node/queue/flows/createXl1ToEthBridgeJob/getXl1ToEthBridgeJob.d.ts +4 -0
  7. package/dist/node/queue/flows/createXl1ToEthBridgeJob/getXl1ToEthBridgeJob.d.ts.map +1 -0
  8. package/dist/node/queue/flows/createXl1ToEthBridgeJob/index.d.ts +4 -0
  9. package/dist/node/queue/flows/createXl1ToEthBridgeJob/index.d.ts.map +1 -0
  10. package/dist/node/queue/flows/index.d.ts +1 -1
  11. package/dist/node/queue/flows/index.d.ts.map +1 -1
  12. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.d.ts +27 -27
  13. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.d.ts.map +1 -1
  14. package/dist/node/validation/validateBridgeTransaction.d.ts.map +1 -1
  15. package/package.json +14 -14
  16. package/src/queue/flows/{createXl1ToEthBridgeJob.ts → createXl1ToEthBridgeJob/createXl1ToEthBridgeJob.ts} +3 -3
  17. package/src/queue/flows/createXl1ToEthBridgeJob/getJobIdForXl1ToEthBridgeJob.ts +18 -0
  18. package/src/queue/flows/createXl1ToEthBridgeJob/getXl1ToEthBridgeJob.ts +11 -0
  19. package/src/queue/flows/createXl1ToEthBridgeJob/index.ts +3 -0
  20. package/src/queue/flows/index.ts +1 -1
  21. package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts +13 -3
  22. package/src/validation/validateBridgeTransaction.ts +14 -6
  23. package/dist/node/queue/flows/createXl1ToEthBridgeJob.d.ts.map +0 -1
  24. /package/dist/node/queue/flows/{createXl1ToEthBridgeJob.d.ts → createXl1ToEthBridgeJob/createXl1ToEthBridgeJob.d.ts} +0 -0
@@ -340,22 +340,28 @@ var validateBridgeEstimateExact = /* @__PURE__ */ __name(async (intent, transfer
340
340
  }, "validateBridgeEstimateExact");
341
341
 
342
342
  // src/validation/validateBridgeTransaction.ts
343
- import { asAddress as asAddress4, isDefined as isDefined6 } from "@xylabs/sdk-js";
344
- import { addressesContains, BoundWitnessValidator, payloadHashesContainsAll } from "@xyo-network/boundwitness-validator";
343
+ import { asAddress as asAddress4 } from "@xylabs/sdk-js";
344
+ import { addressesContains, BoundWitnessValidator, payloadHashesContainsAll, payloadSchemasContainsAll } from "@xyo-network/boundwitness-validator";
345
345
  import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/sdk-js";
346
+ import { BridgeIntentSchema as BridgeIntentSchema2, TransferSchema } from "@xyo-network/xl1-sdk";
346
347
  var validateBridgeTransaction = /* @__PURE__ */ __name(async (signedTxBw, intent, transfer, config) => {
347
348
  const { srcAddress } = intent;
348
349
  const chainId = getXl1ChainId(config);
349
350
  if (signedTxBw.chain !== chainId) return false;
350
- const errors = await new BoundWitnessValidator(signedTxBw).validate();
351
- if (isDefined6(errors) && errors.length > 0) return false;
352
- const sender = asAddress4(srcAddress, true);
353
- if (!addressesContains(signedTxBw, sender)) return false;
351
+ if (signedTxBw.payload_hashes.length != 2) return false;
352
+ if (!payloadSchemasContainsAll(signedTxBw, [
353
+ BridgeIntentSchema2,
354
+ TransferSchema
355
+ ])) return false;
354
356
  const hashes = await PayloadBuilder4.hashes([
355
357
  intent,
356
358
  transfer
357
359
  ]);
358
360
  if (!payloadHashesContainsAll(signedTxBw, hashes)) return false;
361
+ const errors = await new BoundWitnessValidator(signedTxBw).validate();
362
+ if (errors.length > 0) return false;
363
+ const sender = asAddress4(srcAddress, true);
364
+ if (!addressesContains(signedTxBw, sender)) return false;
359
365
  return true;
360
366
  }, "validateBridgeTransaction");
361
367
 
@@ -482,7 +488,7 @@ var EthTransactionPreparation = {
482
488
  };
483
489
 
484
490
  // src/queue/workers/EthTransactionSubmission.ts
485
- import { assertEx as assertEx13, isDefined as isDefined7 } from "@xylabs/sdk-js";
491
+ import { assertEx as assertEx13, isDefined as isDefined6 } from "@xylabs/sdk-js";
486
492
  import { PayloadBuilder as PayloadBuilder7 } from "@xyo-network/sdk-js";
487
493
  import { Worker as Worker3 } from "bullmq";
488
494
 
@@ -523,7 +529,7 @@ var createWorker3 = /* @__PURE__ */ __name((connection2, telemetry2, services) =
523
529
  const hash = await PayloadBuilder7.hash(tx[0]);
524
530
  const state = assertEx13(await stateMap.get(hash), () => `[${hash}] state not found`);
525
531
  const { submissionHash: existingSubmissionHash } = state;
526
- if (isDefined7(existingSubmissionHash)) {
532
+ if (isDefined6(existingSubmissionHash)) {
527
533
  await job.log(`[${hash}] Tx already submitted with submission response hash ${existingSubmissionHash}`);
528
534
  return {
529
535
  submissionHash: existingSubmissionHash
@@ -555,7 +561,7 @@ var EthTransactionSubmission = {
555
561
  };
556
562
 
557
563
  // src/queue/workers/EthTransactionSubmissionStorage.ts
558
- import { assertEx as assertEx14, isDefined as isDefined8 } from "@xylabs/sdk-js";
564
+ import { assertEx as assertEx14, isDefined as isDefined7 } from "@xylabs/sdk-js";
559
565
  import { PayloadBuilder as PayloadBuilder8 } from "@xyo-network/sdk-js";
560
566
  import { Worker as Worker4 } from "bullmq";
561
567
  var name4 = "Store ETH Transaction Submission";
@@ -567,7 +573,7 @@ var createWorker4 = /* @__PURE__ */ __name((connection2, telemetry2, services) =
567
573
  const hash = await PayloadBuilder8.hash(tx[0]);
568
574
  const state = assertEx14(await stateMap.get(hash), () => `[${hash}] state not found`);
569
575
  const { submissionHash: existingSubmissionHash } = state;
570
- if (isDefined8(existingSubmissionHash)) {
576
+ if (isDefined7(existingSubmissionHash)) {
571
577
  await job.log(`[${hash}] submissionHash already stored as ${existingSubmissionHash}`);
572
578
  return {
573
579
  submissionHash: existingSubmissionHash
@@ -631,7 +637,7 @@ var Xl1ToEthBridgeParent = {
631
637
  };
632
638
 
633
639
  // src/queue/workers/Xl1TransactionMonitor.ts
634
- import { assertEx as assertEx15, isDefined as isDefined9, isNull } from "@xylabs/sdk-js";
640
+ import { assertEx as assertEx15, isDefined as isDefined8, isNull } from "@xylabs/sdk-js";
635
641
  import { PayloadBuilder as PayloadBuilder9 } from "@xyo-network/sdk-js";
636
642
  import { UnrecoverableError, Worker as Worker6 } from "bullmq";
637
643
  var name6 = "Monitor Submitted XL1 Transaction";
@@ -647,7 +653,7 @@ var createWorker6 = /* @__PURE__ */ __name((connection2, telemetry2, services) =
647
653
  const submissionHash = assertEx15(state.submissionHash, () => `[${hash}] submissionHash not found`);
648
654
  await job.log(`[${hash}] Checking for XL1 transaction inclusion on chain`);
649
655
  const foundTx = await viewer.transaction.byHash(submissionHash);
650
- if (isDefined9(foundTx) && !isNull(foundTx)) {
656
+ if (isDefined8(foundTx) && !isNull(foundTx)) {
651
657
  await job.log(`[${hash}] Found transaction on chain`);
652
658
  const submissionHash2 = await PayloadBuilder9.hash(foundTx[0]);
653
659
  return {
@@ -720,7 +726,7 @@ var Xl1TransactionPreparation = {
720
726
  };
721
727
 
722
728
  // src/queue/workers/Xl1TransactionSubmission.ts
723
- import { assertEx as assertEx17, isDefined as isDefined10 } from "@xylabs/sdk-js";
729
+ import { assertEx as assertEx17, isDefined as isDefined9 } from "@xylabs/sdk-js";
724
730
  import { PayloadBuilder as PayloadBuilder11 } from "@xyo-network/sdk-js";
725
731
  import { Worker as Worker8 } from "bullmq";
726
732
  var name8 = "Submit XL1 Transaction";
@@ -734,7 +740,7 @@ var createWorker8 = /* @__PURE__ */ __name((connection2, telemetry2, services) =
734
740
  const state = assertEx17(await stateMap.get(hash), () => `[${hash}] state not found`);
735
741
  const preparedTx = assertEx17(state?.preparedTx, () => `[${hash}] preparedTx not found`);
736
742
  const { submissionHash: existingSubmissionHash } = state;
737
- if (isDefined10(existingSubmissionHash)) {
743
+ if (isDefined9(existingSubmissionHash)) {
738
744
  await job.log(`[${hash}] Tx already submitted with submission response hash ${existingSubmissionHash}`);
739
745
  return {
740
746
  submissionHash: existingSubmissionHash
@@ -765,7 +771,7 @@ var Xl1TransactionSubmission = {
765
771
  };
766
772
 
767
773
  // src/queue/workers/Xl1TransactionSubmissionStorage.ts
768
- import { assertEx as assertEx18, isDefined as isDefined11 } from "@xylabs/sdk-js";
774
+ import { assertEx as assertEx18, isDefined as isDefined10 } from "@xylabs/sdk-js";
769
775
  import { PayloadBuilder as PayloadBuilder12 } from "@xyo-network/sdk-js";
770
776
  import { Worker as Worker9 } from "bullmq";
771
777
  var name9 = "Store XL1 Transaction Submission";
@@ -777,7 +783,7 @@ var createWorker9 = /* @__PURE__ */ __name((connection2, telemetry2, services) =
777
783
  const hash = await PayloadBuilder12.hash(tx[0]);
778
784
  const state = assertEx18(await stateMap.get(hash), () => `[${hash}] state not found`);
779
785
  const { submissionHash: existingSubmissionHash } = state;
780
- if (isDefined11(existingSubmissionHash)) {
786
+ if (isDefined10(existingSubmissionHash)) {
781
787
  await job.log(`[${hash}] submissionHash already stored as ${existingSubmissionHash}`);
782
788
  return {
783
789
  submissionHash: existingSubmissionHash
@@ -813,10 +819,16 @@ var Xl1TransactionSubmissionStorage = {
813
819
  queueName: queueName9
814
820
  };
815
821
 
816
- // src/queue/flows/createXl1ToEthBridgeJob.ts
822
+ // src/queue/flows/createXl1ToEthBridgeJob/getJobIdForXl1ToEthBridgeJob.ts
817
823
  import { PayloadBuilder as PayloadBuilder13 } from "@xyo-network/sdk-js";
818
- var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) => {
824
+ var getJobIdForXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (tx) => {
819
825
  const jobId = await PayloadBuilder13.hash(tx[0]);
826
+ return jobId;
827
+ }, "getJobIdForXl1ToEthBridgeJob");
828
+
829
+ // src/queue/flows/createXl1ToEthBridgeJob/createXl1ToEthBridgeJob.ts
830
+ var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) => {
831
+ const jobId = await getJobIdForXl1ToEthBridgeJob(tx);
820
832
  const flow = await flowProducer2.add({
821
833
  // Step 0 (runs first as parent job)
822
834
  name: Xl1ToEthBridgeParent.name,
@@ -965,6 +977,16 @@ var createXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) =
965
977
  return flow;
966
978
  }, "createXl1ToEthBridgeJob");
967
979
 
980
+ // src/queue/flows/createXl1ToEthBridgeJob/getXl1ToEthBridgeJob.ts
981
+ var getXl1ToEthBridgeJob = /* @__PURE__ */ __name(async (flowProducer2, tx) => {
982
+ const id = await getJobIdForXl1ToEthBridgeJob(tx);
983
+ const flow = await flowProducer2.getFlow({
984
+ queueName: Xl1ToEthBridgeParent.queueName,
985
+ id
986
+ });
987
+ return flow;
988
+ }, "getXl1ToEthBridgeJob");
989
+
968
990
  // src/queue/getXl1ToEthQueueJobs.ts
969
991
  var getStatusQueueJobs = /* @__PURE__ */ __name(async (queues, jobId) => {
970
992
  const [ethTransactionMonitorJob, ethTransactionPreparationJob, ethTransactionSubmissionJob, xl1ToEthBridgeParentJob, xl1TransactionMonitorJob, xl1TransactionPreparationJob, xl1TransactionSubmissionJob, xl1TransactionSubmissionStorageJob] = await Promise.all([
@@ -1033,14 +1055,14 @@ var getXl1ToEthQueues = /* @__PURE__ */ __name((config) => {
1033
1055
  }, "getXl1ToEthQueues");
1034
1056
 
1035
1057
  // src/queue/telemetry.ts
1036
- import { isDefined as isDefined12 } from "@xylabs/sdk-js";
1058
+ import { isDefined as isDefined11 } from "@xylabs/sdk-js";
1037
1059
  import { BullMQOtel } from "bullmq-otel";
1038
1060
  var telemetry;
1039
1061
  var options = {
1040
1062
  enableMetrics: true
1041
1063
  };
1042
1064
  var getTelemetry = /* @__PURE__ */ __name(() => {
1043
- if (isDefined12(telemetry)) return telemetry;
1065
+ if (isDefined11(telemetry)) return telemetry;
1044
1066
  telemetry = new BullMQOtel(options);
1045
1067
  return telemetry;
1046
1068
  }, "getTelemetry");
@@ -1161,12 +1183,13 @@ var makeBridgeFromRemoteStatusRoute = /* @__PURE__ */ __name((config) => {
1161
1183
 
1162
1184
  // src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts
1163
1185
  import { requestHandlerValidator as requestHandlerValidator3 } from "@xylabs/express";
1186
+ import { isDefined as isDefined12 } from "@xylabs/sdk-js";
1164
1187
  import { PayloadBuilder as PayloadBuilder14, PayloadZodLooseOfSchema, PayloadZodStrictOfSchema as PayloadZodStrictOfSchema2 } from "@xyo-network/sdk-js";
1165
- import { BridgeIntentFieldsZod, BridgeIntentSchema as BridgeIntentSchema2, BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, SignedTransactionBoundWitnessZod, TransferZod } from "@xyo-network/xl1-sdk";
1188
+ import { BridgeIntentFieldsZod, BridgeIntentSchema as BridgeIntentSchema3, BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, SignedTransactionBoundWitnessZod, TransferZod } from "@xyo-network/xl1-sdk";
1166
1189
  import { z as z2 } from "zod";
1167
1190
  var BridgeToRemoteBodyZod = z2.tuple([
1168
1191
  SignedTransactionBoundWitnessZod,
1169
- PayloadZodLooseOfSchema(BridgeIntentSchema2).extend(BridgeIntentFieldsZod.shape),
1192
+ PayloadZodLooseOfSchema(BridgeIntentSchema3).extend(BridgeIntentFieldsZod.shape),
1170
1193
  TransferZod
1171
1194
  ]);
1172
1195
  var BridgeToRemoteResponseZod = PayloadZodStrictOfSchema2(BridgeSourceObservationSchema).extend(BridgeSourceObservationFieldsZod.shape);
@@ -1208,6 +1231,11 @@ var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
1208
1231
  bridgeIntent
1209
1232
  ]
1210
1233
  ];
1234
+ const existingFlow = await getXl1ToEthBridgeJob(flowProducer2, singedHydratedTransaction);
1235
+ if (isDefined12(existingFlow)) {
1236
+ res.status(200).send();
1237
+ return;
1238
+ }
1211
1239
  await createXl1ToEthBridgeJob(flowProducer2, singedHydratedTransaction);
1212
1240
  const srcConfirmation = await PayloadBuilder14.hash(signedTxBw);
1213
1241
  const bridgeCommonFieldsZod = z2.object({}).extend(BridgeSourceObservationFieldsZod.shape);
@@ -1219,7 +1247,7 @@ var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
1219
1247
  const bridgeObservation = new PayloadBuilder14({
1220
1248
  schema: BridgeSourceObservationSchema
1221
1249
  }).fields(bridgeObservationFields).build();
1222
- res.json(bridgeObservation);
1250
+ res.status(202).json(bridgeObservation);
1223
1251
  })
1224
1252
  };
1225
1253
  }, "makeBridgeToRemoteRoute");
@@ -1228,7 +1256,7 @@ var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
1228
1256
  import { requestHandlerValidator as requestHandlerValidator4 } from "@xylabs/express";
1229
1257
  import { assertEx as assertEx19, toAddress as toAddress3 } from "@xylabs/sdk-js";
1230
1258
  import { PayloadZodStrictOfSchema as PayloadZodStrictOfSchema3 } from "@xyo-network/sdk-js";
1231
- import { BridgeIntentFieldsZod as BridgeIntentFieldsZod2, BridgeIntentSchema as BridgeIntentSchema3, buildUnsignedTransaction, toXL1BlockNumber, TransactionBoundWitnessZod, TransferZod as TransferZod2 } from "@xyo-network/xl1-sdk";
1259
+ import { BridgeIntentFieldsZod as BridgeIntentFieldsZod2, BridgeIntentSchema as BridgeIntentSchema4, buildUnsignedTransaction, toXL1BlockNumber, TransactionBoundWitnessZod, TransferZod as TransferZod2 } from "@xyo-network/xl1-sdk";
1232
1260
  import { z as z3 } from "zod";
1233
1261
  var BridgeToRemoteEstimateBodyZod = BridgeIntentFieldsZod2.pick({
1234
1262
  destAddress: true,
@@ -1237,7 +1265,7 @@ var BridgeToRemoteEstimateBodyZod = BridgeIntentFieldsZod2.pick({
1237
1265
  });
1238
1266
  var BridgeToRemoteEstimateResponseZod = z3.tuple([
1239
1267
  TransactionBoundWitnessZod,
1240
- PayloadZodStrictOfSchema3(BridgeIntentSchema3).extend(BridgeIntentFieldsZod2.shape),
1268
+ PayloadZodStrictOfSchema3(BridgeIntentSchema4).extend(BridgeIntentFieldsZod2.shape),
1241
1269
  TransferZod2
1242
1270
  ]);
1243
1271
  var makeBridgeToRemoteEstimateRoute = /* @__PURE__ */ __name((config, gateway) => {
@@ -1279,9 +1307,9 @@ var makeBridgeToRemoteEstimateRoute = /* @__PURE__ */ __name((config, gateway) =
1279
1307
  import { requestHandlerValidator as requestHandlerValidator5 } from "@xylabs/express";
1280
1308
  import { asHex as asHex3, isDefined as isDefined13 } from "@xylabs/sdk-js";
1281
1309
  import { PayloadBuilder as PayloadBuilder15, PayloadZodStrictOfSchema as PayloadZodStrictOfSchema4 } from "@xyo-network/sdk-js";
1282
- import { asBridgeIntent, BridgeDestinationObservationFieldsZod as BridgeDestinationObservationFieldsZod2, BridgeDestinationObservationSchema as BridgeDestinationObservationSchema2, BridgeIntentFieldsZod as BridgeIntentFieldsZod3, BridgeIntentSchema as BridgeIntentSchema4, BridgeSourceObservationFieldsZod as BridgeSourceObservationFieldsZod2, BridgeSourceObservationSchema as BridgeSourceObservationSchema2, isBridgeIntent as isBridgeIntent5 } from "@xyo-network/xl1-sdk";
1310
+ import { asBridgeIntent, BridgeDestinationObservationFieldsZod as BridgeDestinationObservationFieldsZod2, BridgeDestinationObservationSchema as BridgeDestinationObservationSchema2, BridgeIntentFieldsZod as BridgeIntentFieldsZod3, BridgeIntentSchema as BridgeIntentSchema5, BridgeSourceObservationFieldsZod as BridgeSourceObservationFieldsZod2, BridgeSourceObservationSchema as BridgeSourceObservationSchema2, isBridgeIntent as isBridgeIntent5 } from "@xyo-network/xl1-sdk";
1283
1311
  import { z as z4 } from "zod";
1284
- var BridgeIntentResponseZod = PayloadZodStrictOfSchema4(BridgeIntentSchema4).extend(BridgeIntentFieldsZod3.shape);
1312
+ var BridgeIntentResponseZod = PayloadZodStrictOfSchema4(BridgeIntentSchema5).extend(BridgeIntentFieldsZod3.shape);
1285
1313
  var BridgeSourceResponseZod = PayloadZodStrictOfSchema4(BridgeSourceObservationSchema2).extend(BridgeSourceObservationFieldsZod2.shape);
1286
1314
  var BridgeDestinationResponseZod = PayloadZodStrictOfSchema4(BridgeDestinationObservationSchema2).extend(BridgeDestinationObservationFieldsZod2.shape);
1287
1315
  var BridgeToRemoteStatusResponseZod = z4.union([