@xyo-network/chain-bridge 1.17.3 → 1.17.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/node/index.mjs +51 -29
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.d.ts.map +1 -1
- package/dist/node/server/server.d.ts +1 -1
- package/dist/node/server/server.d.ts.map +1 -1
- package/dist/node/util/index.d.ts +1 -0
- package/dist/node/util/index.d.ts.map +1 -1
- package/dist/node/util/validateBridgeTransaction.d.ts +15 -0
- package/dist/node/util/validateBridgeTransaction.d.ts.map +1 -0
- package/package.json +13 -12
- package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts +9 -15
- package/src/util/index.ts +1 -0
- package/src/util/validateBridgeTransaction.ts +40 -0
package/dist/node/index.mjs
CHANGED
|
@@ -275,7 +275,7 @@ var makeBridgeFromRemoteStatusRoute = /* @__PURE__ */ __name((config) => {
|
|
|
275
275
|
// src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts
|
|
276
276
|
import { requestHandlerValidator as requestHandlerValidator3 } from "@xylabs/express";
|
|
277
277
|
import { assertEx as assertEx6 } from "@xylabs/sdk-js";
|
|
278
|
-
import { PayloadBuilder as
|
|
278
|
+
import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
|
|
279
279
|
import { PayloadZodStrictOfSchema as PayloadZodStrictOfSchema2 } from "@xyo-network/payload-model";
|
|
280
280
|
import { asSentinelInstance } from "@xyo-network/sentinel-model";
|
|
281
281
|
import { BridgeIntentFieldsZod, BridgeIntentSchema as BridgeIntentSchema2, BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, SignedTransactionBoundWitnessZod, TransferZod } from "@xyo-network/xl1-protocol";
|
|
@@ -362,6 +362,24 @@ var validateBridgeEstimateExact = /* @__PURE__ */ __name(async (intent, transfer
|
|
|
362
362
|
return true;
|
|
363
363
|
}, "validateBridgeEstimateExact");
|
|
364
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
|
+
|
|
365
383
|
// src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts
|
|
366
384
|
var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
|
|
367
385
|
const params = z2.object({
|
|
@@ -383,8 +401,12 @@ var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
|
|
|
383
401
|
path: "/bridge/chains/:chainId/bridgeToRemote",
|
|
384
402
|
handlers: validateRequest2(async (req, res) => {
|
|
385
403
|
const [signedTxBw, bridgeIntent, transfer] = req.body;
|
|
386
|
-
const { srcAddress } = bridgeIntent;
|
|
387
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
|
+
}
|
|
388
410
|
const estimateValid = await validateBridgeEstimateExact(bridgeIntent, transfer, config);
|
|
389
411
|
if (!estimateValid) {
|
|
390
412
|
res.status(400).send();
|
|
@@ -405,14 +427,14 @@ var makeBridgeToRemoteRoute = /* @__PURE__ */ __name((config) => {
|
|
|
405
427
|
res.status(500).send();
|
|
406
428
|
return;
|
|
407
429
|
}
|
|
408
|
-
const srcConfirmation = await
|
|
430
|
+
const srcConfirmation = await PayloadBuilder4.hash(signedTxBw);
|
|
409
431
|
const bridgeCommonFieldsZod = z2.object({}).extend(BridgeSourceObservationFieldsZod.shape);
|
|
410
432
|
const bridgeCommonFields = bridgeCommonFieldsZod.parse(bridgeIntent);
|
|
411
433
|
const bridgeObservationFields = {
|
|
412
434
|
...bridgeCommonFields,
|
|
413
435
|
srcConfirmation
|
|
414
436
|
};
|
|
415
|
-
const bridgeObservation = new
|
|
437
|
+
const bridgeObservation = new PayloadBuilder4({
|
|
416
438
|
schema: BridgeSourceObservationSchema
|
|
417
439
|
}).fields(bridgeObservationFields).build();
|
|
418
440
|
res.json(bridgeObservation);
|
|
@@ -475,7 +497,7 @@ var makeBridgeToRemoteEstimateRoute = /* @__PURE__ */ __name((config) => {
|
|
|
475
497
|
|
|
476
498
|
// src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.ts
|
|
477
499
|
import { requestHandlerValidator as requestHandlerValidator5 } from "@xylabs/express";
|
|
478
|
-
import { asAddress as
|
|
500
|
+
import { asAddress as asAddress5, asHex as asHex3, toHex as toHex3 } from "@xylabs/sdk-js";
|
|
479
501
|
import { PayloadZodStrictOfSchema as PayloadZodStrictOfSchema4 } from "@xyo-network/payload-model";
|
|
480
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";
|
|
481
503
|
import { z as z4 } from "zod";
|
|
@@ -516,11 +538,11 @@ var makeBridgeToRemoteStatusRoute = /* @__PURE__ */ __name((config) => {
|
|
|
516
538
|
const result = [];
|
|
517
539
|
const { remoteTokenAddress, xl1ChainId, xl1TokenAddress } = await getBridgeSettings(config);
|
|
518
540
|
const src = xl1ChainId;
|
|
519
|
-
const srcAddress =
|
|
541
|
+
const srcAddress = asAddress5("2222222222222222222222222222222222222222", true);
|
|
520
542
|
const srcAmount = asHex3("0x200", true);
|
|
521
543
|
const srcToken = xl1TokenAddress;
|
|
522
544
|
const dest = chainId;
|
|
523
|
-
const destAddress =
|
|
545
|
+
const destAddress = asAddress5("3333333333333333333333333333333333333333", true);
|
|
524
546
|
const destAmount = asHex3("0x100", true);
|
|
525
547
|
const destToken = remoteTokenAddress;
|
|
526
548
|
if (mockStatus === 0) return res.sendStatus(404);
|
|
@@ -608,13 +630,13 @@ var getApp = /* @__PURE__ */ __name((node, config) => {
|
|
|
608
630
|
}, "getApp");
|
|
609
631
|
|
|
610
632
|
// src/server/server.ts
|
|
611
|
-
import { assertEx as assertEx11, isDefined as
|
|
633
|
+
import { assertEx as assertEx11, isDefined as isDefined9, isString } from "@xylabs/sdk-js";
|
|
612
634
|
import { boot } from "@xyo-network/bios";
|
|
613
635
|
import { HDWallet as HDWallet4 } from "@xyo-network/wallet";
|
|
614
636
|
|
|
615
637
|
// src/manifest/getLocator.ts
|
|
616
638
|
import { BaseMongoSdk } from "@xylabs/mongo";
|
|
617
|
-
import { assertEx as assertEx10, isDefined as
|
|
639
|
+
import { assertEx as assertEx10, isDefined as isDefined8 } from "@xylabs/sdk-js";
|
|
618
640
|
import { MemoryArchivist } from "@xyo-network/archivist-memory";
|
|
619
641
|
import { MongoDBArchivistV2 } from "@xyo-network/archivist-mongodb";
|
|
620
642
|
import { ViewArchivist } from "@xyo-network/archivist-view";
|
|
@@ -629,8 +651,8 @@ import { hasMongoConfig, SimpleXyoGatewayRunner as SimpleXyoGatewayRunner2, Simp
|
|
|
629
651
|
import { HttpRpcXyoConnection as HttpRpcXyoConnection2 } from "@xyo-network/xl1-rpc";
|
|
630
652
|
|
|
631
653
|
// src/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/EVMLiquidityBridgeTransactionCompletionMonitorSentinel.ts
|
|
632
|
-
import { asAddress as
|
|
633
|
-
import { PayloadBuilder as
|
|
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";
|
|
634
656
|
import { AbstractSentinel } from "@xyo-network/sentinel-abstract";
|
|
635
657
|
import { LiquidityPoolBridge__factory } from "@xyo-network/typechain";
|
|
636
658
|
import { BridgeDestinationObservationSchema as BridgeDestinationObservationSchema3, isBridgeIntent } from "@xyo-network/xl1-protocol";
|
|
@@ -665,7 +687,7 @@ var EVMLiquidityBridgeTransactionCompletionMonitorSentinel = class extends Abstr
|
|
|
665
687
|
return assertEx8(this.params.completedTransactions, () => "Completed transactions map is not defined");
|
|
666
688
|
}
|
|
667
689
|
get jobCheckInterval() {
|
|
668
|
-
return
|
|
690
|
+
return isDefined6(this.config.jobCheckInterval) ? this.config.jobCheckInterval : defaultJobCheckIntervalMs;
|
|
669
691
|
}
|
|
670
692
|
get pendingTransactions() {
|
|
671
693
|
return assertEx8(this.params.pendingTransactions, () => "Pending transactions map is not defined");
|
|
@@ -694,15 +716,15 @@ var EVMLiquidityBridgeTransactionCompletionMonitorSentinel = class extends Abstr
|
|
|
694
716
|
const network = await provider.getNetwork();
|
|
695
717
|
this._bridgeChainId = assertEx8(hexFromBigInt(network.chainId), () => new Error("Failed to parse bridgeChainId"));
|
|
696
718
|
const tokenAddress = await this.bridge.token();
|
|
697
|
-
this._bridgeTokenAddress =
|
|
719
|
+
this._bridgeTokenAddress = asAddress6(tokenAddress, true);
|
|
698
720
|
const bridgeRemoteChain = await this.bridge.remoteChain();
|
|
699
721
|
this._bridgeRemoteChainId = asHex4(bridgeRemoteChain);
|
|
700
722
|
}
|
|
701
723
|
async reportHandler(payloads) {
|
|
702
|
-
if (
|
|
724
|
+
if (isDefined6(payloads) && payloads.length > 0) {
|
|
703
725
|
const signedHydratedTransaction = tryUnflattenHydratedTransaction(payloads);
|
|
704
|
-
if (
|
|
705
|
-
const txHash = await
|
|
726
|
+
if (isDefined6(signedHydratedTransaction)) {
|
|
727
|
+
const txHash = await PayloadBuilder5.hash(signedHydratedTransaction[0]);
|
|
706
728
|
this.logger?.info(`Adding transaction ${signedHydratedTransaction[0]} with hash ${txHash} to pending transactions for monitoring`);
|
|
707
729
|
await this.pendingTransactions.set(txHash, signedHydratedTransaction);
|
|
708
730
|
return flattenHydratedTransaction2(signedHydratedTransaction);
|
|
@@ -729,7 +751,7 @@ var EVMLiquidityBridgeTransactionCompletionMonitorSentinel = class extends Abstr
|
|
|
729
751
|
hash,
|
|
730
752
|
signedHydratedTransaction
|
|
731
753
|
]);
|
|
732
|
-
if (
|
|
754
|
+
if (isDefined6(result)) results.push(result[1]);
|
|
733
755
|
await delay(this.jobCheckInterval);
|
|
734
756
|
}
|
|
735
757
|
return flattenHydratedTransactions(results);
|
|
@@ -773,7 +795,7 @@ var EVMLiquidityBridgeTransactionCompletionMonitorSentinel = class extends Abstr
|
|
|
773
795
|
const transactionResponse = await confirmation?.getTransaction();
|
|
774
796
|
const destConfirmation = asHex4(transactionResponse?.hash ?? "", true);
|
|
775
797
|
const { schema, ...rest } = bridgeIntent;
|
|
776
|
-
const result = new
|
|
798
|
+
const result = new PayloadBuilder5({
|
|
777
799
|
schema: BridgeDestinationObservationSchema3
|
|
778
800
|
}).fields({
|
|
779
801
|
...rest,
|
|
@@ -784,8 +806,8 @@ var EVMLiquidityBridgeTransactionCompletionMonitorSentinel = class extends Abstr
|
|
|
784
806
|
};
|
|
785
807
|
|
|
786
808
|
// src/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.ts
|
|
787
|
-
import { assertEx as assertEx9, delay as delay2, isDefined as
|
|
788
|
-
import { PayloadBuilder as
|
|
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";
|
|
789
811
|
import { AbstractSentinel as AbstractSentinel2 } from "@xyo-network/sentinel-abstract";
|
|
790
812
|
import { flattenHydratedTransaction as flattenHydratedTransaction3, flattenHydratedTransactions as flattenHydratedTransactions2, tryUnflattenHydratedTransaction as tryUnflattenHydratedTransaction2 } from "@xyo-network/xl1-protocol-sdk";
|
|
791
813
|
import { Mutex as Mutex2 } from "async-mutex";
|
|
@@ -808,7 +830,7 @@ var XL1TransactionCompletionMonitorSentinel = class extends AbstractSentinel2 {
|
|
|
808
830
|
return assertEx9(this.params.completedTransactions, () => "Completed transactions map is not defined");
|
|
809
831
|
}
|
|
810
832
|
get jobCheckInterval() {
|
|
811
|
-
return
|
|
833
|
+
return isDefined7(this.config.jobCheckInterval) ? this.config.jobCheckInterval : defaultJobCheckIntervalMs2;
|
|
812
834
|
}
|
|
813
835
|
get pendingTransactions() {
|
|
814
836
|
return assertEx9(this.params.pendingTransactions, () => "Pending transactions map is not defined");
|
|
@@ -832,10 +854,10 @@ var XL1TransactionCompletionMonitorSentinel = class extends AbstractSentinel2 {
|
|
|
832
854
|
});
|
|
833
855
|
}
|
|
834
856
|
async reportHandler(payloads) {
|
|
835
|
-
if (
|
|
857
|
+
if (isDefined7(payloads) && payloads.length > 0) {
|
|
836
858
|
const signedHydratedTransaction = tryUnflattenHydratedTransaction2(payloads);
|
|
837
|
-
if (
|
|
838
|
-
const txHash = await
|
|
859
|
+
if (isDefined7(signedHydratedTransaction)) {
|
|
860
|
+
const txHash = await PayloadBuilder6.hash(signedHydratedTransaction[0]);
|
|
839
861
|
this.logger?.info(`Adding transaction ${signedHydratedTransaction[0]} with hash ${txHash} to pending transactions for monitoring`);
|
|
840
862
|
await this.pendingTransactions.set(txHash, signedHydratedTransaction);
|
|
841
863
|
return flattenHydratedTransaction3(signedHydratedTransaction);
|
|
@@ -862,7 +884,7 @@ var XL1TransactionCompletionMonitorSentinel = class extends AbstractSentinel2 {
|
|
|
862
884
|
hash,
|
|
863
885
|
signedHydratedTransaction
|
|
864
886
|
]);
|
|
865
|
-
if (
|
|
887
|
+
if (isDefined7(result)) results.push(result[1]);
|
|
866
888
|
await delay2(this.jobCheckInterval);
|
|
867
889
|
}
|
|
868
890
|
return flattenHydratedTransactions2(results);
|
|
@@ -874,7 +896,7 @@ var XL1TransactionCompletionMonitorSentinel = class extends AbstractSentinel2 {
|
|
|
874
896
|
this._checkCounter?.add(1);
|
|
875
897
|
this._attemptsCounter?.add(1);
|
|
876
898
|
const tx = await this.viewer.transactionByHash(hash);
|
|
877
|
-
if (
|
|
899
|
+
if (isDefined7(tx) && !isNull(tx)) {
|
|
878
900
|
await this.completedTransactions.set(hash, signedHydratedTransaction);
|
|
879
901
|
this.logger?.info(`Found transaction ${signedHydratedTransaction[0]} with hash ${hash}`);
|
|
880
902
|
this.logger?.info(`Removing completed transaction ${signedHydratedTransaction[0]} with hash ${hash}`);
|
|
@@ -915,7 +937,7 @@ var getLocator = /* @__PURE__ */ __name(async (context) => {
|
|
|
915
937
|
port
|
|
916
938
|
}
|
|
917
939
|
});
|
|
918
|
-
if (
|
|
940
|
+
if (isDefined8(logger)) AbstractModule.defaultLogger = logger;
|
|
919
941
|
const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : void 0;
|
|
920
942
|
const locator = new ModuleFactoryLocator();
|
|
921
943
|
const mongoConfig = config.storage?.mongo;
|
|
@@ -989,7 +1011,7 @@ var getLocator = /* @__PURE__ */ __name(async (context) => {
|
|
|
989
1011
|
}, "getLocator");
|
|
990
1012
|
var getGateway2 = /* @__PURE__ */ __name(async (config) => {
|
|
991
1013
|
const { mnemonic, chainRpcApiUrl: endpoint } = config.bridge;
|
|
992
|
-
const walletPromise =
|
|
1014
|
+
const walletPromise = isDefined8(mnemonic) ? HDWallet3.fromPhrase(mnemonic) : HDWallet3.random();
|
|
993
1015
|
const account = await walletPromise;
|
|
994
1016
|
const signer = new SimpleXyoSigner2(account);
|
|
995
1017
|
const connection = new HttpRpcXyoConnection2({
|
|
@@ -1201,7 +1223,7 @@ var getServer = /* @__PURE__ */ __name(async (context) => {
|
|
|
1201
1223
|
const { logger, config } = context;
|
|
1202
1224
|
const { port, mnemonic } = config.bridge;
|
|
1203
1225
|
const bios = await boot();
|
|
1204
|
-
const seedPhrase =
|
|
1226
|
+
const seedPhrase = isDefined9(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger);
|
|
1205
1227
|
const wallet = await HDWallet4.fromPhrase(seedPhrase);
|
|
1206
1228
|
const nodeContext = {
|
|
1207
1229
|
wallet,
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/bridge/routeDefinitions/routes/bridgeConfig.ts","../../src/config/asChainId.ts","../../src/config/asToken.ts","../../src/config/getBridgeEscrowAddress.ts","../../src/config/getBridgeFeesAddress.ts","../../src/config/getFeeStructure.ts","../../src/config/getMaxBridgeAmount.ts","../../src/config/getMinBridgeAmount.ts","../../src/config/getRemoteChainId.ts","../../src/config/getRemoteTokenAddress.ts","../../src/config/getBridgeWalletAccount.ts","../../src/config/getTransferAddresses.ts","../../src/config/getXl1ChainId.ts","../../src/config/getXl1TokenAddress.ts","../../src/config/getBridgeSettings.ts","../../src/config/getGateway.ts","../../src/server/routes/bridge/routeDefinitions/routes/bridgeFromRemoteStatus.ts","../../src/server/routes/bridge/routeDefinitions/pathParams/ChainIdPathParam.ts","../../src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts","../../src/util/calculateBridgeFees.ts","../../src/util/generateBridgeEstimate.ts","../../src/util/validateBridgeEstimateExact.ts","../../src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.ts","../../src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.ts","../../src/server/routes/bridge/routeDefinitions/getRouteDefinitions.ts","../../src/server/routes/bridge/addBridgeRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts","../../src/manifest/getLocator.ts","../../src/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/EVMLiquidityBridgeTransactionCompletionMonitorSentinel.ts","../../src/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.ts","../../src/manifest/getNode.ts","../../src/manifest/node.json","../../src/manifest/nodeManifest.ts","../../src/manifest/private/index.ts","../../src/manifest/public/XL1.json","../../src/manifest/public/Ethereum.json","../../src/manifest/public/index.ts"],"sourcesContent":["import {\n customPoweredByHeader, disableCaseSensitiveRouting, disableExpressDefaultPoweredByHeader, getJsonBodyParser, getJsonBodyParserOptions, responseProfiler,\n standardErrors, standardResponses,\n} from '@xylabs/express'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = (node: NodeInstance, config: Config): Express => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.node = node\n addRoutes(app, config)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport { BridgeSettingsZod, type Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getBridgeSettings } from '../../../../../config/index.ts'\n\nconst response = BridgeSettingsZod\n\nconst validateRequest = requestHandlerValidator({ response })\n\nexport const makeBridgeConfigRoute = (config: Config): RouteDefinition => {\n return {\n method: 'get',\n path: '/bridge/chains/:chainId/config',\n handlers: validateRequest(async (_, res) => {\n const {\n escrowAddress,\n feeFixed,\n feeRateBasisPoints,\n feesAddress,\n maxBridgeAmount,\n minBridgeAmount,\n remoteChainId,\n remoteTokenAddress,\n xl1ChainId,\n xl1TokenAddress,\n } = await getBridgeSettings(config)\n const sanitizedConfig = {\n escrowAddress,\n feeFixed,\n feeRateBasisPoints,\n feesAddress,\n maxBridgeAmount,\n minBridgeAmount,\n remoteChainId,\n remoteTokenAddress,\n xl1ChainId,\n xl1TokenAddress,\n }\n res.json(sanitizedConfig)\n }),\n }\n}\n","import { asHex } from '@xylabs/sdk-js'\nimport type { ChainId } from '@xyo-network/xl1-protocol'\n\nexport const asChainId = (value: unknown): ChainId | undefined => {\n const chainId = asHex(value)\n return chainId\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { asAddress } from '@xylabs/sdk-js'\n\nexport const asToken = (value: unknown): Address | undefined => {\n const token = asAddress(value)\n return token\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { asAddress, assertEx } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport const tryGetBridgeEscrowAddress = (config: Config): Address | undefined => {\n const address = asAddress(config.bridge.escrowAddress)\n return address\n}\n\nexport const getBridgeEscrowAddress = (config: Config): Address => {\n const address = assertEx(tryGetBridgeEscrowAddress(config), () => `Invalid bridge escrow address: ${config.bridge.escrowAddress}`)\n return address\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { asAddress, assertEx } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport const tryGetBridgeFeesAddress = (config: Config): Address | undefined => {\n const address = asAddress(config.bridge.feesAddress)\n return address\n}\n\nexport const getBridgeFeesAddress = (config: Config): Address => {\n const address = assertEx(tryGetBridgeFeesAddress(config), () => `Invalid bridge fees address: ${config.bridge.feesAddress}`)\n return address\n}\n","import type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport type { FeeStructure } from '../util/index.ts'\n\nexport const getFeeStructure = (config: Config): FeeStructure => {\n const { feeFixed, feeRateBasisPoints } = config.bridge\n return { feeFixed, feeRateBasisPoints }\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport const getMaxBridgeAmount = (config: Config): Hex => {\n const { maxBridgeAmount } = config.bridge\n return maxBridgeAmount\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport const getMinBridgeAmount = (config: Config): Hex => {\n const { minBridgeAmount } = config.bridge\n return minBridgeAmount\n}\n","import { assertEx } from '@xylabs/sdk-js'\nimport type { ChainId } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { asChainId } from './asChainId.ts'\n\nexport const getRemoteChainId = (config: Config): ChainId => {\n const remoteChainId = assertEx(asChainId(config.bridge.remoteChainId), () => 'Invalid remote chain ID in config')\n return remoteChainId\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { asToken } from './asToken.ts'\n\nexport const getRemoteTokenAddress = (config: Config): Address => {\n const token = asToken(config.bridge.remoteTokenAddress)\n return assertEx(token, () => 'Remote token address is not defined in bridge configuration')\n}\n","import type { Address, Promisable } from '@xylabs/sdk-js'\nimport { isDefined, isUndefined } from '@xylabs/sdk-js'\nimport { HDWallet } from '@xyo-network/wallet'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { ADDRESS_INDEX, generateXyoBaseWalletFromPhrase } from '@xyo-network/xl1-protocol-sdk'\n\nlet accountServiceSingleton: Promisable<WalletInstance> | undefined\n\nexport const getBridgeWalletAccount = async (config: Config): Promise<WalletInstance> => {\n if (accountServiceSingleton) return accountServiceSingleton\n let walletPhrase = config.bridge.mnemonic\n if (isUndefined(walletPhrase)) {\n console.log('[Bridge] No wallet mnemonic specified!')\n const randomMnemonic = HDWallet.generateMnemonic()\n console.log(`[Bridge] Using randomly generated mnemonic:\n \n${randomMnemonic}\n \n `)\n walletPhrase = randomMnemonic\n }\n const wallet = await generateXyoBaseWalletFromPhrase(walletPhrase)\n const account = await wallet.derivePath(ADDRESS_INDEX.XYO)\n accountServiceSingleton = account\n return accountServiceSingleton\n}\n\nexport const getAddressOrBridgeWalletAccountAddress = async (getConfigAccount: (config: Config) => Address | undefined, config: Config): Promise<Address> => {\n const address = getConfigAccount(config)\n if (isDefined(address)) return address\n const walletAccount = await getBridgeWalletAccount(config)\n return walletAccount.address\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { tryGetBridgeEscrowAddress } from './getBridgeEscrowAddress.ts'\nimport { tryGetBridgeFeesAddress } from './getBridgeFeesAddress.ts'\nimport { getBridgeWalletAccount } from './getBridgeWalletAccount.ts'\n\nexport interface TransferAddresses {\n escrowAddress: Address\n feesAddress: Address\n}\n\nexport const getTransferAddresses = async (config: Config): Promise<TransferAddresses> => {\n const escrowAddress = tryGetBridgeEscrowAddress(config) ?? (await getBridgeWalletAccount(config)).address\n const feesAddress = tryGetBridgeFeesAddress(config) ?? (await getBridgeWalletAccount(config)).address\n return { escrowAddress, feesAddress }\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { ChainId } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { asChainId } from './asChainId.ts'\n\nexport const getXl1ChainId = (config: Config): ChainId => {\n const xl1ChainId = config.bridge.xl1ChainId\n if (isDefined(xl1ChainId)) {\n return assertEx(asChainId(xl1ChainId), () => 'Invalid xl1ChainId in bridge config')\n }\n return assertEx(asChainId(config.chain.id), () => 'Invalid chain.id in config')\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport { isDefined } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { asToken } from './asToken.ts'\nimport { getXl1ChainId } from './getXl1ChainId.ts'\n\nexport const getXl1TokenAddress = (config: Config): Hex => {\n const token = asToken(config.bridge.xl1TokenAddress)\n if (isDefined(token)) return token\n return getXl1ChainId(config)\n}\n","import type { BridgeSettings, Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getFeeStructure } from './getFeeStructure.ts'\nimport { getMaxBridgeAmount } from './getMaxBridgeAmount.ts'\nimport { getMinBridgeAmount } from './getMinBridgeAmount.ts'\nimport { getRemoteChainId } from './getRemoteChainId.ts'\nimport { getRemoteTokenAddress } from './getRemoteTokenAddress.ts'\nimport { getTransferAddresses } from './getTransferAddresses.ts'\nimport { getXl1ChainId } from './getXl1ChainId.ts'\nimport { getXl1TokenAddress } from './getXl1TokenAddress.ts'\n\nexport const getBridgeSettings = async (config: Config): Promise<BridgeSettings> => {\n const { feeFixed, feeRateBasisPoints } = getFeeStructure(config)\n const { feesAddress, escrowAddress } = await getTransferAddresses(config)\n const maxBridgeAmount = getMaxBridgeAmount(config)\n const minBridgeAmount = getMinBridgeAmount(config)\n const remoteChainId = getRemoteChainId(config)\n const remoteTokenAddress = getRemoteTokenAddress(config)\n const xl1TokenAddress = getXl1TokenAddress(config)\n const xl1ChainId = getXl1ChainId(config)\n return {\n feeFixed, feeRateBasisPoints, feesAddress, escrowAddress, maxBridgeAmount, minBridgeAmount, remoteChainId, remoteTokenAddress, xl1TokenAddress, xl1ChainId,\n }\n}\n","import { isDefined } from '@xylabs/sdk-js'\nimport { HDWallet } from '@xyo-network/wallet'\nimport {\n type Config, SimpleXyoGatewayRunner, SimpleXyoSigner, type XyoGatewayRunner,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { HttpRpcXyoConnection } from '@xyo-network/xl1-rpc'\n\nlet gatewayInstance: XyoGatewayRunner | undefined\n\nexport const getGateway = async (config: Config): Promise<XyoGatewayRunner> => {\n if (isDefined(gatewayInstance)) return gatewayInstance\n const { mnemonic, chainRpcApiUrl: endpoint } = config.bridge\n const walletPromise = isDefined(mnemonic) ? HDWallet.fromPhrase(mnemonic) : HDWallet.random()\n const account = await walletPromise\n const signer = new SimpleXyoSigner(account)\n const connection = new HttpRpcXyoConnection({ endpoint })\n gatewayInstance = new SimpleXyoGatewayRunner(connection, signer)\n return gatewayInstance\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport { toAddress, toHex } from '@xylabs/sdk-js'\nimport { PayloadZodStrictOfSchema } from '@xyo-network/payload-model'\nimport type { BridgeDestinationObservation } from '@xyo-network/xl1-protocol'\nimport {\n BridgeDestinationObservationFieldsZod,\n BridgeDestinationObservationSchema,\n} from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { z } from 'zod'\n\nimport { getBridgeSettings } from '../../../../../config/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nexport const makeBridgeFromRemoteStatusRoute = (config: Config): RouteDefinition => {\n const params = z.object({\n chainId: getRemoteChainIdZod(config),\n nonce: z.string().nonempty(),\n })\n const response = PayloadZodStrictOfSchema(BridgeDestinationObservationSchema).extend(\n BridgeDestinationObservationFieldsZod.shape,\n )\n const validateRequest = requestHandlerValidator({ params, response })\n\n return {\n method: 'get',\n path: '/bridge/chains/:chainId/bridgeFromRemote/status/:nonce',\n handlers: validateRequest(async (req, res) => {\n const {\n remoteChainId, remoteTokenAddress, xl1ChainId, xl1TokenAddress,\n } = await getBridgeSettings(config)\n\n const rand = await Promise.resolve(Math.random())\n\n // TODO: Replace with actual lookup logic (e.g. database or chain query)\n const found = rand > 0.5 // simulate lookup\n if (!found) return res.sendStatus(404)\n\n const confirmed = rand > 0.8 // simulate pending/confirmed\n if (!confirmed) return res.sendStatus(204)\n\n const observation: BridgeDestinationObservation = {\n schema: BridgeDestinationObservationSchema,\n dest: xl1ChainId,\n destAddress: toAddress('0xabc'),\n destAmount: toHex('0x100'),\n destToken: xl1TokenAddress,\n src: remoteChainId,\n srcAddress: toAddress('0x123'),\n srcAmount: toHex('0x200'),\n srcToken: remoteTokenAddress,\n destConfirmation: toHex('0x9999'),\n }\n res.json(observation)\n }),\n }\n}\n","import {\n asHex, HexZod, isUndefined,\n} from '@xylabs/sdk-js'\nimport type { ChainId } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getRemoteChainId } from '../../../../../config/index.ts'\n\nexport const getRemoteChainIdZod = (config: Config) => {\n const remoteChainId: ChainId = getRemoteChainId(config)\n return HexZod.superRefine((val, ctx) => {\n const chainId = asHex(val)\n if (isUndefined(chainId)) {\n ctx.addIssue('Not a valid chain id')\n return\n }\n if (chainId !== remoteChainId) {\n ctx.addIssue(`Only ${remoteChainId} is supported`)\n }\n })\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport { asAddress, assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { PayloadZodStrictOfSchema } from '@xyo-network/payload-model'\nimport { asSentinelInstance } from '@xyo-network/sentinel-model'\nimport type {\n BridgeSourceObservation, BridgeSourceObservationFields, SignedHydratedTransaction,\n} from '@xyo-network/xl1-protocol'\nimport {\n BridgeIntentFieldsZod, BridgeIntentSchema, BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, SignedTransactionBoundWitnessZod,\n TransferZod,\n} from '@xyo-network/xl1-protocol'\nimport { type Config, flattenHydratedTransaction } from '@xyo-network/xl1-protocol-sdk'\nimport { z } from 'zod'\n\nimport { validateBridgeEstimateExact } from '../../../../../util/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nexport const makeBridgeToRemoteRoute = (config: Config): RouteDefinition => {\n const params = z.object({ chainId: getRemoteChainIdZod(config) })\n const body = z.tuple([\n SignedTransactionBoundWitnessZod,\n PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),\n TransferZod,\n ])\n const response = PayloadZodStrictOfSchema(BridgeSourceObservationSchema).extend(BridgeSourceObservationFieldsZod.shape)\n\n const validateRequest = requestHandlerValidator({\n params, body, response,\n })\n return {\n method: 'post',\n path: '/bridge/chains/:chainId/bridgeToRemote',\n handlers: validateRequest(async (req, res) => {\n const [signedTxBw, bridgeIntent, transfer] = req.body\n const { srcAddress } = bridgeIntent\n const { node } = req.app\n\n // TODO: Validate TX is valid BW\n // BoundWitnessBuilder.validate(signedTxBw)\n\n // Validate TX has address from srcAddress\n // const sender = asAddress(srcAddress, true)\n // const srcAddressValid = signedTxBw.addresses.includes(sender)\n // if (!srcAddressValid) {\n // res.status(400).send()\n // return\n // }\n\n // Validate estimate\n const estimateValid = await validateBridgeEstimateExact(bridgeIntent, transfer, config)\n if (!estimateValid) {\n res.status(400).send()\n return\n }\n\n // Submit to sentinel\n const mod = await node.resolve('XL1BridgeIntentTransactionCompletionMonitorSentinel')\n const sentinel = assertEx(asSentinelInstance(mod), () => 'Error resolving XL1BridgeIntentTransactionCompletionMonitorSentinel')\n const singedHydratedTransaction: SignedHydratedTransaction = [signedTxBw, [transfer, bridgeIntent]]\n const observation = await sentinel.report(flattenHydratedTransaction(singedHydratedTransaction))\n if (observation.length === 0) {\n console.error('Error submitting bridge intent transaction to sentinel')\n res.status(500).send()\n return\n }\n const srcConfirmation = await PayloadBuilder.hash(signedTxBw)\n\n // Create BridgeObservation\n const bridgeCommonFieldsZod = z.object({}).extend(BridgeSourceObservationFieldsZod.shape)\n const bridgeCommonFields = bridgeCommonFieldsZod.parse(bridgeIntent)\n const bridgeObservationFields: BridgeSourceObservationFields = { ...bridgeCommonFields, srcConfirmation }\n const bridgeObservation: BridgeSourceObservation = new PayloadBuilder<BridgeSourceObservation>(\n { schema: BridgeSourceObservationSchema },\n ).fields(bridgeObservationFields).build()\n\n // Return bridge observation to caller\n res.json(bridgeObservation)\n }),\n }\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport { hexToBigInt, toHex } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport type FeeStructure = Pick<Config['bridge'], 'feeFixed' | 'feeRateBasisPoints'>\n\nexport interface FeeCalculationResult {\n destAmount: Hex\n feeFixed: Hex\n feeVariable: Hex\n}\n\nexport const calculateBridgeFees = (srcAmount: Hex, feeStructure: FeeStructure): FeeCalculationResult => {\n const { feeFixed, feeRateBasisPoints } = feeStructure\n\n // Format source input\n const srcAmountBigInt = hexToBigInt(srcAmount)\n\n // Calculate fixed fee\n const feeFixedBigInt = hexToBigInt(feeFixed)\n\n // Integer-safe basis point calculation (floor division)\n const feeVariableBigInt\n = (srcAmountBigInt * BigInt(feeRateBasisPoints)) / 10_000n\n const feeVariable = toHex(feeVariableBigInt)\n\n // Calculate total fee\n const feeTotalBigInt = feeFixedBigInt + feeVariableBigInt\n\n // Calculate destination amount\n const destAmountBigInt = srcAmountBigInt > feeTotalBigInt ? srcAmountBigInt - feeTotalBigInt : 0n\n const destAmount = toHex(destAmountBigInt)\n\n return {\n destAmount,\n feeFixed,\n feeVariable,\n }\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport { hexToBigInt, toAddress } from '@xylabs/sdk-js'\nimport { createTransferPayload } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n BridgeIntent, BridgeIntentFields, Transfer,\n} from '@xyo-network/xl1-protocol'\nimport { BridgeIntentSchema } from '@xyo-network/xl1-protocol'\nimport { type Config } from '@xyo-network/xl1-protocol-sdk'\nimport { v4 } from 'uuid'\n\nimport { getBridgeSettings } from '../config/index.ts'\nimport { calculateBridgeFees } from './calculateBridgeFees.ts'\n\nexport const generateBridgeEstimate = async (\n srcAddress: Hex,\n srcAmount: Hex,\n destAddress: Hex,\n config: Config,\n nonceOverride?: string,\n): Promise<[BridgeIntent, Transfer]> => {\n const {\n escrowAddress, feeFixed, feeRateBasisPoints, feesAddress, remoteChainId, remoteTokenAddress, xl1ChainId, xl1TokenAddress,\n } = await getBridgeSettings(config)\n\n const sender = toAddress(srcAddress)\n\n // Calculate fees and destination amount\n const fees = calculateBridgeFees(srcAmount, { feeFixed, feeRateBasisPoints })\n const {\n destAmount, feeFixed: feeFixedAmount, feeVariable,\n } = fees\n\n // Generate a unique nonce for the bridge intent\n const nonce = nonceOverride ?? v4()\n\n // Build the bridge intent\n const bridgeIntentFields: BridgeIntentFields = {\n // Source\n src: xl1ChainId,\n srcAddress: sender,\n srcAmount,\n srcToken: xl1TokenAddress,\n\n // Destination\n dest: remoteChainId,\n destAddress,\n destAmount,\n destToken: remoteTokenAddress,\n nonce,\n }\n const bridgeIntent: BridgeIntent = new PayloadBuilder<BridgeIntent>({ schema: BridgeIntentSchema }).fields(bridgeIntentFields).build()\n\n // Build the transfer\n const context = {\n destAmount, feeFixed: feeFixedAmount, feeVariable,\n }\n const transfer: Transfer = createTransferPayload(sender, {\n [escrowAddress]: hexToBigInt(destAmount),\n [feesAddress]: hexToBigInt(feeFixedAmount) + hexToBigInt(feeVariable),\n }, context)\n\n return [bridgeIntent, transfer]\n}\n","import { isUndefined } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { BridgeIntent, Transfer } from '@xyo-network/xl1-protocol'\nimport { type Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { generateBridgeEstimate } from './generateBridgeEstimate.ts'\n\n/**\n * Validates a bridge estimate by checking the intent and transfer against the provided configuration. This method\n * only returns true if the bridge estimate matches exactly.\n * @param intent The BridgeIntent\n * @param transfer The Transfer\n * @param config The Config\n * @returns True if the bridge estimate satisfies bridging conditions, false otherwise.\n */\nexport const validateBridgeEstimateExact = async (\n intent: BridgeIntent,\n transfer: Transfer,\n config: Config,\n): Promise<boolean> => {\n const {\n srcAddress, srcAmount, destAddress,\n } = intent\n const [calculatedIntent, calculatedTransfer] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config)\n if (isUndefined(calculatedIntent) || isUndefined(calculatedTransfer)) return false\n const { nonce: expectedIntentNonce, ...expectedIntentStatic } = calculatedIntent\n const { nonce: actualIntentNonce, ...actualIntentStatic } = intent\n if (await PayloadBuilder.dataHash(expectedIntentStatic) !== await PayloadBuilder.dataHash(actualIntentStatic)) return false\n const { epoch: expectedTransferEpoch, ...expectedTransferStatic } = calculatedTransfer\n const { epoch: actualTransferEpoch, ...actualTransferStatic } = transfer\n if (await PayloadBuilder.dataHash(expectedTransferStatic) !== await PayloadBuilder.dataHash(actualTransferStatic)) return false\n\n return true\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport { assertEx, toAddress } from '@xylabs/sdk-js'\nimport { PayloadZodLooseOfSchema, PayloadZodStrictOfSchema } from '@xyo-network/payload-model'\nimport {\n BridgeIntentFieldsZod, BridgeIntentSchema, toXL1BlockNumber, TransactionBoundWitnessZod, TransferSchema,\n} from '@xyo-network/xl1-protocol'\nimport { buildUnsignedTransaction, type Config } from '@xyo-network/xl1-protocol-sdk'\nimport { z } from 'zod'\n\nimport { getGateway, getXl1ChainId } from '../../../../../config/index.ts'\nimport { generateBridgeEstimate } from '../../../../../util/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nexport const makeBridgeToRemoteEstimateRoute = (config: Config): RouteDefinition => {\n const params = z.object({ chainId: getRemoteChainIdZod(config) })\n const body = BridgeIntentFieldsZod.pick({\n destAddress: true,\n srcAddress: true,\n srcAmount: true,\n })\n const response = z.tuple([\n TransactionBoundWitnessZod,\n PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),\n PayloadZodLooseOfSchema(TransferSchema),\n ])\n const validateRequest = requestHandlerValidator({\n params, body, response,\n })\n\n return {\n method: 'post',\n path: '/bridge/chains/:chainId/bridgeToRemote/estimate',\n handlers: validateRequest(async (req, res) => {\n const xl1ChainId = getXl1ChainId(config)\n const {\n srcAddress, srcAmount, destAddress,\n } = req.body\n const [bridgeIntent, transfer] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config)\n const sender = toAddress(srcAddress)\n\n // Use viewer to get current block\n const gateway = await getGateway(config)\n const viewer = assertEx(gateway.connectionInstance.viewer, () => new Error('Viewer not available on gateway connection'))\n const currentBlockNumber = await viewer.currentBlockNumber()\n // Calculate nbf/exp\n const nbf = toXL1BlockNumber(currentBlockNumber, true)\n const exp = toXL1BlockNumber(currentBlockNumber + 1000, true)\n // Build unsigned transaction representing the transfer that will be signed by srcAddress\n const [txBw] = await buildUnsignedTransaction(xl1ChainId, [transfer], [bridgeIntent], nbf, exp, sender)\n\n // Return the TX to the caller for signing\n res.json([txBw, bridgeIntent, transfer])\n }),\n }\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport {\n asAddress, asHex, toHex,\n} from '@xylabs/sdk-js'\nimport { PayloadZodStrictOfSchema } from '@xyo-network/payload-model'\nimport type { BridgeDestinationObservation, BridgeSourceObservation } from '@xyo-network/xl1-protocol'\nimport {\n BridgeDestinationObservationFieldsZod, BridgeDestinationObservationSchema, BridgeIntentFieldsZod, BridgeIntentSchema, BridgeSourceObservationFieldsZod,\n BridgeSourceObservationSchema,\n} from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { z } from 'zod'\n\nimport { getBridgeSettings } from '../../../../../config/index.ts'\nimport { generateBridgeEstimate } from '../../../../../util/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nexport const makeBridgeToRemoteStatusRoute = (config: Config): RouteDefinition => {\n const params = z.object({\n chainId: getRemoteChainIdZod(config),\n nonce: z.string().nonempty(),\n })\n const query = z.object({ mockStatus: z.coerce.number().default(0) })\n const response = z.union([\n z.tuple([]),\n z.tuple([PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape)]),\n z.tuple([\n PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),\n PayloadZodStrictOfSchema(BridgeSourceObservationSchema).extend(BridgeSourceObservationFieldsZod.shape),\n ]),\n z.tuple([\n PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),\n PayloadZodStrictOfSchema(BridgeSourceObservationSchema).extend(BridgeSourceObservationFieldsZod.shape),\n PayloadZodStrictOfSchema(BridgeDestinationObservationSchema).extend(BridgeDestinationObservationFieldsZod.shape),\n ]),\n ])\n\n const validateRequest = requestHandlerValidator({\n params, query, response,\n })\n\n return {\n method: 'get',\n path: '/bridge/chains/:chainId/bridgeToRemote/status/:nonce',\n handlers: validateRequest(async (req, res) => {\n const { chainId } = req.params\n const { mockStatus = 0 } = req.query\n const result: z.infer<typeof response> = [] as unknown as z.infer<typeof response>\n\n const {\n remoteTokenAddress, xl1ChainId, xl1TokenAddress,\n } = await getBridgeSettings(config)\n\n const src = xl1ChainId\n const srcAddress = asAddress('2222222222222222222222222222222222222222', true)\n const srcAmount = asHex('0x200', true)\n const srcToken = xl1TokenAddress\n\n const dest = chainId\n const destAddress = asAddress('3333333333333333333333333333333333333333', true)\n const destAmount = asHex('0x100', true)\n const destToken = remoteTokenAddress\n\n if (mockStatus === 0) return res.sendStatus(404)\n if (mockStatus > 0) {\n const [observation] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config, req.params.nonce)\n result[0] = observation\n }\n if (mockStatus > 1) {\n const observation: BridgeSourceObservation = {\n schema: BridgeSourceObservationSchema,\n dest,\n destAddress,\n destAmount,\n destToken,\n src,\n srcAddress,\n srcAmount,\n srcToken,\n }\n result[1] = observation\n }\n if (mockStatus > 2) {\n const observation: BridgeDestinationObservation = {\n schema: BridgeDestinationObservationSchema,\n dest,\n destAddress,\n destAmount,\n destToken,\n src,\n srcAddress,\n srcAmount,\n srcToken,\n destConfirmation: toHex('0x9999'),\n }\n result[2] = observation\n }\n\n res.json(result)\n }),\n }\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport {\n makeBridgeConfigRoute, makeBridgeFromRemoteStatusRoute, makeBridgeToRemoteEstimateRoute, makeBridgeToRemoteRoute, makeBridgeToRemoteStatusRoute,\n} from './routes/index.ts'\n\nexport const getRouteDefinitions = (config: Config): RouteDefinition[] => {\n return [\n makeBridgeConfigRoute(config),\n makeBridgeToRemoteEstimateRoute(config),\n makeBridgeToRemoteRoute(config),\n makeBridgeToRemoteStatusRoute(config),\n makeBridgeFromRemoteStatusRoute(config),\n ]\n}\n","import type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport type { Express } from 'express'\n\nimport { getRouteDefinitions } from './routeDefinitions/index.ts'\n\nexport const addBridgeRoutes = (app: Express, config: Config) => {\n const routeDefinitions = getRouteDefinitions(config)\n for (const definition of routeDefinitions) {\n app[definition.method](definition.path, definition.handlers)\n }\n}\n","import type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport type { Express } from 'express'\n\nimport { addBridgeRoutes } from './bridge/index.ts'\n\nexport const addRoutes = (app: Express, config: Config) => {\n addBridgeRoutes(app, config)\n}\n","import {\n assertEx, isDefined, isString, type Logger,\n} from '@xylabs/sdk-js'\nimport { boot } from '@xyo-network/bios'\nimport type { BiosExternalInterface } from '@xyo-network/bios-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { HDWallet } from '@xyo-network/wallet'\nimport { type Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getNode } from '../manifest/index.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\n// TODO: Make nodejs version of bios support round tripping mnemonic between boots\nconst getSeedPhrase = async (bios: BiosExternalInterface, config: Config, logger?: Logger): Promise<string> => {\n const storedSeedPhrase = await bios.seedPhraseStore.get('os')\n logger?.debug(`[Bridge] Stored mnemonic: ${storedSeedPhrase}`)\n const { mnemonic } = config.api\n if (isString(storedSeedPhrase) && isString(mnemonic)) {\n logger?.warn('[Bridge] Stored mnemonic does not match supplied. Updating stored mnemonic to supplied.')\n await bios.seedPhraseStore.set('os', mnemonic)\n } else {\n let seedPhrase: string\n if (isString(mnemonic)) {\n seedPhrase = mnemonic\n } else {\n seedPhrase = HDWallet.generateMnemonic()\n logger?.log('[Bridge] No mnemonic provided, using random mnemonic. This is not recommended for production use.')\n logger?.log(`[Bridge] Mnemonic: ${seedPhrase}`)\n }\n await bios.seedPhraseStore.set('os', seedPhrase)\n }\n return assertEx(await bios.seedPhraseStore.get('os'), () => 'Unable to acquire mnemonic from bios')\n}\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport const getServer = async (context: GetServerContext) => {\n const { logger, config } = context\n const { port, mnemonic } = config.bridge\n const bios = await boot()\n const seedPhrase = isDefined(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger)\n const wallet = await HDWallet.fromPhrase(seedPhrase)\n const nodeContext = {\n wallet, logger, config,\n }\n const node = context.node ?? await getNode(nodeContext)\n const app = getApp(node, config)\n const server = app.listen(port, hostname, () => logger?.log(`[Bridge] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n","import { BaseMongoSdk, type BaseMongoSdkPrivateConfig } from '@xylabs/mongo'\nimport type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'\nimport { ViewArchivist } from '@xyo-network/archivist-view'\nimport { mapToMapType, MongoMap } from '@xyo-network/chain-protocol'\nimport { initEvmProvider } from '@xyo-network/chain-services'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { AbstractModule, LoggerModuleStatusReporter } from '@xyo-network/module-abstract'\nimport { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport type { MongoDBModuleParamsV2 } from '@xyo-network/module-model-mongodb'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport { HDWallet } from '@xyo-network/wallet'\nimport type { BridgeDestinationObservation, SignedHydratedTransaction } from '@xyo-network/xl1-protocol'\nimport type {\n Config, IterableMap, XyoGatewayRunner,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n hasMongoConfig, SimpleXyoGatewayRunner, SimpleXyoSigner,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { HttpRpcXyoConnection } from '@xyo-network/xl1-rpc'\nimport type { Document } from 'mongodb'\n\nimport type { EVMLiquidityBridgeTransactionCompletionMonitorSentinelParams, XL1TransactionCompletionMonitorSentinelParams } from '../modules/index.ts'\nimport {\n EVMLiquidityBridgeTransactionCompletionMonitorSentinel, EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema,\n XL1TransactionCompletionMonitorSentinel, XL1TransactionCompletionMonitorSentinelConfigSchema,\n} from '../modules/index.ts'\n\nexport interface GetLocatorContext {\n config: Config\n logger?: Logger\n}\n\n/**\n * Used for retrieving a locator with the necessary modules registered for testing\n * operation of the node (entirely in memory)\n * @returns A locator with the necessary modules registered\n */\nexport const getLocator = async (context: GetLocatorContext) => {\n const { config, logger } = context\n const { otlpEndpoint } = config.telemetry?.otel ?? {}\n const { path: endpoint = '/metrics', port: port = 9468 } = config.telemetry?.metrics?.scrape ?? {}\n const { traceProvider, meterProvider } = await initTelemetry({\n attributes: {\n serviceName: 'xl1-bridge',\n serviceVersion: '1.0.0',\n },\n otlpEndpoint,\n metricsConfig: { endpoint, port },\n })\n\n if (isDefined(logger)) AbstractModule.defaultLogger = logger\n const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : undefined\n\n const locator = new ModuleFactoryLocator()\n // If there's a MongoDB configuration\n const mongoConfig = config.storage?.mongo\n if (hasMongoConfig(mongoConfig)) {\n // Create the MongoDB SDK from the configuration\n const {\n connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName,\n } = mongoConfig\n const payloadSdkConfig: BaseMongoSdkPrivateConfig = {\n dbConnectionString, dbDomain, dbName, dbPassword, dbUserName,\n }\n const params: Partial<MongoDBModuleParamsV2> = {\n meterProvider, payloadSdkConfig, statusReporter, traceProvider,\n }\n // Register the MongoDB Archivist as the default\n locator.register(MongoDBArchivistV2.factory(params), undefined, true)\n }\n\n locator.register(MemoryArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(MemorySentinel.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(ViewArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n\n const gateway = await getGateway(config)\n const viewer = assertEx(gateway.connectionInstance.viewer, () => 'Gateway viewer is not defined')\n const pendingXl1ToEthXl1BridgeIntentTransactions = await getIterableMap<Hash, SignedHydratedTransaction>(\n config,\n 'liquidity_bridge_xl1_to_eth_xl1_pending',\n )\n const completedXl1ToEthXl1BridgeIntentTransactions = await getIterableMap<Hash, SignedHydratedTransaction>(\n config,\n 'liquidity_bridge_xl1_to_eth_xl1_completed',\n )\n\n const xl1TransactionCompletionMonitorSentinelParams: XL1TransactionCompletionMonitorSentinelParams = {\n completedTransactions: completedXl1ToEthXl1BridgeIntentTransactions,\n config: { schema: XL1TransactionCompletionMonitorSentinelConfigSchema },\n meterProvider,\n pendingTransactions: pendingXl1ToEthXl1BridgeIntentTransactions,\n statusReporter,\n traceProvider,\n viewer,\n }\n locator.register(XL1TransactionCompletionMonitorSentinel.factory(xl1TransactionCompletionMonitorSentinelParams))\n\n const completedEthXl1BridgeTransactions = await getIterableMap<Hash, BridgeDestinationObservation>(\n config,\n 'liquidity_bridge_eth_xl1_bridge_completed',\n )\n const provider = await initEvmProvider({ config })\n const bridgeAddress = config.bridge.remoteBridgeContractAddress\n const evmLiquidityBridgeTransactionCompletionMonitorSentinelParams: EVMLiquidityBridgeTransactionCompletionMonitorSentinelParams = {\n bridgeAddress,\n completedTransactions: completedEthXl1BridgeTransactions,\n config: { schema: EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema },\n meterProvider,\n pendingTransactions: completedXl1ToEthXl1BridgeIntentTransactions,\n provider,\n statusReporter,\n traceProvider,\n }\n locator.register(EVMLiquidityBridgeTransactionCompletionMonitorSentinel.factory(evmLiquidityBridgeTransactionCompletionMonitorSentinelParams))\n\n return locator\n}\n\nconst getGateway = async (\n config: Config,\n): Promise<XyoGatewayRunner> => {\n const { mnemonic, chainRpcApiUrl: endpoint } = config.bridge\n const walletPromise = isDefined(mnemonic) ? HDWallet.fromPhrase(mnemonic) : HDWallet.random()\n const account = await walletPromise\n const signer = new SimpleXyoSigner(account)\n const connection = new HttpRpcXyoConnection({ endpoint })\n const gateway = new SimpleXyoGatewayRunner(connection, signer)\n return gateway\n}\n\n/**\n * Gets an iterable map based on the storage instructions in the config\n * @param config The config containing storage instructions\n * @param collection The collection to use if using MongoDB for persistence\n * @returns The iterable map\n */\nconst getIterableMap = async <K extends {} = string, V extends Document = Document>\n(config: Config, collection: string): Promise<IterableMap<K, V>> => {\n const mongoConfig = config.storage?.mongo\n if (hasMongoConfig(mongoConfig)) {\n const {\n connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName,\n } = mongoConfig\n const payloadSdkConfig: BaseMongoSdkPrivateConfig = {\n dbConnectionString, dbDomain, dbName, dbPassword, dbUserName,\n }\n const sdkBalanceSummaryMap = new BaseMongoSdk<V>({ ...payloadSdkConfig, collection })\n const result = await MongoMap.create<MongoMap<K, V>>({\n sdk: sdkBalanceSummaryMap,\n getCache: { enabled: true, maxEntries: 5000 },\n })\n return result\n } else {\n return mapToMapType(new Map<K, V>())\n }\n}\n","import type { Attributes, Counter } from '@opentelemetry/api'\nimport type {\n Address, Hash, Hex,\n} from '@xylabs/sdk-js'\nimport {\n asAddress, asHex, assertEx, delay, hexFromBigInt, hexToBigInt, isDefined, isUndefined,\n} from '@xylabs/sdk-js'\nimport type { AnyConfigSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport type {\n SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport { type LiquidityPoolBridge, LiquidityPoolBridge__factory } from '@xyo-network/typechain'\nimport {\n type BridgeDestinationObservation, BridgeDestinationObservationSchema, type BridgeIntent, isBridgeIntent, type SignedHydratedTransaction,\n} from '@xyo-network/xl1-protocol'\nimport type { IterableMap, MapType } from '@xyo-network/xl1-protocol-sdk'\nimport {\n flattenHydratedTransaction, flattenHydratedTransactions, tryUnflattenHydratedTransaction,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\nimport { getAddress } from 'ethers/address'\nimport type { Provider } from 'ethers/providers'\nimport { Wallet } from 'ethers/wallet'\n\nexport const EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema\n = 'network.xyo.sentinel.chain.evm.liquidity.bridge.transaction.completion.monitor.config'\nexport type EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema = typeof EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema\n\n/**\n * The configuration for the sentinel\n */\nexport type EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfig = SentinelConfig<{\n /**\n * The interval in milliseconds between checking for jobs to fulfill\n */\n jobCheckInterval: number\n\n /**\n * The schema for the sentinel config\n */\n schema: EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema\n}>\n\ninterface EVMLiquidityBridgeTransactionCompletionMonitorSentinelParamFields {\n /**\n * The address to watch for incoming or outgoing ERC-20 token transfers.\n */\n bridgeAddress: string\n\n /**\n * The map of completed transactions to monitor for completion\n */\n completedTransactions: MapType<Hash, BridgeDestinationObservation>\n\n /**\n * The map of pending transactions to monitor for completion\n */\n pendingTransactions: IterableMap<Hash, SignedHydratedTransaction>\n\n /**\n * An ethers.js Provider connected to the Ethereum network to monitor for ERC-20 transfers.\n */\n provider: Provider\n}\n\nexport type EVMLiquidityBridgeTransactionCompletionMonitorSentinelParams<TConfig extends\nAnyConfigSchema<EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfig> = AnyConfigSchema<EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfig>,\n> = SentinelParams<TConfig> & EVMLiquidityBridgeTransactionCompletionMonitorSentinelParamFields\n\nconst defaultJobCheckIntervalMs = 15_000\n\nexport class EVMLiquidityBridgeTransactionCompletionMonitorSentinel<\n TParams extends EVMLiquidityBridgeTransactionCompletionMonitorSentinelParams = EVMLiquidityBridgeTransactionCompletionMonitorSentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n> extends AbstractSentinel<TParams, TEventData> {\n static override readonly configSchemas = [EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema]\n static override readonly defaultConfigSchema = EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema\n protected _attemptsCounter: Counter<Attributes> | undefined\n protected _bridge: LiquidityPoolBridge | undefined\n protected _bridgeChainId: Hex | undefined\n protected _bridgeRemoteChainId: Hex | undefined\n protected _bridgeTokenAddress: Address | undefined\n protected _checkCounter: Counter<Attributes> | undefined\n protected _errorCounter: Counter<Attributes> | undefined\n protected _reportMutex = new Mutex()\n protected _successCounter: Counter<Attributes> | undefined\n protected _wallet: Wallet | undefined\n\n protected get bridge(): LiquidityPoolBridge {\n return assertEx(this._bridge, () => new Error('Bridge contract not initialized'))\n }\n\n protected get completedTransactions(): MapType<Hash, BridgeDestinationObservation> {\n return assertEx(this.params.completedTransactions, () => 'Completed transactions map is not defined')\n }\n\n protected get jobCheckInterval(): number {\n return isDefined(this.config.jobCheckInterval) ? this.config.jobCheckInterval : defaultJobCheckIntervalMs\n }\n\n protected get pendingTransactions(): IterableMap<Hash, SignedHydratedTransaction> {\n return assertEx(this.params.pendingTransactions, () => 'Pending transactions map is not defined')\n }\n\n protected get wallet(): Wallet {\n return assertEx(this._wallet, () => 'wallet is required')\n }\n\n override async createHandler(): Promise<void> {\n await super.createHandler()\n // Create meters for tracking bridge attempts, successes, and errors.\n this._attemptsCounter = this.meter?.createCounter(\n 'evm_liquidity_bridge_transaction_completion_monitor_sentinel_attempts_total',\n { description: 'Number of attempts' },\n )\n this._checkCounter = this.meter?.createCounter(\n 'evm_liquidity_bridge_transaction_completion_monitor_sentinel_check_total',\n { description: 'Number of checks' },\n )\n this._successCounter = this.meter?.createCounter(\n 'evm_liquidity_bridge_transaction_completion_monitor_sentinel_success_total',\n { description: 'Number of successes' },\n )\n this._errorCounter = this.meter?.createCounter(\n 'evm_liquidity_bridge_transaction_completion_monitor_sentinel_errors_total',\n { description: 'Number of errors' },\n )\n const { provider, bridgeAddress } = this.params\n\n // Connect to the bridge contract\n // Create a wallet bound to the provider (signer + provider)\n const key = assertEx(this.account?.private?.hex, () => new Error('Account private key is required'))\n this._wallet = new Wallet(key, provider)\n this._bridge = LiquidityPoolBridge__factory.connect(getAddress(bridgeAddress), this._wallet)\n\n // Parse bridge network chain ID\n const network = await provider.getNetwork()\n this._bridgeChainId = assertEx(hexFromBigInt(network.chainId), () => new Error('Failed to parse bridgeChainId'))\n\n // Parse bridge token address\n const tokenAddress = await this.bridge.token()\n this._bridgeTokenAddress = asAddress(tokenAddress, true)\n\n // Parse bridge remote chain ID\n const bridgeRemoteChain = await this.bridge.remoteChain()\n this._bridgeRemoteChainId = asHex(bridgeRemoteChain)\n }\n\n override async reportHandler(payloads?: Payload[]): Promise<Payload[]> {\n if (isDefined(payloads) && payloads.length > 0) {\n const signedHydratedTransaction = tryUnflattenHydratedTransaction(payloads)\n if (isDefined(signedHydratedTransaction)) {\n // Insert into pending transactions for monitoring\n const txHash = await PayloadBuilder.hash(signedHydratedTransaction[0])\n this.logger?.info(`Adding transaction ${signedHydratedTransaction[0]} with hash ${txHash} to pending transactions for monitoring`)\n await this.pendingTransactions.set(txHash, signedHydratedTransaction)\n return flattenHydratedTransaction(signedHydratedTransaction)\n }\n return []\n } else {\n if (this._reportMutex.isLocked()) {\n this.logger?.debug(`EVMLiquidityBridgeTransactionCompletionMonitorSentinel [${this.id}] is already running, skipping report [${Date.now()}]`)\n return []\n }\n return await this._reportMutex.runExclusive(async () => {\n const response: Payload[] = []\n if (isUndefined(payloads) || payloads.length === 0) {\n await this.processAllTransactions()\n }\n return response\n })\n }\n }\n\n private async processAllTransactions(): Promise<Payload[]> {\n const results: SignedHydratedTransaction[] = []\n for await (const [hash, signedHydratedTransaction] of this.pendingTransactions) {\n const result = await this.processTransaction([hash, signedHydratedTransaction])\n if (isDefined(result)) results.push(result[1])\n await delay(this.jobCheckInterval)\n }\n return flattenHydratedTransactions(results)\n }\n\n private async processTransaction(\n [hash, signedHydratedTransaction]: [Hash, SignedHydratedTransaction],\n ): Promise<[Hash, SignedHydratedTransaction] | undefined> {\n this.logger?.info(`Checking for transaction ${signedHydratedTransaction[0]} with hash ${hash}`)\n try {\n let ret: [Hash, SignedHydratedTransaction] | undefined = undefined\n this._checkCounter?.add(1)\n const bridgeIntents = signedHydratedTransaction[1].filter(isBridgeIntent)\n // Only support a single intent per transaction for now\n if (bridgeIntents.length !== 1) {\n await this.pendingTransactions.delete(hash)\n return ret\n }\n const bridgeIntent = bridgeIntents[0]\n this._attemptsCounter?.add(1)\n const bridgeDestinationObservation = await this.relayBridgeIntentSync(bridgeIntent)\n await this.completedTransactions.set(hash, bridgeDestinationObservation)\n await this.pendingTransactions.delete(hash)\n this._successCounter?.add(1)\n return ret\n } catch (error) {\n this._errorCounter?.add(1)\n this.logger?.error(`Error checking for transaction ${signedHydratedTransaction[0]} with hash ${hash}:`, error)\n }\n }\n\n /**\n * Relays a given BridgeIntent.\n * @param bridgeIntent The BridgeIntent to relay\n * @returns Relays the intent in a blocking manner, returning the resulting BridgeDestinationObservation if successful\n */\n private async relayBridgeIntentSync(bridgeIntent: BridgeIntent): Promise<BridgeDestinationObservation> {\n // Ensure source observation exists\n const amount = hexToBigInt(bridgeIntent.destAmount)\n const nonce = await this.wallet.getNonce()\n const srcAddress = getAddress(bridgeIntent.srcAddress)\n const destAddress = getAddress(bridgeIntent.destAddress)\n const tx = await this.bridge.bridgeFromRemote(srcAddress, destAddress, amount, { nonce })\n const confirmation = await tx.wait()\n const transactionResponse = await confirmation?.getTransaction()\n const destConfirmation = asHex(transactionResponse?.hash ?? '', true)\n const { schema, ...rest } = bridgeIntent\n const result: BridgeDestinationObservation = new PayloadBuilder<BridgeDestinationObservation>({ schema: BridgeDestinationObservationSchema })\n .fields({ ...rest, destConfirmation }).build()\n return result\n }\n}\n","import type { Attributes, Counter } from '@opentelemetry/api'\nimport type { Hash } from '@xylabs/sdk-js'\nimport {\n assertEx, delay, isDefined, isNull, isUndefined,\n} from '@xylabs/sdk-js'\nimport type { AnyConfigSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport type {\n SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport type { SignedHydratedTransaction } from '@xyo-network/xl1-protocol'\nimport type {\n IterableMap, MapType, XyoViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n flattenHydratedTransaction, flattenHydratedTransactions, tryUnflattenHydratedTransaction,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nexport const XL1TransactionCompletionMonitorSentinelConfigSchema = 'network.xyo.sentinel.chain.transaction.completion.monitor.config'\nexport type XL1TransactionCompletionMonitorSentinelConfigSchema = typeof XL1TransactionCompletionMonitorSentinelConfigSchema\n\n/**\n * The configuration for the sentinel\n */\nexport type XL1TransactionCompletionMonitorSentinelConfig = SentinelConfig<{\n /**\n * The interval in milliseconds between checking for jobs to fulfill\n */\n jobCheckInterval: number\n\n /**\n * The schema for the sentinel config\n */\n schema: XL1TransactionCompletionMonitorSentinelConfigSchema\n}>\n\ninterface XL1TransactionCompletionMonitorSentinelParamFields {\n /**\n * The map of completed transactions to monitor for completion\n */\n completedTransactions: MapType<Hash, SignedHydratedTransaction>\n\n /**\n * The map of pending transactions to monitor for completion\n */\n pendingTransactions: IterableMap<Hash, SignedHydratedTransaction>\n\n /**\n * The viewer instance to use for viewing transactions\n */\n viewer: XyoViewer\n}\n\nexport type XL1TransactionCompletionMonitorSentinelParams<\n TConfig extends AnyConfigSchema<XL1TransactionCompletionMonitorSentinelConfig> = AnyConfigSchema<XL1TransactionCompletionMonitorSentinelConfig>,\n> = SentinelParams<TConfig> & XL1TransactionCompletionMonitorSentinelParamFields\n\nconst defaultJobCheckIntervalMs = 15_000\n\nexport class XL1TransactionCompletionMonitorSentinel<\n TParams extends XL1TransactionCompletionMonitorSentinelParams = XL1TransactionCompletionMonitorSentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n> extends AbstractSentinel<TParams, TEventData> {\n static override readonly configSchemas = [XL1TransactionCompletionMonitorSentinelConfigSchema]\n static override readonly defaultConfigSchema = XL1TransactionCompletionMonitorSentinelConfigSchema\n private _attemptsCounter: Counter<Attributes> | undefined\n private _checkCounter: Counter<Attributes> | undefined\n private _errorCounter: Counter<Attributes> | undefined\n private _reportMutex = new Mutex()\n private _successCounter: Counter<Attributes> | undefined\n\n protected get completedTransactions(): MapType<Hash, SignedHydratedTransaction> {\n return assertEx(this.params.completedTransactions, () => 'Completed transactions map is not defined')\n }\n\n protected get jobCheckInterval(): number {\n return isDefined(this.config.jobCheckInterval) ? this.config.jobCheckInterval : defaultJobCheckIntervalMs\n }\n\n protected get pendingTransactions(): IterableMap<Hash, SignedHydratedTransaction> {\n return assertEx(this.params.pendingTransactions, () => 'Pending transactions map is not defined')\n }\n\n protected get viewer(): XyoViewer {\n return assertEx(this.params.viewer, () => 'Viewer is not defined in params')\n }\n\n override async createHandler(): Promise<void> {\n await super.createHandler()\n // Create meters for tracking bridge attempts, successes, and errors.\n this._attemptsCounter = this.meter?.createCounter('xl1_transaction_completion_monitor_sentinel_attempts_total', { description: 'Number of attempts' })\n this._checkCounter = this.meter?.createCounter('xl1_transaction_completion_monitor_sentinel_check_total', { description: 'Number of checks' })\n this._successCounter = this.meter?.createCounter('xl1_transaction_completion_monitor_sentinel_success_total', { description: 'Number of successes' })\n this._errorCounter = this.meter?.createCounter('xl1_transaction_completion_monitor_sentinel_errors_total', { description: 'Number of errors' })\n }\n\n override async reportHandler(payloads?: Payload[]): Promise<Payload[]> {\n if (isDefined(payloads) && payloads.length > 0) {\n const signedHydratedTransaction = tryUnflattenHydratedTransaction(payloads)\n if (isDefined(signedHydratedTransaction)) {\n // Insert into pending transactions for monitoring\n const txHash = await PayloadBuilder.hash(signedHydratedTransaction[0])\n this.logger?.info(`Adding transaction ${signedHydratedTransaction[0]} with hash ${txHash} to pending transactions for monitoring`)\n await this.pendingTransactions.set(txHash, signedHydratedTransaction)\n return flattenHydratedTransaction(signedHydratedTransaction)\n }\n return []\n } else {\n if (this._reportMutex.isLocked()) {\n this.logger?.debug(`XL1TransactionCompletionMonitorSentinel [${this.id}] is already running, skipping report [${Date.now()}]`)\n return []\n }\n return await this._reportMutex.runExclusive(async () => {\n const response: Payload[] = []\n if (isUndefined(payloads) || payloads.length === 0) {\n await this.processAllTransactions()\n }\n return response\n })\n }\n }\n\n private async processAllTransactions(): Promise<Payload[]> {\n const results: SignedHydratedTransaction[] = []\n for await (const [hash, signedHydratedTransaction] of this.pendingTransactions) {\n const result = await this.processTransaction([hash, signedHydratedTransaction])\n if (isDefined(result)) results.push(result[1])\n await delay(this.jobCheckInterval)\n }\n return flattenHydratedTransactions(results)\n }\n\n private async processTransaction(\n [hash, signedHydratedTransaction]: [Hash, SignedHydratedTransaction],\n ): Promise<[Hash, SignedHydratedTransaction] | undefined> {\n this.logger?.info(`Checking for transaction ${signedHydratedTransaction[0]} with hash ${hash}`)\n try {\n let ret: [Hash, SignedHydratedTransaction] | undefined = undefined\n this._checkCounter?.add(1)\n this._attemptsCounter?.add(1)\n // Check if the transaction is already included in the chain\n const tx = await this.viewer.transactionByHash(hash)\n if (isDefined(tx) && !isNull(tx)) {\n await this.completedTransactions.set(hash, signedHydratedTransaction)\n this.logger?.info(`Found transaction ${signedHydratedTransaction[0]} with hash ${hash}`)\n this.logger?.info(`Removing completed transaction ${signedHydratedTransaction[0]} with hash ${hash}`)\n await this.pendingTransactions.delete(hash)\n ret = [hash, signedHydratedTransaction]\n } else {\n const currentBlockNumber = await this.viewer.currentBlockNumber()\n if (signedHydratedTransaction[0].exp < currentBlockNumber) {\n this.logger?.info(`Removing expired transaction ${signedHydratedTransaction[0]} with hash ${hash}`)\n await this.pendingTransactions.delete(hash)\n }\n }\n this._successCounter?.add(1)\n return ret\n } catch (error) {\n this._errorCounter?.add(1)\n this.logger?.error(`Error checking for transaction ${signedHydratedTransaction[0]} with hash ${hash}:`, error)\n }\n }\n}\n","import type { Logger } from '@xylabs/sdk-js'\nimport { ManifestWrapper } from '@xyo-network/manifest-wrapper'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getLocator } from './getLocator.ts'\nimport { NodeManifest } from './nodeManifest.ts'\nimport { PrivateChildManifests } from './private/index.ts'\nimport { PublicChildManifests } from './public/index.ts'\n\nexport interface GetNodeContext {\n config: Config\n logger?: Logger\n wallet: WalletInstance\n}\n\n/**\n * Creates a node with the xyo-chain modules registered\n * @param context The context to use for the node\n * @returns A node with the xyo-chain modules registered\n */\nexport const getNode = async (context: GetNodeContext) => {\n const { wallet } = context\n const locator = await getLocator(context)\n const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests)\n const [node, ...childNodes] = await wrapper.loadNodes()\n if (childNodes?.length > 0) {\n await Promise.all(childNodes.map(childNode => node.register(childNode)))\n await Promise.all(childNodes.map(childNode => node.attach(childNode.address, true)))\n }\n return node\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"44'/60'/1\",\n \"name\": \"XYOEthereumBridge\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [],\n \"public\": []\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport node from './node.json' with { type: 'json' }\n\n/**\n * Root Node Manifest\n */\nexport const NodeManifest = node as PackageManifestPayload\n","/**\n * Private Child Manifests\n */\nexport const PrivateChildManifests = []\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"2\",\n \"name\": \"XL1\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"1/1'/1'\",\n \"automations\": [\n {\n \"frequency\": 60000,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"XL1BridgeIntentTransactionCompletionMonitorSentinelIntervalSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": true,\n \"tasks\": [\n {\n \"mod\": \"XL1BridgeIntentTransactionCompletionMonitorSentinel\",\n \"endPoint\": \"report\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"name\": \"XL1BridgeIntentTransactionCompletionMonitorSentinel\",\n \"schema\": \"network.xyo.sentinel.chain.transaction.completion.monitor.config\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"3\",\n \"name\": \"Ethereum\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"1/1'/1'\",\n \"automations\": [\n {\n \"frequency\": 60000,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"EVMLiquidityBridgeTransactionCompletionMonitorSentinelIntervalSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": true,\n \"tasks\": [\n {\n \"mod\": \"EVMLiquidityBridgeTransactionCompletionMonitorSentinel\",\n \"endPoint\": \"report\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"name\": \"EVMLiquidityBridgeTransactionCompletionMonitorSentinel\",\n \"schema\": \"network.xyo.sentinel.chain.evm.liquidity.bridge.transaction.completion.monitor.config\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { ModuleManifest, PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport XL1Node from './XL1.json' with { type: 'json' }\nimport EthereumNode from './Ethereum.json' with { type: 'json' }\n\n\n/**\n * XL1 Node Manifest\n */\nexport const XL1NodeManifest = XL1Node as PackageManifestPayload\n\n/**\n * Ethereum Node Manifest\n */\nexport const EthereumNodeManifest = EthereumNode as PackageManifestPayload\n\n/**\n * Public Child Manifests\n */\nexport const PublicChildManifests: ModuleManifest[] = [\n ...XL1NodeManifest.nodes,\n ...EthereumNodeManifest.nodes,\n]\n"],"mappings":";;;;AAAA,SACEA,uBAAuBC,6BAA6BC,sCAAsCC,mBAAmBC,0BAA0BC,kBACvIC,gBAAgBC,yBACX;AAGP,OAAOC,iBAAiB;AACxB,OAAOC,UAAU;AAEjB,OAAOC,aAAa;;;ACTpB,SAASC,gCAAgC;AACzC,SAASC,8BAA8B;AACvC,SAASC,2BAA2B;AAS7B,IAAMC,qBAAqB,6BAAA;AAChC,QAAMC,mBAAmB;IAAC,IAAIC,oBAAAA;IAAuB,IAAIC,uBAAAA;;AACzDC,2BAAyB;IAAEH;EAAiB,CAAA;AAC9C,GAHkC;;;ACVlC,SAASI,+BAA+B;AACxC,SAASC,yBAAsC;;;ACF/C,SAASC,aAAa;AAGf,IAAMC,YAAY,wBAACC,UAAAA;AACxB,QAAMC,UAAUC,MAAMF,KAAAA;AACtB,SAAOC;AACT,GAHyB;;;ACFzB,SAASE,iBAAiB;AAEnB,IAAMC,UAAU,wBAACC,UAAAA;AACtB,QAAMC,QAAQC,UAAUF,KAAAA;AACxB,SAAOC;AACT,GAHuB;;;ACFvB,SAASE,aAAAA,YAAWC,gBAAgB;AAG7B,IAAMC,4BAA4B,wBAACC,WAAAA;AACxC,QAAMC,UAAUC,WAAUF,OAAOG,OAAOC,aAAa;AACrD,SAAOH;AACT,GAHyC;;;ACHzC,SAASI,aAAAA,YAAWC,YAAAA,iBAAgB;AAG7B,IAAMC,0BAA0B,wBAACC,WAAAA;AACtC,QAAMC,UAAUC,WAAUF,OAAOG,OAAOC,WAAW;AACnD,SAAOH;AACT,GAHuC;;;ACAhC,IAAMI,kBAAkB,wBAACC,WAAAA;AAC9B,QAAM,EAAEC,UAAUC,mBAAkB,IAAKF,OAAOG;AAChD,SAAO;IAAEF;IAAUC;EAAmB;AACxC,GAH+B;;;ACDxB,IAAME,qBAAqB,wBAACC,WAAAA;AACjC,QAAM,EAAEC,gBAAe,IAAKD,OAAOE;AACnC,SAAOD;AACT,GAHkC;;;ACA3B,IAAME,qBAAqB,wBAACC,WAAAA;AACjC,QAAM,EAAEC,gBAAe,IAAKD,OAAOE;AACnC,SAAOD;AACT,GAHkC;;;ACHlC,SAASE,YAAAA,iBAAgB;AAMlB,IAAMC,mBAAmB,wBAACC,WAAAA;AAC/B,QAAMC,gBAAgBC,UAASC,UAAUH,OAAOI,OAAOH,aAAa,GAAG,MAAM,mCAAA;AAC7E,SAAOA;AACT,GAHgC;;;ACLhC,SAASI,YAAAA,iBAAgB;AAKlB,IAAMC,wBAAwB,wBAACC,WAAAA;AACpC,QAAMC,QAAQC,QAAQF,OAAOG,OAAOC,kBAAkB;AACtD,SAAOC,UAASJ,OAAO,MAAM,6DAAA;AAC/B,GAHqC;;;ACLrC,SAASK,WAAWC,mBAAmB;AACvC,SAASC,gBAAgB;AAGzB,SAASC,eAAeC,uCAAuC;AAE/D,IAAIC;AAEG,IAAMC,yBAAyB,8BAAOC,WAAAA;AAC3C,MAAIF,wBAAyB,QAAOA;AACpC,MAAIG,eAAeD,OAAOE,OAAOC;AACjC,MAAIC,YAAYH,YAAAA,GAAe;AAC7BI,YAAQC,IAAI,wCAAA;AACZ,UAAMC,iBAAiBC,SAASC,iBAAgB;AAChDJ,YAAQC,IAAI;;EAEdC,cAAAA;;KAEG;AACDN,mBAAeM;EACjB;AACA,QAAMG,SAAS,MAAMC,gCAAgCV,YAAAA;AACrD,QAAMW,UAAU,MAAMF,OAAOG,WAAWC,cAAcC,GAAG;AACzDjB,4BAA0Bc;AAC1B,SAAOd;AACT,GAjBsC;;;ACG/B,IAAMkB,uBAAuB,8BAAOC,WAAAA;AACzC,QAAMC,gBAAgBC,0BAA0BF,MAAAA,MAAY,MAAMG,uBAAuBH,MAAAA,GAASI;AAClG,QAAMC,cAAcC,wBAAwBN,MAAAA,MAAY,MAAMG,uBAAuBH,MAAAA,GAASI;AAC9F,SAAO;IAAEH;IAAeI;EAAY;AACtC,GAJoC;;;ACZpC,SAASE,YAAAA,WAAUC,aAAAA,kBAAiB;AAM7B,IAAMC,gBAAgB,wBAACC,WAAAA;AAC5B,QAAMC,aAAaD,OAAOE,OAAOD;AACjC,MAAIE,WAAUF,UAAAA,GAAa;AACzB,WAAOG,UAASC,UAAUJ,UAAAA,GAAa,MAAM,qCAAA;EAC/C;AACA,SAAOG,UAASC,UAAUL,OAAOM,MAAMC,EAAE,GAAG,MAAM,4BAAA;AACpD,GAN6B;;;ACL7B,SAASC,aAAAA,kBAAiB;AAMnB,IAAMC,qBAAqB,wBAACC,WAAAA;AACjC,QAAMC,QAAQC,QAAQF,OAAOG,OAAOC,eAAe;AACnD,MAAIC,WAAUJ,KAAAA,EAAQ,QAAOA;AAC7B,SAAOK,cAAcN,MAAAA;AACvB,GAJkC;;;ACI3B,IAAMO,oBAAoB,8BAAOC,WAAAA;AACtC,QAAM,EAAEC,UAAUC,mBAAkB,IAAKC,gBAAgBH,MAAAA;AACzD,QAAM,EAAEI,aAAaC,cAAa,IAAK,MAAMC,qBAAqBN,MAAAA;AAClE,QAAMO,kBAAkBC,mBAAmBR,MAAAA;AAC3C,QAAMS,kBAAkBC,mBAAmBV,MAAAA;AAC3C,QAAMW,gBAAgBC,iBAAiBZ,MAAAA;AACvC,QAAMa,qBAAqBC,sBAAsBd,MAAAA;AACjD,QAAMe,kBAAkBC,mBAAmBhB,MAAAA;AAC3C,QAAMiB,aAAaC,cAAclB,MAAAA;AACjC,SAAO;IACLC;IAAUC;IAAoBE;IAAaC;IAAeE;IAAiBE;IAAiBE;IAAeE;IAAoBE;IAAiBE;EAClJ;AACF,GAZiC;;;ACXjC,SAASE,aAAAA,kBAAiB;AAC1B,SAASC,YAAAA,iBAAgB;AACzB,SACeC,wBAAwBC,uBAChC;AACP,SAASC,4BAA4B;AAErC,IAAIC;AAEG,IAAMC,aAAa,8BAAOC,WAAAA;AAC/B,MAAIC,WAAUH,eAAAA,EAAkB,QAAOA;AACvC,QAAM,EAAEI,UAAUC,gBAAgBC,SAAQ,IAAKJ,OAAOK;AACtD,QAAMC,gBAAgBL,WAAUC,QAAAA,IAAYK,UAASC,WAAWN,QAAAA,IAAYK,UAASE,OAAM;AAC3F,QAAMC,UAAU,MAAMJ;AACtB,QAAMK,SAAS,IAAIC,gBAAgBF,OAAAA;AACnC,QAAMG,aAAa,IAAIC,qBAAqB;IAAEV;EAAS,CAAA;AACvDN,oBAAkB,IAAIiB,uBAAuBF,YAAYF,MAAAA;AACzD,SAAOb;AACT,GAT0B;;;AfH1B,IAAMkB,WAAWC;AAEjB,IAAMC,kBAAkBC,wBAAwB;EAAEH;AAAS,CAAA;AAEpD,IAAMI,wBAAwB,wBAACC,WAAAA;AACpC,SAAO;IACLC,QAAQ;IACRC,MAAM;IACNC,UAAUN,gBAAgB,OAAOO,GAAGC,QAAAA;AAClC,YAAM,EACJC,eACAC,UACAC,oBACAC,aACAC,iBACAC,iBACAC,eACAC,oBACAC,YACAC,gBAAe,IACb,MAAMC,kBAAkBhB,MAAAA;AAC5B,YAAMiB,kBAAkB;QACtBX;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;MACF;AACAV,UAAIa,KAAKD,eAAAA;IACX,CAAA;EACF;AACF,GAhCqC;;;AgBTrC,SAASE,2BAAAA,gCAA+B;AACxC,SAASC,WAAWC,aAAa;AACjC,SAASC,gCAAgC;AAEzC,SACEC,uCACAC,0CACK;AAEP,SAASC,SAAS;;;ACVlB,SACEC,SAAAA,QAAOC,QAAQC,eAAAA,oBACV;AAMA,IAAMC,sBAAsB,wBAACC,WAAAA;AAClC,QAAMC,gBAAyBC,iBAAiBF,MAAAA;AAChD,SAAOG,OAAOC,YAAY,CAACC,KAAKC,QAAAA;AAC9B,UAAMC,UAAUC,OAAMH,GAAAA;AACtB,QAAII,aAAYF,OAAAA,GAAU;AACxBD,UAAII,SAAS,sBAAA;AACb;IACF;AACA,QAAIH,YAAYN,eAAe;AAC7BK,UAAII,SAAS,QAAQT,aAAAA,eAA4B;IACnD;EACF,CAAA;AACF,GAZmC;;;ADO5B,IAAMU,kCAAkC,wBAACC,WAAAA;AAC9C,QAAMC,SAASC,EAAEC,OAAO;IACtBC,SAASC,oBAAoBL,MAAAA;IAC7BM,OAAOJ,EAAEK,OAAM,EAAGC,SAAQ;EAC5B,CAAA;AACA,QAAMC,YAAWC,yBAAyBC,kCAAAA,EAAoCC,OAC5EC,sCAAsCC,KAAK;AAE7C,QAAMC,mBAAkBC,yBAAwB;IAAEf;IAAQQ,UAAAA;EAAS,CAAA;AAEnE,SAAO;IACLQ,QAAQ;IACRC,MAAM;IACNC,UAAUJ,iBAAgB,OAAOK,KAAKC,QAAAA;AACpC,YAAM,EACJC,eAAeC,oBAAoBC,YAAYC,gBAAe,IAC5D,MAAMC,kBAAkB1B,MAAAA;AAE5B,YAAM2B,OAAO,MAAMC,QAAQC,QAAQC,KAAKC,OAAM,CAAA;AAG9C,YAAMC,QAAQL,OAAO;AACrB,UAAI,CAACK,MAAO,QAAOX,IAAIY,WAAW,GAAA;AAElC,YAAMC,YAAYP,OAAO;AACzB,UAAI,CAACO,UAAW,QAAOb,IAAIY,WAAW,GAAA;AAEtC,YAAME,cAA4C;QAChDC,QAAQzB;QACR0B,MAAMb;QACNc,aAAaC,UAAU,OAAA;QACvBC,YAAYC,MAAM,OAAA;QAClBC,WAAWjB;QACXkB,KAAKrB;QACLsB,YAAYL,UAAU,OAAA;QACtBM,WAAWJ,MAAM,OAAA;QACjBK,UAAUvB;QACVwB,kBAAkBN,MAAM,QAAA;MAC1B;AACApB,UAAI2B,KAAKb,WAAAA;IACX,CAAA;EACF;AACF,GA1C+C;;;AEd/C,SAASc,2BAAAA,gCAA+B;AACxC,SAAoBC,YAAAA,iBAAgB;AACpC,SAASC,kBAAAA,uBAAsB;AAC/B,SAASC,4BAAAA,iCAAgC;AACzC,SAASC,0BAA0B;AAInC,SACEC,uBAAuBC,sBAAAA,qBAAoBC,kCAAkCC,+BAA+BC,kCAC5GC,mBACK;AACP,SAAsBC,kCAAkC;AACxD,SAASC,KAAAA,UAAS;;;ACblB,SAASC,aAAaC,SAAAA,cAAa;AAW5B,IAAMC,sBAAsB,wBAACC,WAAgBC,iBAAAA;AAClD,QAAM,EAAEC,UAAUC,mBAAkB,IAAKF;AAGzC,QAAMG,kBAAkBC,YAAYL,SAAAA;AAGpC,QAAMM,iBAAiBD,YAAYH,QAAAA;AAGnC,QAAMK,oBACDH,kBAAkBI,OAAOL,kBAAAA,IAAuB;AACrD,QAAMM,cAAcC,OAAMH,iBAAAA;AAG1B,QAAMI,iBAAiBL,iBAAiBC;AAGxC,QAAMK,mBAAmBR,kBAAkBO,iBAAiBP,kBAAkBO,iBAAiB;AAC/F,QAAME,aAAaH,OAAME,gBAAAA;AAEzB,SAAO;IACLC;IACAX;IACAO;EACF;AACF,GA1BmC;;;ACXnC,SAASK,eAAAA,cAAaC,aAAAA,kBAAiB;AACvC,SAASC,6BAA6B;AACtC,SAASC,sBAAsB;AAI/B,SAASC,0BAA0B;AAEnC,SAASC,UAAU;AAKZ,IAAMC,yBAAyB,8BACpCC,YACAC,WACAC,aACAC,QACAC,kBAAAA;AAEA,QAAM,EACJC,eAAeC,UAAUC,oBAAoBC,aAAaC,eAAeC,oBAAoBC,YAAYC,gBAAe,IACtH,MAAMC,kBAAkBV,MAAAA;AAE5B,QAAMW,SAASC,WAAUf,UAAAA;AAGzB,QAAMgB,OAAOC,oBAAoBhB,WAAW;IAAEK;IAAUC;EAAmB,CAAA;AAC3E,QAAM,EACJW,YAAYZ,UAAUa,gBAAgBC,YAAW,IAC/CJ;AAGJ,QAAMK,QAAQjB,iBAAiBkB,GAAAA;AAG/B,QAAMC,qBAAyC;;IAE7CC,KAAKb;IACLX,YAAYc;IACZb;IACAwB,UAAUb;;IAGVc,MAAMjB;IACNP;IACAgB;IACAS,WAAWjB;IACXW;EACF;AACA,QAAMO,eAA6B,IAAIC,eAA6B;IAAEC,QAAQC;EAAmB,CAAA,EAAGC,OAAOT,kBAAAA,EAAoBU,MAAK;AAGpI,QAAMC,UAAU;IACdhB;IAAYZ,UAAUa;IAAgBC;EACxC;AACA,QAAMe,WAAqBC,sBAAsBtB,QAAQ;IACvD,CAACT,aAAAA,GAAgBgC,aAAYnB,UAAAA;IAC7B,CAACV,WAAAA,GAAc6B,aAAYlB,cAAAA,IAAkBkB,aAAYjB,WAAAA;EAC3D,GAAGc,OAAAA;AAEH,SAAO;IAACN;IAAcO;;AACxB,GAjDsC;;;ACdtC,SAASG,eAAAA,oBAAmB;AAC5B,SAASC,kBAAAA,uBAAsB;AAcxB,IAAMC,8BAA8B,8BACzCC,QACAC,UACAC,WAAAA;AAEA,QAAM,EACJC,YAAYC,WAAWC,YAAW,IAChCL;AACJ,QAAM,CAACM,kBAAkBC,kBAAAA,IAAsB,MAAMC,uBAAuBL,YAAYC,WAAWC,aAAaH,MAAAA;AAChH,MAAIO,aAAYH,gBAAAA,KAAqBG,aAAYF,kBAAAA,EAAqB,QAAO;AAC7E,QAAM,EAAEG,OAAOC,qBAAqB,GAAGC,qBAAAA,IAAyBN;AAChE,QAAM,EAAEI,OAAOG,mBAAmB,GAAGC,mBAAAA,IAAuBd;AAC5D,MAAI,MAAMe,gBAAeC,SAASJ,oBAAAA,MAA0B,MAAMG,gBAAeC,SAASF,kBAAAA,EAAqB,QAAO;AACtH,QAAM,EAAEG,OAAOC,uBAAuB,GAAGC,uBAAAA,IAA2BZ;AACpE,QAAM,EAAEU,OAAOG,qBAAqB,GAAGC,qBAAAA,IAAyBpB;AAChE,MAAI,MAAMc,gBAAeC,SAASG,sBAAAA,MAA4B,MAAMJ,gBAAeC,SAASK,oBAAAA,EAAuB,QAAO;AAE1H,SAAO;AACT,GAlB2C;;;AHIpC,IAAMC,0BAA0B,wBAACC,WAAAA;AACtC,QAAMC,SAASC,GAAEC,OAAO;IAAEC,SAASC,oBAAoBL,MAAAA;EAAQ,CAAA;AAC/D,QAAMM,OAAOJ,GAAEK,MAAM;IACnBC;IACAC,0BAAyBC,mBAAAA,EAAoBC,OAAOC,sBAAsBC,KAAK;IAC/EC;GACD;AACD,QAAMC,YAAWN,0BAAyBO,6BAAAA,EAA+BL,OAAOM,iCAAiCJ,KAAK;AAEtH,QAAMK,mBAAkBC,yBAAwB;IAC9ClB;IAAQK;IAAMS,UAAAA;EAChB,CAAA;AACA,SAAO;IACLK,QAAQ;IACRC,MAAM;IACNC,UAAUJ,iBAAgB,OAAOK,KAAKC,QAAAA;AACpC,YAAM,CAACC,YAAYC,cAAcC,QAAAA,IAAYJ,IAAIjB;AACjD,YAAM,EAAEsB,WAAU,IAAKF;AACvB,YAAM,EAAEG,KAAI,IAAKN,IAAIO;AAcrB,YAAMC,gBAAgB,MAAMC,4BAA4BN,cAAcC,UAAU3B,MAAAA;AAChF,UAAI,CAAC+B,eAAe;AAClBP,YAAIS,OAAO,GAAA,EAAKC,KAAI;AACpB;MACF;AAGA,YAAMC,MAAM,MAAMN,KAAKO,QAAQ,qDAAA;AAC/B,YAAMC,WAAWC,UAASC,mBAAmBJ,GAAAA,GAAM,MAAM,qEAAA;AACzD,YAAMK,4BAAuD;QAACf;QAAY;UAACE;UAAUD;;;AACrF,YAAMe,cAAc,MAAMJ,SAASK,OAAOC,2BAA2BH,yBAAAA,CAAAA;AACrE,UAAIC,YAAYG,WAAW,GAAG;AAC5BC,gBAAQC,MAAM,wDAAA;AACdtB,YAAIS,OAAO,GAAA,EAAKC,KAAI;AACpB;MACF;AACA,YAAMa,kBAAkB,MAAMC,gBAAeC,KAAKxB,UAAAA;AAGlD,YAAMyB,wBAAwBhD,GAAEC,OAAO,CAAC,CAAA,EAAGQ,OAAOM,iCAAiCJ,KAAK;AACxF,YAAMsC,qBAAqBD,sBAAsBE,MAAM1B,YAAAA;AACvD,YAAM2B,0BAAyD;QAAE,GAAGF;QAAoBJ;MAAgB;AACxG,YAAMO,oBAA6C,IAAIN,gBACrD;QAAEO,QAAQvC;MAA8B,CAAA,EACxCwC,OAAOH,uBAAAA,EAAyBI,MAAK;AAGvCjC,UAAIkC,KAAKJ,iBAAAA;IACX,CAAA;EACF;AACF,GA9DuC;;;AIlBvC,SAASK,2BAAAA,gCAA+B;AACxC,SAASC,YAAAA,WAAUC,aAAAA,kBAAiB;AACpC,SAASC,yBAAyBC,4BAAAA,iCAAgC;AAClE,SACEC,yBAAAA,wBAAuBC,sBAAAA,qBAAoBC,kBAAkBC,4BAA4BC,sBACpF;AACP,SAASC,gCAA6C;AACtD,SAASC,KAAAA,UAAS;AAMX,IAAMC,kCAAkC,wBAACC,WAAAA;AAC9C,QAAMC,SAASC,GAAEC,OAAO;IAAEC,SAASC,oBAAoBL,MAAAA;EAAQ,CAAA;AAC/D,QAAMM,OAAOC,uBAAsBC,KAAK;IACtCC,aAAa;IACbC,YAAY;IACZC,WAAW;EACb,CAAA;AACA,QAAMC,YAAWV,GAAEW,MAAM;IACvBC;IACAC,0BAAyBC,mBAAAA,EAAoBC,OAAOV,uBAAsBW,KAAK;IAC/EC,wBAAwBC,cAAAA;GACzB;AACD,QAAMC,mBAAkBC,yBAAwB;IAC9CrB;IAAQK;IAAMM,UAAAA;EAChB,CAAA;AAEA,SAAO;IACLW,QAAQ;IACRC,MAAM;IACNC,UAAUJ,iBAAgB,OAAOK,KAAKC,QAAAA;AACpC,YAAMC,aAAaC,cAAc7B,MAAAA;AACjC,YAAM,EACJU,YAAYC,WAAWF,YAAW,IAChCiB,IAAIpB;AACR,YAAM,CAACwB,cAAcC,QAAAA,IAAY,MAAMC,uBAAuBtB,YAAYC,WAAWF,aAAaT,MAAAA;AAClG,YAAMiC,SAASC,WAAUxB,UAAAA;AAGzB,YAAMyB,UAAU,MAAMC,WAAWpC,MAAAA;AACjC,YAAMqC,SAASC,UAASH,QAAQI,mBAAmBF,QAAQ,MAAM,IAAIG,MAAM,4CAAA,CAAA;AAC3E,YAAMC,qBAAqB,MAAMJ,OAAOI,mBAAkB;AAE1D,YAAMC,MAAMC,iBAAiBF,oBAAoB,IAAA;AACjD,YAAMG,MAAMD,iBAAiBF,qBAAqB,KAAM,IAAA;AAExD,YAAM,CAACI,IAAAA,IAAQ,MAAMC,yBAAyBlB,YAAY;QAACG;SAAW;QAACD;SAAeY,KAAKE,KAAKX,MAAAA;AAGhGN,UAAIoB,KAAK;QAACF;QAAMf;QAAcC;OAAS;IACzC,CAAA;EACF;AACF,GAzC+C;;;ACb/C,SAASiB,2BAAAA,gCAA+B;AACxC,SACEC,aAAAA,YAAWC,SAAAA,QAAOC,SAAAA,cACb;AACP,SAASC,4BAAAA,iCAAgC;AAEzC,SACEC,yCAAAA,wCAAuCC,sCAAAA,qCAAoCC,yBAAAA,wBAAuBC,sBAAAA,qBAAoBC,oCAAAA,mCACtHC,iCAAAA,sCACK;AAEP,SAASC,KAAAA,UAAS;AAMX,IAAMC,gCAAgC,wBAACC,WAAAA;AAC5C,QAAMC,SAASC,GAAEC,OAAO;IACtBC,SAASC,oBAAoBL,MAAAA;IAC7BM,OAAOJ,GAAEK,OAAM,EAAGC,SAAQ;EAC5B,CAAA;AACA,QAAMC,QAAQP,GAAEC,OAAO;IAAEO,YAAYR,GAAES,OAAOC,OAAM,EAAGC,QAAQ,CAAA;EAAG,CAAA;AAClE,QAAMC,YAAWZ,GAAEa,MAAM;IACvBb,GAAEc,MAAM,CAAA,CAAE;IACVd,GAAEc,MAAM;MAACC,0BAAyBC,mBAAAA,EAAoBC,OAAOC,uBAAsBC,KAAK;KAAE;IAC1FnB,GAAEc,MAAM;MACNC,0BAAyBC,mBAAAA,EAAoBC,OAAOC,uBAAsBC,KAAK;MAC/EJ,0BAAyBK,8BAAAA,EAA+BH,OAAOI,kCAAiCF,KAAK;KACtG;IACDnB,GAAEc,MAAM;MACNC,0BAAyBC,mBAAAA,EAAoBC,OAAOC,uBAAsBC,KAAK;MAC/EJ,0BAAyBK,8BAAAA,EAA+BH,OAAOI,kCAAiCF,KAAK;MACrGJ,0BAAyBO,mCAAAA,EAAoCL,OAAOM,uCAAsCJ,KAAK;KAChH;GACF;AAED,QAAMK,mBAAkBC,yBAAwB;IAC9C1B;IAAQQ;IAAOK,UAAAA;EACjB,CAAA;AAEA,SAAO;IACLc,QAAQ;IACRC,MAAM;IACNC,UAAUJ,iBAAgB,OAAOK,KAAKC,QAAAA;AACpC,YAAM,EAAE5B,QAAO,IAAK2B,IAAI9B;AACxB,YAAM,EAAES,aAAa,EAAC,IAAKqB,IAAItB;AAC/B,YAAMwB,SAAmC,CAAA;AAEzC,YAAM,EACJC,oBAAoBC,YAAYC,gBAAe,IAC7C,MAAMC,kBAAkBrC,MAAAA;AAE5B,YAAMsC,MAAMH;AACZ,YAAMI,aAAaC,WAAU,4CAA4C,IAAA;AACzE,YAAMC,YAAYC,OAAM,SAAS,IAAA;AACjC,YAAMC,WAAWP;AAEjB,YAAMQ,OAAOxC;AACb,YAAMyC,cAAcL,WAAU,4CAA4C,IAAA;AAC1E,YAAMM,aAAaJ,OAAM,SAAS,IAAA;AAClC,YAAMK,YAAYb;AAElB,UAAIxB,eAAe,EAAG,QAAOsB,IAAIgB,WAAW,GAAA;AAC5C,UAAItC,aAAa,GAAG;AAClB,cAAM,CAACuC,WAAAA,IAAe,MAAMC,uBAAuBX,YAAYE,WAAWI,aAAa7C,QAAQ+B,IAAI9B,OAAOK,KAAK;AAC/G2B,eAAO,CAAA,IAAKgB;MACd;AACA,UAAIvC,aAAa,GAAG;AAClB,cAAMuC,cAAuC;UAC3CE,QAAQ7B;UACRsB;UACAC;UACAC;UACAC;UACAT;UACAC;UACAE;UACAE;QACF;AACAV,eAAO,CAAA,IAAKgB;MACd;AACA,UAAIvC,aAAa,GAAG;AAClB,cAAMuC,cAA4C;UAChDE,QAAQ3B;UACRoB;UACAC;UACAC;UACAC;UACAT;UACAC;UACAE;UACAE;UACAS,kBAAkBC,OAAM,QAAA;QAC1B;AACApB,eAAO,CAAA,IAAKgB;MACd;AAEAjB,UAAIsB,KAAKrB,MAAAA;IACX,CAAA;EACF;AACF,GApF6C;;;ACXtC,IAAMsB,sBAAsB,wBAACC,WAAAA;AAClC,SAAO;IACLC,sBAAsBD,MAAAA;IACtBE,gCAAgCF,MAAAA;IAChCG,wBAAwBH,MAAAA;IACxBI,8BAA8BJ,MAAAA;IAC9BK,gCAAgCL,MAAAA;;AAEpC,GARmC;;;ACF5B,IAAMM,kBAAkB,wBAACC,KAAcC,WAAAA;AAC5C,QAAMC,mBAAmBC,oBAAoBF,MAAAA;AAC7C,aAAWG,cAAcF,kBAAkB;AACzCF,QAAII,WAAWC,MAAM,EAAED,WAAWE,MAAMF,WAAWG,QAAQ;EAC7D;AACF,GAL+B;;;ACAxB,IAAMC,YAAY,wBAACC,KAAcC,WAAAA;AACtCC,kBAAgBF,KAAKC,MAAAA;AACvB,GAFyB;;;A5BSlB,IAAME,SAAS,wBAACC,MAAoBC,WAAAA;AACzCC,qBAAAA;AACA,QAAMC,MAAMC,QAAAA;AACZD,MAAIE,IAAI,QAAQ,KAAA;AAChBF,MAAIG,IAAIC,KAAAA,CAAAA;AACRJ,MAAIG,IAAIE,YAAAA,CAAAA;AACRL,MAAIG,IAAIG,gBAAAA;AACRN,MAAIG,IAAII,kBAAkBC,yBAAyB;IAAEC,OAAO;EAAM,CAAA,CAAA,CAAA;AAClET,MAAIG,IAAIO,iBAAAA;AACRC,uCAAqCX,GAAAA;AACrCA,MAAIG,IAAIS,qBAAAA;AACRC,8BAA4Bb,GAAAA;AAC5BA,MAAIH,OAAOA;AACXiB,YAAUd,KAAKF,MAAAA;AACfE,MAAIG,IAAIY,cAAAA;AACR,SAAOf;AACT,GAhBsB;;;A6BdtB,SACEgB,YAAAA,YAAUC,aAAAA,YAAWC,gBAChB;AACP,SAASC,YAAY;AAGrB,SAASC,YAAAA,iBAAgB;;;ACNzB,SAASC,oBAAoD;AAE7D,SAASC,YAAAA,YAAUC,aAAAA,kBAAiB;AACpC,SAASC,uBAAuB;AAChC,SAASC,0BAA0B;AACnC,SAASC,qBAAqB;AAC9B,SAASC,cAAcC,gBAAgB;AACvC,SAASC,uBAAuB;AAChC,SAASC,qBAAqB;AAC9B,SAASC,gBAAgBC,kCAAkC;AAC3D,SAASC,4BAA4B;AAErC,SAASC,sBAAsB;AAC/B,SAASC,YAAAA,iBAAgB;AAKzB,SACEC,gBAAgBC,0BAAAA,yBAAwBC,mBAAAA,wBACnC;AACP,SAASC,wBAAAA,6BAA4B;;;ACjBrC,SACEC,aAAAA,YAAWC,SAAAA,QAAOC,YAAAA,WAAUC,OAAOC,eAAeC,eAAAA,cAAaC,aAAAA,YAAWC,eAAAA,oBACrE;AAEP,SAASC,kBAAAA,uBAAsB;AAE/B,SAASC,wBAAwB;AAIjC,SAAmCC,oCAAoC;AACvE,SACqCC,sCAAAA,qCAAuDC,sBACrF;AAEP,SACEC,8BAAAA,6BAA4BC,6BAA6BC,uCACpD;AACP,SAASC,aAAa;AACtB,SAASC,kBAAkB;AAE3B,SAASC,cAAc;AAEhB,IAAMC,qEACT;AA4CJ,IAAMC,4BAA4B;AAE3B,IAAMC,yDAAN,cAGGC,iBAAAA;EAzEV,OAyEUA;;;EACR,OAAyBC,gBAAgB;IAACJ;;EAC1C,OAAyBK,sBAAsBL;EACrCM;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC,eAAe,IAAIC,MAAAA;EACnBC;EACAC;EAEV,IAAcC,SAA8B;AAC1C,WAAOC,UAAS,KAAKX,SAAS,MAAM,IAAIY,MAAM,iCAAA,CAAA;EAChD;EAEA,IAAcC,wBAAqE;AACjF,WAAOF,UAAS,KAAKG,OAAOD,uBAAuB,MAAM,2CAAA;EAC3D;EAEA,IAAcE,mBAA2B;AACvC,WAAOC,WAAU,KAAKC,OAAOF,gBAAgB,IAAI,KAAKE,OAAOF,mBAAmBrB;EAClF;EAEA,IAAcwB,sBAAoE;AAChF,WAAOP,UAAS,KAAKG,OAAOI,qBAAqB,MAAM,yCAAA;EACzD;EAEA,IAAcC,SAAiB;AAC7B,WAAOR,UAAS,KAAKF,SAAS,MAAM,oBAAA;EACtC;EAEA,MAAeW,gBAA+B;AAC5C,UAAM,MAAMA,cAAAA;AAEZ,SAAKrB,mBAAmB,KAAKsB,OAAOC,cAClC,+EACA;MAAEC,aAAa;IAAqB,CAAA;AAEtC,SAAKnB,gBAAgB,KAAKiB,OAAOC,cAC/B,4EACA;MAAEC,aAAa;IAAmB,CAAA;AAEpC,SAAKf,kBAAkB,KAAKa,OAAOC,cACjC,8EACA;MAAEC,aAAa;IAAsB,CAAA;AAEvC,SAAKlB,gBAAgB,KAAKgB,OAAOC,cAC/B,6EACA;MAAEC,aAAa;IAAmB,CAAA;AAEpC,UAAM,EAAEC,UAAUC,cAAa,IAAK,KAAKX;AAIzC,UAAMY,MAAMf,UAAS,KAAKgB,SAASC,SAASC,KAAK,MAAM,IAAIjB,MAAM,iCAAA,CAAA;AACjE,SAAKH,UAAU,IAAIqB,OAAOJ,KAAKF,QAAAA;AAC/B,SAAKxB,UAAU+B,6BAA6BC,QAAQC,WAAWR,aAAAA,GAAgB,KAAKhB,OAAO;AAG3F,UAAMyB,UAAU,MAAMV,SAASW,WAAU;AACzC,SAAKlC,iBAAiBU,UAASyB,cAAcF,QAAQG,OAAO,GAAG,MAAM,IAAIzB,MAAM,+BAAA,CAAA;AAG/E,UAAM0B,eAAe,MAAM,KAAK5B,OAAO6B,MAAK;AAC5C,SAAKpC,sBAAsBqC,WAAUF,cAAc,IAAA;AAGnD,UAAMG,oBAAoB,MAAM,KAAK/B,OAAOgC,YAAW;AACvD,SAAKxC,uBAAuByC,OAAMF,iBAAAA;EACpC;EAEA,MAAeG,cAAcC,UAA0C;AACrE,QAAI7B,WAAU6B,QAAAA,KAAaA,SAASC,SAAS,GAAG;AAC9C,YAAMC,4BAA4BC,gCAAgCH,QAAAA;AAClE,UAAI7B,WAAU+B,yBAAAA,GAA4B;AAExC,cAAME,SAAS,MAAMC,gBAAeC,KAAKJ,0BAA0B,CAAA,CAAE;AACrE,aAAKK,QAAQC,KAAK,sBAAsBN,0BAA0B,CAAA,CAAE,cAAcE,MAAAA,yCAA+C;AACjI,cAAM,KAAK/B,oBAAoBoC,IAAIL,QAAQF,yBAAAA;AAC3C,eAAOQ,4BAA2BR,yBAAAA;MACpC;AACA,aAAO,CAAA;IACT,OAAO;AACL,UAAI,KAAKzC,aAAakD,SAAQ,GAAI;AAChC,aAAKJ,QAAQK,MAAM,2DAA2D,KAAKC,EAAE,0CAA0CC,KAAKC,IAAG,CAAA,GAAK;AAC5I,eAAO,CAAA;MACT;AACA,aAAO,MAAM,KAAKtD,aAAauD,aAAa,YAAA;AAC1C,cAAMC,YAAsB,CAAA;AAC5B,YAAIC,aAAYlB,QAAAA,KAAaA,SAASC,WAAW,GAAG;AAClD,gBAAM,KAAKkB,uBAAsB;QACnC;AACA,eAAOF;MACT,CAAA;IACF;EACF;EAEA,MAAcE,yBAA6C;AACzD,UAAMC,UAAuC,CAAA;AAC7C,qBAAiB,CAACd,MAAMJ,yBAAAA,KAA8B,KAAK7B,qBAAqB;AAC9E,YAAMgD,SAAS,MAAM,KAAKC,mBAAmB;QAAChB;QAAMJ;OAA0B;AAC9E,UAAI/B,WAAUkD,MAAAA,EAASD,SAAQG,KAAKF,OAAO,CAAA,CAAE;AAC7C,YAAMG,MAAM,KAAKtD,gBAAgB;IACnC;AACA,WAAOuD,4BAA4BL,OAAAA;EACrC;EAEA,MAAcE,mBACZ,CAAChB,MAAMJ,yBAAAA,GACiD;AACxD,SAAKK,QAAQC,KAAK,4BAA4BN,0BAA0B,CAAA,CAAE,cAAcI,IAAAA,EAAM;AAC9F,QAAI;AACF,UAAIoB,MAAqDC;AACzD,WAAKpE,eAAeqE,IAAI,CAAA;AACxB,YAAMC,gBAAgB3B,0BAA0B,CAAA,EAAG4B,OAAOC,cAAAA;AAE1D,UAAIF,cAAc5B,WAAW,GAAG;AAC9B,cAAM,KAAK5B,oBAAoB2D,OAAO1B,IAAAA;AACtC,eAAOoB;MACT;AACA,YAAMO,eAAeJ,cAAc,CAAA;AACnC,WAAK3E,kBAAkB0E,IAAI,CAAA;AAC3B,YAAMM,+BAA+B,MAAM,KAAKC,sBAAsBF,YAAAA;AACtE,YAAM,KAAKjE,sBAAsByC,IAAIH,MAAM4B,4BAAAA;AAC3C,YAAM,KAAK7D,oBAAoB2D,OAAO1B,IAAAA;AACtC,WAAK3C,iBAAiBiE,IAAI,CAAA;AAC1B,aAAOF;IACT,SAASU,OAAO;AACd,WAAK5E,eAAeoE,IAAI,CAAA;AACxB,WAAKrB,QAAQ6B,MAAM,kCAAkClC,0BAA0B,CAAA,CAAE,cAAcI,IAAAA,KAAS8B,KAAAA;IAC1G;EACF;;;;;;EAOA,MAAcD,sBAAsBF,cAAmE;AAErG,UAAMI,SAASC,aAAYL,aAAaM,UAAU;AAClD,UAAMC,QAAQ,MAAM,KAAKlE,OAAOmE,SAAQ;AACxC,UAAMC,aAAatD,WAAW6C,aAAaS,UAAU;AACrD,UAAMC,cAAcvD,WAAW6C,aAAaU,WAAW;AACvD,UAAMC,KAAK,MAAM,KAAK/E,OAAOgF,iBAAiBH,YAAYC,aAAaN,QAAQ;MAAEG;IAAM,CAAA;AACvF,UAAMM,eAAe,MAAMF,GAAGG,KAAI;AAClC,UAAMC,sBAAsB,MAAMF,cAAcG,eAAAA;AAChD,UAAMC,mBAAmBpD,OAAMkD,qBAAqB1C,QAAQ,IAAI,IAAA;AAChE,UAAM,EAAE6C,QAAQ,GAAGC,KAAAA,IAASnB;AAC5B,UAAMZ,SAAuC,IAAIhB,gBAA6C;MAAE8C,QAAQE;IAAmC,CAAA,EACxIC,OAAO;MAAE,GAAGF;MAAMF;IAAiB,CAAA,EAAGK,MAAK;AAC9C,WAAOlC;EACT;AACF;;;ACvOA,SACEmC,YAAAA,WAAUC,SAAAA,QAAOC,aAAAA,YAAWC,QAAQC,eAAAA,oBAC/B;AAEP,SAASC,kBAAAA,uBAAsB;AAE/B,SAASC,oBAAAA,yBAAwB;AAQjC,SACEC,8BAAAA,6BAA4BC,+BAAAA,8BAA6BC,mCAAAA,wCACpD;AACP,SAASC,SAAAA,cAAa;AAEf,IAAMC,sDAAsD;AAuCnE,IAAMC,6BAA4B;AAE3B,IAAMC,0CAAN,cAGGC,kBAAAA;EA/DV,OA+DUA;;;EACR,OAAyBC,gBAAgB;IAACJ;;EAC1C,OAAyBK,sBAAsBL;EACvCM;EACAC;EACAC;EACAC,eAAe,IAAIC,OAAAA;EACnBC;EAER,IAAcC,wBAAkE;AAC9E,WAAOC,UAAS,KAAKC,OAAOF,uBAAuB,MAAM,2CAAA;EAC3D;EAEA,IAAcG,mBAA2B;AACvC,WAAOC,WAAU,KAAKC,OAAOF,gBAAgB,IAAI,KAAKE,OAAOF,mBAAmBd;EAClF;EAEA,IAAciB,sBAAoE;AAChF,WAAOL,UAAS,KAAKC,OAAOI,qBAAqB,MAAM,yCAAA;EACzD;EAEA,IAAcC,SAAoB;AAChC,WAAON,UAAS,KAAKC,OAAOK,QAAQ,MAAM,iCAAA;EAC5C;EAEA,MAAeC,gBAA+B;AAC5C,UAAM,MAAMA,cAAAA;AAEZ,SAAKd,mBAAmB,KAAKe,OAAOC,cAAc,8DAA8D;MAAEC,aAAa;IAAqB,CAAA;AACpJ,SAAKhB,gBAAgB,KAAKc,OAAOC,cAAc,2DAA2D;MAAEC,aAAa;IAAmB,CAAA;AAC5I,SAAKZ,kBAAkB,KAAKU,OAAOC,cAAc,6DAA6D;MAAEC,aAAa;IAAsB,CAAA;AACnJ,SAAKf,gBAAgB,KAAKa,OAAOC,cAAc,4DAA4D;MAAEC,aAAa;IAAmB,CAAA;EAC/I;EAEA,MAAeC,cAAcC,UAA0C;AACrE,QAAIT,WAAUS,QAAAA,KAAaA,SAASC,SAAS,GAAG;AAC9C,YAAMC,4BAA4BC,iCAAgCH,QAAAA;AAClE,UAAIT,WAAUW,yBAAAA,GAA4B;AAExC,cAAME,SAAS,MAAMC,gBAAeC,KAAKJ,0BAA0B,CAAA,CAAE;AACrE,aAAKK,QAAQC,KAAK,sBAAsBN,0BAA0B,CAAA,CAAE,cAAcE,MAAAA,yCAA+C;AACjI,cAAM,KAAKX,oBAAoBgB,IAAIL,QAAQF,yBAAAA;AAC3C,eAAOQ,4BAA2BR,yBAAAA;MACpC;AACA,aAAO,CAAA;IACT,OAAO;AACL,UAAI,KAAKlB,aAAa2B,SAAQ,GAAI;AAChC,aAAKJ,QAAQK,MAAM,4CAA4C,KAAKC,EAAE,0CAA0CC,KAAKC,IAAG,CAAA,GAAK;AAC7H,eAAO,CAAA;MACT;AACA,aAAO,MAAM,KAAK/B,aAAagC,aAAa,YAAA;AAC1C,cAAMC,YAAsB,CAAA;AAC5B,YAAIC,aAAYlB,QAAAA,KAAaA,SAASC,WAAW,GAAG;AAClD,gBAAM,KAAKkB,uBAAsB;QACnC;AACA,eAAOF;MACT,CAAA;IACF;EACF;EAEA,MAAcE,yBAA6C;AACzD,UAAMC,UAAuC,CAAA;AAC7C,qBAAiB,CAACd,MAAMJ,yBAAAA,KAA8B,KAAKT,qBAAqB;AAC9E,YAAM4B,SAAS,MAAM,KAAKC,mBAAmB;QAAChB;QAAMJ;OAA0B;AAC9E,UAAIX,WAAU8B,MAAAA,EAASD,SAAQG,KAAKF,OAAO,CAAA,CAAE;AAC7C,YAAMG,OAAM,KAAKlC,gBAAgB;IACnC;AACA,WAAOmC,6BAA4BL,OAAAA;EACrC;EAEA,MAAcE,mBACZ,CAAChB,MAAMJ,yBAAAA,GACiD;AACxD,SAAKK,QAAQC,KAAK,4BAA4BN,0BAA0B,CAAA,CAAE,cAAcI,IAAAA,EAAM;AAC9F,QAAI;AACF,UAAIoB,MAAqDC;AACzD,WAAK7C,eAAe8C,IAAI,CAAA;AACxB,WAAK/C,kBAAkB+C,IAAI,CAAA;AAE3B,YAAMC,KAAK,MAAM,KAAKnC,OAAOoC,kBAAkBxB,IAAAA;AAC/C,UAAIf,WAAUsC,EAAAA,KAAO,CAACE,OAAOF,EAAAA,GAAK;AAChC,cAAM,KAAK1C,sBAAsBsB,IAAIH,MAAMJ,yBAAAA;AAC3C,aAAKK,QAAQC,KAAK,qBAAqBN,0BAA0B,CAAA,CAAE,cAAcI,IAAAA,EAAM;AACvF,aAAKC,QAAQC,KAAK,kCAAkCN,0BAA0B,CAAA,CAAE,cAAcI,IAAAA,EAAM;AACpG,cAAM,KAAKb,oBAAoBuC,OAAO1B,IAAAA;AACtCoB,cAAM;UAACpB;UAAMJ;;MACf,OAAO;AACL,cAAM+B,qBAAqB,MAAM,KAAKvC,OAAOuC,mBAAkB;AAC/D,YAAI/B,0BAA0B,CAAA,EAAGgC,MAAMD,oBAAoB;AACzD,eAAK1B,QAAQC,KAAK,gCAAgCN,0BAA0B,CAAA,CAAE,cAAcI,IAAAA,EAAM;AAClG,gBAAM,KAAKb,oBAAoBuC,OAAO1B,IAAAA;QACxC;MACF;AACA,WAAKpB,iBAAiB0C,IAAI,CAAA;AAC1B,aAAOF;IACT,SAASS,OAAO;AACd,WAAKpD,eAAe6C,IAAI,CAAA;AACxB,WAAKrB,QAAQ4B,MAAM,kCAAkCjC,0BAA0B,CAAA,CAAE,cAAcI,IAAAA,KAAS6B,KAAAA;IAC1G;EACF;AACF;;;AF7HO,IAAMC,aAAa,8BAAOC,YAAAA;AAC/B,QAAM,EAAEC,QAAQC,OAAM,IAAKF;AAC3B,QAAM,EAAEG,aAAY,IAAKF,OAAOG,WAAWC,QAAQ,CAAC;AACpD,QAAM,EAAEC,MAAMC,WAAW,YAAYC,OAAa,KAAI,IAAKP,OAAOG,WAAWK,SAASC,UAAU,CAAC;AACjG,QAAM,EAAEC,eAAeC,cAAa,IAAK,MAAMC,cAAc;IAC3DC,YAAY;MACVC,aAAa;MACbC,gBAAgB;IAClB;IACAb;IACAc,eAAe;MAAEV;MAAUC;IAAK;EAClC,CAAA;AAEA,MAAIU,WAAUhB,MAAAA,EAASiB,gBAAeC,gBAAgBlB;AACtD,QAAMmB,iBAAiBnB,SAAS,IAAIoB,2BAA2BpB,MAAAA,IAAUqB;AAEzE,QAAMC,UAAU,IAAIC,qBAAAA;AAEpB,QAAMC,cAAczB,OAAO0B,SAASC;AACpC,MAAIC,eAAeH,WAAAA,GAAc;AAE/B,UAAM,EACJI,kBAAkBC,oBAAoBC,UAAUC,QAAQC,QAAQC,UAAUC,UAAUC,YAAYC,UAAUC,WAAU,IAClHb;AACJ,UAAMc,mBAA8C;MAClDT;MAAoBI;MAAUF;MAAQI;MAAYE;IACpD;AACA,UAAME,SAAyC;MAC7C7B;MAAe4B;MAAkBnB;MAAgBV;IACnD;AAEAa,YAAQkB,SAASC,mBAAmBC,QAAQH,MAAAA,GAASlB,QAAW,IAAA;EAClE;AAEAC,UAAQkB,SAASG,gBAAgBD,QAAQ;IACvCjC;IAAeC;IAAeS;EAChC,CAAA,CAAA;AACAG,UAAQkB,SAASI,eAAeF,QAAQ;IACtCjC;IAAeC;IAAeS;EAChC,CAAA,CAAA;AACAG,UAAQkB,SAASK,cAAcH,QAAQ;IACrCjC;IAAeC;IAAeS;EAChC,CAAA,CAAA;AAEA,QAAM2B,UAAU,MAAMC,YAAWhD,MAAAA;AACjC,QAAMiD,SAASC,WAASH,QAAQI,mBAAmBF,QAAQ,MAAM,+BAAA;AACjE,QAAMG,6CAA6C,MAAMC,eACvDrD,QACA,yCAAA;AAEF,QAAMsD,+CAA+C,MAAMD,eACzDrD,QACA,2CAAA;AAGF,QAAMuD,gDAA+F;IACnGC,uBAAuBF;IACvBtD,QAAQ;MAAEyD,QAAQC;IAAoD;IACtE/C;IACAgD,qBAAqBP;IACrBhC;IACAV;IACAuC;EACF;AACA1B,UAAQkB,SAASmB,wCAAwCjB,QAAQY,6CAAAA,CAAAA;AAEjE,QAAMM,oCAAoC,MAAMR,eAC9CrD,QACA,2CAAA;AAEF,QAAM8D,WAAW,MAAMC,gBAAgB;IAAE/D;EAAO,CAAA;AAChD,QAAMgE,gBAAgBhE,OAAOiE,OAAOC;AACpC,QAAMC,+DAA6H;IACjIH;IACAR,uBAAuBK;IACvB7D,QAAQ;MAAEyD,QAAQW;IAAmE;IACrFzD;IACAgD,qBAAqBL;IACrBQ;IACA1C;IACAV;EACF;AACAa,UAAQkB,SAAS4B,uDAAuD1B,QAAQwB,4DAAAA,CAAAA;AAEhF,SAAO5C;AACT,GArF0B;AAuF1B,IAAMyB,cAAa,8BACjBhD,WAAAA;AAEA,QAAM,EAAEsE,UAAUC,gBAAgBjE,SAAQ,IAAKN,OAAOiE;AACtD,QAAMO,gBAAgBvD,WAAUqD,QAAAA,IAAYG,UAASC,WAAWJ,QAAAA,IAAYG,UAASE,OAAM;AAC3F,QAAMC,UAAU,MAAMJ;AACtB,QAAMK,SAAS,IAAIC,iBAAgBF,OAAAA;AACnC,QAAMG,aAAa,IAAIC,sBAAqB;IAAE1E;EAAS,CAAA;AACvD,QAAMyC,UAAU,IAAIkC,wBAAuBF,YAAYF,MAAAA;AACvD,SAAO9B;AACT,GAVmB;AAkBnB,IAAMM,iBAAiB,8BACtBrD,QAAgBkF,eAAAA;AACf,QAAMzD,cAAczB,OAAO0B,SAASC;AACpC,MAAIC,eAAeH,WAAAA,GAAc;AAC/B,UAAM,EACJI,kBAAkBC,oBAAoBC,UAAUC,QAAQC,QAAQC,UAAUC,UAAUC,YAAYC,UAAUC,WAAU,IAClHb;AACJ,UAAMc,mBAA8C;MAClDT;MAAoBI;MAAUF;MAAQI;MAAYE;IACpD;AACA,UAAM6C,uBAAuB,IAAIC,aAAgB;MAAE,GAAG7C;MAAkB2C;IAAW,CAAA;AACnF,UAAMG,SAAS,MAAMC,SAASC,OAAuB;MACnDC,KAAKL;MACLM,UAAU;QAAEC,SAAS;QAAMC,YAAY;MAAK;IAC9C,CAAA;AACA,WAAON;EACT,OAAO;AACL,WAAOO,aAAa,oBAAIC,IAAAA,CAAAA;EAC1B;AACF,GAnBuB;;;AGhJvB,SAASC,uBAAuB;;;ACDhC;AAAA,EACE,SAAW;AAAA,EACX,OAAS;AAAA,IACP;AAAA,MACE,QAAU;AAAA,QACR,aAAe;AAAA,QACf,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,SAAW;AAAA,QACT,SAAW,CAAC;AAAA,QACZ,QAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAU;AACZ;;;ACTO,IAAMC,eAAeC;;;ACJrB,IAAMC,wBAAwB,CAAA;;;ACHrC;AAAA,EACE,SAAW;AAAA,EACX,OAAS;AAAA,IACP;AAAA,MACE,QAAU;AAAA,QACR,aAAe;AAAA,QACf,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,SAAW;AAAA,QACT,SAAW;AAAA,UACT;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,aAAe;AAAA,gBACb;AAAA,kBACE,WAAa;AAAA,kBACb,gBAAkB;AAAA,kBAClB,QAAU;AAAA,kBACV,MAAQ;AAAA,gBACV;AAAA,cACF;AAAA,cACA,MAAQ;AAAA,cACR,QAAU;AAAA,cACV,aAAe;AAAA,cACf,OAAS;AAAA,gBACP;AAAA,kBACE,KAAO;AAAA,kBACP,UAAY;AAAA,gBACd;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,QAAU;AAAA,UACR;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,MAAQ;AAAA,cACR,QAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAU;AACZ;;;AC/CA;AAAA,EACE,SAAW;AAAA,EACX,OAAS;AAAA,IACP;AAAA,MACE,QAAU;AAAA,QACR,aAAe;AAAA,QACf,MAAQ;AAAA,QACR,QAAU;AAAA,MACZ;AAAA,MACA,SAAW;AAAA,QACT,SAAW;AAAA,UACT;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,aAAe;AAAA,gBACb;AAAA,kBACE,WAAa;AAAA,kBACb,gBAAkB;AAAA,kBAClB,QAAU;AAAA,kBACV,MAAQ;AAAA,gBACV;AAAA,cACF;AAAA,cACA,MAAQ;AAAA,cACR,QAAU;AAAA,cACV,aAAe;AAAA,cACf,OAAS;AAAA,gBACP;AAAA,kBACE,KAAO;AAAA,kBACP,UAAY;AAAA,gBACd;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,QAAU;AAAA,UACR;AAAA,YACE,QAAU;AAAA,cACR,aAAe;AAAA,cACf,MAAQ;AAAA,cACR,QAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAU;AACZ;;;ACtCO,IAAMC,kBAAkBC;AAKxB,IAAMC,uBAAuBC;AAK7B,IAAMC,uBAAyC;KACjDJ,gBAAgBK;KAChBH,qBAAqBG;;;;ANAnB,IAAMC,UAAU,8BAAOC,YAAAA;AAC5B,QAAM,EAAEC,OAAM,IAAKD;AACnB,QAAME,UAAU,MAAMC,WAAWH,OAAAA;AACjC,QAAMI,UAAU,IAAIC,gBAAgBC,cAAcL,QAAQC,SAASK,sBAAsBC,qBAAAA;AACzF,QAAM,CAACC,MAAM,GAAGC,UAAAA,IAAc,MAAMN,QAAQO,UAAS;AACrD,MAAID,YAAYE,SAAS,GAAG;AAC1B,UAAMC,QAAQC,IAAIJ,WAAWK,IAAIC,CAAAA,cAAaP,KAAKQ,SAASD,SAAAA,CAAAA,CAAAA;AAC5D,UAAMH,QAAQC,IAAIJ,WAAWK,IAAIC,CAAAA,cAAaP,KAAKS,OAAOF,UAAUG,SAAS,IAAA,CAAA,CAAA;EAC/E;AACA,SAAOV;AACT,GAVuB;;;AJTvB,IAAMW,WAAW;AAIjB,IAAMC,gBAAgB,8BAAOC,MAA6BC,QAAgBC,WAAAA;AACxE,QAAMC,mBAAmB,MAAMH,KAAKI,gBAAgBC,IAAI,IAAA;AACxDH,UAAQI,MAAM,6BAA6BH,gBAAAA,EAAkB;AAC7D,QAAM,EAAEI,SAAQ,IAAKN,OAAOO;AAC5B,MAAIC,SAASN,gBAAAA,KAAqBM,SAASF,QAAAA,GAAW;AACpDL,YAAQQ,KAAK,yFAAA;AACb,UAAMV,KAAKI,gBAAgBO,IAAI,MAAMJ,QAAAA;EACvC,OAAO;AACL,QAAIK;AACJ,QAAIH,SAASF,QAAAA,GAAW;AACtBK,mBAAaL;IACf,OAAO;AACLK,mBAAaC,UAASC,iBAAgB;AACtCZ,cAAQa,IAAI,mGAAA;AACZb,cAAQa,IAAI,sBAAsBH,UAAAA,EAAY;IAChD;AACA,UAAMZ,KAAKI,gBAAgBO,IAAI,MAAMC,UAAAA;EACvC;AACA,SAAOI,WAAS,MAAMhB,KAAKI,gBAAgBC,IAAI,IAAA,GAAO,MAAM,sCAAA;AAC9D,GAnBsB;AA2Bf,IAAMY,YAAY,8BAAOC,YAAAA;AAC9B,QAAM,EAAEhB,QAAQD,OAAM,IAAKiB;AAC3B,QAAM,EAAEC,MAAMZ,SAAQ,IAAKN,OAAOmB;AAClC,QAAMpB,OAAO,MAAMqB,KAAAA;AACnB,QAAMT,aAAaU,WAAUf,QAAAA,IAAYA,WAAW,MAAMR,cAAcC,MAAMC,QAAQC,MAAAA;AACtF,QAAMqB,SAAS,MAAMV,UAASW,WAAWZ,UAAAA;AACzC,QAAMa,cAAc;IAClBF;IAAQrB;IAAQD;EAClB;AACA,QAAMyB,OAAOR,QAAQQ,QAAQ,MAAMC,QAAQF,WAAAA;AAC3C,QAAMG,MAAMC,OAAOH,MAAMzB,MAAAA;AACzB,QAAM6B,SAASF,IAAIG,OAAOZ,MAAMrB,UAAU,MAAMI,QAAQa,IAAI,uCAAuCjB,QAAAA,IAAYqB,IAAAA,EAAM,CAAA;AACrHW,SAAOE,WAAW,GAAA;AAClB,SAAOF;AACT,GAdyB;","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","requestHandlerValidator","BridgeSettingsZod","asHex","asChainId","value","chainId","asHex","asAddress","asToken","value","token","asAddress","asAddress","assertEx","tryGetBridgeEscrowAddress","config","address","asAddress","bridge","escrowAddress","asAddress","assertEx","tryGetBridgeFeesAddress","config","address","asAddress","bridge","feesAddress","getFeeStructure","config","feeFixed","feeRateBasisPoints","bridge","getMaxBridgeAmount","config","maxBridgeAmount","bridge","getMinBridgeAmount","config","minBridgeAmount","bridge","assertEx","getRemoteChainId","config","remoteChainId","assertEx","asChainId","bridge","assertEx","getRemoteTokenAddress","config","token","asToken","bridge","remoteTokenAddress","assertEx","isDefined","isUndefined","HDWallet","ADDRESS_INDEX","generateXyoBaseWalletFromPhrase","accountServiceSingleton","getBridgeWalletAccount","config","walletPhrase","bridge","mnemonic","isUndefined","console","log","randomMnemonic","HDWallet","generateMnemonic","wallet","generateXyoBaseWalletFromPhrase","account","derivePath","ADDRESS_INDEX","XYO","getTransferAddresses","config","escrowAddress","tryGetBridgeEscrowAddress","getBridgeWalletAccount","address","feesAddress","tryGetBridgeFeesAddress","assertEx","isDefined","getXl1ChainId","config","xl1ChainId","bridge","isDefined","assertEx","asChainId","chain","id","isDefined","getXl1TokenAddress","config","token","asToken","bridge","xl1TokenAddress","isDefined","getXl1ChainId","getBridgeSettings","config","feeFixed","feeRateBasisPoints","getFeeStructure","feesAddress","escrowAddress","getTransferAddresses","maxBridgeAmount","getMaxBridgeAmount","minBridgeAmount","getMinBridgeAmount","remoteChainId","getRemoteChainId","remoteTokenAddress","getRemoteTokenAddress","xl1TokenAddress","getXl1TokenAddress","xl1ChainId","getXl1ChainId","isDefined","HDWallet","SimpleXyoGatewayRunner","SimpleXyoSigner","HttpRpcXyoConnection","gatewayInstance","getGateway","config","isDefined","mnemonic","chainRpcApiUrl","endpoint","bridge","walletPromise","HDWallet","fromPhrase","random","account","signer","SimpleXyoSigner","connection","HttpRpcXyoConnection","SimpleXyoGatewayRunner","response","BridgeSettingsZod","validateRequest","requestHandlerValidator","makeBridgeConfigRoute","config","method","path","handlers","_","res","escrowAddress","feeFixed","feeRateBasisPoints","feesAddress","maxBridgeAmount","minBridgeAmount","remoteChainId","remoteTokenAddress","xl1ChainId","xl1TokenAddress","getBridgeSettings","sanitizedConfig","json","requestHandlerValidator","toAddress","toHex","PayloadZodStrictOfSchema","BridgeDestinationObservationFieldsZod","BridgeDestinationObservationSchema","z","asHex","HexZod","isUndefined","getRemoteChainIdZod","config","remoteChainId","getRemoteChainId","HexZod","superRefine","val","ctx","chainId","asHex","isUndefined","addIssue","makeBridgeFromRemoteStatusRoute","config","params","z","object","chainId","getRemoteChainIdZod","nonce","string","nonempty","response","PayloadZodStrictOfSchema","BridgeDestinationObservationSchema","extend","BridgeDestinationObservationFieldsZod","shape","validateRequest","requestHandlerValidator","method","path","handlers","req","res","remoteChainId","remoteTokenAddress","xl1ChainId","xl1TokenAddress","getBridgeSettings","rand","Promise","resolve","Math","random","found","sendStatus","confirmed","observation","schema","dest","destAddress","toAddress","destAmount","toHex","destToken","src","srcAddress","srcAmount","srcToken","destConfirmation","json","requestHandlerValidator","assertEx","PayloadBuilder","PayloadZodStrictOfSchema","asSentinelInstance","BridgeIntentFieldsZod","BridgeIntentSchema","BridgeSourceObservationFieldsZod","BridgeSourceObservationSchema","SignedTransactionBoundWitnessZod","TransferZod","flattenHydratedTransaction","z","hexToBigInt","toHex","calculateBridgeFees","srcAmount","feeStructure","feeFixed","feeRateBasisPoints","srcAmountBigInt","hexToBigInt","feeFixedBigInt","feeVariableBigInt","BigInt","feeVariable","toHex","feeTotalBigInt","destAmountBigInt","destAmount","hexToBigInt","toAddress","createTransferPayload","PayloadBuilder","BridgeIntentSchema","v4","generateBridgeEstimate","srcAddress","srcAmount","destAddress","config","nonceOverride","escrowAddress","feeFixed","feeRateBasisPoints","feesAddress","remoteChainId","remoteTokenAddress","xl1ChainId","xl1TokenAddress","getBridgeSettings","sender","toAddress","fees","calculateBridgeFees","destAmount","feeFixedAmount","feeVariable","nonce","v4","bridgeIntentFields","src","srcToken","dest","destToken","bridgeIntent","PayloadBuilder","schema","BridgeIntentSchema","fields","build","context","transfer","createTransferPayload","hexToBigInt","isUndefined","PayloadBuilder","validateBridgeEstimateExact","intent","transfer","config","srcAddress","srcAmount","destAddress","calculatedIntent","calculatedTransfer","generateBridgeEstimate","isUndefined","nonce","expectedIntentNonce","expectedIntentStatic","actualIntentNonce","actualIntentStatic","PayloadBuilder","dataHash","epoch","expectedTransferEpoch","expectedTransferStatic","actualTransferEpoch","actualTransferStatic","makeBridgeToRemoteRoute","config","params","z","object","chainId","getRemoteChainIdZod","body","tuple","SignedTransactionBoundWitnessZod","PayloadZodStrictOfSchema","BridgeIntentSchema","extend","BridgeIntentFieldsZod","shape","TransferZod","response","BridgeSourceObservationSchema","BridgeSourceObservationFieldsZod","validateRequest","requestHandlerValidator","method","path","handlers","req","res","signedTxBw","bridgeIntent","transfer","srcAddress","node","app","estimateValid","validateBridgeEstimateExact","status","send","mod","resolve","sentinel","assertEx","asSentinelInstance","singedHydratedTransaction","observation","report","flattenHydratedTransaction","length","console","error","srcConfirmation","PayloadBuilder","hash","bridgeCommonFieldsZod","bridgeCommonFields","parse","bridgeObservationFields","bridgeObservation","schema","fields","build","json","requestHandlerValidator","assertEx","toAddress","PayloadZodLooseOfSchema","PayloadZodStrictOfSchema","BridgeIntentFieldsZod","BridgeIntentSchema","toXL1BlockNumber","TransactionBoundWitnessZod","TransferSchema","buildUnsignedTransaction","z","makeBridgeToRemoteEstimateRoute","config","params","z","object","chainId","getRemoteChainIdZod","body","BridgeIntentFieldsZod","pick","destAddress","srcAddress","srcAmount","response","tuple","TransactionBoundWitnessZod","PayloadZodStrictOfSchema","BridgeIntentSchema","extend","shape","PayloadZodLooseOfSchema","TransferSchema","validateRequest","requestHandlerValidator","method","path","handlers","req","res","xl1ChainId","getXl1ChainId","bridgeIntent","transfer","generateBridgeEstimate","sender","toAddress","gateway","getGateway","viewer","assertEx","connectionInstance","Error","currentBlockNumber","nbf","toXL1BlockNumber","exp","txBw","buildUnsignedTransaction","json","requestHandlerValidator","asAddress","asHex","toHex","PayloadZodStrictOfSchema","BridgeDestinationObservationFieldsZod","BridgeDestinationObservationSchema","BridgeIntentFieldsZod","BridgeIntentSchema","BridgeSourceObservationFieldsZod","BridgeSourceObservationSchema","z","makeBridgeToRemoteStatusRoute","config","params","z","object","chainId","getRemoteChainIdZod","nonce","string","nonempty","query","mockStatus","coerce","number","default","response","union","tuple","PayloadZodStrictOfSchema","BridgeIntentSchema","extend","BridgeIntentFieldsZod","shape","BridgeSourceObservationSchema","BridgeSourceObservationFieldsZod","BridgeDestinationObservationSchema","BridgeDestinationObservationFieldsZod","validateRequest","requestHandlerValidator","method","path","handlers","req","res","result","remoteTokenAddress","xl1ChainId","xl1TokenAddress","getBridgeSettings","src","srcAddress","asAddress","srcAmount","asHex","srcToken","dest","destAddress","destAmount","destToken","sendStatus","observation","generateBridgeEstimate","schema","destConfirmation","toHex","json","getRouteDefinitions","config","makeBridgeConfigRoute","makeBridgeToRemoteEstimateRoute","makeBridgeToRemoteRoute","makeBridgeToRemoteStatusRoute","makeBridgeFromRemoteStatusRoute","addBridgeRoutes","app","config","routeDefinitions","getRouteDefinitions","definition","method","path","handlers","addRoutes","app","config","addBridgeRoutes","getApp","node","config","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","isDefined","isString","boot","HDWallet","BaseMongoSdk","assertEx","isDefined","MemoryArchivist","MongoDBArchivistV2","ViewArchivist","mapToMapType","MongoMap","initEvmProvider","initTelemetry","AbstractModule","LoggerModuleStatusReporter","ModuleFactoryLocator","MemorySentinel","HDWallet","hasMongoConfig","SimpleXyoGatewayRunner","SimpleXyoSigner","HttpRpcXyoConnection","asAddress","asHex","assertEx","delay","hexFromBigInt","hexToBigInt","isDefined","isUndefined","PayloadBuilder","AbstractSentinel","LiquidityPoolBridge__factory","BridgeDestinationObservationSchema","isBridgeIntent","flattenHydratedTransaction","flattenHydratedTransactions","tryUnflattenHydratedTransaction","Mutex","getAddress","Wallet","EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema","defaultJobCheckIntervalMs","EVMLiquidityBridgeTransactionCompletionMonitorSentinel","AbstractSentinel","configSchemas","defaultConfigSchema","_attemptsCounter","_bridge","_bridgeChainId","_bridgeRemoteChainId","_bridgeTokenAddress","_checkCounter","_errorCounter","_reportMutex","Mutex","_successCounter","_wallet","bridge","assertEx","Error","completedTransactions","params","jobCheckInterval","isDefined","config","pendingTransactions","wallet","createHandler","meter","createCounter","description","provider","bridgeAddress","key","account","private","hex","Wallet","LiquidityPoolBridge__factory","connect","getAddress","network","getNetwork","hexFromBigInt","chainId","tokenAddress","token","asAddress","bridgeRemoteChain","remoteChain","asHex","reportHandler","payloads","length","signedHydratedTransaction","tryUnflattenHydratedTransaction","txHash","PayloadBuilder","hash","logger","info","set","flattenHydratedTransaction","isLocked","debug","id","Date","now","runExclusive","response","isUndefined","processAllTransactions","results","result","processTransaction","push","delay","flattenHydratedTransactions","ret","undefined","add","bridgeIntents","filter","isBridgeIntent","delete","bridgeIntent","bridgeDestinationObservation","relayBridgeIntentSync","error","amount","hexToBigInt","destAmount","nonce","getNonce","srcAddress","destAddress","tx","bridgeFromRemote","confirmation","wait","transactionResponse","getTransaction","destConfirmation","schema","rest","BridgeDestinationObservationSchema","fields","build","assertEx","delay","isDefined","isNull","isUndefined","PayloadBuilder","AbstractSentinel","flattenHydratedTransaction","flattenHydratedTransactions","tryUnflattenHydratedTransaction","Mutex","XL1TransactionCompletionMonitorSentinelConfigSchema","defaultJobCheckIntervalMs","XL1TransactionCompletionMonitorSentinel","AbstractSentinel","configSchemas","defaultConfigSchema","_attemptsCounter","_checkCounter","_errorCounter","_reportMutex","Mutex","_successCounter","completedTransactions","assertEx","params","jobCheckInterval","isDefined","config","pendingTransactions","viewer","createHandler","meter","createCounter","description","reportHandler","payloads","length","signedHydratedTransaction","tryUnflattenHydratedTransaction","txHash","PayloadBuilder","hash","logger","info","set","flattenHydratedTransaction","isLocked","debug","id","Date","now","runExclusive","response","isUndefined","processAllTransactions","results","result","processTransaction","push","delay","flattenHydratedTransactions","ret","undefined","add","tx","transactionByHash","isNull","delete","currentBlockNumber","exp","error","getLocator","context","config","logger","otlpEndpoint","telemetry","otel","path","endpoint","port","metrics","scrape","traceProvider","meterProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","isDefined","AbstractModule","defaultLogger","statusReporter","LoggerModuleStatusReporter","undefined","locator","ModuleFactoryLocator","mongoConfig","storage","mongo","hasMongoConfig","connectionString","dbConnectionString","database","dbName","domain","dbDomain","password","dbPassword","username","dbUserName","payloadSdkConfig","params","register","MongoDBArchivistV2","factory","MemoryArchivist","MemorySentinel","ViewArchivist","gateway","getGateway","viewer","assertEx","connectionInstance","pendingXl1ToEthXl1BridgeIntentTransactions","getIterableMap","completedXl1ToEthXl1BridgeIntentTransactions","xl1TransactionCompletionMonitorSentinelParams","completedTransactions","schema","XL1TransactionCompletionMonitorSentinelConfigSchema","pendingTransactions","XL1TransactionCompletionMonitorSentinel","completedEthXl1BridgeTransactions","provider","initEvmProvider","bridgeAddress","bridge","remoteBridgeContractAddress","evmLiquidityBridgeTransactionCompletionMonitorSentinelParams","EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema","EVMLiquidityBridgeTransactionCompletionMonitorSentinel","mnemonic","chainRpcApiUrl","walletPromise","HDWallet","fromPhrase","random","account","signer","SimpleXyoSigner","connection","HttpRpcXyoConnection","SimpleXyoGatewayRunner","collection","sdkBalanceSummaryMap","BaseMongoSdk","result","MongoMap","create","sdk","getCache","enabled","maxEntries","mapToMapType","Map","ManifestWrapper","NodeManifest","node","PrivateChildManifests","XL1NodeManifest","XL1Node","EthereumNodeManifest","EthereumNode","PublicChildManifests","nodes","getNode","context","wallet","locator","getLocator","wrapper","ManifestWrapper","NodeManifest","PublicChildManifests","PrivateChildManifests","node","childNodes","loadNodes","length","Promise","all","map","childNode","register","attach","address","hostname","getSeedPhrase","bios","config","logger","storedSeedPhrase","seedPhraseStore","get","debug","mnemonic","api","isString","warn","set","seedPhrase","HDWallet","generateMnemonic","log","assertEx","getServer","context","port","bridge","boot","isDefined","wallet","fromPhrase","nodeContext","node","getNode","app","getApp","server","listen","setTimeout"]}
|
|
1
|
+
{"version":3,"sources":["../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/bridge/routeDefinitions/routes/bridgeConfig.ts","../../src/config/asChainId.ts","../../src/config/asToken.ts","../../src/config/getBridgeEscrowAddress.ts","../../src/config/getBridgeFeesAddress.ts","../../src/config/getFeeStructure.ts","../../src/config/getMaxBridgeAmount.ts","../../src/config/getMinBridgeAmount.ts","../../src/config/getRemoteChainId.ts","../../src/config/getRemoteTokenAddress.ts","../../src/config/getBridgeWalletAccount.ts","../../src/config/getTransferAddresses.ts","../../src/config/getXl1ChainId.ts","../../src/config/getXl1TokenAddress.ts","../../src/config/getBridgeSettings.ts","../../src/config/getGateway.ts","../../src/server/routes/bridge/routeDefinitions/routes/bridgeFromRemoteStatus.ts","../../src/server/routes/bridge/routeDefinitions/pathParams/ChainIdPathParam.ts","../../src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts","../../src/util/calculateBridgeFees.ts","../../src/util/generateBridgeEstimate.ts","../../src/util/validateBridgeEstimateExact.ts","../../src/util/validateBridgeTransaction.ts","../../src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.ts","../../src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.ts","../../src/server/routes/bridge/routeDefinitions/getRouteDefinitions.ts","../../src/server/routes/bridge/addBridgeRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts","../../src/manifest/getLocator.ts","../../src/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/EVMLiquidityBridgeTransactionCompletionMonitorSentinel.ts","../../src/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.ts","../../src/manifest/getNode.ts","../../src/manifest/node.json","../../src/manifest/nodeManifest.ts","../../src/manifest/private/index.ts","../../src/manifest/public/XL1.json","../../src/manifest/public/Ethereum.json","../../src/manifest/public/index.ts"],"sourcesContent":["import {\n customPoweredByHeader, disableCaseSensitiveRouting, disableExpressDefaultPoweredByHeader, getJsonBodyParser, getJsonBodyParserOptions, responseProfiler,\n standardErrors, standardResponses,\n} from '@xylabs/express'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = (node: NodeInstance, config: Config): Express => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.node = node\n addRoutes(app, config)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport { BridgeSettingsZod, type Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getBridgeSettings } from '../../../../../config/index.ts'\n\nconst response = BridgeSettingsZod\n\nconst validateRequest = requestHandlerValidator({ response })\n\nexport const makeBridgeConfigRoute = (config: Config): RouteDefinition => {\n return {\n method: 'get',\n path: '/bridge/chains/:chainId/config',\n handlers: validateRequest(async (_, res) => {\n const {\n escrowAddress,\n feeFixed,\n feeRateBasisPoints,\n feesAddress,\n maxBridgeAmount,\n minBridgeAmount,\n remoteChainId,\n remoteTokenAddress,\n xl1ChainId,\n xl1TokenAddress,\n } = await getBridgeSettings(config)\n const sanitizedConfig = {\n escrowAddress,\n feeFixed,\n feeRateBasisPoints,\n feesAddress,\n maxBridgeAmount,\n minBridgeAmount,\n remoteChainId,\n remoteTokenAddress,\n xl1ChainId,\n xl1TokenAddress,\n }\n res.json(sanitizedConfig)\n }),\n }\n}\n","import { asHex } from '@xylabs/sdk-js'\nimport type { ChainId } from '@xyo-network/xl1-protocol'\n\nexport const asChainId = (value: unknown): ChainId | undefined => {\n const chainId = asHex(value)\n return chainId\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { asAddress } from '@xylabs/sdk-js'\n\nexport const asToken = (value: unknown): Address | undefined => {\n const token = asAddress(value)\n return token\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { asAddress, assertEx } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport const tryGetBridgeEscrowAddress = (config: Config): Address | undefined => {\n const address = asAddress(config.bridge.escrowAddress)\n return address\n}\n\nexport const getBridgeEscrowAddress = (config: Config): Address => {\n const address = assertEx(tryGetBridgeEscrowAddress(config), () => `Invalid bridge escrow address: ${config.bridge.escrowAddress}`)\n return address\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { asAddress, assertEx } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport const tryGetBridgeFeesAddress = (config: Config): Address | undefined => {\n const address = asAddress(config.bridge.feesAddress)\n return address\n}\n\nexport const getBridgeFeesAddress = (config: Config): Address => {\n const address = assertEx(tryGetBridgeFeesAddress(config), () => `Invalid bridge fees address: ${config.bridge.feesAddress}`)\n return address\n}\n","import type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport type { FeeStructure } from '../util/index.ts'\n\nexport const getFeeStructure = (config: Config): FeeStructure => {\n const { feeFixed, feeRateBasisPoints } = config.bridge\n return { feeFixed, feeRateBasisPoints }\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport const getMaxBridgeAmount = (config: Config): Hex => {\n const { maxBridgeAmount } = config.bridge\n return maxBridgeAmount\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport const getMinBridgeAmount = (config: Config): Hex => {\n const { minBridgeAmount } = config.bridge\n return minBridgeAmount\n}\n","import { assertEx } from '@xylabs/sdk-js'\nimport type { ChainId } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { asChainId } from './asChainId.ts'\n\nexport const getRemoteChainId = (config: Config): ChainId => {\n const remoteChainId = assertEx(asChainId(config.bridge.remoteChainId), () => 'Invalid remote chain ID in config')\n return remoteChainId\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { asToken } from './asToken.ts'\n\nexport const getRemoteTokenAddress = (config: Config): Address => {\n const token = asToken(config.bridge.remoteTokenAddress)\n return assertEx(token, () => 'Remote token address is not defined in bridge configuration')\n}\n","import type { Address, Promisable } from '@xylabs/sdk-js'\nimport { isDefined, isUndefined } from '@xylabs/sdk-js'\nimport { HDWallet } from '@xyo-network/wallet'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { ADDRESS_INDEX, generateXyoBaseWalletFromPhrase } from '@xyo-network/xl1-protocol-sdk'\n\nlet accountServiceSingleton: Promisable<WalletInstance> | undefined\n\nexport const getBridgeWalletAccount = async (config: Config): Promise<WalletInstance> => {\n if (accountServiceSingleton) return accountServiceSingleton\n let walletPhrase = config.bridge.mnemonic\n if (isUndefined(walletPhrase)) {\n console.log('[Bridge] No wallet mnemonic specified!')\n const randomMnemonic = HDWallet.generateMnemonic()\n console.log(`[Bridge] Using randomly generated mnemonic:\n \n${randomMnemonic}\n \n `)\n walletPhrase = randomMnemonic\n }\n const wallet = await generateXyoBaseWalletFromPhrase(walletPhrase)\n const account = await wallet.derivePath(ADDRESS_INDEX.XYO)\n accountServiceSingleton = account\n return accountServiceSingleton\n}\n\nexport const getAddressOrBridgeWalletAccountAddress = async (getConfigAccount: (config: Config) => Address | undefined, config: Config): Promise<Address> => {\n const address = getConfigAccount(config)\n if (isDefined(address)) return address\n const walletAccount = await getBridgeWalletAccount(config)\n return walletAccount.address\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { tryGetBridgeEscrowAddress } from './getBridgeEscrowAddress.ts'\nimport { tryGetBridgeFeesAddress } from './getBridgeFeesAddress.ts'\nimport { getBridgeWalletAccount } from './getBridgeWalletAccount.ts'\n\nexport interface TransferAddresses {\n escrowAddress: Address\n feesAddress: Address\n}\n\nexport const getTransferAddresses = async (config: Config): Promise<TransferAddresses> => {\n const escrowAddress = tryGetBridgeEscrowAddress(config) ?? (await getBridgeWalletAccount(config)).address\n const feesAddress = tryGetBridgeFeesAddress(config) ?? (await getBridgeWalletAccount(config)).address\n return { escrowAddress, feesAddress }\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { ChainId } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { asChainId } from './asChainId.ts'\n\nexport const getXl1ChainId = (config: Config): ChainId => {\n const xl1ChainId = config.bridge.xl1ChainId\n if (isDefined(xl1ChainId)) {\n return assertEx(asChainId(xl1ChainId), () => 'Invalid xl1ChainId in bridge config')\n }\n return assertEx(asChainId(config.chain.id), () => 'Invalid chain.id in config')\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport { isDefined } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { asToken } from './asToken.ts'\nimport { getXl1ChainId } from './getXl1ChainId.ts'\n\nexport const getXl1TokenAddress = (config: Config): Hex => {\n const token = asToken(config.bridge.xl1TokenAddress)\n if (isDefined(token)) return token\n return getXl1ChainId(config)\n}\n","import type { BridgeSettings, Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getFeeStructure } from './getFeeStructure.ts'\nimport { getMaxBridgeAmount } from './getMaxBridgeAmount.ts'\nimport { getMinBridgeAmount } from './getMinBridgeAmount.ts'\nimport { getRemoteChainId } from './getRemoteChainId.ts'\nimport { getRemoteTokenAddress } from './getRemoteTokenAddress.ts'\nimport { getTransferAddresses } from './getTransferAddresses.ts'\nimport { getXl1ChainId } from './getXl1ChainId.ts'\nimport { getXl1TokenAddress } from './getXl1TokenAddress.ts'\n\nexport const getBridgeSettings = async (config: Config): Promise<BridgeSettings> => {\n const { feeFixed, feeRateBasisPoints } = getFeeStructure(config)\n const { feesAddress, escrowAddress } = await getTransferAddresses(config)\n const maxBridgeAmount = getMaxBridgeAmount(config)\n const minBridgeAmount = getMinBridgeAmount(config)\n const remoteChainId = getRemoteChainId(config)\n const remoteTokenAddress = getRemoteTokenAddress(config)\n const xl1TokenAddress = getXl1TokenAddress(config)\n const xl1ChainId = getXl1ChainId(config)\n return {\n feeFixed, feeRateBasisPoints, feesAddress, escrowAddress, maxBridgeAmount, minBridgeAmount, remoteChainId, remoteTokenAddress, xl1TokenAddress, xl1ChainId,\n }\n}\n","import { isDefined } from '@xylabs/sdk-js'\nimport { HDWallet } from '@xyo-network/wallet'\nimport {\n type Config, SimpleXyoGatewayRunner, SimpleXyoSigner, type XyoGatewayRunner,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { HttpRpcXyoConnection } from '@xyo-network/xl1-rpc'\n\nlet gatewayInstance: XyoGatewayRunner | undefined\n\nexport const getGateway = async (config: Config): Promise<XyoGatewayRunner> => {\n if (isDefined(gatewayInstance)) return gatewayInstance\n const { mnemonic, chainRpcApiUrl: endpoint } = config.bridge\n const walletPromise = isDefined(mnemonic) ? HDWallet.fromPhrase(mnemonic) : HDWallet.random()\n const account = await walletPromise\n const signer = new SimpleXyoSigner(account)\n const connection = new HttpRpcXyoConnection({ endpoint })\n gatewayInstance = new SimpleXyoGatewayRunner(connection, signer)\n return gatewayInstance\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport { toAddress, toHex } from '@xylabs/sdk-js'\nimport { PayloadZodStrictOfSchema } from '@xyo-network/payload-model'\nimport type { BridgeDestinationObservation } from '@xyo-network/xl1-protocol'\nimport {\n BridgeDestinationObservationFieldsZod,\n BridgeDestinationObservationSchema,\n} from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { z } from 'zod'\n\nimport { getBridgeSettings } from '../../../../../config/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nexport const makeBridgeFromRemoteStatusRoute = (config: Config): RouteDefinition => {\n const params = z.object({\n chainId: getRemoteChainIdZod(config),\n nonce: z.string().nonempty(),\n })\n const response = PayloadZodStrictOfSchema(BridgeDestinationObservationSchema).extend(\n BridgeDestinationObservationFieldsZod.shape,\n )\n const validateRequest = requestHandlerValidator({ params, response })\n\n return {\n method: 'get',\n path: '/bridge/chains/:chainId/bridgeFromRemote/status/:nonce',\n handlers: validateRequest(async (req, res) => {\n const {\n remoteChainId, remoteTokenAddress, xl1ChainId, xl1TokenAddress,\n } = await getBridgeSettings(config)\n\n const rand = await Promise.resolve(Math.random())\n\n // TODO: Replace with actual lookup logic (e.g. database or chain query)\n const found = rand > 0.5 // simulate lookup\n if (!found) return res.sendStatus(404)\n\n const confirmed = rand > 0.8 // simulate pending/confirmed\n if (!confirmed) return res.sendStatus(204)\n\n const observation: BridgeDestinationObservation = {\n schema: BridgeDestinationObservationSchema,\n dest: xl1ChainId,\n destAddress: toAddress('0xabc'),\n destAmount: toHex('0x100'),\n destToken: xl1TokenAddress,\n src: remoteChainId,\n srcAddress: toAddress('0x123'),\n srcAmount: toHex('0x200'),\n srcToken: remoteTokenAddress,\n destConfirmation: toHex('0x9999'),\n }\n res.json(observation)\n }),\n }\n}\n","import {\n asHex, HexZod, isUndefined,\n} from '@xylabs/sdk-js'\nimport type { ChainId } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getRemoteChainId } from '../../../../../config/index.ts'\n\nexport const getRemoteChainIdZod = (config: Config) => {\n const remoteChainId: ChainId = getRemoteChainId(config)\n return HexZod.superRefine((val, ctx) => {\n const chainId = asHex(val)\n if (isUndefined(chainId)) {\n ctx.addIssue('Not a valid chain id')\n return\n }\n if (chainId !== remoteChainId) {\n ctx.addIssue(`Only ${remoteChainId} is supported`)\n }\n })\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { PayloadZodStrictOfSchema } from '@xyo-network/payload-model'\nimport { asSentinelInstance } from '@xyo-network/sentinel-model'\nimport type {\n BridgeSourceObservation, BridgeSourceObservationFields, SignedHydratedTransaction,\n} from '@xyo-network/xl1-protocol'\nimport {\n BridgeIntentFieldsZod, BridgeIntentSchema, BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, SignedTransactionBoundWitnessZod, TransferZod,\n} from '@xyo-network/xl1-protocol'\nimport { type Config, flattenHydratedTransaction } from '@xyo-network/xl1-protocol-sdk'\nimport { z } from 'zod'\n\nimport { validateBridgeEstimateExact, validateBridgeTransaction } from '../../../../../util/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nexport const makeBridgeToRemoteRoute = (config: Config): RouteDefinition => {\n const params = z.object({ chainId: getRemoteChainIdZod(config) })\n const body = z.tuple([\n SignedTransactionBoundWitnessZod,\n PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),\n TransferZod,\n ])\n const response = PayloadZodStrictOfSchema(BridgeSourceObservationSchema).extend(BridgeSourceObservationFieldsZod.shape)\n\n const validateRequest = requestHandlerValidator({\n params, body, response,\n })\n return {\n method: 'post',\n path: '/bridge/chains/:chainId/bridgeToRemote',\n handlers: validateRequest(async (req, res) => {\n const [signedTxBw, bridgeIntent, transfer] = req.body\n const { node } = req.app\n\n // Validate request\n const transactionValid = await validateBridgeTransaction(signedTxBw, bridgeIntent, transfer, config)\n if (!transactionValid) {\n res.status(400).send()\n return\n }\n\n // Validate estimate\n const estimateValid = await validateBridgeEstimateExact(bridgeIntent, transfer, config)\n if (!estimateValid) {\n res.status(400).send()\n return\n }\n\n // Submit to sentinel\n const mod = await node.resolve('XL1BridgeIntentTransactionCompletionMonitorSentinel')\n const sentinel = assertEx(asSentinelInstance(mod), () => 'Error resolving XL1BridgeIntentTransactionCompletionMonitorSentinel')\n const singedHydratedTransaction: SignedHydratedTransaction = [signedTxBw, [transfer, bridgeIntent]]\n const observation = await sentinel.report(flattenHydratedTransaction(singedHydratedTransaction))\n if (observation.length === 0) {\n console.error('Error submitting bridge intent transaction to sentinel')\n res.status(500).send()\n return\n }\n const srcConfirmation = await PayloadBuilder.hash(signedTxBw)\n\n // Create BridgeObservation\n const bridgeCommonFieldsZod = z.object({}).extend(BridgeSourceObservationFieldsZod.shape)\n const bridgeCommonFields = bridgeCommonFieldsZod.parse(bridgeIntent)\n const bridgeObservationFields: BridgeSourceObservationFields = { ...bridgeCommonFields, srcConfirmation }\n const bridgeObservation: BridgeSourceObservation = new PayloadBuilder<BridgeSourceObservation>(\n { schema: BridgeSourceObservationSchema },\n ).fields(bridgeObservationFields).build()\n\n // Return bridge observation to caller\n res.json(bridgeObservation)\n }),\n }\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport { hexToBigInt, toHex } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport type FeeStructure = Pick<Config['bridge'], 'feeFixed' | 'feeRateBasisPoints'>\n\nexport interface FeeCalculationResult {\n destAmount: Hex\n feeFixed: Hex\n feeVariable: Hex\n}\n\nexport const calculateBridgeFees = (srcAmount: Hex, feeStructure: FeeStructure): FeeCalculationResult => {\n const { feeFixed, feeRateBasisPoints } = feeStructure\n\n // Format source input\n const srcAmountBigInt = hexToBigInt(srcAmount)\n\n // Calculate fixed fee\n const feeFixedBigInt = hexToBigInt(feeFixed)\n\n // Integer-safe basis point calculation (floor division)\n const feeVariableBigInt\n = (srcAmountBigInt * BigInt(feeRateBasisPoints)) / 10_000n\n const feeVariable = toHex(feeVariableBigInt)\n\n // Calculate total fee\n const feeTotalBigInt = feeFixedBigInt + feeVariableBigInt\n\n // Calculate destination amount\n const destAmountBigInt = srcAmountBigInt > feeTotalBigInt ? srcAmountBigInt - feeTotalBigInt : 0n\n const destAmount = toHex(destAmountBigInt)\n\n return {\n destAmount,\n feeFixed,\n feeVariable,\n }\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport { hexToBigInt, toAddress } from '@xylabs/sdk-js'\nimport { createTransferPayload } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n BridgeIntent, BridgeIntentFields, Transfer,\n} from '@xyo-network/xl1-protocol'\nimport { BridgeIntentSchema } from '@xyo-network/xl1-protocol'\nimport { type Config } from '@xyo-network/xl1-protocol-sdk'\nimport { v4 } from 'uuid'\n\nimport { getBridgeSettings } from '../config/index.ts'\nimport { calculateBridgeFees } from './calculateBridgeFees.ts'\n\nexport const generateBridgeEstimate = async (\n srcAddress: Hex,\n srcAmount: Hex,\n destAddress: Hex,\n config: Config,\n nonceOverride?: string,\n): Promise<[BridgeIntent, Transfer]> => {\n const {\n escrowAddress, feeFixed, feeRateBasisPoints, feesAddress, remoteChainId, remoteTokenAddress, xl1ChainId, xl1TokenAddress,\n } = await getBridgeSettings(config)\n\n const sender = toAddress(srcAddress)\n\n // Calculate fees and destination amount\n const fees = calculateBridgeFees(srcAmount, { feeFixed, feeRateBasisPoints })\n const {\n destAmount, feeFixed: feeFixedAmount, feeVariable,\n } = fees\n\n // Generate a unique nonce for the bridge intent\n const nonce = nonceOverride ?? v4()\n\n // Build the bridge intent\n const bridgeIntentFields: BridgeIntentFields = {\n // Source\n src: xl1ChainId,\n srcAddress: sender,\n srcAmount,\n srcToken: xl1TokenAddress,\n\n // Destination\n dest: remoteChainId,\n destAddress,\n destAmount,\n destToken: remoteTokenAddress,\n nonce,\n }\n const bridgeIntent: BridgeIntent = new PayloadBuilder<BridgeIntent>({ schema: BridgeIntentSchema }).fields(bridgeIntentFields).build()\n\n // Build the transfer\n const context = {\n destAmount, feeFixed: feeFixedAmount, feeVariable,\n }\n const transfer: Transfer = createTransferPayload(sender, {\n [escrowAddress]: hexToBigInt(destAmount),\n [feesAddress]: hexToBigInt(feeFixedAmount) + hexToBigInt(feeVariable),\n }, context)\n\n return [bridgeIntent, transfer]\n}\n","import { isUndefined } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { BridgeIntent, Transfer } from '@xyo-network/xl1-protocol'\nimport { type Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { generateBridgeEstimate } from './generateBridgeEstimate.ts'\n\n/**\n * Validates a bridge estimate by checking the intent and transfer against the provided configuration. This method\n * only returns true if the bridge estimate matches exactly.\n * @param intent The BridgeIntent\n * @param transfer The Transfer\n * @param config The Config\n * @returns True if the bridge estimate satisfies bridging conditions, false otherwise.\n */\nexport const validateBridgeEstimateExact = async (\n intent: BridgeIntent,\n transfer: Transfer,\n config: Config,\n): Promise<boolean> => {\n const {\n srcAddress, srcAmount, destAddress,\n } = intent\n const [calculatedIntent, calculatedTransfer] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config)\n if (isUndefined(calculatedIntent) || isUndefined(calculatedTransfer)) return false\n const { nonce: expectedIntentNonce, ...expectedIntentStatic } = calculatedIntent\n const { nonce: actualIntentNonce, ...actualIntentStatic } = intent\n if (await PayloadBuilder.dataHash(expectedIntentStatic) !== await PayloadBuilder.dataHash(actualIntentStatic)) return false\n const { epoch: expectedTransferEpoch, ...expectedTransferStatic } = calculatedTransfer\n const { epoch: actualTransferEpoch, ...actualTransferStatic } = transfer\n if (await PayloadBuilder.dataHash(expectedTransferStatic) !== await PayloadBuilder.dataHash(actualTransferStatic)) return false\n\n return true\n}\n","import { asAddress, isDefined } from '@xylabs/sdk-js'\nimport {\n addressesContains, BoundWitnessValidator, payloadHashesContainsAll,\n} from '@xyo-network/boundwitness-validator'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n BridgeIntent, TransactionBoundWitness, Transfer,\n} from '@xyo-network/xl1-protocol'\nimport { type Config } from '@xyo-network/xl1-protocol-sdk'\n\n/**\n * Validates a bridge estimate by checking the intent and transfer against the provided configuration. This method\n * exists to allow for \"at least\" validation of a bridge estimates in case we want to allow for some flexibility in\n * the bridge estimate.\n * @ param signedTransaction The signed transaction bound witness\n * @param signedTxBw The signed transaction bound witness\n * @param intent The BridgeIntent\n * @param transfer The Transfer\n * @param config The Config\n * @returns True if the bridge estimate satisfies bridging conditions, false otherwise.\n */\nexport const validateBridgeTransaction = async (\n signedTxBw: TransactionBoundWitness,\n intent: BridgeIntent,\n transfer: Transfer,\n config: Config,\n): Promise<boolean> => {\n const { srcAddress } = intent\n\n const errors = await new BoundWitnessValidator(signedTxBw).validate()\n if (isDefined(errors) && errors.length > 0) return false\n\n const sender = asAddress(srcAddress, true)\n if (!addressesContains(signedTxBw, sender)) return false\n\n const hashes = await PayloadBuilder.hashes([intent, transfer])\n if (!payloadHashesContainsAll(signedTxBw, hashes)) return false\n\n return true\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport { assertEx, toAddress } from '@xylabs/sdk-js'\nimport { PayloadZodLooseOfSchema, PayloadZodStrictOfSchema } from '@xyo-network/payload-model'\nimport {\n BridgeIntentFieldsZod, BridgeIntentSchema, toXL1BlockNumber, TransactionBoundWitnessZod, TransferSchema,\n} from '@xyo-network/xl1-protocol'\nimport { buildUnsignedTransaction, type Config } from '@xyo-network/xl1-protocol-sdk'\nimport { z } from 'zod'\n\nimport { getGateway, getXl1ChainId } from '../../../../../config/index.ts'\nimport { generateBridgeEstimate } from '../../../../../util/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nexport const makeBridgeToRemoteEstimateRoute = (config: Config): RouteDefinition => {\n const params = z.object({ chainId: getRemoteChainIdZod(config) })\n const body = BridgeIntentFieldsZod.pick({\n destAddress: true,\n srcAddress: true,\n srcAmount: true,\n })\n const response = z.tuple([\n TransactionBoundWitnessZod,\n PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),\n PayloadZodLooseOfSchema(TransferSchema),\n ])\n const validateRequest = requestHandlerValidator({\n params, body, response,\n })\n\n return {\n method: 'post',\n path: '/bridge/chains/:chainId/bridgeToRemote/estimate',\n handlers: validateRequest(async (req, res) => {\n const xl1ChainId = getXl1ChainId(config)\n const {\n srcAddress, srcAmount, destAddress,\n } = req.body\n const [bridgeIntent, transfer] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config)\n const sender = toAddress(srcAddress)\n\n // Use viewer to get current block\n const gateway = await getGateway(config)\n const viewer = assertEx(gateway.connectionInstance.viewer, () => new Error('Viewer not available on gateway connection'))\n const currentBlockNumber = await viewer.currentBlockNumber()\n // Calculate nbf/exp\n const nbf = toXL1BlockNumber(currentBlockNumber, true)\n const exp = toXL1BlockNumber(currentBlockNumber + 1000, true)\n // Build unsigned transaction representing the transfer that will be signed by srcAddress\n const [txBw] = await buildUnsignedTransaction(xl1ChainId, [transfer], [bridgeIntent], nbf, exp, sender)\n\n // Return the TX to the caller for signing\n res.json([txBw, bridgeIntent, transfer])\n }),\n }\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport {\n asAddress, asHex, toHex,\n} from '@xylabs/sdk-js'\nimport { PayloadZodStrictOfSchema } from '@xyo-network/payload-model'\nimport type { BridgeDestinationObservation, BridgeSourceObservation } from '@xyo-network/xl1-protocol'\nimport {\n BridgeDestinationObservationFieldsZod, BridgeDestinationObservationSchema, BridgeIntentFieldsZod, BridgeIntentSchema, BridgeSourceObservationFieldsZod,\n BridgeSourceObservationSchema,\n} from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { z } from 'zod'\n\nimport { getBridgeSettings } from '../../../../../config/index.ts'\nimport { generateBridgeEstimate } from '../../../../../util/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nexport const makeBridgeToRemoteStatusRoute = (config: Config): RouteDefinition => {\n const params = z.object({\n chainId: getRemoteChainIdZod(config),\n nonce: z.string().nonempty(),\n })\n const query = z.object({ mockStatus: z.coerce.number().default(0) })\n const response = z.union([\n z.tuple([]),\n z.tuple([PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape)]),\n z.tuple([\n PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),\n PayloadZodStrictOfSchema(BridgeSourceObservationSchema).extend(BridgeSourceObservationFieldsZod.shape),\n ]),\n z.tuple([\n PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),\n PayloadZodStrictOfSchema(BridgeSourceObservationSchema).extend(BridgeSourceObservationFieldsZod.shape),\n PayloadZodStrictOfSchema(BridgeDestinationObservationSchema).extend(BridgeDestinationObservationFieldsZod.shape),\n ]),\n ])\n\n const validateRequest = requestHandlerValidator({\n params, query, response,\n })\n\n return {\n method: 'get',\n path: '/bridge/chains/:chainId/bridgeToRemote/status/:nonce',\n handlers: validateRequest(async (req, res) => {\n const { chainId } = req.params\n const { mockStatus = 0 } = req.query\n const result: z.infer<typeof response> = [] as unknown as z.infer<typeof response>\n\n const {\n remoteTokenAddress, xl1ChainId, xl1TokenAddress,\n } = await getBridgeSettings(config)\n\n const src = xl1ChainId\n const srcAddress = asAddress('2222222222222222222222222222222222222222', true)\n const srcAmount = asHex('0x200', true)\n const srcToken = xl1TokenAddress\n\n const dest = chainId\n const destAddress = asAddress('3333333333333333333333333333333333333333', true)\n const destAmount = asHex('0x100', true)\n const destToken = remoteTokenAddress\n\n if (mockStatus === 0) return res.sendStatus(404)\n if (mockStatus > 0) {\n const [observation] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config, req.params.nonce)\n result[0] = observation\n }\n if (mockStatus > 1) {\n const observation: BridgeSourceObservation = {\n schema: BridgeSourceObservationSchema,\n dest,\n destAddress,\n destAmount,\n destToken,\n src,\n srcAddress,\n srcAmount,\n srcToken,\n }\n result[1] = observation\n }\n if (mockStatus > 2) {\n const observation: BridgeDestinationObservation = {\n schema: BridgeDestinationObservationSchema,\n dest,\n destAddress,\n destAmount,\n destToken,\n src,\n srcAddress,\n srcAmount,\n srcToken,\n destConfirmation: toHex('0x9999'),\n }\n result[2] = observation\n }\n\n res.json(result)\n }),\n }\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport {\n makeBridgeConfigRoute, makeBridgeFromRemoteStatusRoute, makeBridgeToRemoteEstimateRoute, makeBridgeToRemoteRoute, makeBridgeToRemoteStatusRoute,\n} from './routes/index.ts'\n\nexport const getRouteDefinitions = (config: Config): RouteDefinition[] => {\n return [\n makeBridgeConfigRoute(config),\n makeBridgeToRemoteEstimateRoute(config),\n makeBridgeToRemoteRoute(config),\n makeBridgeToRemoteStatusRoute(config),\n makeBridgeFromRemoteStatusRoute(config),\n ]\n}\n","import type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport type { Express } from 'express'\n\nimport { getRouteDefinitions } from './routeDefinitions/index.ts'\n\nexport const addBridgeRoutes = (app: Express, config: Config) => {\n const routeDefinitions = getRouteDefinitions(config)\n for (const definition of routeDefinitions) {\n app[definition.method](definition.path, definition.handlers)\n }\n}\n","import type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport type { Express } from 'express'\n\nimport { addBridgeRoutes } from './bridge/index.ts'\n\nexport const addRoutes = (app: Express, config: Config) => {\n addBridgeRoutes(app, config)\n}\n","import {\n assertEx, isDefined, isString, type Logger,\n} from '@xylabs/sdk-js'\nimport { boot } from '@xyo-network/bios'\nimport type { BiosExternalInterface } from '@xyo-network/bios-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { HDWallet } from '@xyo-network/wallet'\nimport { type Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getNode } from '../manifest/index.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\n// TODO: Make nodejs version of bios support round tripping mnemonic between boots\nconst getSeedPhrase = async (bios: BiosExternalInterface, config: Config, logger?: Logger): Promise<string> => {\n const storedSeedPhrase = await bios.seedPhraseStore.get('os')\n logger?.debug(`[Bridge] Stored mnemonic: ${storedSeedPhrase}`)\n const { mnemonic } = config.api\n if (isString(storedSeedPhrase) && isString(mnemonic)) {\n logger?.warn('[Bridge] Stored mnemonic does not match supplied. Updating stored mnemonic to supplied.')\n await bios.seedPhraseStore.set('os', mnemonic)\n } else {\n let seedPhrase: string\n if (isString(mnemonic)) {\n seedPhrase = mnemonic\n } else {\n seedPhrase = HDWallet.generateMnemonic()\n logger?.log('[Bridge] No mnemonic provided, using random mnemonic. This is not recommended for production use.')\n logger?.log(`[Bridge] Mnemonic: ${seedPhrase}`)\n }\n await bios.seedPhraseStore.set('os', seedPhrase)\n }\n return assertEx(await bios.seedPhraseStore.get('os'), () => 'Unable to acquire mnemonic from bios')\n}\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport const getServer = async (context: GetServerContext) => {\n const { logger, config } = context\n const { port, mnemonic } = config.bridge\n const bios = await boot()\n const seedPhrase = isDefined(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger)\n const wallet = await HDWallet.fromPhrase(seedPhrase)\n const nodeContext = {\n wallet, logger, config,\n }\n const node = context.node ?? await getNode(nodeContext)\n const app = getApp(node, config)\n const server = app.listen(port, hostname, () => logger?.log(`[Bridge] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n","import { BaseMongoSdk, type BaseMongoSdkPrivateConfig } from '@xylabs/mongo'\nimport type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { MongoDBArchivistV2 } from '@xyo-network/archivist-mongodb'\nimport { ViewArchivist } from '@xyo-network/archivist-view'\nimport { mapToMapType, MongoMap } from '@xyo-network/chain-protocol'\nimport { initEvmProvider } from '@xyo-network/chain-services'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { AbstractModule, LoggerModuleStatusReporter } from '@xyo-network/module-abstract'\nimport { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'\nimport type { MongoDBModuleParamsV2 } from '@xyo-network/module-model-mongodb'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport { HDWallet } from '@xyo-network/wallet'\nimport type { BridgeDestinationObservation, SignedHydratedTransaction } from '@xyo-network/xl1-protocol'\nimport type {\n Config, IterableMap, XyoGatewayRunner,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n hasMongoConfig, SimpleXyoGatewayRunner, SimpleXyoSigner,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { HttpRpcXyoConnection } from '@xyo-network/xl1-rpc'\nimport type { Document } from 'mongodb'\n\nimport type { EVMLiquidityBridgeTransactionCompletionMonitorSentinelParams, XL1TransactionCompletionMonitorSentinelParams } from '../modules/index.ts'\nimport {\n EVMLiquidityBridgeTransactionCompletionMonitorSentinel, EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema,\n XL1TransactionCompletionMonitorSentinel, XL1TransactionCompletionMonitorSentinelConfigSchema,\n} from '../modules/index.ts'\n\nexport interface GetLocatorContext {\n config: Config\n logger?: Logger\n}\n\n/**\n * Used for retrieving a locator with the necessary modules registered for testing\n * operation of the node (entirely in memory)\n * @returns A locator with the necessary modules registered\n */\nexport const getLocator = async (context: GetLocatorContext) => {\n const { config, logger } = context\n const { otlpEndpoint } = config.telemetry?.otel ?? {}\n const { path: endpoint = '/metrics', port: port = 9468 } = config.telemetry?.metrics?.scrape ?? {}\n const { traceProvider, meterProvider } = await initTelemetry({\n attributes: {\n serviceName: 'xl1-bridge',\n serviceVersion: '1.0.0',\n },\n otlpEndpoint,\n metricsConfig: { endpoint, port },\n })\n\n if (isDefined(logger)) AbstractModule.defaultLogger = logger\n const statusReporter = logger ? new LoggerModuleStatusReporter(logger) : undefined\n\n const locator = new ModuleFactoryLocator()\n // If there's a MongoDB configuration\n const mongoConfig = config.storage?.mongo\n if (hasMongoConfig(mongoConfig)) {\n // Create the MongoDB SDK from the configuration\n const {\n connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName,\n } = mongoConfig\n const payloadSdkConfig: BaseMongoSdkPrivateConfig = {\n dbConnectionString, dbDomain, dbName, dbPassword, dbUserName,\n }\n const params: Partial<MongoDBModuleParamsV2> = {\n meterProvider, payloadSdkConfig, statusReporter, traceProvider,\n }\n // Register the MongoDB Archivist as the default\n locator.register(MongoDBArchivistV2.factory(params), undefined, true)\n }\n\n locator.register(MemoryArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(MemorySentinel.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n locator.register(ViewArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n\n const gateway = await getGateway(config)\n const viewer = assertEx(gateway.connectionInstance.viewer, () => 'Gateway viewer is not defined')\n const pendingXl1ToEthXl1BridgeIntentTransactions = await getIterableMap<Hash, SignedHydratedTransaction>(\n config,\n 'liquidity_bridge_xl1_to_eth_xl1_pending',\n )\n const completedXl1ToEthXl1BridgeIntentTransactions = await getIterableMap<Hash, SignedHydratedTransaction>(\n config,\n 'liquidity_bridge_xl1_to_eth_xl1_completed',\n )\n\n const xl1TransactionCompletionMonitorSentinelParams: XL1TransactionCompletionMonitorSentinelParams = {\n completedTransactions: completedXl1ToEthXl1BridgeIntentTransactions,\n config: { schema: XL1TransactionCompletionMonitorSentinelConfigSchema },\n meterProvider,\n pendingTransactions: pendingXl1ToEthXl1BridgeIntentTransactions,\n statusReporter,\n traceProvider,\n viewer,\n }\n locator.register(XL1TransactionCompletionMonitorSentinel.factory(xl1TransactionCompletionMonitorSentinelParams))\n\n const completedEthXl1BridgeTransactions = await getIterableMap<Hash, BridgeDestinationObservation>(\n config,\n 'liquidity_bridge_eth_xl1_bridge_completed',\n )\n const provider = await initEvmProvider({ config })\n const bridgeAddress = config.bridge.remoteBridgeContractAddress\n const evmLiquidityBridgeTransactionCompletionMonitorSentinelParams: EVMLiquidityBridgeTransactionCompletionMonitorSentinelParams = {\n bridgeAddress,\n completedTransactions: completedEthXl1BridgeTransactions,\n config: { schema: EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema },\n meterProvider,\n pendingTransactions: completedXl1ToEthXl1BridgeIntentTransactions,\n provider,\n statusReporter,\n traceProvider,\n }\n locator.register(EVMLiquidityBridgeTransactionCompletionMonitorSentinel.factory(evmLiquidityBridgeTransactionCompletionMonitorSentinelParams))\n\n return locator\n}\n\nconst getGateway = async (\n config: Config,\n): Promise<XyoGatewayRunner> => {\n const { mnemonic, chainRpcApiUrl: endpoint } = config.bridge\n const walletPromise = isDefined(mnemonic) ? HDWallet.fromPhrase(mnemonic) : HDWallet.random()\n const account = await walletPromise\n const signer = new SimpleXyoSigner(account)\n const connection = new HttpRpcXyoConnection({ endpoint })\n const gateway = new SimpleXyoGatewayRunner(connection, signer)\n return gateway\n}\n\n/**\n * Gets an iterable map based on the storage instructions in the config\n * @param config The config containing storage instructions\n * @param collection The collection to use if using MongoDB for persistence\n * @returns The iterable map\n */\nconst getIterableMap = async <K extends {} = string, V extends Document = Document>\n(config: Config, collection: string): Promise<IterableMap<K, V>> => {\n const mongoConfig = config.storage?.mongo\n if (hasMongoConfig(mongoConfig)) {\n const {\n connectionString: dbConnectionString, database: dbName, domain: dbDomain, password: dbPassword, username: dbUserName,\n } = mongoConfig\n const payloadSdkConfig: BaseMongoSdkPrivateConfig = {\n dbConnectionString, dbDomain, dbName, dbPassword, dbUserName,\n }\n const sdkBalanceSummaryMap = new BaseMongoSdk<V>({ ...payloadSdkConfig, collection })\n const result = await MongoMap.create<MongoMap<K, V>>({\n sdk: sdkBalanceSummaryMap,\n getCache: { enabled: true, maxEntries: 5000 },\n })\n return result\n } else {\n return mapToMapType(new Map<K, V>())\n }\n}\n","import type { Attributes, Counter } from '@opentelemetry/api'\nimport type {\n Address, Hash, Hex,\n} from '@xylabs/sdk-js'\nimport {\n asAddress, asHex, assertEx, delay, hexFromBigInt, hexToBigInt, isDefined, isUndefined,\n} from '@xylabs/sdk-js'\nimport type { AnyConfigSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport type {\n SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport { type LiquidityPoolBridge, LiquidityPoolBridge__factory } from '@xyo-network/typechain'\nimport {\n type BridgeDestinationObservation, BridgeDestinationObservationSchema, type BridgeIntent, isBridgeIntent, type SignedHydratedTransaction,\n} from '@xyo-network/xl1-protocol'\nimport type { IterableMap, MapType } from '@xyo-network/xl1-protocol-sdk'\nimport {\n flattenHydratedTransaction, flattenHydratedTransactions, tryUnflattenHydratedTransaction,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\nimport { getAddress } from 'ethers/address'\nimport type { Provider } from 'ethers/providers'\nimport { Wallet } from 'ethers/wallet'\n\nexport const EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema\n = 'network.xyo.sentinel.chain.evm.liquidity.bridge.transaction.completion.monitor.config'\nexport type EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema = typeof EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema\n\n/**\n * The configuration for the sentinel\n */\nexport type EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfig = SentinelConfig<{\n /**\n * The interval in milliseconds between checking for jobs to fulfill\n */\n jobCheckInterval: number\n\n /**\n * The schema for the sentinel config\n */\n schema: EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema\n}>\n\ninterface EVMLiquidityBridgeTransactionCompletionMonitorSentinelParamFields {\n /**\n * The address to watch for incoming or outgoing ERC-20 token transfers.\n */\n bridgeAddress: string\n\n /**\n * The map of completed transactions to monitor for completion\n */\n completedTransactions: MapType<Hash, BridgeDestinationObservation>\n\n /**\n * The map of pending transactions to monitor for completion\n */\n pendingTransactions: IterableMap<Hash, SignedHydratedTransaction>\n\n /**\n * An ethers.js Provider connected to the Ethereum network to monitor for ERC-20 transfers.\n */\n provider: Provider\n}\n\nexport type EVMLiquidityBridgeTransactionCompletionMonitorSentinelParams<TConfig extends\nAnyConfigSchema<EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfig> = AnyConfigSchema<EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfig>,\n> = SentinelParams<TConfig> & EVMLiquidityBridgeTransactionCompletionMonitorSentinelParamFields\n\nconst defaultJobCheckIntervalMs = 15_000\n\nexport class EVMLiquidityBridgeTransactionCompletionMonitorSentinel<\n TParams extends EVMLiquidityBridgeTransactionCompletionMonitorSentinelParams = EVMLiquidityBridgeTransactionCompletionMonitorSentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n> extends AbstractSentinel<TParams, TEventData> {\n static override readonly configSchemas = [EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema]\n static override readonly defaultConfigSchema = EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema\n protected _attemptsCounter: Counter<Attributes> | undefined\n protected _bridge: LiquidityPoolBridge | undefined\n protected _bridgeChainId: Hex | undefined\n protected _bridgeRemoteChainId: Hex | undefined\n protected _bridgeTokenAddress: Address | undefined\n protected _checkCounter: Counter<Attributes> | undefined\n protected _errorCounter: Counter<Attributes> | undefined\n protected _reportMutex = new Mutex()\n protected _successCounter: Counter<Attributes> | undefined\n protected _wallet: Wallet | undefined\n\n protected get bridge(): LiquidityPoolBridge {\n return assertEx(this._bridge, () => new Error('Bridge contract not initialized'))\n }\n\n protected get completedTransactions(): MapType<Hash, BridgeDestinationObservation> {\n return assertEx(this.params.completedTransactions, () => 'Completed transactions map is not defined')\n }\n\n protected get jobCheckInterval(): number {\n return isDefined(this.config.jobCheckInterval) ? this.config.jobCheckInterval : defaultJobCheckIntervalMs\n }\n\n protected get pendingTransactions(): IterableMap<Hash, SignedHydratedTransaction> {\n return assertEx(this.params.pendingTransactions, () => 'Pending transactions map is not defined')\n }\n\n protected get wallet(): Wallet {\n return assertEx(this._wallet, () => 'wallet is required')\n }\n\n override async createHandler(): Promise<void> {\n await super.createHandler()\n // Create meters for tracking bridge attempts, successes, and errors.\n this._attemptsCounter = this.meter?.createCounter(\n 'evm_liquidity_bridge_transaction_completion_monitor_sentinel_attempts_total',\n { description: 'Number of attempts' },\n )\n this._checkCounter = this.meter?.createCounter(\n 'evm_liquidity_bridge_transaction_completion_monitor_sentinel_check_total',\n { description: 'Number of checks' },\n )\n this._successCounter = this.meter?.createCounter(\n 'evm_liquidity_bridge_transaction_completion_monitor_sentinel_success_total',\n { description: 'Number of successes' },\n )\n this._errorCounter = this.meter?.createCounter(\n 'evm_liquidity_bridge_transaction_completion_monitor_sentinel_errors_total',\n { description: 'Number of errors' },\n )\n const { provider, bridgeAddress } = this.params\n\n // Connect to the bridge contract\n // Create a wallet bound to the provider (signer + provider)\n const key = assertEx(this.account?.private?.hex, () => new Error('Account private key is required'))\n this._wallet = new Wallet(key, provider)\n this._bridge = LiquidityPoolBridge__factory.connect(getAddress(bridgeAddress), this._wallet)\n\n // Parse bridge network chain ID\n const network = await provider.getNetwork()\n this._bridgeChainId = assertEx(hexFromBigInt(network.chainId), () => new Error('Failed to parse bridgeChainId'))\n\n // Parse bridge token address\n const tokenAddress = await this.bridge.token()\n this._bridgeTokenAddress = asAddress(tokenAddress, true)\n\n // Parse bridge remote chain ID\n const bridgeRemoteChain = await this.bridge.remoteChain()\n this._bridgeRemoteChainId = asHex(bridgeRemoteChain)\n }\n\n override async reportHandler(payloads?: Payload[]): Promise<Payload[]> {\n if (isDefined(payloads) && payloads.length > 0) {\n const signedHydratedTransaction = tryUnflattenHydratedTransaction(payloads)\n if (isDefined(signedHydratedTransaction)) {\n // Insert into pending transactions for monitoring\n const txHash = await PayloadBuilder.hash(signedHydratedTransaction[0])\n this.logger?.info(`Adding transaction ${signedHydratedTransaction[0]} with hash ${txHash} to pending transactions for monitoring`)\n await this.pendingTransactions.set(txHash, signedHydratedTransaction)\n return flattenHydratedTransaction(signedHydratedTransaction)\n }\n return []\n } else {\n if (this._reportMutex.isLocked()) {\n this.logger?.debug(`EVMLiquidityBridgeTransactionCompletionMonitorSentinel [${this.id}] is already running, skipping report [${Date.now()}]`)\n return []\n }\n return await this._reportMutex.runExclusive(async () => {\n const response: Payload[] = []\n if (isUndefined(payloads) || payloads.length === 0) {\n await this.processAllTransactions()\n }\n return response\n })\n }\n }\n\n private async processAllTransactions(): Promise<Payload[]> {\n const results: SignedHydratedTransaction[] = []\n for await (const [hash, signedHydratedTransaction] of this.pendingTransactions) {\n const result = await this.processTransaction([hash, signedHydratedTransaction])\n if (isDefined(result)) results.push(result[1])\n await delay(this.jobCheckInterval)\n }\n return flattenHydratedTransactions(results)\n }\n\n private async processTransaction(\n [hash, signedHydratedTransaction]: [Hash, SignedHydratedTransaction],\n ): Promise<[Hash, SignedHydratedTransaction] | undefined> {\n this.logger?.info(`Checking for transaction ${signedHydratedTransaction[0]} with hash ${hash}`)\n try {\n let ret: [Hash, SignedHydratedTransaction] | undefined = undefined\n this._checkCounter?.add(1)\n const bridgeIntents = signedHydratedTransaction[1].filter(isBridgeIntent)\n // Only support a single intent per transaction for now\n if (bridgeIntents.length !== 1) {\n await this.pendingTransactions.delete(hash)\n return ret\n }\n const bridgeIntent = bridgeIntents[0]\n this._attemptsCounter?.add(1)\n const bridgeDestinationObservation = await this.relayBridgeIntentSync(bridgeIntent)\n await this.completedTransactions.set(hash, bridgeDestinationObservation)\n await this.pendingTransactions.delete(hash)\n this._successCounter?.add(1)\n return ret\n } catch (error) {\n this._errorCounter?.add(1)\n this.logger?.error(`Error checking for transaction ${signedHydratedTransaction[0]} with hash ${hash}:`, error)\n }\n }\n\n /**\n * Relays a given BridgeIntent.\n * @param bridgeIntent The BridgeIntent to relay\n * @returns Relays the intent in a blocking manner, returning the resulting BridgeDestinationObservation if successful\n */\n private async relayBridgeIntentSync(bridgeIntent: BridgeIntent): Promise<BridgeDestinationObservation> {\n // Ensure source observation exists\n const amount = hexToBigInt(bridgeIntent.destAmount)\n const nonce = await this.wallet.getNonce()\n const srcAddress = getAddress(bridgeIntent.srcAddress)\n const destAddress = getAddress(bridgeIntent.destAddress)\n const tx = await this.bridge.bridgeFromRemote(srcAddress, destAddress, amount, { nonce })\n const confirmation = await tx.wait()\n const transactionResponse = await confirmation?.getTransaction()\n const destConfirmation = asHex(transactionResponse?.hash ?? '', true)\n const { schema, ...rest } = bridgeIntent\n const result: BridgeDestinationObservation = new PayloadBuilder<BridgeDestinationObservation>({ schema: BridgeDestinationObservationSchema })\n .fields({ ...rest, destConfirmation }).build()\n return result\n }\n}\n","import type { Attributes, Counter } from '@opentelemetry/api'\nimport type { Hash } from '@xylabs/sdk-js'\nimport {\n assertEx, delay, isDefined, isNull, isUndefined,\n} from '@xylabs/sdk-js'\nimport type { AnyConfigSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport type {\n SentinelConfig, SentinelInstance, SentinelModuleEventData, SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport type { SignedHydratedTransaction } from '@xyo-network/xl1-protocol'\nimport type {\n IterableMap, MapType, XyoViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n flattenHydratedTransaction, flattenHydratedTransactions, tryUnflattenHydratedTransaction,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nexport const XL1TransactionCompletionMonitorSentinelConfigSchema = 'network.xyo.sentinel.chain.transaction.completion.monitor.config'\nexport type XL1TransactionCompletionMonitorSentinelConfigSchema = typeof XL1TransactionCompletionMonitorSentinelConfigSchema\n\n/**\n * The configuration for the sentinel\n */\nexport type XL1TransactionCompletionMonitorSentinelConfig = SentinelConfig<{\n /**\n * The interval in milliseconds between checking for jobs to fulfill\n */\n jobCheckInterval: number\n\n /**\n * The schema for the sentinel config\n */\n schema: XL1TransactionCompletionMonitorSentinelConfigSchema\n}>\n\ninterface XL1TransactionCompletionMonitorSentinelParamFields {\n /**\n * The map of completed transactions to monitor for completion\n */\n completedTransactions: MapType<Hash, SignedHydratedTransaction>\n\n /**\n * The map of pending transactions to monitor for completion\n */\n pendingTransactions: IterableMap<Hash, SignedHydratedTransaction>\n\n /**\n * The viewer instance to use for viewing transactions\n */\n viewer: XyoViewer\n}\n\nexport type XL1TransactionCompletionMonitorSentinelParams<\n TConfig extends AnyConfigSchema<XL1TransactionCompletionMonitorSentinelConfig> = AnyConfigSchema<XL1TransactionCompletionMonitorSentinelConfig>,\n> = SentinelParams<TConfig> & XL1TransactionCompletionMonitorSentinelParamFields\n\nconst defaultJobCheckIntervalMs = 15_000\n\nexport class XL1TransactionCompletionMonitorSentinel<\n TParams extends XL1TransactionCompletionMonitorSentinelParams = XL1TransactionCompletionMonitorSentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n> extends AbstractSentinel<TParams, TEventData> {\n static override readonly configSchemas = [XL1TransactionCompletionMonitorSentinelConfigSchema]\n static override readonly defaultConfigSchema = XL1TransactionCompletionMonitorSentinelConfigSchema\n private _attemptsCounter: Counter<Attributes> | undefined\n private _checkCounter: Counter<Attributes> | undefined\n private _errorCounter: Counter<Attributes> | undefined\n private _reportMutex = new Mutex()\n private _successCounter: Counter<Attributes> | undefined\n\n protected get completedTransactions(): MapType<Hash, SignedHydratedTransaction> {\n return assertEx(this.params.completedTransactions, () => 'Completed transactions map is not defined')\n }\n\n protected get jobCheckInterval(): number {\n return isDefined(this.config.jobCheckInterval) ? this.config.jobCheckInterval : defaultJobCheckIntervalMs\n }\n\n protected get pendingTransactions(): IterableMap<Hash, SignedHydratedTransaction> {\n return assertEx(this.params.pendingTransactions, () => 'Pending transactions map is not defined')\n }\n\n protected get viewer(): XyoViewer {\n return assertEx(this.params.viewer, () => 'Viewer is not defined in params')\n }\n\n override async createHandler(): Promise<void> {\n await super.createHandler()\n // Create meters for tracking bridge attempts, successes, and errors.\n this._attemptsCounter = this.meter?.createCounter('xl1_transaction_completion_monitor_sentinel_attempts_total', { description: 'Number of attempts' })\n this._checkCounter = this.meter?.createCounter('xl1_transaction_completion_monitor_sentinel_check_total', { description: 'Number of checks' })\n this._successCounter = this.meter?.createCounter('xl1_transaction_completion_monitor_sentinel_success_total', { description: 'Number of successes' })\n this._errorCounter = this.meter?.createCounter('xl1_transaction_completion_monitor_sentinel_errors_total', { description: 'Number of errors' })\n }\n\n override async reportHandler(payloads?: Payload[]): Promise<Payload[]> {\n if (isDefined(payloads) && payloads.length > 0) {\n const signedHydratedTransaction = tryUnflattenHydratedTransaction(payloads)\n if (isDefined(signedHydratedTransaction)) {\n // Insert into pending transactions for monitoring\n const txHash = await PayloadBuilder.hash(signedHydratedTransaction[0])\n this.logger?.info(`Adding transaction ${signedHydratedTransaction[0]} with hash ${txHash} to pending transactions for monitoring`)\n await this.pendingTransactions.set(txHash, signedHydratedTransaction)\n return flattenHydratedTransaction(signedHydratedTransaction)\n }\n return []\n } else {\n if (this._reportMutex.isLocked()) {\n this.logger?.debug(`XL1TransactionCompletionMonitorSentinel [${this.id}] is already running, skipping report [${Date.now()}]`)\n return []\n }\n return await this._reportMutex.runExclusive(async () => {\n const response: Payload[] = []\n if (isUndefined(payloads) || payloads.length === 0) {\n await this.processAllTransactions()\n }\n return response\n })\n }\n }\n\n private async processAllTransactions(): Promise<Payload[]> {\n const results: SignedHydratedTransaction[] = []\n for await (const [hash, signedHydratedTransaction] of this.pendingTransactions) {\n const result = await this.processTransaction([hash, signedHydratedTransaction])\n if (isDefined(result)) results.push(result[1])\n await delay(this.jobCheckInterval)\n }\n return flattenHydratedTransactions(results)\n }\n\n private async processTransaction(\n [hash, signedHydratedTransaction]: [Hash, SignedHydratedTransaction],\n ): Promise<[Hash, SignedHydratedTransaction] | undefined> {\n this.logger?.info(`Checking for transaction ${signedHydratedTransaction[0]} with hash ${hash}`)\n try {\n let ret: [Hash, SignedHydratedTransaction] | undefined = undefined\n this._checkCounter?.add(1)\n this._attemptsCounter?.add(1)\n // Check if the transaction is already included in the chain\n const tx = await this.viewer.transactionByHash(hash)\n if (isDefined(tx) && !isNull(tx)) {\n await this.completedTransactions.set(hash, signedHydratedTransaction)\n this.logger?.info(`Found transaction ${signedHydratedTransaction[0]} with hash ${hash}`)\n this.logger?.info(`Removing completed transaction ${signedHydratedTransaction[0]} with hash ${hash}`)\n await this.pendingTransactions.delete(hash)\n ret = [hash, signedHydratedTransaction]\n } else {\n const currentBlockNumber = await this.viewer.currentBlockNumber()\n if (signedHydratedTransaction[0].exp < currentBlockNumber) {\n this.logger?.info(`Removing expired transaction ${signedHydratedTransaction[0]} with hash ${hash}`)\n await this.pendingTransactions.delete(hash)\n }\n }\n this._successCounter?.add(1)\n return ret\n } catch (error) {\n this._errorCounter?.add(1)\n this.logger?.error(`Error checking for transaction ${signedHydratedTransaction[0]} with hash ${hash}:`, error)\n }\n }\n}\n","import type { Logger } from '@xylabs/sdk-js'\nimport { ManifestWrapper } from '@xyo-network/manifest-wrapper'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getLocator } from './getLocator.ts'\nimport { NodeManifest } from './nodeManifest.ts'\nimport { PrivateChildManifests } from './private/index.ts'\nimport { PublicChildManifests } from './public/index.ts'\n\nexport interface GetNodeContext {\n config: Config\n logger?: Logger\n wallet: WalletInstance\n}\n\n/**\n * Creates a node with the xyo-chain modules registered\n * @param context The context to use for the node\n * @returns A node with the xyo-chain modules registered\n */\nexport const getNode = async (context: GetNodeContext) => {\n const { wallet } = context\n const locator = await getLocator(context)\n const wrapper = new ManifestWrapper(NodeManifest, wallet, locator, PublicChildManifests, PrivateChildManifests)\n const [node, ...childNodes] = await wrapper.loadNodes()\n if (childNodes?.length > 0) {\n await Promise.all(childNodes.map(childNode => node.register(childNode)))\n await Promise.all(childNodes.map(childNode => node.attach(childNode.address, true)))\n }\n return node\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"44'/60'/1\",\n \"name\": \"XYOEthereumBridge\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [],\n \"public\": []\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport node from './node.json' with { type: 'json' }\n\n/**\n * Root Node Manifest\n */\nexport const NodeManifest = node as PackageManifestPayload\n","/**\n * Private Child Manifests\n */\nexport const PrivateChildManifests = []\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"2\",\n \"name\": \"XL1\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"1/1'/1'\",\n \"automations\": [\n {\n \"frequency\": 60000,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"XL1BridgeIntentTransactionCompletionMonitorSentinelIntervalSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": true,\n \"tasks\": [\n {\n \"mod\": \"XL1BridgeIntentTransactionCompletionMonitorSentinel\",\n \"endPoint\": \"report\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"name\": \"XL1BridgeIntentTransactionCompletionMonitorSentinel\",\n \"schema\": \"network.xyo.sentinel.chain.transaction.completion.monitor.config\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","{\n \"$schema\": \"https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json\",\n \"nodes\": [\n {\n \"config\": {\n \"accountPath\": \"3\",\n \"name\": \"Ethereum\",\n \"schema\": \"network.xyo.node.config\"\n },\n \"modules\": {\n \"private\": [\n {\n \"config\": {\n \"accountPath\": \"1/1'/1'\",\n \"automations\": [\n {\n \"frequency\": 60000,\n \"frequencyUnits\": \"millis\",\n \"schema\": \"network.xyo.automation.interval\",\n \"type\": \"interval\"\n }\n ],\n \"name\": \"EVMLiquidityBridgeTransactionCompletionMonitorSentinelIntervalSentinel\",\n \"schema\": \"network.xyo.sentinel.config\",\n \"synchronous\": true,\n \"tasks\": [\n {\n \"mod\": \"EVMLiquidityBridgeTransactionCompletionMonitorSentinel\",\n \"endPoint\": \"report\"\n }\n ]\n }\n }\n ],\n \"public\": [\n {\n \"config\": {\n \"accountPath\": \"1/1/1\",\n \"name\": \"EVMLiquidityBridgeTransactionCompletionMonitorSentinel\",\n \"schema\": \"network.xyo.sentinel.chain.evm.liquidity.bridge.transaction.completion.monitor.config\"\n }\n }\n ]\n }\n }\n ],\n \"schema\": \"network.xyo.manifest\"\n}\n","import type { ModuleManifest, PackageManifestPayload } from '@xyo-network/manifest-model'\n\nimport XL1Node from './XL1.json' with { type: 'json' }\nimport EthereumNode from './Ethereum.json' with { type: 'json' }\n\n\n/**\n * XL1 Node Manifest\n */\nexport const XL1NodeManifest = XL1Node as PackageManifestPayload\n\n/**\n * Ethereum Node Manifest\n */\nexport const EthereumNodeManifest = EthereumNode as PackageManifestPayload\n\n/**\n * Public Child Manifests\n */\nexport const PublicChildManifests: ModuleManifest[] = [\n ...XL1NodeManifest.nodes,\n ...EthereumNodeManifest.nodes,\n]\n"],"mappings":"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","names":["customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","requestHandlerValidator","BridgeSettingsZod","asHex","asChainId","value","chainId","asHex","asAddress","asToken","value","token","asAddress","asAddress","assertEx","tryGetBridgeEscrowAddress","config","address","asAddress","bridge","escrowAddress","asAddress","assertEx","tryGetBridgeFeesAddress","config","address","asAddress","bridge","feesAddress","getFeeStructure","config","feeFixed","feeRateBasisPoints","bridge","getMaxBridgeAmount","config","maxBridgeAmount","bridge","getMinBridgeAmount","config","minBridgeAmount","bridge","assertEx","getRemoteChainId","config","remoteChainId","assertEx","asChainId","bridge","assertEx","getRemoteTokenAddress","config","token","asToken","bridge","remoteTokenAddress","assertEx","isDefined","isUndefined","HDWallet","ADDRESS_INDEX","generateXyoBaseWalletFromPhrase","accountServiceSingleton","getBridgeWalletAccount","config","walletPhrase","bridge","mnemonic","isUndefined","console","log","randomMnemonic","HDWallet","generateMnemonic","wallet","generateXyoBaseWalletFromPhrase","account","derivePath","ADDRESS_INDEX","XYO","getTransferAddresses","config","escrowAddress","tryGetBridgeEscrowAddress","getBridgeWalletAccount","address","feesAddress","tryGetBridgeFeesAddress","assertEx","isDefined","getXl1ChainId","config","xl1ChainId","bridge","isDefined","assertEx","asChainId","chain","id","isDefined","getXl1TokenAddress","config","token","asToken","bridge","xl1TokenAddress","isDefined","getXl1ChainId","getBridgeSettings","config","feeFixed","feeRateBasisPoints","getFeeStructure","feesAddress","escrowAddress","getTransferAddresses","maxBridgeAmount","getMaxBridgeAmount","minBridgeAmount","getMinBridgeAmount","remoteChainId","getRemoteChainId","remoteTokenAddress","getRemoteTokenAddress","xl1TokenAddress","getXl1TokenAddress","xl1ChainId","getXl1ChainId","isDefined","HDWallet","SimpleXyoGatewayRunner","SimpleXyoSigner","HttpRpcXyoConnection","gatewayInstance","getGateway","config","isDefined","mnemonic","chainRpcApiUrl","endpoint","bridge","walletPromise","HDWallet","fromPhrase","random","account","signer","SimpleXyoSigner","connection","HttpRpcXyoConnection","SimpleXyoGatewayRunner","response","BridgeSettingsZod","validateRequest","requestHandlerValidator","makeBridgeConfigRoute","config","method","path","handlers","_","res","escrowAddress","feeFixed","feeRateBasisPoints","feesAddress","maxBridgeAmount","minBridgeAmount","remoteChainId","remoteTokenAddress","xl1ChainId","xl1TokenAddress","getBridgeSettings","sanitizedConfig","json","requestHandlerValidator","toAddress","toHex","PayloadZodStrictOfSchema","BridgeDestinationObservationFieldsZod","BridgeDestinationObservationSchema","z","asHex","HexZod","isUndefined","getRemoteChainIdZod","config","remoteChainId","getRemoteChainId","HexZod","superRefine","val","ctx","chainId","asHex","isUndefined","addIssue","makeBridgeFromRemoteStatusRoute","config","params","z","object","chainId","getRemoteChainIdZod","nonce","string","nonempty","response","PayloadZodStrictOfSchema","BridgeDestinationObservationSchema","extend","BridgeDestinationObservationFieldsZod","shape","validateRequest","requestHandlerValidator","method","path","handlers","req","res","remoteChainId","remoteTokenAddress","xl1ChainId","xl1TokenAddress","getBridgeSettings","rand","Promise","resolve","Math","random","found","sendStatus","confirmed","observation","schema","dest","destAddress","toAddress","destAmount","toHex","destToken","src","srcAddress","srcAmount","srcToken","destConfirmation","json","requestHandlerValidator","assertEx","PayloadBuilder","PayloadZodStrictOfSchema","asSentinelInstance","BridgeIntentFieldsZod","BridgeIntentSchema","BridgeSourceObservationFieldsZod","BridgeSourceObservationSchema","SignedTransactionBoundWitnessZod","TransferZod","flattenHydratedTransaction","z","hexToBigInt","toHex","calculateBridgeFees","srcAmount","feeStructure","feeFixed","feeRateBasisPoints","srcAmountBigInt","hexToBigInt","feeFixedBigInt","feeVariableBigInt","BigInt","feeVariable","toHex","feeTotalBigInt","destAmountBigInt","destAmount","hexToBigInt","toAddress","createTransferPayload","PayloadBuilder","BridgeIntentSchema","v4","generateBridgeEstimate","srcAddress","srcAmount","destAddress","config","nonceOverride","escrowAddress","feeFixed","feeRateBasisPoints","feesAddress","remoteChainId","remoteTokenAddress","xl1ChainId","xl1TokenAddress","getBridgeSettings","sender","toAddress","fees","calculateBridgeFees","destAmount","feeFixedAmount","feeVariable","nonce","v4","bridgeIntentFields","src","srcToken","dest","destToken","bridgeIntent","PayloadBuilder","schema","BridgeIntentSchema","fields","build","context","transfer","createTransferPayload","hexToBigInt","isUndefined","PayloadBuilder","validateBridgeEstimateExact","intent","transfer","config","srcAddress","srcAmount","destAddress","calculatedIntent","calculatedTransfer","generateBridgeEstimate","isUndefined","nonce","expectedIntentNonce","expectedIntentStatic","actualIntentNonce","actualIntentStatic","PayloadBuilder","dataHash","epoch","expectedTransferEpoch","expectedTransferStatic","actualTransferEpoch","actualTransferStatic","asAddress","isDefined","addressesContains","BoundWitnessValidator","payloadHashesContainsAll","PayloadBuilder","validateBridgeTransaction","signedTxBw","intent","transfer","config","srcAddress","errors","BoundWitnessValidator","validate","isDefined","length","sender","asAddress","addressesContains","hashes","PayloadBuilder","payloadHashesContainsAll","makeBridgeToRemoteRoute","config","params","z","object","chainId","getRemoteChainIdZod","body","tuple","SignedTransactionBoundWitnessZod","PayloadZodStrictOfSchema","BridgeIntentSchema","extend","BridgeIntentFieldsZod","shape","TransferZod","response","BridgeSourceObservationSchema","BridgeSourceObservationFieldsZod","validateRequest","requestHandlerValidator","method","path","handlers","req","res","signedTxBw","bridgeIntent","transfer","node","app","transactionValid","validateBridgeTransaction","status","send","estimateValid","validateBridgeEstimateExact","mod","resolve","sentinel","assertEx","asSentinelInstance","singedHydratedTransaction","observation","report","flattenHydratedTransaction","length","console","error","srcConfirmation","PayloadBuilder","hash","bridgeCommonFieldsZod","bridgeCommonFields","parse","bridgeObservationFields","bridgeObservation","schema","fields","build","json","requestHandlerValidator","assertEx","toAddress","PayloadZodLooseOfSchema","PayloadZodStrictOfSchema","BridgeIntentFieldsZod","BridgeIntentSchema","toXL1BlockNumber","TransactionBoundWitnessZod","TransferSchema","buildUnsignedTransaction","z","makeBridgeToRemoteEstimateRoute","config","params","z","object","chainId","getRemoteChainIdZod","body","BridgeIntentFieldsZod","pick","destAddress","srcAddress","srcAmount","response","tuple","TransactionBoundWitnessZod","PayloadZodStrictOfSchema","BridgeIntentSchema","extend","shape","PayloadZodLooseOfSchema","TransferSchema","validateRequest","requestHandlerValidator","method","path","handlers","req","res","xl1ChainId","getXl1ChainId","bridgeIntent","transfer","generateBridgeEstimate","sender","toAddress","gateway","getGateway","viewer","assertEx","connectionInstance","Error","currentBlockNumber","nbf","toXL1BlockNumber","exp","txBw","buildUnsignedTransaction","json","requestHandlerValidator","asAddress","asHex","toHex","PayloadZodStrictOfSchema","BridgeDestinationObservationFieldsZod","BridgeDestinationObservationSchema","BridgeIntentFieldsZod","BridgeIntentSchema","BridgeSourceObservationFieldsZod","BridgeSourceObservationSchema","z","makeBridgeToRemoteStatusRoute","config","params","z","object","chainId","getRemoteChainIdZod","nonce","string","nonempty","query","mockStatus","coerce","number","default","response","union","tuple","PayloadZodStrictOfSchema","BridgeIntentSchema","extend","BridgeIntentFieldsZod","shape","BridgeSourceObservationSchema","BridgeSourceObservationFieldsZod","BridgeDestinationObservationSchema","BridgeDestinationObservationFieldsZod","validateRequest","requestHandlerValidator","method","path","handlers","req","res","result","remoteTokenAddress","xl1ChainId","xl1TokenAddress","getBridgeSettings","src","srcAddress","asAddress","srcAmount","asHex","srcToken","dest","destAddress","destAmount","destToken","sendStatus","observation","generateBridgeEstimate","schema","destConfirmation","toHex","json","getRouteDefinitions","config","makeBridgeConfigRoute","makeBridgeToRemoteEstimateRoute","makeBridgeToRemoteRoute","makeBridgeToRemoteStatusRoute","makeBridgeFromRemoteStatusRoute","addBridgeRoutes","app","config","routeDefinitions","getRouteDefinitions","definition","method","path","handlers","addRoutes","app","config","addBridgeRoutes","getApp","node","config","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","isDefined","isString","boot","HDWallet","BaseMongoSdk","assertEx","isDefined","MemoryArchivist","MongoDBArchivistV2","ViewArchivist","mapToMapType","MongoMap","initEvmProvider","initTelemetry","AbstractModule","LoggerModuleStatusReporter","ModuleFactoryLocator","MemorySentinel","HDWallet","hasMongoConfig","SimpleXyoGatewayRunner","SimpleXyoSigner","HttpRpcXyoConnection","asAddress","asHex","assertEx","delay","hexFromBigInt","hexToBigInt","isDefined","isUndefined","PayloadBuilder","AbstractSentinel","LiquidityPoolBridge__factory","BridgeDestinationObservationSchema","isBridgeIntent","flattenHydratedTransaction","flattenHydratedTransactions","tryUnflattenHydratedTransaction","Mutex","getAddress","Wallet","EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema","defaultJobCheckIntervalMs","EVMLiquidityBridgeTransactionCompletionMonitorSentinel","AbstractSentinel","configSchemas","defaultConfigSchema","_attemptsCounter","_bridge","_bridgeChainId","_bridgeRemoteChainId","_bridgeTokenAddress","_checkCounter","_errorCounter","_reportMutex","Mutex","_successCounter","_wallet","bridge","assertEx","Error","completedTransactions","params","jobCheckInterval","isDefined","config","pendingTransactions","wallet","createHandler","meter","createCounter","description","provider","bridgeAddress","key","account","private","hex","Wallet","LiquidityPoolBridge__factory","connect","getAddress","network","getNetwork","hexFromBigInt","chainId","tokenAddress","token","asAddress","bridgeRemoteChain","remoteChain","asHex","reportHandler","payloads","length","signedHydratedTransaction","tryUnflattenHydratedTransaction","txHash","PayloadBuilder","hash","logger","info","set","flattenHydratedTransaction","isLocked","debug","id","Date","now","runExclusive","response","isUndefined","processAllTransactions","results","result","processTransaction","push","delay","flattenHydratedTransactions","ret","undefined","add","bridgeIntents","filter","isBridgeIntent","delete","bridgeIntent","bridgeDestinationObservation","relayBridgeIntentSync","error","amount","hexToBigInt","destAmount","nonce","getNonce","srcAddress","destAddress","tx","bridgeFromRemote","confirmation","wait","transactionResponse","getTransaction","destConfirmation","schema","rest","BridgeDestinationObservationSchema","fields","build","assertEx","delay","isDefined","isNull","isUndefined","PayloadBuilder","AbstractSentinel","flattenHydratedTransaction","flattenHydratedTransactions","tryUnflattenHydratedTransaction","Mutex","XL1TransactionCompletionMonitorSentinelConfigSchema","defaultJobCheckIntervalMs","XL1TransactionCompletionMonitorSentinel","AbstractSentinel","configSchemas","defaultConfigSchema","_attemptsCounter","_checkCounter","_errorCounter","_reportMutex","Mutex","_successCounter","completedTransactions","assertEx","params","jobCheckInterval","isDefined","config","pendingTransactions","viewer","createHandler","meter","createCounter","description","reportHandler","payloads","length","signedHydratedTransaction","tryUnflattenHydratedTransaction","txHash","PayloadBuilder","hash","logger","info","set","flattenHydratedTransaction","isLocked","debug","id","Date","now","runExclusive","response","isUndefined","processAllTransactions","results","result","processTransaction","push","delay","flattenHydratedTransactions","ret","undefined","add","tx","transactionByHash","isNull","delete","currentBlockNumber","exp","error","getLocator","context","config","logger","otlpEndpoint","telemetry","otel","path","endpoint","port","metrics","scrape","traceProvider","meterProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","isDefined","AbstractModule","defaultLogger","statusReporter","LoggerModuleStatusReporter","undefined","locator","ModuleFactoryLocator","mongoConfig","storage","mongo","hasMongoConfig","connectionString","dbConnectionString","database","dbName","domain","dbDomain","password","dbPassword","username","dbUserName","payloadSdkConfig","params","register","MongoDBArchivistV2","factory","MemoryArchivist","MemorySentinel","ViewArchivist","gateway","getGateway","viewer","assertEx","connectionInstance","pendingXl1ToEthXl1BridgeIntentTransactions","getIterableMap","completedXl1ToEthXl1BridgeIntentTransactions","xl1TransactionCompletionMonitorSentinelParams","completedTransactions","schema","XL1TransactionCompletionMonitorSentinelConfigSchema","pendingTransactions","XL1TransactionCompletionMonitorSentinel","completedEthXl1BridgeTransactions","provider","initEvmProvider","bridgeAddress","bridge","remoteBridgeContractAddress","evmLiquidityBridgeTransactionCompletionMonitorSentinelParams","EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema","EVMLiquidityBridgeTransactionCompletionMonitorSentinel","mnemonic","chainRpcApiUrl","walletPromise","HDWallet","fromPhrase","random","account","signer","SimpleXyoSigner","connection","HttpRpcXyoConnection","SimpleXyoGatewayRunner","collection","sdkBalanceSummaryMap","BaseMongoSdk","result","MongoMap","create","sdk","getCache","enabled","maxEntries","mapToMapType","Map","ManifestWrapper","NodeManifest","node","PrivateChildManifests","XL1NodeManifest","XL1Node","EthereumNodeManifest","EthereumNode","PublicChildManifests","nodes","getNode","context","wallet","locator","getLocator","wrapper","ManifestWrapper","NodeManifest","PublicChildManifests","PrivateChildManifests","node","childNodes","loadNodes","length","Promise","all","map","childNode","register","attach","address","hostname","getSeedPhrase","bios","config","logger","storedSeedPhrase","seedPhraseStore","get","debug","mnemonic","api","isString","warn","set","seedPhrase","HDWallet","generateMnemonic","log","assertEx","getServer","context","port","bridge","boot","isDefined","wallet","fromPhrase","nodeContext","node","getNode","app","getApp","server","listen","setTimeout"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeToRemote.d.ts","sourceRoot":"","sources":["../../../../../../../src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"bridgeToRemote.d.ts","sourceRoot":"","sources":["../../../../../../../src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAYtD,OAAO,EAAE,KAAK,MAAM,EAA8B,MAAM,+BAA+B,CAAA;AAMvF,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,KAAG,eAyDxD,CAAA"}
|
|
@@ -6,6 +6,6 @@ interface GetServerContext {
|
|
|
6
6
|
logger?: Logger;
|
|
7
7
|
node?: NodeInstance;
|
|
8
8
|
}
|
|
9
|
-
export declare const getServer: (context: GetServerContext) => Promise<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>>;
|
|
9
|
+
export declare const getServer: (context: GetServerContext) => Promise<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>>;
|
|
10
10
|
export {};
|
|
11
11
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAC0B,KAAK,MAAM,EAC3C,MAAM,gBAAgB,CAAA;AAGvB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,+BAA+B,CAAA;AA8B3D,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAED,eAAO,MAAM,SAAS,GAAU,SAAS,gBAAgB,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAC0B,KAAK,MAAM,EAC3C,MAAM,gBAAgB,CAAA;AAGvB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,+BAA+B,CAAA;AA8B3D,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAED,eAAO,MAAM,SAAS,GAAU,SAAS,gBAAgB,+HAcxD,CAAA"}
|
|
@@ -2,4 +2,5 @@ export * from './calculateBridgeFees.ts';
|
|
|
2
2
|
export * from './generateBridgeEstimate.ts';
|
|
3
3
|
export * from './validateBridgeEstimate.ts';
|
|
4
4
|
export * from './validateBridgeEstimateExact.ts';
|
|
5
|
+
export * from './validateBridgeTransaction.ts';
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,kCAAkC,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,kCAAkC,CAAA;AAChD,cAAc,gCAAgC,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { BridgeIntent, TransactionBoundWitness, Transfer } from '@xyo-network/xl1-protocol';
|
|
2
|
+
import { type Config } from '@xyo-network/xl1-protocol-sdk';
|
|
3
|
+
/**
|
|
4
|
+
* Validates a bridge estimate by checking the intent and transfer against the provided configuration. This method
|
|
5
|
+
* exists to allow for "at least" validation of a bridge estimates in case we want to allow for some flexibility in
|
|
6
|
+
* the bridge estimate.
|
|
7
|
+
* @ param signedTransaction The signed transaction bound witness
|
|
8
|
+
* @param signedTxBw The signed transaction bound witness
|
|
9
|
+
* @param intent The BridgeIntent
|
|
10
|
+
* @param transfer The Transfer
|
|
11
|
+
* @param config The Config
|
|
12
|
+
* @returns True if the bridge estimate satisfies bridging conditions, false otherwise.
|
|
13
|
+
*/
|
|
14
|
+
export declare const validateBridgeTransaction: (signedTxBw: TransactionBoundWitness, intent: BridgeIntent, transfer: Transfer, config: Config) => Promise<boolean>;
|
|
15
|
+
//# sourceMappingURL=validateBridgeTransaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateBridgeTransaction.d.ts","sourceRoot":"","sources":["../../../src/util/validateBridgeTransaction.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EAAE,uBAAuB,EAAE,QAAQ,EAChD,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAE3D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,yBAAyB,GACpC,YAAY,uBAAuB,EACnC,QAAQ,YAAY,EACpB,UAAU,QAAQ,EAClB,QAAQ,MAAM,KACb,OAAO,CAAC,OAAO,CAajB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/chain-bridge",
|
|
3
|
-
"version": "1.17.
|
|
3
|
+
"version": "1.17.7",
|
|
4
4
|
"description": "XYO Layer One Bridge",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -61,9 +61,10 @@
|
|
|
61
61
|
"@xyo-network/archivist-view": "~5.2.17",
|
|
62
62
|
"@xyo-network/bios": "~7.2.0",
|
|
63
63
|
"@xyo-network/boundwitness-model": "~5.2.17",
|
|
64
|
-
"@xyo-network/
|
|
65
|
-
"@xyo-network/chain-
|
|
66
|
-
"@xyo-network/chain-
|
|
64
|
+
"@xyo-network/boundwitness-validator": "~5.2.17",
|
|
65
|
+
"@xyo-network/chain-protocol": "~1.17.7",
|
|
66
|
+
"@xyo-network/chain-services": "~1.17.7",
|
|
67
|
+
"@xyo-network/chain-telemetry": "~1.17.7",
|
|
67
68
|
"@xyo-network/manifest-model": "~5.2.17",
|
|
68
69
|
"@xyo-network/manifest-wrapper": "~5.2.17",
|
|
69
70
|
"@xyo-network/module-abstract": "~5.2.17",
|
|
@@ -79,8 +80,8 @@
|
|
|
79
80
|
"@xyo-network/wallet": "~5.2.17",
|
|
80
81
|
"@xyo-network/wallet-model": "~5.2.17",
|
|
81
82
|
"@xyo-network/xl1-protocol": "~1.14.17",
|
|
82
|
-
"@xyo-network/xl1-protocol-sdk": "~1.17.
|
|
83
|
-
"@xyo-network/xl1-rpc": "~1.17.
|
|
83
|
+
"@xyo-network/xl1-protocol-sdk": "~1.17.7",
|
|
84
|
+
"@xyo-network/xl1-rpc": "~1.17.7",
|
|
84
85
|
"async-mutex": "~0.5.0",
|
|
85
86
|
"compression": "~1.8.1",
|
|
86
87
|
"cors": "~2.8.5",
|
|
@@ -96,11 +97,11 @@
|
|
|
96
97
|
"@types/cors": "~2.8.19",
|
|
97
98
|
"@types/express": "5.0.6",
|
|
98
99
|
"@types/express-serve-static-core": "~5.1.0",
|
|
99
|
-
"@types/node": "~
|
|
100
|
+
"@types/node": "~25.0.1",
|
|
100
101
|
"@xylabs/mongo": "~5.0.51",
|
|
101
102
|
"@xylabs/sdk-js": "~5.0.51",
|
|
102
|
-
"@xylabs/ts-scripts-yarn3": "~7.2.
|
|
103
|
-
"@xylabs/tsconfig": "~7.2.
|
|
103
|
+
"@xylabs/ts-scripts-yarn3": "~7.2.30",
|
|
104
|
+
"@xylabs/tsconfig": "~7.2.30",
|
|
104
105
|
"@xylabs/vitest-extended": "~5.0.51",
|
|
105
106
|
"@xyo-network/account": "~5.2.17",
|
|
106
107
|
"@xyo-network/account-model": "~5.2.17",
|
|
@@ -111,9 +112,9 @@
|
|
|
111
112
|
"@xyo-network/bios": "~7.2.0",
|
|
112
113
|
"@xyo-network/bios-model": "~7.2.0",
|
|
113
114
|
"@xyo-network/boundwitness-builder": "~5.2.17",
|
|
114
|
-
"@xyo-network/chain-protocol": "~1.17.
|
|
115
|
-
"@xyo-network/chain-services": "~1.17.
|
|
116
|
-
"@xyo-network/chain-telemetry": "~1.17.
|
|
115
|
+
"@xyo-network/chain-protocol": "~1.17.7",
|
|
116
|
+
"@xyo-network/chain-services": "~1.17.7",
|
|
117
|
+
"@xyo-network/chain-telemetry": "~1.17.7",
|
|
117
118
|
"@xyo-network/manifest-wrapper": "~5.2.17",
|
|
118
119
|
"@xyo-network/module-abstract": "~5.2.17",
|
|
119
120
|
"@xyo-network/module-abstract-mongodb": "~5.2.17",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { RouteDefinition } from '@xylabs/express'
|
|
2
2
|
import { requestHandlerValidator } from '@xylabs/express'
|
|
3
|
-
import {
|
|
3
|
+
import { assertEx } from '@xylabs/sdk-js'
|
|
4
4
|
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
5
5
|
import { PayloadZodStrictOfSchema } from '@xyo-network/payload-model'
|
|
6
6
|
import { asSentinelInstance } from '@xyo-network/sentinel-model'
|
|
@@ -8,13 +8,12 @@ import type {
|
|
|
8
8
|
BridgeSourceObservation, BridgeSourceObservationFields, SignedHydratedTransaction,
|
|
9
9
|
} from '@xyo-network/xl1-protocol'
|
|
10
10
|
import {
|
|
11
|
-
BridgeIntentFieldsZod, BridgeIntentSchema, BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, SignedTransactionBoundWitnessZod,
|
|
12
|
-
TransferZod,
|
|
11
|
+
BridgeIntentFieldsZod, BridgeIntentSchema, BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, SignedTransactionBoundWitnessZod, TransferZod,
|
|
13
12
|
} from '@xyo-network/xl1-protocol'
|
|
14
13
|
import { type Config, flattenHydratedTransaction } from '@xyo-network/xl1-protocol-sdk'
|
|
15
14
|
import { z } from 'zod'
|
|
16
15
|
|
|
17
|
-
import { validateBridgeEstimateExact } from '../../../../../util/index.ts'
|
|
16
|
+
import { validateBridgeEstimateExact, validateBridgeTransaction } from '../../../../../util/index.ts'
|
|
18
17
|
import { getRemoteChainIdZod } from '../pathParams/index.ts'
|
|
19
18
|
|
|
20
19
|
export const makeBridgeToRemoteRoute = (config: Config): RouteDefinition => {
|
|
@@ -34,19 +33,14 @@ export const makeBridgeToRemoteRoute = (config: Config): RouteDefinition => {
|
|
|
34
33
|
path: '/bridge/chains/:chainId/bridgeToRemote',
|
|
35
34
|
handlers: validateRequest(async (req, res) => {
|
|
36
35
|
const [signedTxBw, bridgeIntent, transfer] = req.body
|
|
37
|
-
const { srcAddress } = bridgeIntent
|
|
38
36
|
const { node } = req.app
|
|
39
37
|
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
// if (!srcAddressValid) {
|
|
47
|
-
// res.status(400).send()
|
|
48
|
-
// return
|
|
49
|
-
// }
|
|
38
|
+
// Validate request
|
|
39
|
+
const transactionValid = await validateBridgeTransaction(signedTxBw, bridgeIntent, transfer, config)
|
|
40
|
+
if (!transactionValid) {
|
|
41
|
+
res.status(400).send()
|
|
42
|
+
return
|
|
43
|
+
}
|
|
50
44
|
|
|
51
45
|
// Validate estimate
|
|
52
46
|
const estimateValid = await validateBridgeEstimateExact(bridgeIntent, transfer, config)
|
package/src/util/index.ts
CHANGED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { asAddress, isDefined } from '@xylabs/sdk-js'
|
|
2
|
+
import {
|
|
3
|
+
addressesContains, BoundWitnessValidator, payloadHashesContainsAll,
|
|
4
|
+
} from '@xyo-network/boundwitness-validator'
|
|
5
|
+
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
6
|
+
import type {
|
|
7
|
+
BridgeIntent, TransactionBoundWitness, Transfer,
|
|
8
|
+
} from '@xyo-network/xl1-protocol'
|
|
9
|
+
import { type Config } from '@xyo-network/xl1-protocol-sdk'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Validates a bridge estimate by checking the intent and transfer against the provided configuration. This method
|
|
13
|
+
* exists to allow for "at least" validation of a bridge estimates in case we want to allow for some flexibility in
|
|
14
|
+
* the bridge estimate.
|
|
15
|
+
* @ param signedTransaction The signed transaction bound witness
|
|
16
|
+
* @param signedTxBw The signed transaction bound witness
|
|
17
|
+
* @param intent The BridgeIntent
|
|
18
|
+
* @param transfer The Transfer
|
|
19
|
+
* @param config The Config
|
|
20
|
+
* @returns True if the bridge estimate satisfies bridging conditions, false otherwise.
|
|
21
|
+
*/
|
|
22
|
+
export const validateBridgeTransaction = async (
|
|
23
|
+
signedTxBw: TransactionBoundWitness,
|
|
24
|
+
intent: BridgeIntent,
|
|
25
|
+
transfer: Transfer,
|
|
26
|
+
config: Config,
|
|
27
|
+
): Promise<boolean> => {
|
|
28
|
+
const { srcAddress } = intent
|
|
29
|
+
|
|
30
|
+
const errors = await new BoundWitnessValidator(signedTxBw).validate()
|
|
31
|
+
if (isDefined(errors) && errors.length > 0) return false
|
|
32
|
+
|
|
33
|
+
const sender = asAddress(srcAddress, true)
|
|
34
|
+
if (!addressesContains(signedTxBw, sender)) return false
|
|
35
|
+
|
|
36
|
+
const hashes = await PayloadBuilder.hashes([intent, transfer])
|
|
37
|
+
if (!payloadHashesContainsAll(signedTxBw, hashes)) return false
|
|
38
|
+
|
|
39
|
+
return true
|
|
40
|
+
}
|