@xyo-network/chain-bridge 1.19.14 → 1.19.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/dist/node/BridgeActor.d.ts +3 -2
  2. package/dist/node/BridgeActor.d.ts.map +1 -1
  3. package/dist/node/config/getBridgeEscrowAddress.d.ts +3 -3
  4. package/dist/node/config/getBridgeEscrowAddress.d.ts.map +1 -1
  5. package/dist/node/config/getBridgeFeesAddress.d.ts +3 -3
  6. package/dist/node/config/getBridgeFeesAddress.d.ts.map +1 -1
  7. package/dist/node/config/getBridgeSettings.d.ts +2 -2
  8. package/dist/node/config/getBridgeSettings.d.ts.map +1 -1
  9. package/dist/node/config/getBridgeWalletAccount.d.ts +3 -3
  10. package/dist/node/config/getBridgeWalletAccount.d.ts.map +1 -1
  11. package/dist/node/config/getFeeStructure.d.ts +2 -2
  12. package/dist/node/config/getFeeStructure.d.ts.map +1 -1
  13. package/dist/node/config/getGateway.d.ts +3 -2
  14. package/dist/node/config/getGateway.d.ts.map +1 -1
  15. package/dist/node/config/getMaxBridgeAmount.d.ts +2 -2
  16. package/dist/node/config/getMaxBridgeAmount.d.ts.map +1 -1
  17. package/dist/node/config/getMinBridgeAmount.d.ts +2 -2
  18. package/dist/node/config/getMinBridgeAmount.d.ts.map +1 -1
  19. package/dist/node/config/getRemoteChainId.d.ts +3 -2
  20. package/dist/node/config/getRemoteChainId.d.ts.map +1 -1
  21. package/dist/node/config/getRemoteTokenAddress.d.ts +2 -2
  22. package/dist/node/config/getRemoteTokenAddress.d.ts.map +1 -1
  23. package/dist/node/config/getTransferAddresses.d.ts +2 -2
  24. package/dist/node/config/getTransferAddresses.d.ts.map +1 -1
  25. package/dist/node/config/getXl1ChainId.d.ts +3 -2
  26. package/dist/node/config/getXl1ChainId.d.ts.map +1 -1
  27. package/dist/node/config/getXl1TokenAddress.d.ts +2 -2
  28. package/dist/node/config/getXl1TokenAddress.d.ts.map +1 -1
  29. package/dist/node/index.mjs +178 -624
  30. package/dist/node/index.mjs.map +1 -1
  31. package/dist/node/interface/service/Relay/LiquidityPoolBridgeRelay/LiquidityPoolBridgeRelay.d.ts +1 -1
  32. package/dist/node/interface/service/Relay/LiquidityPoolBridgeRelay/LiquidityPoolBridgeRelay.d.ts.map +1 -1
  33. package/dist/node/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/EVMLiquidityBridgeTransactionCompletionMonitorSentinel.d.ts +1 -2
  34. package/dist/node/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/EVMLiquidityBridgeTransactionCompletionMonitorSentinel.d.ts.map +1 -1
  35. package/dist/node/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.d.ts +1 -2
  36. package/dist/node/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.d.ts.map +1 -1
  37. package/dist/node/queue/connection.d.ts +2 -2
  38. package/dist/node/queue/connection.d.ts.map +1 -1
  39. package/dist/node/queue/workers/EthTransactionPreparation.d.ts.map +1 -1
  40. package/dist/node/queue/workers/util/index.d.ts +2 -0
  41. package/dist/node/queue/workers/util/index.d.ts.map +1 -1
  42. package/dist/node/queue/workers/util/validateSufficientAllowance.d.ts +19 -0
  43. package/dist/node/queue/workers/util/validateSufficientAllowance.d.ts.map +1 -0
  44. package/dist/node/queue/workers/util/validateSufficientBalance.d.ts +19 -0
  45. package/dist/node/queue/workers/util/validateSufficientBalance.d.ts.map +1 -0
  46. package/dist/node/server/addFlowProducer.d.ts +2 -2
  47. package/dist/node/server/addFlowProducer.d.ts.map +1 -1
  48. package/dist/node/server/addWorkers.d.ts +2 -2
  49. package/dist/node/server/addWorkers.d.ts.map +1 -1
  50. package/dist/node/server/app.d.ts +3 -3
  51. package/dist/node/server/app.d.ts.map +1 -1
  52. package/dist/node/server/index.d.ts +0 -2
  53. package/dist/node/server/index.d.ts.map +1 -1
  54. package/dist/node/server/routes/addRoutes.d.ts +3 -2
  55. package/dist/node/server/routes/addRoutes.d.ts.map +1 -1
  56. package/dist/node/server/routes/bridge/addBridgeRoutes.d.ts +3 -2
  57. package/dist/node/server/routes/bridge/addBridgeRoutes.d.ts.map +1 -1
  58. package/dist/node/server/routes/bridge/routeDefinitions/getRouteDefinitions.d.ts +3 -2
  59. package/dist/node/server/routes/bridge/routeDefinitions/getRouteDefinitions.d.ts.map +1 -1
  60. package/dist/node/server/routes/bridge/routeDefinitions/pathParams/ChainIdPathParam.d.ts +2 -2
  61. package/dist/node/server/routes/bridge/routeDefinitions/pathParams/ChainIdPathParam.d.ts.map +1 -1
  62. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeConfig.d.ts +2 -2
  63. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeConfig.d.ts.map +1 -1
  64. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeFromRemoteStatus.d.ts +2 -2
  65. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeFromRemoteStatus.d.ts.map +1 -1
  66. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.d.ts +3 -3
  67. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.d.ts.map +1 -1
  68. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.d.ts +4 -3
  69. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.d.ts.map +1 -1
  70. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.d.ts +2 -2
  71. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.d.ts.map +1 -1
  72. package/dist/node/server/server.d.ts +3 -10
  73. package/dist/node/server/server.d.ts.map +1 -1
  74. package/dist/node/{manifest → services}/getIterableMap.d.ts +2 -2
  75. package/dist/node/services/getIterableMap.d.ts.map +1 -0
  76. package/dist/node/services/getServices.d.ts +9 -0
  77. package/dist/node/services/getServices.d.ts.map +1 -0
  78. package/dist/node/services/index.d.ts +1 -0
  79. package/dist/node/services/index.d.ts.map +1 -1
  80. package/dist/node/util/BridgeFees.d.ts +7 -0
  81. package/dist/node/util/BridgeFees.d.ts.map +1 -0
  82. package/dist/node/util/bridgeFeesAsBigInt.d.ts +7 -0
  83. package/dist/node/util/bridgeFeesAsBigInt.d.ts.map +1 -0
  84. package/dist/node/util/calculateBridgeFees.d.ts +4 -8
  85. package/dist/node/util/calculateBridgeFees.d.ts.map +1 -1
  86. package/dist/node/util/createBridgeTransfer.d.ts +14 -0
  87. package/dist/node/util/createBridgeTransfer.d.ts.map +1 -0
  88. package/dist/node/util/generateBridgeEstimate.d.ts +3 -2
  89. package/dist/node/util/generateBridgeEstimate.d.ts.map +1 -1
  90. package/dist/node/util/index.d.ts +3 -0
  91. package/dist/node/util/index.d.ts.map +1 -1
  92. package/dist/node/util/validateBridgeEstimate.d.ts +3 -2
  93. package/dist/node/util/validateBridgeEstimate.d.ts.map +1 -1
  94. package/dist/node/util/validateBridgeEstimateExact.d.ts +3 -2
  95. package/dist/node/util/validateBridgeEstimateExact.d.ts.map +1 -1
  96. package/dist/node/util/validateBridgeTransaction.d.ts +3 -2
  97. package/dist/node/util/validateBridgeTransaction.d.ts.map +1 -1
  98. package/package.json +46 -59
  99. package/src/BridgeActor.ts +3 -3
  100. package/src/config/getBridgeEscrowAddress.ts +5 -5
  101. package/src/config/getBridgeFeesAddress.ts +5 -5
  102. package/src/config/getBridgeSettings.ts +2 -2
  103. package/src/config/getBridgeWalletAccount.ts +7 -4
  104. package/src/config/getFeeStructure.ts +3 -3
  105. package/src/config/getGateway.ts +5 -4
  106. package/src/config/getMaxBridgeAmount.ts +3 -3
  107. package/src/config/getMinBridgeAmount.ts +3 -3
  108. package/src/config/getRemoteChainId.ts +4 -3
  109. package/src/config/getRemoteTokenAddress.ts +3 -3
  110. package/src/config/getTransferAddresses.ts +2 -2
  111. package/src/config/getXl1ChainId.ts +4 -3
  112. package/src/config/getXl1TokenAddress.ts +3 -3
  113. package/src/interface/service/Observer/LiquidityPoolBridgeObserver/LiquidityPoolBridgeObserver.ts +1 -1
  114. package/src/interface/service/Relay/LiquidityPoolBridgeRelay/LiquidityPoolBridgeRelay.ts +1 -1
  115. package/src/interface/util/getBridgeIntentIdentifier.ts +1 -1
  116. package/src/modules/EVMLiquidityBridgeTransactionCompletionMonitorSentinel/EVMLiquidityBridgeTransactionCompletionMonitorSentinel.ts +2 -3
  117. package/src/modules/XL1TransactionCompletionMonitorSentinel/XL1TransactionCompletionMonitorSentinel.ts +2 -3
  118. package/src/queue/connection.ts +3 -3
  119. package/src/queue/workers/EthTransactionMonitor.ts +1 -1
  120. package/src/queue/workers/EthTransactionPreparation.ts +14 -4
  121. package/src/queue/workers/EthTransactionSubmission.ts +1 -1
  122. package/src/queue/workers/Xl1TransactionMonitor.ts +1 -1
  123. package/src/queue/workers/Xl1TransactionPreparation.ts +1 -1
  124. package/src/queue/workers/Xl1TransactionSubmission.ts +1 -1
  125. package/src/queue/workers/util/index.ts +2 -0
  126. package/src/queue/workers/util/submitEthTransaction.ts +1 -1
  127. package/src/queue/workers/util/validateSufficientAllowance.ts +38 -0
  128. package/src/queue/workers/util/validateSufficientBalance.ts +37 -0
  129. package/src/server/addFlowProducer.ts +2 -2
  130. package/src/server/addWorkers.ts +2 -2
  131. package/src/server/app.ts +3 -4
  132. package/src/server/index.ts +2 -2
  133. package/src/server/routes/addRoutes.ts +3 -2
  134. package/src/server/routes/bridge/addBridgeRoutes.ts +3 -2
  135. package/src/server/routes/bridge/routeDefinitions/getRouteDefinitions.ts +3 -2
  136. package/src/server/routes/bridge/routeDefinitions/pathParams/ChainIdPathParam.ts +3 -2
  137. package/src/server/routes/bridge/routeDefinitions/routes/bridgeConfig.ts +3 -2
  138. package/src/server/routes/bridge/routeDefinitions/routes/bridgeFromRemoteStatus.ts +4 -3
  139. package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts +6 -4
  140. package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.ts +4 -3
  141. package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.ts +4 -5
  142. package/src/server/server.ts +7 -48
  143. package/src/{manifest → services}/getIterableMap.ts +2 -2
  144. package/src/{manifest → services}/getServices.ts +9 -13
  145. package/src/services/index.ts +1 -0
  146. package/src/util/BridgeFees.ts +7 -0
  147. package/src/util/bridgeFeesAsBigInt.ts +15 -0
  148. package/src/util/calculateBridgeFees.ts +5 -11
  149. package/src/util/createBridgeTransfer.ts +31 -0
  150. package/src/util/generateBridgeEstimate.ts +9 -17
  151. package/src/util/index.ts +3 -0
  152. package/src/util/validateBridgeEstimate.ts +4 -5
  153. package/src/util/validateBridgeEstimateExact.ts +4 -5
  154. package/src/util/validateBridgeTransaction.ts +4 -3
  155. package/dist/node/indexers/index.d.ts +0 -2
  156. package/dist/node/indexers/index.d.ts.map +0 -1
  157. package/dist/node/manifest/getIterableMap.d.ts.map +0 -1
  158. package/dist/node/manifest/getModuleLocator.d.ts +0 -15
  159. package/dist/node/manifest/getModuleLocator.d.ts.map +0 -1
  160. package/dist/node/manifest/getNode.d.ts +0 -15
  161. package/dist/node/manifest/getNode.d.ts.map +0 -1
  162. package/dist/node/manifest/getServices.d.ts +0 -13
  163. package/dist/node/manifest/getServices.d.ts.map +0 -1
  164. package/dist/node/manifest/index.d.ts +0 -7
  165. package/dist/node/manifest/index.d.ts.map +0 -1
  166. package/dist/node/manifest/nodeManifest.d.ts +0 -6
  167. package/dist/node/manifest/nodeManifest.d.ts.map +0 -1
  168. package/dist/node/manifest/private/index.d.ts +0 -5
  169. package/dist/node/manifest/private/index.d.ts.map +0 -1
  170. package/dist/node/manifest/public/index.d.ts +0 -14
  171. package/dist/node/manifest/public/index.d.ts.map +0 -1
  172. package/dist/node/server/routes/dataLake/addDataLakeRoutes.d.ts +0 -3
  173. package/dist/node/server/routes/dataLake/addDataLakeRoutes.d.ts.map +0 -1
  174. package/dist/node/server/routes/dataLake/archivistMiddleware.d.ts +0 -10
  175. package/dist/node/server/routes/dataLake/archivistMiddleware.d.ts.map +0 -1
  176. package/dist/node/server/routes/dataLake/index.d.ts +0 -2
  177. package/dist/node/server/routes/dataLake/index.d.ts.map +0 -1
  178. package/src/indexers/index.ts +0 -1
  179. package/src/manifest/getModuleLocator.ts +0 -153
  180. package/src/manifest/getNode.ts +0 -40
  181. package/src/manifest/index.ts +0 -6
  182. package/src/manifest/node.json +0 -17
  183. package/src/manifest/nodeManifest.ts +0 -8
  184. package/src/manifest/private/index.ts +0 -4
  185. package/src/manifest/public/Ethereum.json +0 -48
  186. package/src/manifest/public/XL1.json +0 -48
  187. package/src/manifest/public/index.ts +0 -23
  188. package/src/server/routes/dataLake/addDataLakeRoutes.ts +0 -9
  189. package/src/server/routes/dataLake/archivistMiddleware.ts +0 -85
  190. package/src/server/routes/dataLake/index.ts +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/BridgeActor.ts","../../src/server/app.ts","../../src/queue/connection.ts","../../src/queue/flowProducer.ts","../../src/queue/workers/createWorkers.ts","../../src/queue/workers/EthTransactionMonitor.ts","../../src/queue/workers/EthTransactionPreparation.ts","../../src/queue/workers/EthTransactionSubmission.ts","../../src/queue/workers/util/submitEthTransaction.ts","../../src/queue/workers/util/submitXl1Transaction.ts","../../src/queue/workers/Xl1ToEthBridgeParent.ts","../../src/queue/workers/Xl1TransactionMonitor.ts","../../src/queue/workers/Xl1TransactionPreparation.ts","../../src/queue/workers/Xl1TransactionSubmission.ts","../../src/queue/flows/createXl1ToEthBridgeJob.ts","../../src/server/addFlowProducer.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/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/getModuleLocator.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/getServices.ts","../../src/manifest/getIterableMap.ts","../../src/server/addWorkers.ts"],"sourcesContent":["import { Server } from 'node:http'\n\nimport { creatable } from '@xylabs/sdk-js'\nimport {\n ActorParamsV3,\n ActorV3,\n Config,\n XyoGatewayRunner,\n XyoGatewayRunnerMoniker,\n} from '@xyo-network/xl1-sdk'\n\nimport { getServer } from './server/index.ts'\n\nexport type BridgeActorParams = ActorParamsV3<{\n config: Config\n}>\n\n@creatable()\nexport class BridgeActor extends ActorV3<BridgeActorParams> {\n protected _gatewayRunner!: XyoGatewayRunner\n private server?: Server\n\n protected get gatewayRunner() {\n return this._gatewayRunner\n }\n\n override async createHandler() {\n await super.createHandler()\n this._gatewayRunner = await this.locator.getInstance(XyoGatewayRunnerMoniker)\n }\n\n override async startHandler() {\n await super.startHandler()\n this.stopServer()\n await this.startServer()\n }\n\n override async stopHandler() {\n await super.stopHandler()\n this.stopServer()\n }\n\n private async startServer() {\n this.server = await getServer(this.context, this._gatewayRunner)\n }\n\n private stopServer() {\n this.server?.close()\n this.server = undefined\n }\n}\n","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, XyoGatewayRunner } from '@xyo-network/xl1-sdk'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport { addFlowProducer } from './addFlowProducer.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = (node: NodeInstance, config: Config, gateway: XyoGatewayRunner): 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 addFlowProducer(app, config)\n addRoutes(app, config, gateway)\n app.use(standardErrors)\n return app\n}\n","import { isDefined } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-sdk'\nimport { Redis } from 'ioredis'\n\nlet connection: Redis | undefined\n\nconst maxRetriesPerRequest = null\n\nexport const getConnection = (config: Config) => {\n if (isDefined(connection)) return connection\n const { redisHost: host, redisPort: port } = config.actors.bridge\n connection = new Redis({\n host, port, maxRetriesPerRequest,\n })\n return connection\n}\n","import { isDefined } from '@xylabs/sdk-js'\nimport { FlowProducer } from 'bullmq'\nimport type { Redis } from 'ioredis'\n\nlet flowProducer: FlowProducer | undefined\n\nexport const getFlowProducer = (connection: Redis) => {\n if (isDefined(flowProducer)) return flowProducer\n flowProducer = new FlowProducer({ connection })\n return flowProducer\n}\n","import type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport {\n EthTransactionMonitor,\n EthTransactionPreparation,\n EthTransactionSubmission,\n Xl1ToEthBridgeParent,\n Xl1TransactionMonitor,\n Xl1TransactionPreparation,\n Xl1TransactionSubmission,\n} from './index.ts'\n\nexport const createWorkers = (connection: Redis, services: IBridgeServiceCollection) => {\n Xl1ToEthBridgeParent.createWorker(connection)\n Xl1TransactionPreparation.createWorker(connection, services)\n Xl1TransactionSubmission.createWorker(connection, services)\n Xl1TransactionMonitor.createWorker(connection, services)\n EthTransactionPreparation.createWorker(connection, services)\n EthTransactionSubmission.createWorker(connection, services)\n EthTransactionMonitor.createWorker(connection, services)\n}\n","import { assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\n\ntype JobData = { tx: SignedHydratedTransaction }\ninterface ReturnType {\n blockHash: string\n blockNumber: number\n}\n\nconst name = 'Monitor Submitted ETH Transaction'\nconst queueName = 'eth-tx-monitor'\nconst createWorker = (connection: Redis, services?: IBridgeServiceCollection) => {\n const provider = assertEx(services?.provider, () => 'provider service not provided')\n const stateMap = assertEx(services?.ethTxStateMap, () => 'ethTxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Job<JobData, ReturnType>) => {\n const { tx } = job.data\n const hash = await PayloadBuilder.hash(tx[0])\n const state = assertEx(await stateMap.get(hash), () => 'State not found')\n const submissionHash = assertEx(state?.submissionHash, () => 'submissionHash not found')\n const receipt = assertEx(await provider.getTransactionReceipt(submissionHash), () => 'Transaction receipt not found')\n await job.log(`[${hash}] confirmed ETH tx ${submissionHash} in block ${receipt.blockNumber}`)\n const { blockHash, blockNumber } = receipt\n state.confirmationHash = blockHash\n await stateMap.set(hash, state)\n return { blockHash, blockNumber }\n },\n { connection },\n )\n\n worker.on('failed', (job, err) => {\n console.error(`[${name}] Job ${job?.id} failed:`, err.message)\n })\n\n worker.on('error', (err) => {\n console.error(`[${name}] Worker error:`, err)\n })\n}\n\nexport const EthTransactionMonitor: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import { assertEx, hexToBigInt } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport {\n isBridgeIntent, isSignedTransactionBoundWitness, type SignedHydratedTransaction,\n} from '@xyo-network/xl1-sdk'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport { getAddress } from 'ethers'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\n\ntype JobData = { tx: SignedHydratedTransaction }\n\ninterface ReturnType {}\n\nconst name = 'Prepare ETH Transaction'\nconst queueName = 'eth-tx-prepare'\n\nexport const createWorker = (connection: Redis, services?: IBridgeServiceCollection) => {\n const bridge = assertEx(services?.bridge, () => 'bridge service not provided')\n const stateMap = assertEx(services?.ethTxStateMap, () => 'ethTxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Job<JobData, ReturnType>) => {\n const { tx } = job.data\n const hash = await PayloadBuilder.hash(tx[0])\n await job.log(`[${hash}] preparing ETH transaction`)\n await job.log(`[${hash}] building ETH transaction`)\n const bridgeIntent = assertEx(tx[1].find(isBridgeIntent), () => 'No bridge intent found')\n const amount = hexToBigInt(bridgeIntent.destAmount)\n const srcAddress = getAddress(bridgeIntent.srcAddress)\n const destAddress = getAddress(bridgeIntent.destAddress)\n const nonce = hexToBigInt(await PayloadBuilder.hash(tx[0]))\n const preparedTx = await bridge.getFunction('bridgeFromRemote').populateTransaction(srcAddress, destAddress, amount, nonce)\n await job.log(`[${hash}] built ETH transaction`)\n await job.log(`[${hash}] storing ETH preparedTx`)\n await stateMap.set(hash, { preparedTx })\n await job.log(`[${hash}] stored ETH preparedTx`)\n await job.log(`[${hash}] prepared ETH transaction`)\n return {}\n },\n { connection },\n )\n\n worker.on('failed', (job, err) => {\n console.error(`[${name}] Job ${job?.id} failed:`, err.message)\n })\n\n worker.on('error', (err) => {\n console.error(`[${name}] Worker error:`, err)\n })\n}\n\nexport const EthTransactionPreparation: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { type SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { Redis } from 'ioredis'\n\nimport type { EthTxState, IBridgeServiceCollection } from '../../services/index.ts'\nimport { submitEthTransaction } from './util/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\n\ntype JobData = { tx: SignedHydratedTransaction }\n\ninterface ReturnType {\n submissionHash: Required<EthTxState>['submissionHash']\n}\n\nconst name = 'Submit ETH Transaction'\nconst queueName = 'eth-tx-submit'\nconst createWorker = (connection: Redis, services?: IBridgeServiceCollection) => {\n const bridge = assertEx(services?.bridge, () => 'bridge service not provided')\n const bridgeableToken = assertEx(services?.bridgeableToken, () => 'bridgeableToken service not provided')\n const wallet = assertEx(services?.wallet, () => 'wallet service not provided')\n const stateMap = assertEx(services?.ethTxStateMap, () => 'ethTxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Job<JobData, ReturnType>) => {\n const { tx } = job.data\n const hash = await PayloadBuilder.hash(tx[0])\n const state = assertEx(await stateMap.get(hash), () => `[${hash}] state not found`)\n const preparedTx = assertEx(state?.preparedTx, () => `[${hash}] preparedTx not found`)\n\n // Idempotency check against resubmission\n const { submissionHash: existingSubmissionHash } = state\n if (isDefined(existingSubmissionHash)) {\n await job.log(`[${hash}] Tx already submitted with submission response hash ${existingSubmissionHash}`)\n return { submissionHash: existingSubmissionHash }\n }\n\n // Submit the transaction to the Ethereum network\n await job.log(`[${hash}] Submitting ETH tx`)\n // const submissionResponse = await wallet.sendTransaction(preparedTx)\n // const submissionHash = submissionResponse.hash\n\n const submissionHash = assertEx(await submitEthTransaction(tx, bridgeableToken, bridge, wallet), () => `[${hash}] submissionHash not found in receipt`)\n\n await job.log(`[${hash}] Submitted ETH tx and received submission response hash ${submissionHash}`)\n\n // Store the submission hash in the state\n await job.log(`[${hash}] Storing ETH submissionHash`)\n state.submissionHash = submissionHash\n await stateMap.set(hash, state)\n await job.log(`[${hash}] Stored ETH submissionHash`)\n\n return { submissionHash }\n // const hash = await PayloadBuilder.hash(tx[0])\n // await job.log(`[${hash}] Obtaining bridge intent from tx`)\n // const bridgeIntent = assertEx(tx[1].find(isBridgeIntent), () => 'No bridge intent found in transaction payload')\n // await job.log(`[${hash}] submitting ETH transaction`)\n // const amount = hexToBigInt(bridgeIntent.destAmount)\n // const srcAddress = getAddress(bridgeIntent.srcAddress)\n // const destAddress = getAddress(bridgeIntent.destAddress)\n // const tx = await bridge.bridgeFromRemote(srcAddress, destAddress, amount)\n // // const nonce = await wallet.getNonce()\n // // const tx = await bridge.bridgeFromRemote(srcAddress, destAddress, amount, { nonce })\n // await job.log(`[${hash}] submitted ETH transaction`)\n // const confirmation = await tx.wait()\n // const transactionResponse = await confirmation?.getTransaction()\n // const destConfirmation = asHex(transactionResponse?.hash ?? '', true)\n // const block = await transactionResponse?.getBlock()\n // await job.log(`[${hash}] confirmed ETH transaction with hash ${destConfirmation} in block ${block?.number}`)\n // const { schema, ...rest } = bridgeIntent\n // const result: BridgeDestinationObservation = new PayloadBuilder<BridgeDestinationObservation>({ schema: BridgeDestinationObservationSchema })\n // .fields({ ...rest, destConfirmation }).build()\n // return result\n },\n { connection, concurrency: 1 },\n )\n\n worker.on('failed', (job, err) => {\n console.error(`[${name}] Job ${job?.id} failed:`, err.message)\n })\n\n worker.on('error', (err) => {\n console.error(`[${name}] Worker error:`, err)\n })\n}\n\nexport const EthTransactionSubmission: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import {\n assertEx, hexToBigInt, toEthAddress,\n} from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { BridgeableToken, LiquidityPoolBridge } from '@xyo-network/typechain'\nimport { isBridgeIntent, type SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { Wallet } from 'ethers'\n\nexport const submitEthTransaction = async (tx: SignedHydratedTransaction, bridgeableToken: BridgeableToken, bridge: LiquidityPoolBridge, wallet: Wallet) => {\n // Approve the bridge to spend tokens\n const xl1Transaction = assertEx(tx[0], () => 'No corresponding XL1 transaction found')\n const bridgeIntent = assertEx(tx[1].find(isBridgeIntent), () => 'No bridge intent found')\n const srcAddress = toEthAddress(bridgeIntent.srcAddress)\n const destAddress = toEthAddress(bridgeIntent.destAddress)\n const amount = hexToBigInt(bridgeIntent.destAmount)\n const nonce = hexToBigInt(await PayloadBuilder.hash(xl1Transaction))\n // Assume approval has already been done out of band for simplicity\n // const contractApprovalTx = await bridgeableToken.connect(wallet).approve(bridge.getAddress(), amount)\n // await contractApprovalTx.wait(1)\n\n // Send tokens to bridge\n const bridgeTx = await bridge.connect(wallet).bridgeFromRemote(srcAddress, destAddress, amount, nonce)\n const receipt = await bridgeTx.wait(1)\n return receipt?.hash\n}\n","import { type BrandedHash } from '@xylabs/sdk-js'\nimport {\n isAllowedBlockPayload, type SignedHydratedTransaction, type XyoGatewayRunner,\n} from '@xyo-network/xl1-sdk'\n\nexport const submitXl1Transaction = async (\n preparedTx: SignedHydratedTransaction,\n gateway: XyoGatewayRunner,\n): Promise<[BrandedHash, SignedHydratedTransaction]> => {\n // Option 1: Add payloads to chain with addPayloadsToChain\n // Not optimal as it requires reconstructing the transaction from the on-chain payloads, which changes the tx hash\n // const offChainPayloads = preparedTx[1].filter(p => !isAllowedBlockPayload(p))\n // const onChainPayloads = preparedTx[1].filter(isAllowedBlockPayload)\n // const result = await gateway.addPayloadsToChain(onChainPayloads, offChainPayloads)\n // return result\n\n // Option 2: Add transaction to chain with addTransactionToChain\n // Fails due to resigning of transaction in addTransactionToChain, which causes `from` to be invalid\n const offChainPayloads = preparedTx[1].filter(p => !isAllowedBlockPayload(p))\n const result = await gateway.addTransactionToChain(preparedTx, offChainPayloads)\n return result\n\n // Option 3: Add transaction to chain with addTransactionToChain, but bypass resigning by passing the preparedTx as an unsigned transaction\n // const runner = assertEx(gateway.connection.runner, () => 'No runner available on gateway connection')\n // const result = await runner.broadcastTransaction(preparedTx)\n // return [result, preparedTx]\n}\n","import type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { Redis } from 'ioredis'\n\nimport type { WorkerDescription } from './WorkerDescription.ts'\n\nconst name = 'Bridge XL1 to Ethereum'\nconst queueName = 'xl1-to-eth-bridge'\nconst createWorker = (connection: Redis) => {\n const worker = new Worker(\n queueName,\n async (job: Job) => {\n await job.log(`[${job.name}] start`)\n // Parent job has no work other than waiting on children\n await job.log(`[${job.name}] done`)\n // const values = await job.getChildrenValues()\n return { ok: true }\n },\n { connection },\n )\n\n worker.on('failed', (job, err) => {\n console.error(`[${name}] Job ${job?.id} failed:`, err.message)\n })\n\n worker.on('error', (err) => {\n console.error(`[${name}] Worker error:`, err)\n })\n}\n\nexport const Xl1ToEthBridgeParent: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import {\n assertEx, isDefined, isNull,\n} from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { Job } from 'bullmq'\nimport { UnrecoverableError, Worker } from 'bullmq'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\n\ntype JobData = { tx: SignedHydratedTransaction }\n\ninterface ReturnType {\n}\n\nconst name = 'Monitor Submitted XL1 Transaction'\nconst queueName = 'xl1-tx-monitor'\nconst createWorker = (connection: Redis, services?: IBridgeServiceCollection) => {\n const gateway = assertEx(services?.gateway, () => 'gateway service not provided')\n const stateMap = assertEx(services?.xl1TxStateMap, () => 'xl1TxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Job<JobData, ReturnType>) => {\n const { tx } = job.data\n // Get the hash of the transaction\n const hash = await PayloadBuilder.hash(tx[0])\n // Get the state of the transaction\n const viewer = assertEx(gateway.connection.viewer, () => `[${hash}] viewer not defined on gateway`)\n const state = assertEx(await stateMap.get(hash), () => `[${hash}] state not found`)\n const submissionHash = assertEx(state?.submissionHash, () => `[${hash}] submissionHash not found`)\n\n // Check for transaction inclusion on chain\n await job.log(`[${hash}] Checking for XL1 transaction inclusion on chain`)\n const foundTx = await viewer.transactionByHash(submissionHash)\n\n // Transaction found on chain\n if (isDefined(foundTx) && !isNull(foundTx)) {\n await job.log(`[${hash}] Found transaction on chain`)\n // Store the block hash\n state.confirmationHash = await PayloadBuilder.hash(foundTx[0])\n await stateMap.set(hash, state)\n return {}\n }\n\n // Check for transaction expiration\n const currentBlockNumber = await viewer.currentBlockNumber()\n if (tx[0].exp < currentBlockNumber) {\n await job.log(\n `[${hash}] Transaction expired at block ${tx[0].exp}, current block ${currentBlockNumber}`,\n )\n // Throw unrecoverable error to stop retries\n throw new UnrecoverableError(`[${hash}] Transaction expired and will never be included`)\n }\n\n // Transaction not yet found, but still valid — retry later\n await job.log(`[${hash}] Transaction not yet included, retrying later`)\n throw new Error(`[${hash}] Transaction not yet included`)\n },\n { connection },\n )\n\n worker.on('failed', (job, err) => {\n console.error(`[${name}] Job ${job?.id} failed:`, err.message)\n })\n\n worker.on('error', (err) => {\n console.error(`[${name}] Worker error:`, err)\n })\n}\n\nexport const Xl1TransactionMonitor: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import { assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\n\ntype JobData = { tx: SignedHydratedTransaction }\n\ninterface ReturnType {}\n\nconst name = 'Prepare XL1 Transaction'\nconst queueName = 'xl1-tx-prepare'\nconst createWorker = (connection: Redis, services?: IBridgeServiceCollection) => {\n const stateMap = assertEx(services?.xl1TxStateMap, () => 'xl1TxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Job<JobData, ReturnType>) => {\n const { tx } = job.data\n const hash = await PayloadBuilder.hash(tx[0])\n await job.log(`[${hash}] preparing XL1 transaction`)\n const preparedTx = tx\n await job.log(`[${hash}] storing XL1 preparedTx`)\n await stateMap.set(hash, { preparedTx })\n await job.log(`[${hash}] stored XL1 preparedTx`)\n await job.log(`[${hash}] prepared XL1 transaction`)\n return {}\n },\n { connection },\n )\n\n worker.on('failed', (job, err) => {\n console.error(`[${name}] Job ${job?.id} failed:`, err.message)\n })\n\n worker.on('error', (err) => {\n console.error(`[${name}] Worker error:`, err)\n })\n}\n\nexport const Xl1TransactionPreparation: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { type SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection, Xl1TxState } from '../../services/index.ts'\nimport { submitXl1Transaction } from './util/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\n\ntype JobData = { tx: SignedHydratedTransaction }\n\ninterface ReturnType {\n submissionHash: Required<Xl1TxState>['submissionHash']\n}\n\nconst name = 'Submit XL1 Transaction'\nconst queueName = 'xl1-tx-submit'\nconst createWorker = (connection: Redis, services?: IBridgeServiceCollection) => {\n const gateway = assertEx(services?.gateway, () => 'gateway service not provided')\n const stateMap = assertEx(services?.xl1TxStateMap, () => 'xl1TxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Job<JobData, ReturnType>) => {\n const { tx } = job.data\n // Get the hash of the transaction\n const hash = await PayloadBuilder.hash(tx[0])\n // Get the state of the transaction\n const state = assertEx(await stateMap.get(hash), () => `[${hash}] state not found`)\n const preparedTx = assertEx(state?.preparedTx, () => `[${hash}] preparedTx not found`)\n\n // Idempotency check against resubmission\n const { submissionHash: existingSubmissionHash } = state\n if (isDefined(existingSubmissionHash)) {\n await job.log(`[${hash}] Tx already submitted with submission response hash ${existingSubmissionHash}`)\n return { submissionHash: existingSubmissionHash }\n }\n\n // Submit the transaction to the XL1 network\n await job.log(`[${hash}] Submitting XL1 tx`)\n const [submissionHash] = await submitXl1Transaction(preparedTx, gateway)\n\n // Ensure the submission hash matches the expected hash\n // assertEx(submissionHash === hash, () => `[${hash}] Submitted transaction hash ${submissionHash} does not match expected hash`)\n await job.log(`[${hash}] Submitted XL1 tx`)\n\n // Store the submission hash in the state\n await job.log(`[${hash}] Storing XL1 submissionHash`)\n state.submissionHash = submissionHash\n await stateMap.set(hash, state)\n await job.log(`[${hash}] Stored XL1 submissionHash`)\n\n return { submissionHash }\n },\n { connection },\n )\n\n worker.on('failed', (job, err) => {\n console.error(`[${name}] Job ${job?.id} failed:`, err.message)\n })\n\n worker.on('error', (err) => {\n console.error(`[${name}] Worker error:`, err)\n })\n}\n\nexport const Xl1TransactionSubmission: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import type { SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { FlowProducer } from 'bullmq'\n\nimport {\n EthTransactionMonitor, EthTransactionPreparation, EthTransactionSubmission, Xl1ToEthBridgeParent, Xl1TransactionMonitor, Xl1TransactionPreparation,\n Xl1TransactionSubmission,\n} from '../workers/index.ts'\n\n/**\n * Creates a job flow for bridging a transaction from XL1 to Ethereum.\n * @param flowProducer The flow producer to run the job\n * @param tx The bridge transaction\n * @returns The JobNode representing the XL1 to ETH bridge job\n */\nexport const createXl1ToEthBridgeJob = async (\n flowProducer: FlowProducer,\n tx: SignedHydratedTransaction,\n) => {\n const flow = await flowProducer.add({\n name: Xl1ToEthBridgeParent.name,\n queueName: Xl1ToEthBridgeParent.queueName,\n data: { tx },\n children: [\n {\n // Step 6 (runs after child completes)\n name: EthTransactionMonitor.name,\n queueName: EthTransactionMonitor.queueName,\n data: { tx },\n opts: { attempts: 60, backoff: { type: 'fixed', delay: 5000 } },\n children: [\n {\n // Step 5\n name: EthTransactionSubmission.name,\n queueName: EthTransactionSubmission.queueName,\n data: { tx },\n children: [\n {\n // Step 4\n name: EthTransactionPreparation.name,\n queueName: EthTransactionPreparation.queueName,\n data: { tx },\n children: [\n {\n // Step 3\n name: Xl1TransactionMonitor.name,\n queueName: Xl1TransactionMonitor.queueName,\n data: { tx },\n opts: { attempts: 60, backoff: { type: 'fixed', delay: 5000 } },\n children: [\n {\n // Step 2\n name: Xl1TransactionSubmission.name,\n queueName: Xl1TransactionSubmission.queueName,\n data: { tx },\n children: [\n {\n // Step 1 (runs first as deepest child)\n name: Xl1TransactionPreparation.name,\n queueName: Xl1TransactionPreparation.queueName,\n data: { tx },\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n })\n return flow\n}\n","import type { Config } from '@xyo-network/xl1-sdk'\nimport type { Express } from 'express'\n\nimport { getConnection, getFlowProducer } from '../queue/index.ts'\n\nexport const addFlowProducer = (app: Express, config: Config): Express => {\n const connection = getConnection(config)\n const flowProducer = getFlowProducer(connection)\n app.flowProducer = flowProducer\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-sdk'\nimport type { z } from 'zod'\n\nimport { getBridgeSettings } from '../../../../../config/index.ts'\n\nexport const BridgeConfigResponseZod = BridgeSettingsZod\nexport type BridgeConfigResponse = z.infer<typeof BridgeConfigResponseZod>\n\nconst validateRequest = requestHandlerValidator({ response: BridgeConfigResponseZod })\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-sdk'\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-sdk'\n\nexport const tryGetBridgeEscrowAddress = (config: Config): Address | undefined => {\n const address = asAddress(config.actors.bridge.escrowAddress)\n return address\n}\n\nexport const getBridgeEscrowAddress = (config: Config): Address => {\n const address = assertEx(tryGetBridgeEscrowAddress(config), () => `Invalid bridge escrow address: ${config.actors.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-sdk'\n\nexport const tryGetBridgeFeesAddress = (config: Config): Address | undefined => {\n const address = asAddress(config.actors.bridge.feesAddress)\n return address\n}\n\nexport const getBridgeFeesAddress = (config: Config): Address => {\n const address = assertEx(tryGetBridgeFeesAddress(config), () => `Invalid bridge fees address: ${config.actors.bridge.feesAddress}`)\n return address\n}\n","import type { Config } from '@xyo-network/xl1-sdk'\n\nimport type { FeeStructure } from '../util/index.ts'\n\nexport const getFeeStructure = (config: Config): FeeStructure => {\n const { feeFixed, feeRateBasisPoints } = config.actors.bridge\n return { feeFixed, feeRateBasisPoints }\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-sdk'\n\nexport const getMaxBridgeAmount = (config: Config): Hex => {\n const { maxBridgeAmount } = config.actors.bridge\n return maxBridgeAmount\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-sdk'\n\nexport const getMinBridgeAmount = (config: Config): Hex => {\n const { minBridgeAmount } = config.actors.bridge\n return minBridgeAmount\n}\n","import { assertEx } from '@xylabs/sdk-js'\nimport type { ChainId, Config } from '@xyo-network/xl1-sdk'\n\nimport { asChainId } from './asChainId.ts'\n\nexport const getRemoteChainId = (config: Config): ChainId => {\n const remoteChainId = assertEx(asChainId(config.actors.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-sdk'\n\nimport { asToken } from './asToken.ts'\n\nexport const getRemoteTokenAddress = (config: Config): Address => {\n const token = asToken(config.actors.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-sdk'\nimport { ADDRESS_INDEX, generateXyoBaseWalletFromPhrase } from '@xyo-network/xl1-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.actors.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-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, Config } from '@xyo-network/xl1-sdk'\n\nimport { asChainId } from './asChainId.ts'\n\nexport const getXl1ChainId = (config: Config): ChainId => {\n const xl1ChainId = config.actors.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-sdk'\n\nimport { asToken } from './asToken.ts'\nimport { getXl1ChainId } from './getXl1ChainId.ts'\n\nexport const getXl1TokenAddress = (config: Config): Hex => {\n const token = asToken(config.actors.bridge.xl1TokenAddress)\n if (isDefined(token)) return token\n return getXl1ChainId(config)\n}\n","import type { BridgeSettings, Config } from '@xyo-network/xl1-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 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, Config } from '@xyo-network/xl1-sdk'\nimport {\n BridgeDestinationObservationFieldsZod,\n BridgeDestinationObservationSchema,\n} from '@xyo-network/xl1-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, Config } from '@xyo-network/xl1-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 { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { PayloadZodLooseOfSchema, PayloadZodStrictOfSchema } from '@xyo-network/payload-model'\nimport type {\n BridgeSourceObservation, BridgeSourceObservationFields, Config, SignedHydratedTransaction,\n} from '@xyo-network/xl1-sdk'\nimport {\n BridgeIntentFieldsZod, BridgeIntentSchema, BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, SignedTransactionBoundWitnessZod, TransferZod,\n} from '@xyo-network/xl1-sdk'\nimport { z } from 'zod'\n\nimport { createXl1ToEthBridgeJob } from '../../../../../queue/index.ts'\nimport { validateBridgeEstimateExact, validateBridgeTransaction } from '../../../../../util/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nexport const BridgeToRemoteBodyZod = z.tuple([\n SignedTransactionBoundWitnessZod,\n PayloadZodLooseOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),\n TransferZod,\n])\nexport type BridgeToRemoteBody = z.infer<typeof BridgeToRemoteBodyZod>\n\nexport const BridgeToRemoteResponseZod = PayloadZodStrictOfSchema(BridgeSourceObservationSchema).extend(BridgeSourceObservationFieldsZod.shape)\nexport type BridgeToRemoteResponse = z.infer<typeof BridgeToRemoteResponseZod>\n\nexport const makeBridgeToRemoteRoute = (config: Config): RouteDefinition => {\n const params = z.object({ chainId: getRemoteChainIdZod(config) })\n\n const validateRequest = requestHandlerValidator({\n params, body: BridgeToRemoteBodyZod, response: BridgeToRemoteResponseZod,\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 { flowProducer } = 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 job queue\n const singedHydratedTransaction: SignedHydratedTransaction = [signedTxBw, [transfer, bridgeIntent]]\n await createXl1ToEthBridgeJob(flowProducer, singedHydratedTransaction)\n\n // Create BridgeObservation\n const srcConfirmation = await PayloadBuilder.hash(signedTxBw)\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-sdk'\n\nexport type FeeStructure = Pick<Config['actors']['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 { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n BridgeIntent, BridgeIntentFields, Config,\n Transfer,\n} from '@xyo-network/xl1-sdk'\nimport { BridgeIntentSchema, createTransferPayload } from '@xyo-network/xl1-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 {\n BridgeIntent, Config, Transfer,\n} from '@xyo-network/xl1-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, Config,\n TransactionBoundWitness, Transfer,\n} from '@xyo-network/xl1-sdk'\n\nimport { getXl1ChainId } from '../config/index.ts'\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 chainId = getXl1ChainId(config)\n if (signedTxBw.chain !== chainId) return false\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 { PayloadZodStrictOfSchema } from '@xyo-network/payload-model'\nimport type { Config, XyoGatewayRunner } from '@xyo-network/xl1-sdk'\nimport {\n BridgeIntentFieldsZod, BridgeIntentSchema, buildUnsignedTransaction, toXL1BlockNumber, TransactionBoundWitnessZod, TransferZod,\n} from '@xyo-network/xl1-sdk'\nimport { z } from 'zod'\n\nimport { getXl1ChainId } from '../../../../../config/index.ts'\nimport { generateBridgeEstimate } from '../../../../../util/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nexport const BridgeToRemoteEstimateBodyZod = BridgeIntentFieldsZod.pick({\n destAddress: true,\n srcAddress: true,\n srcAmount: true,\n})\nexport type BridgeToRemoteEstimateBody = z.infer<typeof BridgeToRemoteEstimateBodyZod>\n\nexport const BridgeToRemoteEstimateResponseZod = z.tuple([\n TransactionBoundWitnessZod,\n PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),\n TransferZod,\n])\n\nexport type BridgeToRemoteEstimateResponse = z.infer<typeof BridgeToRemoteEstimateResponseZod>\n\nexport const makeBridgeToRemoteEstimateRoute = (config: Config, gateway: XyoGatewayRunner): RouteDefinition => {\n const params = z.object({ chainId: getRemoteChainIdZod(config) })\n const validateRequest = requestHandlerValidator({\n params, body: BridgeToRemoteEstimateBodyZod, response: BridgeToRemoteEstimateResponseZod,\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 viewer = assertEx(gateway.connection.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 {\n BridgeDestinationObservation, BridgeSourceObservation, Config,\n} from '@xyo-network/xl1-sdk'\nimport {\n BridgeDestinationObservationFieldsZod, BridgeDestinationObservationSchema, BridgeIntentFieldsZod, BridgeIntentSchema, BridgeSourceObservationFieldsZod,\n BridgeSourceObservationSchema,\n} from '@xyo-network/xl1-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 BridgeToRemoteStatusResponseZod = 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])\nexport type BridgeToRemoteStatusResponse = z.infer<typeof BridgeToRemoteStatusResponseZod>\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\n const validateRequest = requestHandlerValidator({\n params, query, response: BridgeToRemoteStatusResponseZod,\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 BridgeToRemoteStatusResponseZod> = [] as unknown as z.infer<typeof BridgeToRemoteStatusResponseZod>\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 srcConfirmation: toHex('0x8888'),\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, XyoGatewayRunner } from '@xyo-network/xl1-sdk'\n\nimport {\n makeBridgeConfigRoute, makeBridgeFromRemoteStatusRoute, makeBridgeToRemoteEstimateRoute, makeBridgeToRemoteRoute, makeBridgeToRemoteStatusRoute,\n} from './routes/index.ts'\n\nexport const getRouteDefinitions = (config: Config, gateway: XyoGatewayRunner): RouteDefinition[] => {\n return [\n makeBridgeConfigRoute(config),\n makeBridgeToRemoteEstimateRoute(config, gateway),\n makeBridgeToRemoteRoute(config),\n makeBridgeToRemoteStatusRoute(config),\n makeBridgeFromRemoteStatusRoute(config),\n ]\n}\n","import type { Config, XyoGatewayRunner } from '@xyo-network/xl1-sdk'\nimport type { Express } from 'express'\n\nimport { getRouteDefinitions } from './routeDefinitions/index.ts'\n\nexport const addBridgeRoutes = (app: Express, config: Config, gateway: XyoGatewayRunner) => {\n const routeDefinitions = getRouteDefinitions(config, gateway)\n for (const definition of routeDefinitions) {\n app[definition.method](definition.path, definition.handlers)\n }\n}\n","import type { Config, XyoGatewayRunner } from '@xyo-network/xl1-sdk'\nimport type { Express } from 'express'\n\nimport { addBridgeRoutes } from './bridge/index.ts'\n\nexport const addRoutes = (app: Express, config: Config, gateway: XyoGatewayRunner) => {\n addBridgeRoutes(app, config, gateway)\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, XyoGatewayRunner } from '@xyo-network/xl1-sdk'\n\nimport { getNode, getServices } from '../manifest/index.ts'\nimport { addWorkers } from './addWorkers.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.actors.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, gateway: XyoGatewayRunner) => {\n const { logger, config } = context\n const { port, mnemonic } = config.actors.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, gateway)\n const services = await getServices({ config, logger }, gateway)\n addWorkers(config, services)\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 { initEvmProvider } from '@xyo-network/chain-orchestration'\nimport { MongoMap } from '@xyo-network/chain-protocol'\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 type {\n BridgeDestinationObservation, Config, IterableMap, ProviderFactoryLocator, SignedHydratedTransaction, XyoGatewayRunner,\n} from '@xyo-network/xl1-sdk'\nimport {\n hasMongoConfig, mapToMapType, XyoGatewayRunnerMoniker,\n} from '@xyo-network/xl1-sdk'\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 locator: ProviderFactoryLocator\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 getModuleLocator = async (context: GetLocatorContext) => {\n const {\n config, locator, logger,\n } = 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 moduleLocator = 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 moduleLocator.register(MongoDBArchivistV2.factory(params), undefined, true)\n }\n\n moduleLocator.register(MemoryArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n moduleLocator.register(MemorySentinel.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n moduleLocator.register(ViewArchivist.factory({\n traceProvider, meterProvider, statusReporter,\n }))\n\n const gateway = await locator.getInstance<XyoGatewayRunner>(XyoGatewayRunnerMoniker)\n const viewer = assertEx(gateway.connection.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 moduleLocator.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.actors.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 moduleLocator.register(EVMLiquidityBridgeTransactionCompletionMonitorSentinel.factory(evmLiquidityBridgeTransactionCompletionMonitorSentinelParams))\n\n return moduleLocator\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 { asSchema, 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 type {\n BridgeDestinationObservation, BridgeIntent, IterableMap, MapType,\n SignedHydratedTransaction,\n} from '@xyo-network/xl1-sdk'\nimport {\n BridgeDestinationObservationSchema, flattenHydratedTransaction, flattenHydratedTransactions, isBridgeIntent,\n tryUnflattenHydratedTransaction,\n} from '@xyo-network/xl1-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 = asSchema('network.xyo.sentinel.chain.evm.liquidity.bridge.transaction.completion.monitor.config', true)\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() {\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 { asSchema, 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 {\n IterableMap, MapType, SignedHydratedTransaction,\n XyoViewer,\n} from '@xyo-network/xl1-sdk'\nimport {\n flattenHydratedTransaction, flattenHydratedTransactions, tryUnflattenHydratedTransaction,\n} from '@xyo-network/xl1-sdk'\nimport { Mutex } from 'async-mutex'\n\nexport const XL1TransactionCompletionMonitorSentinelConfigSchema = asSchema('network.xyo.sentinel.chain.transaction.completion.monitor.config', true)\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() {\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 { assertEx, type Logger } from '@xylabs/sdk-js'\nimport { ManifestWrapper } from '@xyo-network/manifest-wrapper'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n Config, RpcSchemaMap, TransportFactory,\n} from '@xyo-network/xl1-sdk'\nimport { buildJsonRpcProviderLocator, HttpRpcTransport } from '@xyo-network/xl1-sdk'\n\nimport { getBridgeWalletAccount } from '../config/index.ts'\nimport { getModuleLocator } from './getModuleLocator.ts'\nimport { NodeManifest } from './nodeManifest.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 { config, wallet } = context\n const endpoint = assertEx(config.actors.bridge.remote?.rpc?.url ?? config.remote?.rpc?.url, () => 'RPC URL is required for Node')\n const transportFactory: TransportFactory = (schemas: RpcSchemaMap) => new HttpRpcTransport(endpoint, schemas)\n const signerAccount = await getBridgeWalletAccount(config)\n const locator = await buildJsonRpcProviderLocator({ signerAccount, transportFactory })\n\n const moduleLocator = await getModuleLocator({ ...context, locator })\n // const wrapper = new ManifestWrapper(NodeManifest, wallet, moduleLocator, PublicChildManifests, PrivateChildManifests)\n const wrapper = new ManifestWrapper(NodeManifest, wallet, moduleLocator, [], [])\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 unknown as PackageManifestPayload\n","import type { Hash, Logger } from '@xylabs/sdk-js'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { initEvmProvider } from '@xyo-network/chain-orchestration'\nimport { BridgeableToken__factory, LiquidityPoolBridge__factory } from '@xyo-network/typechain'\nimport { HDWallet } from '@xyo-network/wallet'\nimport type { Config, XyoGatewayRunner } from '@xyo-network/xl1-sdk'\nimport { getAddress, Wallet } from 'ethers'\n\nimport type {\n EthTxState, IBridgeServiceCollection, Xl1TxState,\n} from '../services/index.ts'\nimport { getIterableMap } from './getIterableMap.ts'\n\nexport interface GetServicesContext {\n config: Config\n logger?: Logger\n}\n\n/**\n * Used for retrieving a service collection\n * @returns A service collection\n */\nexport const getServices = async (context: GetServicesContext, gateway: XyoGatewayRunner): Promise<IBridgeServiceCollection> => {\n const { config } = context\n\n const ethTxStateMap = await getIterableMap<Hash, EthTxState>(config, 'liquidity_bridge_xl1_to_eth_eth_tx_state')\n const xl1TxStateMap = await getIterableMap<Hash, Xl1TxState>(config, 'liquidity_bridge_xl1_to_eth_xl1_tx_state')\n const provider = await initEvmProvider({ config })\n const {\n remoteBridgeContractAddress, remoteChainWalletPrivateKey, remoteTokenAddress, mnemonic,\n } = config.actors.bridge\n const account = isDefined(mnemonic) ? await HDWallet.fromPhrase(mnemonic) : await HDWallet.random()\n const wallet = new Wallet(remoteChainWalletPrivateKey, provider)\n const bridgeableToken = BridgeableToken__factory.connect(getAddress(remoteTokenAddress), wallet)\n const bridge = LiquidityPoolBridge__factory.connect(getAddress(remoteBridgeContractAddress), wallet)\n // const approvalAmount = 18n * 10n ** 9n * 10n ** 18n // 18 billion tokens with 18 decimals\n // const contractApprovalTx = await bridgeableToken.connect(wallet).approve(bridge.getAddress(), approvalAmount)\n // await contractApprovalTx.wait(1)\n // Assert we are contract owner so we can call ownable methods\n const bridgeOwner = await bridge.owner()\n assertEx(bridgeOwner.toLowerCase() === wallet.address.toLowerCase(), () => 'Wallet is not the owner of the bridge contract')\n return {\n account, bridge, bridgeableToken, ethTxStateMap, gateway, provider, wallet, xl1TxStateMap,\n }\n}\n","import { BaseMongoSdk, type BaseMongoSdkPrivateConfig } from '@xylabs/mongo'\nimport { MongoMap } from '@xyo-network/chain-protocol'\nimport type { Config, IterableMap } from '@xyo-network/xl1-sdk'\nimport { hasMongoConfig, mapToMapType } from '@xyo-network/xl1-sdk'\nimport type { Document } from 'mongodb'\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 */\nexport const getIterableMap = async <K extends {} = string, V extends Document = Document>(\n config: Config,\n collection: string,\n): 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 { Config } from '@xyo-network/xl1-sdk'\n\nimport { createWorkers, getConnection } from '../queue/index.ts'\nimport type { IBridgeServiceCollection } from '../services/index.ts'\n\nexport const addWorkers = (config: Config, services: IBridgeServiceCollection) => {\n const connection = getConnection(config)\n createWorkers(connection, services)\n}\n"],"mappings":"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","names":["creatable","ActorV3","XyoGatewayRunnerMoniker","customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","isDefined","Redis","connection","maxRetriesPerRequest","getConnection","config","isDefined","redisHost","host","redisPort","port","actors","bridge","Redis","isDefined","FlowProducer","flowProducer","getFlowProducer","connection","isDefined","FlowProducer","createWorkers","connection","services","Xl1ToEthBridgeParent","createWorker","Xl1TransactionPreparation","Xl1TransactionSubmission","Xl1TransactionMonitor","EthTransactionPreparation","EthTransactionSubmission","EthTransactionMonitor","assertEx","PayloadBuilder","Worker","name","queueName","createWorker","connection","services","provider","assertEx","stateMap","ethTxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","submissionHash","receipt","getTransactionReceipt","log","blockNumber","blockHash","confirmationHash","set","on","err","console","error","id","message","EthTransactionMonitor","assertEx","hexToBigInt","PayloadBuilder","isBridgeIntent","Worker","getAddress","name","queueName","createWorker","connection","services","bridge","assertEx","stateMap","ethTxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","log","bridgeIntent","find","isBridgeIntent","amount","hexToBigInt","destAmount","srcAddress","getAddress","destAddress","nonce","preparedTx","getFunction","populateTransaction","set","on","err","console","error","id","message","EthTransactionPreparation","assertEx","isDefined","PayloadBuilder","Worker","assertEx","hexToBigInt","toEthAddress","PayloadBuilder","isBridgeIntent","submitEthTransaction","tx","bridgeableToken","bridge","wallet","xl1Transaction","assertEx","bridgeIntent","find","isBridgeIntent","srcAddress","toEthAddress","destAddress","amount","hexToBigInt","destAmount","nonce","PayloadBuilder","hash","bridgeTx","connect","bridgeFromRemote","receipt","wait","isAllowedBlockPayload","submitXl1Transaction","preparedTx","gateway","offChainPayloads","filter","p","isAllowedBlockPayload","result","addTransactionToChain","name","queueName","createWorker","connection","services","bridge","assertEx","bridgeableToken","wallet","stateMap","ethTxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","preparedTx","submissionHash","existingSubmissionHash","isDefined","log","submitEthTransaction","set","concurrency","on","err","console","error","id","message","EthTransactionSubmission","Worker","name","queueName","createWorker","connection","worker","Worker","job","log","ok","on","err","console","error","id","message","Xl1ToEthBridgeParent","assertEx","isDefined","isNull","PayloadBuilder","UnrecoverableError","Worker","name","queueName","createWorker","connection","services","gateway","assertEx","stateMap","xl1TxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","viewer","state","get","submissionHash","log","foundTx","transactionByHash","isDefined","isNull","confirmationHash","set","currentBlockNumber","exp","UnrecoverableError","Error","on","err","console","error","id","message","Xl1TransactionMonitor","assertEx","PayloadBuilder","Worker","name","queueName","createWorker","connection","services","stateMap","assertEx","xl1TxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","log","preparedTx","set","on","err","console","error","id","message","Xl1TransactionPreparation","assertEx","isDefined","PayloadBuilder","Worker","name","queueName","createWorker","connection","services","gateway","assertEx","stateMap","xl1TxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","preparedTx","submissionHash","existingSubmissionHash","isDefined","log","submitXl1Transaction","set","on","err","console","error","id","message","Xl1TransactionSubmission","createXl1ToEthBridgeJob","flowProducer","tx","flow","add","name","Xl1ToEthBridgeParent","queueName","data","children","EthTransactionMonitor","opts","attempts","backoff","type","delay","EthTransactionSubmission","EthTransactionPreparation","Xl1TransactionMonitor","Xl1TransactionSubmission","Xl1TransactionPreparation","addFlowProducer","app","config","connection","getConnection","flowProducer","getFlowProducer","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","actors","bridge","escrowAddress","asAddress","assertEx","tryGetBridgeFeesAddress","config","address","asAddress","actors","bridge","feesAddress","getFeeStructure","config","feeFixed","feeRateBasisPoints","actors","bridge","getMaxBridgeAmount","config","maxBridgeAmount","actors","bridge","getMinBridgeAmount","config","minBridgeAmount","actors","bridge","assertEx","getRemoteChainId","config","remoteChainId","assertEx","asChainId","actors","bridge","assertEx","getRemoteTokenAddress","config","token","asToken","actors","bridge","remoteTokenAddress","assertEx","isDefined","isUndefined","HDWallet","ADDRESS_INDEX","generateXyoBaseWalletFromPhrase","accountServiceSingleton","getBridgeWalletAccount","config","walletPhrase","actors","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","actors","bridge","isDefined","assertEx","asChainId","chain","id","isDefined","getXl1TokenAddress","config","token","asToken","actors","bridge","xl1TokenAddress","isDefined","getXl1ChainId","getBridgeSettings","config","feeFixed","feeRateBasisPoints","getFeeStructure","feesAddress","escrowAddress","getTransferAddresses","maxBridgeAmount","getMaxBridgeAmount","minBridgeAmount","getMinBridgeAmount","remoteChainId","getRemoteChainId","remoteTokenAddress","getRemoteTokenAddress","xl1TokenAddress","getXl1TokenAddress","xl1ChainId","getXl1ChainId","BridgeConfigResponseZod","BridgeSettingsZod","validateRequest","requestHandlerValidator","response","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","PayloadBuilder","PayloadZodLooseOfSchema","PayloadZodStrictOfSchema","BridgeIntentFieldsZod","BridgeIntentSchema","BridgeSourceObservationFieldsZod","BridgeSourceObservationSchema","SignedTransactionBoundWitnessZod","TransferZod","z","hexToBigInt","toHex","calculateBridgeFees","srcAmount","feeStructure","feeFixed","feeRateBasisPoints","srcAmountBigInt","hexToBigInt","feeFixedBigInt","feeVariableBigInt","BigInt","feeVariable","toHex","feeTotalBigInt","destAmountBigInt","destAmount","hexToBigInt","toAddress","PayloadBuilder","BridgeIntentSchema","createTransferPayload","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","chainId","getXl1ChainId","chain","errors","BoundWitnessValidator","validate","isDefined","length","sender","asAddress","addressesContains","hashes","PayloadBuilder","payloadHashesContainsAll","BridgeToRemoteBodyZod","z","tuple","SignedTransactionBoundWitnessZod","PayloadZodLooseOfSchema","BridgeIntentSchema","extend","BridgeIntentFieldsZod","shape","TransferZod","BridgeToRemoteResponseZod","PayloadZodStrictOfSchema","BridgeSourceObservationSchema","BridgeSourceObservationFieldsZod","makeBridgeToRemoteRoute","config","params","object","chainId","getRemoteChainIdZod","validateRequest","requestHandlerValidator","body","response","method","path","handlers","req","res","signedTxBw","bridgeIntent","transfer","flowProducer","app","transactionValid","validateBridgeTransaction","status","send","estimateValid","validateBridgeEstimateExact","singedHydratedTransaction","createXl1ToEthBridgeJob","srcConfirmation","PayloadBuilder","hash","bridgeCommonFieldsZod","bridgeCommonFields","parse","bridgeObservationFields","bridgeObservation","schema","fields","build","json","requestHandlerValidator","assertEx","toAddress","PayloadZodStrictOfSchema","BridgeIntentFieldsZod","BridgeIntentSchema","buildUnsignedTransaction","toXL1BlockNumber","TransactionBoundWitnessZod","TransferZod","z","BridgeToRemoteEstimateBodyZod","BridgeIntentFieldsZod","pick","destAddress","srcAddress","srcAmount","BridgeToRemoteEstimateResponseZod","z","tuple","TransactionBoundWitnessZod","PayloadZodStrictOfSchema","BridgeIntentSchema","extend","shape","TransferZod","makeBridgeToRemoteEstimateRoute","config","gateway","params","object","chainId","getRemoteChainIdZod","validateRequest","requestHandlerValidator","body","response","method","path","handlers","req","res","xl1ChainId","getXl1ChainId","bridgeIntent","transfer","generateBridgeEstimate","sender","toAddress","viewer","assertEx","connection","Error","currentBlockNumber","nbf","toXL1BlockNumber","exp","txBw","buildUnsignedTransaction","json","requestHandlerValidator","asAddress","asHex","toHex","PayloadZodStrictOfSchema","BridgeDestinationObservationFieldsZod","BridgeDestinationObservationSchema","BridgeIntentFieldsZod","BridgeIntentSchema","BridgeSourceObservationFieldsZod","BridgeSourceObservationSchema","z","BridgeToRemoteStatusResponseZod","z","union","tuple","PayloadZodStrictOfSchema","BridgeIntentSchema","extend","BridgeIntentFieldsZod","shape","BridgeSourceObservationSchema","BridgeSourceObservationFieldsZod","BridgeDestinationObservationSchema","BridgeDestinationObservationFieldsZod","makeBridgeToRemoteStatusRoute","config","params","object","chainId","getRemoteChainIdZod","nonce","string","nonempty","query","mockStatus","coerce","number","default","validateRequest","requestHandlerValidator","response","method","path","handlers","req","res","result","remoteTokenAddress","xl1ChainId","xl1TokenAddress","getBridgeSettings","src","srcAddress","asAddress","srcAmount","asHex","srcToken","dest","destAddress","destAmount","destToken","sendStatus","observation","generateBridgeEstimate","schema","srcConfirmation","toHex","destConfirmation","json","getRouteDefinitions","config","gateway","makeBridgeConfigRoute","makeBridgeToRemoteEstimateRoute","makeBridgeToRemoteRoute","makeBridgeToRemoteStatusRoute","makeBridgeFromRemoteStatusRoute","addBridgeRoutes","app","config","gateway","routeDefinitions","getRouteDefinitions","definition","method","path","handlers","addRoutes","app","config","gateway","addBridgeRoutes","getApp","node","config","gateway","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addFlowProducer","addRoutes","standardErrors","assertEx","isDefined","isString","boot","HDWallet","BaseMongoSdk","assertEx","isDefined","MemoryArchivist","MongoDBArchivistV2","ViewArchivist","initEvmProvider","MongoMap","initTelemetry","AbstractModule","LoggerModuleStatusReporter","ModuleFactoryLocator","MemorySentinel","hasMongoConfig","mapToMapType","XyoGatewayRunnerMoniker","asAddress","asHex","assertEx","delay","hexFromBigInt","hexToBigInt","isDefined","isUndefined","PayloadBuilder","asSchema","AbstractSentinel","LiquidityPoolBridge__factory","BridgeDestinationObservationSchema","flattenHydratedTransaction","flattenHydratedTransactions","isBridgeIntent","tryUnflattenHydratedTransaction","Mutex","getAddress","Wallet","EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema","asSchema","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","asSchema","AbstractSentinel","flattenHydratedTransaction","flattenHydratedTransactions","tryUnflattenHydratedTransaction","Mutex","XL1TransactionCompletionMonitorSentinelConfigSchema","asSchema","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","getModuleLocator","context","config","locator","logger","otlpEndpoint","telemetry","otel","path","endpoint","port","metrics","scrape","traceProvider","meterProvider","initTelemetry","attributes","serviceName","serviceVersion","metricsConfig","isDefined","AbstractModule","defaultLogger","statusReporter","LoggerModuleStatusReporter","undefined","moduleLocator","ModuleFactoryLocator","mongoConfig","storage","mongo","hasMongoConfig","connectionString","dbConnectionString","database","dbName","domain","dbDomain","password","dbPassword","username","dbUserName","payloadSdkConfig","params","register","MongoDBArchivistV2","factory","MemoryArchivist","MemorySentinel","ViewArchivist","gateway","getInstance","XyoGatewayRunnerMoniker","viewer","assertEx","connection","pendingXl1ToEthXl1BridgeIntentTransactions","getIterableMap","completedXl1ToEthXl1BridgeIntentTransactions","xl1TransactionCompletionMonitorSentinelParams","completedTransactions","schema","XL1TransactionCompletionMonitorSentinelConfigSchema","pendingTransactions","XL1TransactionCompletionMonitorSentinel","completedEthXl1BridgeTransactions","provider","initEvmProvider","bridgeAddress","actors","bridge","remoteBridgeContractAddress","evmLiquidityBridgeTransactionCompletionMonitorSentinelParams","EVMLiquidityBridgeTransactionCompletionMonitorSentinelConfigSchema","EVMLiquidityBridgeTransactionCompletionMonitorSentinel","collection","sdkBalanceSummaryMap","BaseMongoSdk","result","MongoMap","create","sdk","getCache","enabled","maxEntries","mapToMapType","Map","assertEx","ManifestWrapper","buildJsonRpcProviderLocator","HttpRpcTransport","NodeManifest","node","getNode","context","config","wallet","endpoint","assertEx","actors","bridge","remote","rpc","url","transportFactory","schemas","HttpRpcTransport","signerAccount","getBridgeWalletAccount","locator","buildJsonRpcProviderLocator","moduleLocator","getModuleLocator","wrapper","ManifestWrapper","NodeManifest","node","childNodes","loadNodes","length","Promise","all","map","childNode","register","attach","address","assertEx","isDefined","initEvmProvider","BridgeableToken__factory","LiquidityPoolBridge__factory","HDWallet","getAddress","Wallet","BaseMongoSdk","MongoMap","hasMongoConfig","mapToMapType","getIterableMap","config","collection","mongoConfig","storage","mongo","hasMongoConfig","connectionString","dbConnectionString","database","dbName","domain","dbDomain","password","dbPassword","username","dbUserName","payloadSdkConfig","sdkBalanceSummaryMap","BaseMongoSdk","result","MongoMap","create","sdk","getCache","enabled","maxEntries","mapToMapType","Map","getServices","context","gateway","config","ethTxStateMap","getIterableMap","xl1TxStateMap","provider","initEvmProvider","remoteBridgeContractAddress","remoteChainWalletPrivateKey","remoteTokenAddress","mnemonic","actors","bridge","account","isDefined","HDWallet","fromPhrase","random","wallet","Wallet","bridgeableToken","BridgeableToken__factory","connect","getAddress","LiquidityPoolBridge__factory","bridgeOwner","owner","assertEx","toLowerCase","address","addWorkers","config","services","connection","getConnection","createWorkers","hostname","getSeedPhrase","bios","config","logger","storedSeedPhrase","seedPhraseStore","get","debug","mnemonic","actors","api","isString","warn","set","seedPhrase","HDWallet","generateMnemonic","log","assertEx","getServer","context","gateway","port","bridge","boot","isDefined","wallet","fromPhrase","nodeContext","node","getNode","app","getApp","services","getServices","addWorkers","server","listen","setTimeout","BridgeActor","ActorV3","_gatewayRunner","server","gatewayRunner","createHandler","locator","getInstance","XyoGatewayRunnerMoniker","startHandler","stopServer","startServer","stopHandler","getServer","context","close","undefined"]}
1
+ {"version":3,"sources":["../../src/BridgeActor.ts","../../src/server/app.ts","../../src/queue/connection.ts","../../src/queue/flowProducer.ts","../../src/queue/workers/createWorkers.ts","../../src/queue/workers/EthTransactionMonitor.ts","../../src/queue/workers/EthTransactionPreparation.ts","../../src/queue/workers/util/submitEthTransaction.ts","../../src/queue/workers/util/submitXl1Transaction.ts","../../src/queue/workers/util/validateSufficientAllowance.ts","../../src/queue/workers/util/validateSufficientBalance.ts","../../src/queue/workers/EthTransactionSubmission.ts","../../src/queue/workers/Xl1ToEthBridgeParent.ts","../../src/queue/workers/Xl1TransactionMonitor.ts","../../src/queue/workers/Xl1TransactionPreparation.ts","../../src/queue/workers/Xl1TransactionSubmission.ts","../../src/queue/flows/createXl1ToEthBridgeJob.ts","../../src/server/addFlowProducer.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/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/createBridgeTransfer.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/services/getServices.ts","../../src/services/getIterableMap.ts","../../src/server/addWorkers.ts","../../src/server/server.ts"],"sourcesContent":["import { Server } from 'node:http'\n\nimport { creatable } from '@xylabs/sdk-js'\nimport { asBridgeConfigContext, BridgeConfig } from '@xyo-network/chain-orchestration'\nimport {\n ActorParamsV3,\n ActorV3,\n XyoGatewayRunner,\n XyoGatewayRunnerMoniker,\n} from '@xyo-network/xl1-sdk'\n\nimport { getServer } from './server/index.ts'\n\nexport type BridgeActorParams = ActorParamsV3<{\n config: BridgeConfig\n}>\n\n@creatable()\nexport class BridgeActor extends ActorV3<BridgeActorParams> {\n protected _gatewayRunner!: XyoGatewayRunner\n private server?: Server\n\n protected get gatewayRunner() {\n return this._gatewayRunner\n }\n\n override async createHandler() {\n await super.createHandler()\n this._gatewayRunner = await this.locator.getInstance(XyoGatewayRunnerMoniker)\n }\n\n override async startHandler() {\n await super.startHandler()\n this.stopServer()\n await this.startServer()\n }\n\n override async stopHandler() {\n await super.stopHandler()\n this.stopServer()\n }\n\n private async startServer() {\n this.server = await getServer(asBridgeConfigContext(this.context, true), this._gatewayRunner)\n }\n\n private stopServer() {\n this.server?.close()\n this.server = undefined\n }\n}\n","import {\n customPoweredByHeader, disableCaseSensitiveRouting, disableExpressDefaultPoweredByHeader, getJsonBodyParser, getJsonBodyParserOptions, responseProfiler,\n standardErrors, standardResponses,\n} from '@xylabs/express'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport type { XyoGatewayRunner } from '@xyo-network/xl1-sdk'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport { addFlowProducer } from './addFlowProducer.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = (config: BridgeConfig, gateway: XyoGatewayRunner): 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 addFlowProducer(app, config)\n addRoutes(app, config, gateway)\n app.use(standardErrors)\n return app\n}\n","import { isDefined } from '@xylabs/sdk-js'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { Redis } from 'ioredis'\n\nlet connection: Redis | undefined\n\nconst maxRetriesPerRequest = null\n\nexport const getConnection = (config: BridgeConfig) => {\n if (isDefined(connection)) return connection\n const { redisHost: host, redisPort: port } = config\n connection = new Redis({\n host, port, maxRetriesPerRequest,\n })\n return connection\n}\n","import { isDefined } from '@xylabs/sdk-js'\nimport { FlowProducer } from 'bullmq'\nimport type { Redis } from 'ioredis'\n\nlet flowProducer: FlowProducer | undefined\n\nexport const getFlowProducer = (connection: Redis) => {\n if (isDefined(flowProducer)) return flowProducer\n flowProducer = new FlowProducer({ connection })\n return flowProducer\n}\n","import type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport {\n EthTransactionMonitor,\n EthTransactionPreparation,\n EthTransactionSubmission,\n Xl1ToEthBridgeParent,\n Xl1TransactionMonitor,\n Xl1TransactionPreparation,\n Xl1TransactionSubmission,\n} from './index.ts'\n\nexport const createWorkers = (connection: Redis, services: IBridgeServiceCollection) => {\n Xl1ToEthBridgeParent.createWorker(connection)\n Xl1TransactionPreparation.createWorker(connection, services)\n Xl1TransactionSubmission.createWorker(connection, services)\n Xl1TransactionMonitor.createWorker(connection, services)\n EthTransactionPreparation.createWorker(connection, services)\n EthTransactionSubmission.createWorker(connection, services)\n EthTransactionMonitor.createWorker(connection, services)\n}\n","import { assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\n\ntype JobData = { tx: SignedHydratedTransaction }\ninterface ReturnType {\n blockHash: string\n blockNumber: number\n}\n\nconst name = 'Monitor Submitted ETH Transaction'\nconst queueName = 'eth-tx-monitor'\nconst createWorker = (connection: Redis, services?: IBridgeServiceCollection) => {\n const provider = assertEx(services?.provider, () => 'provider service not provided')\n const stateMap = assertEx(services?.ethTxStateMap, () => 'ethTxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Job<JobData, ReturnType>) => {\n const { tx } = job.data\n const hash = await PayloadBuilder.hash(tx[0])\n const state = assertEx(await stateMap.get(hash), () => 'State not found')\n const submissionHash = assertEx(state?.submissionHash, () => 'submissionHash not found')\n const receipt = assertEx(await provider.getTransactionReceipt(submissionHash), () => 'Transaction receipt not found')\n await job.log(`[${hash}] confirmed ETH tx ${submissionHash} in block ${receipt.blockNumber}`)\n const { blockHash, blockNumber } = receipt\n state.confirmationHash = blockHash\n await stateMap.set(hash, state)\n return { blockHash, blockNumber }\n },\n { connection },\n )\n\n worker.on('failed', (job, err) => {\n console.error(`[${name}] Job ${job?.id} failed:`, err.message)\n })\n\n worker.on('error', (err) => {\n console.error(`[${name}] Worker error:`, err)\n })\n}\n\nexport const EthTransactionMonitor: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import { assertEx, hexToBigInt } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport { isBridgeIntent, type SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport { getAddress } from 'ethers'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport { validateSufficientAllowance, validateSufficientBalance } from './util/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\n\ntype JobData = { tx: SignedHydratedTransaction }\n\ninterface ReturnType {}\n\nconst name = 'Prepare ETH Transaction'\nconst queueName = 'eth-tx-prepare'\n\nexport const createWorker = (connection: Redis, services?: IBridgeServiceCollection) => {\n const bridge = assertEx(services?.bridge, () => 'bridge service not provided')\n const bridgeableToken = assertEx(services?.bridgeableToken, () => 'bridgeableToken service not provided')\n const stateMap = assertEx(services?.ethTxStateMap, () => 'ethTxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Job<JobData, ReturnType>) => {\n const { tx } = job.data\n const hash = await PayloadBuilder.hash(tx[0])\n await job.log(`[${hash}] preparing ETH transaction`)\n await job.log(`[${hash}] validating liquiditySource has sufficient allowance`)\n if (!await validateSufficientAllowance(tx, bridgeableToken, bridge, job)) {\n throw new Error('Liquidity source does not have sufficient allowance for the bridge to execute the transaction')\n }\n await job.log(`[${hash}] validated liquiditySource has sufficient allowance`)\n await job.log(`[${hash}] validating liquiditySource has sufficient balance`)\n if (!await validateSufficientBalance(tx, bridgeableToken, bridge, job)) {\n throw new Error('Liquidity source does not have sufficient balance for the bridge to execute the transaction')\n }\n await job.log(`[${hash}] validated liquiditySource has sufficient balance`)\n await job.log(`[${hash}] building ETH transaction`)\n const bridgeIntent = assertEx(tx[1].find(isBridgeIntent), () => 'No bridge intent found')\n const amount = hexToBigInt(bridgeIntent.destAmount)\n const srcAddress = getAddress(bridgeIntent.srcAddress)\n const destAddress = getAddress(bridgeIntent.destAddress)\n const nonce = hexToBigInt(await PayloadBuilder.hash(tx[0]))\n const preparedTx = await bridge.getFunction('bridgeFromRemote').populateTransaction(srcAddress, destAddress, amount, nonce)\n await job.log(`[${hash}] built ETH transaction`)\n await job.log(`[${hash}] storing ETH preparedTx`)\n await stateMap.set(hash, { preparedTx })\n await job.log(`[${hash}] stored ETH preparedTx`)\n await job.log(`[${hash}] prepared ETH transaction`)\n return {}\n },\n { connection },\n )\n\n worker.on('failed', (job, err) => {\n console.error(`[${name}] Job ${job?.id} failed:`, err.message)\n })\n\n worker.on('error', (err) => {\n console.error(`[${name}] Worker error:`, err)\n })\n}\n\nexport const EthTransactionPreparation: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import {\n assertEx, hexToBigInt, toEthAddress,\n} from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { BridgeableToken, LiquidityPoolBridge } from '@xyo-network/typechain'\nimport { isBridgeIntent, type SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { Wallet } from 'ethers'\n\nexport const submitEthTransaction = async (tx: SignedHydratedTransaction, bridgeableToken: BridgeableToken, bridge: LiquidityPoolBridge, wallet: Wallet) => {\n // Approve the bridge to spend tokens\n const xl1Transaction = assertEx(tx[0], () => 'No corresponding XL1 transaction found')\n const bridgeIntent = assertEx(tx[1].find(isBridgeIntent), () => 'No bridge intent found')\n const srcAddress = toEthAddress(bridgeIntent.srcAddress)\n const destAddress = toEthAddress(bridgeIntent.destAddress)\n const amount = hexToBigInt(bridgeIntent.destAmount)\n const nonce = hexToBigInt(await PayloadBuilder.hash(xl1Transaction))\n // Assume approval has already been done out of band for simplicity\n // const contractApprovalTx = await bridgeableToken.connect(wallet).approve(bridge.getAddress(), amount)\n // await contractApprovalTx.wait(1)\n\n // Send tokens to bridge\n const bridgeTx = await bridge.connect(wallet).bridgeFromRemote(srcAddress, destAddress, amount, nonce)\n const receipt = await bridgeTx.wait(1)\n return receipt?.hash\n}\n","import { type BrandedHash } from '@xylabs/sdk-js'\nimport {\n isAllowedBlockPayload, type SignedHydratedTransaction, type XyoGatewayRunner,\n} from '@xyo-network/xl1-sdk'\n\nexport const submitXl1Transaction = async (\n preparedTx: SignedHydratedTransaction,\n gateway: XyoGatewayRunner,\n): Promise<[BrandedHash, SignedHydratedTransaction]> => {\n // Option 1: Add payloads to chain with addPayloadsToChain\n // Not optimal as it requires reconstructing the transaction from the on-chain payloads, which changes the tx hash\n // const offChainPayloads = preparedTx[1].filter(p => !isAllowedBlockPayload(p))\n // const onChainPayloads = preparedTx[1].filter(isAllowedBlockPayload)\n // const result = await gateway.addPayloadsToChain(onChainPayloads, offChainPayloads)\n // return result\n\n // Option 2: Add transaction to chain with addTransactionToChain\n // Fails due to resigning of transaction in addTransactionToChain, which causes `from` to be invalid\n const offChainPayloads = preparedTx[1].filter(p => !isAllowedBlockPayload(p))\n const result = await gateway.addTransactionToChain(preparedTx, offChainPayloads)\n return result\n\n // Option 3: Add transaction to chain with addTransactionToChain, but bypass resigning by passing the preparedTx as an unsigned transaction\n // const runner = assertEx(gateway.connection.runner, () => 'No runner available on gateway connection')\n // const result = await runner.broadcastTransaction(preparedTx)\n // return [result, preparedTx]\n}\n","import type { Promisable } from '@xylabs/sdk-js'\nimport { assertEx, hexToBigInt } from '@xylabs/sdk-js'\nimport type { BridgeableToken, LiquidityPoolBridge } from '@xyo-network/typechain'\nimport { isBridgeIntent, type SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\n\ninterface IAsyncLogger {\n log: (message: string) => Promisable<unknown>\n}\n\n/**\n * Checks if the liquidity source has sufficient allowance for the bridge to execute the transaction. This doesn't\n * ensure that (due to race conditions) the transaction will succeed, but is a quick check to avoid\n * submitting transactions that are likely to fail.\n * @param tx The transaction containing a bridge intent\n * @param bridgeableToken The contract for the token being bridged\n * @param bridge The contract for the liquidity bridge\n * @param logger Optional logger for asynchronous logging\n * @returns True if the liquidity source allowance is sufficient to execute the bridge\n */\nexport const validateSufficientAllowance = async (\n tx: SignedHydratedTransaction,\n bridgeableToken: BridgeableToken,\n bridge: LiquidityPoolBridge,\n logger?: IAsyncLogger,\n) => {\n // Get the amount being bridged from the bridge intent\n const bridgeIntent = assertEx(tx[1].find(isBridgeIntent), () => 'No bridge intent found')\n const amount = hexToBigInt(bridgeIntent.destAmount)\n\n // Get the addresses\n const liquiditySourceAddress = await bridge.liquiditySource()\n const bridgeAddress = await bridge.getAddress()\n\n // Check the allowance of the liquidity source for the bridge\n const remainingAllowance = await bridgeableToken.allowance(liquiditySourceAddress, bridgeAddress)\n await logger?.log(`Remaining allowance: ${remainingAllowance.toString()}`)\n return remainingAllowance >= amount\n}\n","import type { Promisable } from '@xylabs/sdk-js'\nimport { assertEx, hexToBigInt } from '@xylabs/sdk-js'\nimport type { BridgeableToken, LiquidityPoolBridge } from '@xyo-network/typechain'\nimport { isBridgeIntent, type SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\n\ninterface IAsyncLogger {\n log: (message: string) => Promisable<unknown>\n}\n\n/**\n * Checks if the liquidity source has sufficient balance for the bridge to execute the transaction. This doesn't\n * ensure that (due to race conditions) the transaction will succeed, but is a quick check to avoid\n * submitting transactions that are likely to fail.\n * @param tx The transaction containing a bridge intent\n * @param bridgeableToken The contract for the token being bridged\n * @param bridge The contract for the liquidity bridge\n * @param logger Optional logger for asynchronous logging\n * @returns True if the liquidity source balance is sufficient to execute the bridge\n */\nexport const validateSufficientBalance = async (\n tx: SignedHydratedTransaction,\n bridgeableToken: BridgeableToken,\n bridge: LiquidityPoolBridge,\n logger?: IAsyncLogger,\n) => {\n // Get the amount being bridged from the bridge intent\n const bridgeIntent = assertEx(tx[1].find(isBridgeIntent), () => 'No bridge intent found')\n const amount = hexToBigInt(bridgeIntent.destAmount)\n\n // Get the addresses\n const liquiditySourceAddress = await bridge.liquiditySource()\n\n // Check the balance of the liquidity source for the bridge\n const balance = await bridgeableToken.balanceOf(liquiditySourceAddress)\n await logger?.log(`Remaining balance: ${balance.toString()}`)\n return balance >= amount\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport { type SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { Redis } from 'ioredis'\n\nimport type { EthTxState, IBridgeServiceCollection } from '../../services/index.ts'\nimport { submitEthTransaction } from './util/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\n\ntype JobData = { tx: SignedHydratedTransaction }\n\ninterface ReturnType {\n submissionHash: Required<EthTxState>['submissionHash']\n}\n\nconst name = 'Submit ETH Transaction'\nconst queueName = 'eth-tx-submit'\nconst createWorker = (connection: Redis, services?: IBridgeServiceCollection) => {\n const bridge = assertEx(services?.bridge, () => 'bridge service not provided')\n const bridgeableToken = assertEx(services?.bridgeableToken, () => 'bridgeableToken service not provided')\n const wallet = assertEx(services?.wallet, () => 'wallet service not provided')\n const stateMap = assertEx(services?.ethTxStateMap, () => 'ethTxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Job<JobData, ReturnType>) => {\n const { tx } = job.data\n const hash = await PayloadBuilder.hash(tx[0])\n const state = assertEx(await stateMap.get(hash), () => `[${hash}] state not found`)\n const preparedTx = assertEx(state?.preparedTx, () => `[${hash}] preparedTx not found`)\n\n // Idempotency check against resubmission\n const { submissionHash: existingSubmissionHash } = state\n if (isDefined(existingSubmissionHash)) {\n await job.log(`[${hash}] Tx already submitted with submission response hash ${existingSubmissionHash}`)\n return { submissionHash: existingSubmissionHash }\n }\n\n // Submit the transaction to the Ethereum network\n await job.log(`[${hash}] Submitting ETH tx`)\n // const submissionResponse = await wallet.sendTransaction(preparedTx)\n // const submissionHash = submissionResponse.hash\n\n const submissionHash = assertEx(await submitEthTransaction(tx, bridgeableToken, bridge, wallet), () => `[${hash}] submissionHash not found in receipt`)\n\n await job.log(`[${hash}] Submitted ETH tx and received submission response hash ${submissionHash}`)\n\n // Store the submission hash in the state\n await job.log(`[${hash}] Storing ETH submissionHash`)\n state.submissionHash = submissionHash\n await stateMap.set(hash, state)\n await job.log(`[${hash}] Stored ETH submissionHash`)\n\n return { submissionHash }\n // const hash = await PayloadBuilder.hash(tx[0])\n // await job.log(`[${hash}] Obtaining bridge intent from tx`)\n // const bridgeIntent = assertEx(tx[1].find(isBridgeIntent), () => 'No bridge intent found in transaction payload')\n // await job.log(`[${hash}] submitting ETH transaction`)\n // const amount = hexToBigInt(bridgeIntent.destAmount)\n // const srcAddress = getAddress(bridgeIntent.srcAddress)\n // const destAddress = getAddress(bridgeIntent.destAddress)\n // const tx = await bridge.bridgeFromRemote(srcAddress, destAddress, amount)\n // // const nonce = await wallet.getNonce()\n // // const tx = await bridge.bridgeFromRemote(srcAddress, destAddress, amount, { nonce })\n // await job.log(`[${hash}] submitted ETH transaction`)\n // const confirmation = await tx.wait()\n // const transactionResponse = await confirmation?.getTransaction()\n // const destConfirmation = asHex(transactionResponse?.hash ?? '', true)\n // const block = await transactionResponse?.getBlock()\n // await job.log(`[${hash}] confirmed ETH transaction with hash ${destConfirmation} in block ${block?.number}`)\n // const { schema, ...rest } = bridgeIntent\n // const result: BridgeDestinationObservation = new PayloadBuilder<BridgeDestinationObservation>({ schema: BridgeDestinationObservationSchema })\n // .fields({ ...rest, destConfirmation }).build()\n // return result\n },\n { connection, concurrency: 1 },\n )\n\n worker.on('failed', (job, err) => {\n console.error(`[${name}] Job ${job?.id} failed:`, err.message)\n })\n\n worker.on('error', (err) => {\n console.error(`[${name}] Worker error:`, err)\n })\n}\n\nexport const EthTransactionSubmission: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { Redis } from 'ioredis'\n\nimport type { WorkerDescription } from './WorkerDescription.ts'\n\nconst name = 'Bridge XL1 to Ethereum'\nconst queueName = 'xl1-to-eth-bridge'\nconst createWorker = (connection: Redis) => {\n const worker = new Worker(\n queueName,\n async (job: Job) => {\n await job.log(`[${job.name}] start`)\n // Parent job has no work other than waiting on children\n await job.log(`[${job.name}] done`)\n // const values = await job.getChildrenValues()\n return { ok: true }\n },\n { connection },\n )\n\n worker.on('failed', (job, err) => {\n console.error(`[${name}] Job ${job?.id} failed:`, err.message)\n })\n\n worker.on('error', (err) => {\n console.error(`[${name}] Worker error:`, err)\n })\n}\n\nexport const Xl1ToEthBridgeParent: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import {\n assertEx, isDefined, isNull,\n} from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { Job } from 'bullmq'\nimport { UnrecoverableError, Worker } from 'bullmq'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\n\ntype JobData = { tx: SignedHydratedTransaction }\n\ninterface ReturnType {\n}\n\nconst name = 'Monitor Submitted XL1 Transaction'\nconst queueName = 'xl1-tx-monitor'\nconst createWorker = (connection: Redis, services?: IBridgeServiceCollection) => {\n const gateway = assertEx(services?.gateway, () => 'gateway service not provided')\n const stateMap = assertEx(services?.xl1TxStateMap, () => 'xl1TxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Job<JobData, ReturnType>) => {\n const { tx } = job.data\n // Get the hash of the transaction\n const hash = await PayloadBuilder.hash(tx[0])\n // Get the state of the transaction\n const viewer = assertEx(gateway.connection.viewer, () => `[${hash}] viewer not defined on gateway`)\n const state = assertEx(await stateMap.get(hash), () => `[${hash}] state not found`)\n const submissionHash = assertEx(state?.submissionHash, () => `[${hash}] submissionHash not found`)\n\n // Check for transaction inclusion on chain\n await job.log(`[${hash}] Checking for XL1 transaction inclusion on chain`)\n const foundTx = await viewer.transactionByHash(submissionHash)\n\n // Transaction found on chain\n if (isDefined(foundTx) && !isNull(foundTx)) {\n await job.log(`[${hash}] Found transaction on chain`)\n // Store the block hash\n state.confirmationHash = await PayloadBuilder.hash(foundTx[0])\n await stateMap.set(hash, state)\n return {}\n }\n\n // Check for transaction expiration\n const currentBlockNumber = await viewer.currentBlockNumber()\n if (tx[0].exp < currentBlockNumber) {\n await job.log(\n `[${hash}] Transaction expired at block ${tx[0].exp}, current block ${currentBlockNumber}`,\n )\n // Throw unrecoverable error to stop retries\n throw new UnrecoverableError(`[${hash}] Transaction expired and will never be included`)\n }\n\n // Transaction not yet found, but still valid — retry later\n await job.log(`[${hash}] Transaction not yet included, retrying later`)\n throw new Error(`[${hash}] Transaction not yet included`)\n },\n { connection },\n )\n\n worker.on('failed', (job, err) => {\n console.error(`[${name}] Job ${job?.id} failed:`, err.message)\n })\n\n worker.on('error', (err) => {\n console.error(`[${name}] Worker error:`, err)\n })\n}\n\nexport const Xl1TransactionMonitor: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import { assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\n\ntype JobData = { tx: SignedHydratedTransaction }\n\ninterface ReturnType {}\n\nconst name = 'Prepare XL1 Transaction'\nconst queueName = 'xl1-tx-prepare'\nconst createWorker = (connection: Redis, services?: IBridgeServiceCollection) => {\n const stateMap = assertEx(services?.xl1TxStateMap, () => 'xl1TxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Job<JobData, ReturnType>) => {\n const { tx } = job.data\n const hash = await PayloadBuilder.hash(tx[0])\n await job.log(`[${hash}] preparing XL1 transaction`)\n const preparedTx = tx\n await job.log(`[${hash}] storing XL1 preparedTx`)\n await stateMap.set(hash, { preparedTx })\n await job.log(`[${hash}] stored XL1 preparedTx`)\n await job.log(`[${hash}] prepared XL1 transaction`)\n return {}\n },\n { connection },\n )\n\n worker.on('failed', (job, err) => {\n console.error(`[${name}] Job ${job?.id} failed:`, err.message)\n })\n\n worker.on('error', (err) => {\n console.error(`[${name}] Worker error:`, err)\n })\n}\n\nexport const Xl1TransactionPreparation: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport { type SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection, Xl1TxState } from '../../services/index.ts'\nimport { submitXl1Transaction } from './util/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\n\ntype JobData = { tx: SignedHydratedTransaction }\n\ninterface ReturnType {\n submissionHash: Required<Xl1TxState>['submissionHash']\n}\n\nconst name = 'Submit XL1 Transaction'\nconst queueName = 'xl1-tx-submit'\nconst createWorker = (connection: Redis, services?: IBridgeServiceCollection) => {\n const gateway = assertEx(services?.gateway, () => 'gateway service not provided')\n const stateMap = assertEx(services?.xl1TxStateMap, () => 'xl1TxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Job<JobData, ReturnType>) => {\n const { tx } = job.data\n // Get the hash of the transaction\n const hash = await PayloadBuilder.hash(tx[0])\n // Get the state of the transaction\n const state = assertEx(await stateMap.get(hash), () => `[${hash}] state not found`)\n const preparedTx = assertEx(state?.preparedTx, () => `[${hash}] preparedTx not found`)\n\n // Idempotency check against resubmission\n const { submissionHash: existingSubmissionHash } = state\n if (isDefined(existingSubmissionHash)) {\n await job.log(`[${hash}] Tx already submitted with submission response hash ${existingSubmissionHash}`)\n return { submissionHash: existingSubmissionHash }\n }\n\n // Submit the transaction to the XL1 network\n await job.log(`[${hash}] Submitting XL1 tx`)\n const [submissionHash] = await submitXl1Transaction(preparedTx, gateway)\n\n // Ensure the submission hash matches the expected hash\n // assertEx(submissionHash === hash, () => `[${hash}] Submitted transaction hash ${submissionHash} does not match expected hash`)\n await job.log(`[${hash}] Submitted XL1 tx`)\n\n // Store the submission hash in the state\n await job.log(`[${hash}] Storing XL1 submissionHash`)\n state.submissionHash = submissionHash\n await stateMap.set(hash, state)\n await job.log(`[${hash}] Stored XL1 submissionHash`)\n\n return { submissionHash }\n },\n { connection },\n )\n\n worker.on('failed', (job, err) => {\n console.error(`[${name}] Job ${job?.id} failed:`, err.message)\n })\n\n worker.on('error', (err) => {\n console.error(`[${name}] Worker error:`, err)\n })\n}\n\nexport const Xl1TransactionSubmission: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import type { SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { FlowProducer } from 'bullmq'\n\nimport {\n EthTransactionMonitor, EthTransactionPreparation, EthTransactionSubmission, Xl1ToEthBridgeParent, Xl1TransactionMonitor, Xl1TransactionPreparation,\n Xl1TransactionSubmission,\n} from '../workers/index.ts'\n\n/**\n * Creates a job flow for bridging a transaction from XL1 to Ethereum.\n * @param flowProducer The flow producer to run the job\n * @param tx The bridge transaction\n * @returns The JobNode representing the XL1 to ETH bridge job\n */\nexport const createXl1ToEthBridgeJob = async (\n flowProducer: FlowProducer,\n tx: SignedHydratedTransaction,\n) => {\n const flow = await flowProducer.add({\n name: Xl1ToEthBridgeParent.name,\n queueName: Xl1ToEthBridgeParent.queueName,\n data: { tx },\n children: [\n {\n // Step 6 (runs after child completes)\n name: EthTransactionMonitor.name,\n queueName: EthTransactionMonitor.queueName,\n data: { tx },\n opts: { attempts: 60, backoff: { type: 'fixed', delay: 5000 } },\n children: [\n {\n // Step 5\n name: EthTransactionSubmission.name,\n queueName: EthTransactionSubmission.queueName,\n data: { tx },\n children: [\n {\n // Step 4\n name: EthTransactionPreparation.name,\n queueName: EthTransactionPreparation.queueName,\n data: { tx },\n children: [\n {\n // Step 3\n name: Xl1TransactionMonitor.name,\n queueName: Xl1TransactionMonitor.queueName,\n data: { tx },\n opts: { attempts: 60, backoff: { type: 'fixed', delay: 5000 } },\n children: [\n {\n // Step 2\n name: Xl1TransactionSubmission.name,\n queueName: Xl1TransactionSubmission.queueName,\n data: { tx },\n children: [\n {\n // Step 1 (runs first as deepest child)\n name: Xl1TransactionPreparation.name,\n queueName: Xl1TransactionPreparation.queueName,\n data: { tx },\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n })\n return flow\n}\n","import type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport type { Express } from 'express'\n\nimport { getConnection, getFlowProducer } from '../queue/index.ts'\n\nexport const addFlowProducer = (app: Express, config: BridgeConfig): Express => {\n const connection = getConnection(config)\n const flowProducer = getFlowProducer(connection)\n app.flowProducer = flowProducer\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 type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { BridgeSettingsZod } from '@xyo-network/chain-orchestration'\nimport type { z } from 'zod'\n\nimport { getBridgeSettings } from '../../../../../config/index.ts'\n\nexport const BridgeConfigResponseZod = BridgeSettingsZod\nexport type BridgeConfigResponse = z.infer<typeof BridgeConfigResponseZod>\n\nconst validateRequest = requestHandlerValidator({ response: BridgeConfigResponseZod })\n\nexport const makeBridgeConfigRoute = (config: BridgeConfig): 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-sdk'\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 { BridgeConfig } from '@xyo-network/chain-orchestration'\n\nexport const tryGetBridgeEscrowAddress = (config: BridgeConfig): Address | undefined => {\n const address = asAddress(config.escrowAddress)\n return address\n}\n\nexport const getBridgeEscrowAddress = (config: BridgeConfig): Address => {\n const address = assertEx(tryGetBridgeEscrowAddress(config), () => `Invalid bridge escrow address: ${config.escrowAddress}`)\n return address\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { asAddress, assertEx } from '@xylabs/sdk-js'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\n\nexport const tryGetBridgeFeesAddress = (config: BridgeConfig): Address | undefined => {\n const address = asAddress(config.feesAddress)\n return address\n}\n\nexport const getBridgeFeesAddress = (config: BridgeConfig): Address => {\n const address = assertEx(tryGetBridgeFeesAddress(config), () => `Invalid bridge fees address: ${config.feesAddress}`)\n return address\n}\n","import type { BridgeConfig } from '@xyo-network/chain-orchestration'\n\nimport type { FeeStructure } from '../util/index.ts'\n\nexport const getFeeStructure = (config: BridgeConfig): FeeStructure => {\n const { feeFixed, feeRateBasisPoints } = config\n return { feeFixed, feeRateBasisPoints }\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\n\nexport const getMaxBridgeAmount = (config: BridgeConfig): Hex => {\n const { maxBridgeAmount } = config\n return maxBridgeAmount\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\n\nexport const getMinBridgeAmount = (config: BridgeConfig): Hex => {\n const { minBridgeAmount } = config\n return minBridgeAmount\n}\n","import { assertEx } from '@xylabs/sdk-js'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport type { ChainId } from '@xyo-network/xl1-sdk'\n\nimport { asChainId } from './asChainId.ts'\n\nexport const getRemoteChainId = (config: BridgeConfig): ChainId => {\n const remoteChainId = assertEx(asChainId(config.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 { BridgeConfig } from '@xyo-network/chain-orchestration'\n\nimport { asToken } from './asToken.ts'\n\nexport const getRemoteTokenAddress = (config: BridgeConfig): Address => {\n const token = asToken(config.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 { ActorConfig } from '@xyo-network/xl1-sdk'\nimport { ADDRESS_INDEX, generateXyoBaseWalletFromPhrase } from '@xyo-network/xl1-sdk'\n\nlet accountServiceSingleton: Promisable<WalletInstance> | undefined\n\nexport const getBridgeWalletAccount = async (config: ActorConfig): Promise<WalletInstance> => {\n if (accountServiceSingleton) return accountServiceSingleton\n let walletPhrase = config.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 (\n getConfigAccount: (config: ActorConfig) => Address | undefined,\n config: ActorConfig,\n): 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 { BridgeConfig } from '@xyo-network/chain-orchestration'\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: BridgeConfig): 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 { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport type { ChainId } from '@xyo-network/xl1-sdk'\n\nimport { asChainId } from './asChainId.ts'\n\nexport const getXl1ChainId = (config: BridgeConfig): ChainId => {\n const xl1ChainId = config.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 { BridgeConfig } from '@xyo-network/chain-orchestration'\n\nimport { asToken } from './asToken.ts'\nimport { getXl1ChainId } from './getXl1ChainId.ts'\n\nexport const getXl1TokenAddress = (config: BridgeConfig): Hex => {\n const token = asToken(config.xl1TokenAddress)\n if (isDefined(token)) return token\n return getXl1ChainId(config)\n}\n","import type { BridgeConfig, BridgeSettings } from '@xyo-network/chain-orchestration'\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: BridgeConfig): 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 type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport { toAddress, toHex } from '@xylabs/sdk-js'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { PayloadZodStrictOfSchema } from '@xyo-network/sdk-js'\nimport type { BridgeDestinationObservation } from '@xyo-network/xl1-sdk'\nimport {\n BridgeDestinationObservationFieldsZod,\n BridgeDestinationObservationSchema,\n} from '@xyo-network/xl1-sdk'\nimport { z } from 'zod'\n\nimport { getBridgeSettings } from '../../../../../config/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nexport const makeBridgeFromRemoteStatusRoute = (config: BridgeConfig): 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 { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport type { ChainId } from '@xyo-network/xl1-sdk'\n\nimport { getRemoteChainId } from '../../../../../config/index.ts'\n\nexport const getRemoteChainIdZod = (config: BridgeConfig) => {\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 type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport {\n PayloadBuilder, PayloadZodLooseOfSchema, PayloadZodStrictOfSchema,\n} from '@xyo-network/sdk-js'\nimport type {\n BridgeSourceObservation, BridgeSourceObservationFields, SignedHydratedTransaction,\n} from '@xyo-network/xl1-sdk'\nimport {\n BridgeIntentFieldsZod, BridgeIntentSchema, BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, SignedTransactionBoundWitnessZod, TransferZod,\n} from '@xyo-network/xl1-sdk'\nimport { z } from 'zod'\n\nimport { createXl1ToEthBridgeJob } from '../../../../../queue/index.ts'\nimport { validateBridgeEstimateExact, validateBridgeTransaction } from '../../../../../util/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nexport const BridgeToRemoteBodyZod = z.tuple([\n SignedTransactionBoundWitnessZod,\n PayloadZodLooseOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),\n TransferZod,\n])\nexport type BridgeToRemoteBody = z.infer<typeof BridgeToRemoteBodyZod>\n\nexport const BridgeToRemoteResponseZod = PayloadZodStrictOfSchema(BridgeSourceObservationSchema).extend(BridgeSourceObservationFieldsZod.shape)\nexport type BridgeToRemoteResponse = z.infer<typeof BridgeToRemoteResponseZod>\n\nexport const makeBridgeToRemoteRoute = (config: BridgeConfig): RouteDefinition => {\n const params = z.object({ chainId: getRemoteChainIdZod(config) })\n\n const validateRequest = requestHandlerValidator({\n params, body: BridgeToRemoteBodyZod, response: BridgeToRemoteResponseZod,\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 { flowProducer } = 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 job queue\n const singedHydratedTransaction: SignedHydratedTransaction = [signedTxBw, [transfer, bridgeIntent]]\n await createXl1ToEthBridgeJob(flowProducer, singedHydratedTransaction)\n\n // Create BridgeObservation\n const srcConfirmation = await PayloadBuilder.hash(signedTxBw)\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 { BridgeConfig } from '@xyo-network/chain-orchestration'\n\nimport type { BridgeFees } from './BridgeFees.ts'\n\nexport type FeeStructure = Pick<BridgeConfig, 'feeFixed' | 'feeRateBasisPoints'>\n\nexport const calculateBridgeFees = (srcAmount: Hex, feeStructure: FeeStructure): BridgeFees => {\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 feeFixed, feeVariable, srcAmount,\n }\n}\n","import type { Address, Hex } from '@xylabs/sdk-js'\nimport { hexToBigInt } from '@xylabs/sdk-js'\nimport type { Transfer } from '@xyo-network/xl1-sdk'\nimport { createTransferPayload } from '@xyo-network/xl1-sdk'\n\nimport type { BridgeFees } from './BridgeFees.ts'\n\n/**\n * Calculates the transfer representing the bridging of funds including the appropriate amounts for the bridge fees\n * @param sender The client attempting to bridge\n * @param srcAmount The amount the client is attempting to bridge\n * @param escrowAddress The address in which bridged funds will be held until the transfer is executed on the destination chain\n * @param feesAddress The address to which bridge fees will be paid\n * @param context An object containing the necessary fee and amount information to construct the transfer context\n * @returns A transfer representing the bridging of funds including the appropriate amounts for the bridge fees\n */\nexport const createBridgeTransfer = (sender: Address, srcAmount: Hex, escrowAddress: Address, feesAddress: Address, context: BridgeFees): Transfer => {\n const { feeFixed, feeVariable } = context\n const escrowAmount = hexToBigInt(srcAmount)\n const feesAmount = hexToBigInt(feeFixed) + hexToBigInt(feeVariable)\n const transfers: Record<Address, bigint>\n // If the escrow and fee addresses are the same\n = escrowAddress === feesAddress\n // combine the amounts into a single transfer to that address\n ? { [feesAddress]: escrowAmount + feesAmount }\n // otherwise, create separate transfers to the escrow and fees addresses\n : { [escrowAddress]: escrowAmount, [feesAddress]: feesAmount }\n const transfer = createTransferPayload(sender, transfers, context)\n\n return transfer\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport { toAddress } from '@xylabs/sdk-js'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n BridgeIntent, BridgeIntentFields, Transfer,\n} from '@xyo-network/xl1-sdk'\nimport { BridgeIntentSchema } from '@xyo-network/xl1-sdk'\nimport { v4 } from 'uuid'\n\nimport { getBridgeSettings } from '../config/index.ts'\nimport { calculateBridgeFees } from './calculateBridgeFees.ts'\nimport { createBridgeTransfer } from './createBridgeTransfer.ts'\n\nexport const generateBridgeEstimate = async (\n srcAddress: Hex,\n srcAmount: Hex,\n destAddress: Hex,\n config: BridgeConfig,\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\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: srcAmount, // This is a 1:1 bridge. Fees are handled at the transfer level, not the bridge intent level.\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 transfer = createBridgeTransfer(sender, srcAmount, escrowAddress, feesAddress, fees)\n\n return [bridgeIntent, transfer]\n}\n","import { isUndefined } from '@xylabs/sdk-js'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { BridgeIntent, Transfer } from '@xyo-network/xl1-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: BridgeConfig,\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 type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n BridgeIntent,\n TransactionBoundWitness, Transfer,\n} from '@xyo-network/xl1-sdk'\n\nimport { getXl1ChainId } from '../config/index.ts'\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: BridgeConfig,\n): Promise<boolean> => {\n const { srcAddress } = intent\n\n const chainId = getXl1ChainId(config)\n if (signedTxBw.chain !== chainId) return false\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 type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { PayloadZodStrictOfSchema } from '@xyo-network/sdk-js'\nimport type { XyoGatewayRunner } from '@xyo-network/xl1-sdk'\nimport {\n BridgeIntentFieldsZod, BridgeIntentSchema, buildUnsignedTransaction, toXL1BlockNumber, TransactionBoundWitnessZod, TransferZod,\n} from '@xyo-network/xl1-sdk'\nimport { z } from 'zod'\n\nimport { getXl1ChainId } from '../../../../../config/index.ts'\nimport { generateBridgeEstimate } from '../../../../../util/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nexport const BridgeToRemoteEstimateBodyZod = BridgeIntentFieldsZod.pick({\n destAddress: true,\n srcAddress: true,\n srcAmount: true,\n})\nexport type BridgeToRemoteEstimateBody = z.infer<typeof BridgeToRemoteEstimateBodyZod>\n\nexport const BridgeToRemoteEstimateResponseZod = z.tuple([\n TransactionBoundWitnessZod,\n PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),\n TransferZod,\n])\n\nexport type BridgeToRemoteEstimateResponse = z.infer<typeof BridgeToRemoteEstimateResponseZod>\n\nexport const makeBridgeToRemoteEstimateRoute = (config: BridgeConfig, gateway: XyoGatewayRunner): RouteDefinition => {\n const params = z.object({ chainId: getRemoteChainIdZod(config) })\n const validateRequest = requestHandlerValidator({\n params, body: BridgeToRemoteEstimateBodyZod, response: BridgeToRemoteEstimateResponseZod,\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 viewer = assertEx(gateway.connection.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 type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { PayloadZodStrictOfSchema } from '@xyo-network/sdk-js'\nimport type { BridgeDestinationObservation, BridgeSourceObservation } from '@xyo-network/xl1-sdk'\nimport {\n BridgeDestinationObservationFieldsZod, BridgeDestinationObservationSchema, BridgeIntentFieldsZod, BridgeIntentSchema, BridgeSourceObservationFieldsZod,\n BridgeSourceObservationSchema,\n} from '@xyo-network/xl1-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 BridgeToRemoteStatusResponseZod = 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])\nexport type BridgeToRemoteStatusResponse = z.infer<typeof BridgeToRemoteStatusResponseZod>\n\nexport const makeBridgeToRemoteStatusRoute = (config: BridgeConfig): 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\n const validateRequest = requestHandlerValidator({\n params, query, response: BridgeToRemoteStatusResponseZod,\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 BridgeToRemoteStatusResponseZod> = [] as unknown as z.infer<typeof BridgeToRemoteStatusResponseZod>\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 srcConfirmation: toHex('0x8888'),\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 { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport type { XyoGatewayRunner } from '@xyo-network/xl1-sdk'\n\nimport {\n makeBridgeConfigRoute, makeBridgeFromRemoteStatusRoute, makeBridgeToRemoteEstimateRoute, makeBridgeToRemoteRoute, makeBridgeToRemoteStatusRoute,\n} from './routes/index.ts'\n\nexport const getRouteDefinitions = (config: BridgeConfig, gateway: XyoGatewayRunner): RouteDefinition[] => {\n return [\n makeBridgeConfigRoute(config),\n makeBridgeToRemoteEstimateRoute(config, gateway),\n makeBridgeToRemoteRoute(config),\n makeBridgeToRemoteStatusRoute(config),\n makeBridgeFromRemoteStatusRoute(config),\n ]\n}\n","import type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport type { XyoGatewayRunner } from '@xyo-network/xl1-sdk'\nimport type { Express } from 'express'\n\nimport { getRouteDefinitions } from './routeDefinitions/index.ts'\n\nexport const addBridgeRoutes = (app: Express, config: BridgeConfig, gateway: XyoGatewayRunner) => {\n const routeDefinitions = getRouteDefinitions(config, gateway)\n for (const definition of routeDefinitions) {\n app[definition.method](definition.path, definition.handlers)\n }\n}\n","import type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport type { XyoGatewayRunner } from '@xyo-network/xl1-sdk'\nimport type { Express } from 'express'\n\nimport { addBridgeRoutes } from './bridge/index.ts'\n\nexport const addRoutes = (app: Express, config: BridgeConfig, gateway: XyoGatewayRunner) => {\n addBridgeRoutes(app, config, gateway)\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { BridgeConfig, BridgeConfigContext } from '@xyo-network/chain-orchestration'\nimport { initEvmProvider } from '@xyo-network/chain-orchestration'\nimport { BridgeableToken__factory, LiquidityPoolBridge__factory } from '@xyo-network/typechain'\nimport { HDWallet } from '@xyo-network/wallet'\nimport type { XyoGatewayRunner } from '@xyo-network/xl1-sdk'\nimport { getAddress, Wallet } from 'ethers'\n\nimport type { EthTxState } from './EthTxState.ts'\nimport { getIterableMap } from './getIterableMap.ts'\nimport type { IBridgeServiceCollection } from './IBridgeServiceCollection.ts'\nimport type { Xl1TxState } from './Xl1TxState.ts'\n\n/**\n * Used for retrieving a service collection\n * @returns A service collection\n */\nexport const getServices = async (context: BridgeConfigContext, gateway: XyoGatewayRunner): Promise<IBridgeServiceCollection> => {\n const { config } = context\n\n const ethTxStateMap = await getIterableMap<Hash, EthTxState>(config, 'liquidity_bridge_xl1_to_eth_eth_tx_state')\n const xl1TxStateMap = await getIterableMap<Hash, Xl1TxState>(config, 'liquidity_bridge_xl1_to_eth_xl1_tx_state')\n const provider = await initEvmProvider(context)\n const {\n remoteBridgeContractAddress, remoteChainWalletPrivateKey, remoteTokenAddress, mnemonic,\n } = config as BridgeConfig\n const account = isDefined(mnemonic) ? await HDWallet.fromPhrase(mnemonic) : await HDWallet.random()\n const wallet = new Wallet(remoteChainWalletPrivateKey, provider)\n const bridgeableToken = BridgeableToken__factory.connect(getAddress(remoteTokenAddress), wallet)\n const bridge = LiquidityPoolBridge__factory.connect(getAddress(remoteBridgeContractAddress), wallet)\n // const approvalAmount = 18n * 10n ** 9n * 10n ** 18n // 18 billion tokens with 18 decimals\n // const contractApprovalTx = await bridgeableToken.connect(wallet).approve(bridge.getAddress(), approvalAmount)\n // await contractApprovalTx.wait(1)\n // Assert we are contract owner so we can call ownable methods\n const bridgeOwner = await bridge.owner()\n assertEx(bridgeOwner.toLowerCase() === wallet.address.toLowerCase(), () => 'Wallet is not the owner of the bridge contract')\n return {\n account, bridge, bridgeableToken, ethTxStateMap, gateway, provider, wallet, xl1TxStateMap,\n }\n}\n","import { BaseMongoSdk, type BaseMongoSdkPrivateConfig } from '@xylabs/mongo'\nimport { MongoMap } from '@xyo-network/chain-protocol'\nimport type { BaseConfig, IterableMap } from '@xyo-network/xl1-sdk'\nimport { hasMongoConfig, mapToMapType } from '@xyo-network/xl1-sdk'\nimport type { Document } from 'mongodb'\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 */\nexport const getIterableMap = async <K extends {} = string, V extends Document = Document>(\n config: BaseConfig,\n collection: string,\n): 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 { BridgeConfig } from '@xyo-network/chain-orchestration'\n\nimport { createWorkers, getConnection } from '../queue/index.ts'\nimport type { IBridgeServiceCollection } from '../services/index.ts'\n\nexport const addWorkers = (config: BridgeConfig, services: IBridgeServiceCollection) => {\n const connection = getConnection(config)\n createWorkers(connection, services)\n}\n","import type { BridgeConfigContext } from '@xyo-network/chain-orchestration'\nimport type { XyoGatewayRunner } from '@xyo-network/xl1-sdk'\n\nimport { getServices } from '../services/index.ts'\nimport { addWorkers } from './addWorkers.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\nexport const getServer = async (context: BridgeConfigContext, gateway: XyoGatewayRunner) => {\n const { logger, config } = context\n const { port } = config\n const app = getApp(config, gateway)\n const services = await getServices(context, gateway)\n addWorkers(config, services)\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"],"mappings":";;;;AAEA,SAASA,iBAAiB;AAC1B,SAASC,6BAA2C;AACpD,SAEEC,SAEAC,+BACK;;;ACTP,SACEC,uBAAuBC,6BAA6BC,sCAAsCC,mBAAmBC,0BAA0BC,kBACvIC,gBAAgBC,yBACX;AAGP,OAAOC,iBAAiB;AACxB,OAAOC,UAAU;AAEjB,OAAOC,aAAa;;;ACTpB,SAASC,iBAAiB;AAE1B,SAASC,aAAa;AAEtB,IAAIC;AAEJ,IAAMC,uBAAuB;AAEtB,IAAMC,gBAAgB,wBAACC,WAAAA;AAC5B,MAAIC,UAAUJ,UAAAA,EAAa,QAAOA;AAClC,QAAM,EAAEK,WAAWC,MAAMC,WAAWC,KAAI,IAAKL;AAC7CH,eAAa,IAAIS,MAAM;IACrBH;IAAME;IAAMP;EACd,CAAA;AACA,SAAOD;AACT,GAP6B;;;ACR7B,SAASU,aAAAA,kBAAiB;AAC1B,SAASC,oBAAoB;AAG7B,IAAIC;AAEG,IAAMC,kBAAkB,wBAACC,gBAAAA;AAC9B,MAAIC,WAAUH,YAAAA,EAAe,QAAOA;AACpCA,iBAAe,IAAII,aAAa;IAAEF,YAAAA;EAAW,CAAA;AAC7C,SAAOF;AACT,GAJ+B;;;ACOxB,IAAMK,gBAAgB,wBAACC,aAAmBC,aAAAA;AAC/CC,uBAAqBC,aAAaH,WAAAA;AAClCI,4BAA0BD,aAAaH,aAAYC,QAAAA;AACnDI,2BAAyBF,aAAaH,aAAYC,QAAAA;AAClDK,wBAAsBH,aAAaH,aAAYC,QAAAA;AAC/CM,4BAA0BJ,aAAaH,aAAYC,QAAAA;AACnDO,2BAAyBL,aAAaH,aAAYC,QAAAA;AAClDQ,wBAAsBN,aAAaH,aAAYC,QAAAA;AACjD,GAR6B;;;ACb7B,SAASS,gBAAgB;AACzB,SAASC,sBAAsB;AAG/B,SAASC,cAAc;AAYvB,IAAMC,OAAO;AACb,IAAMC,YAAY;AAClB,IAAMC,eAAe,wBAACC,aAAmBC,aAAAA;AACvC,QAAMC,WAAWC,SAASF,UAAUC,UAAU,MAAM,+BAAA;AACpD,QAAME,WAAWD,SAASF,UAAUI,eAAe,MAAM,oCAAA;AAEzD,QAAMC,SAAS,IAAIC,OACjBT,WACA,OAAOU,QAAAA;AACL,UAAM,EAAEC,GAAE,IAAKD,IAAIE;AACnB,UAAMC,OAAO,MAAMC,eAAeD,KAAKF,GAAG,CAAA,CAAE;AAC5C,UAAMI,QAAQV,SAAS,MAAMC,SAASU,IAAIH,IAAAA,GAAO,MAAM,iBAAA;AACvD,UAAMI,iBAAiBZ,SAASU,OAAOE,gBAAgB,MAAM,0BAAA;AAC7D,UAAMC,UAAUb,SAAS,MAAMD,SAASe,sBAAsBF,cAAAA,GAAiB,MAAM,+BAAA;AACrF,UAAMP,IAAIU,IAAI,IAAIP,IAAAA,sBAA0BI,cAAAA,aAA2BC,QAAQG,WAAW,EAAE;AAC5F,UAAM,EAAEC,WAAWD,YAAW,IAAKH;AACnCH,UAAMQ,mBAAmBD;AACzB,UAAMhB,SAASkB,IAAIX,MAAME,KAAAA;AACzB,WAAO;MAAEO;MAAWD;IAAY;EAClC,GACA;IAAEnB,YAAAA;EAAW,CAAA;AAGfM,SAAOiB,GAAG,UAAU,CAACf,KAAKgB,QAAAA;AACxBC,YAAQC,MAAM,IAAI7B,IAAAA,SAAaW,KAAKmB,EAAAA,YAAcH,IAAII,OAAO;EAC/D,CAAA;AAEAtB,SAAOiB,GAAG,SAAS,CAACC,QAAAA;AAClBC,YAAQC,MAAM,IAAI7B,IAAAA,mBAAuB2B,GAAAA;EAC3C,CAAA;AACF,GA5BqB;AA8Bd,IAAMK,wBAA2C;EACtD9B;EAAcF;EAAMC;AACtB;;;AClDA,SAASgC,YAAAA,WAAUC,eAAAA,oBAAmB;AACtC,SAASC,kBAAAA,uBAAsB;AAC/B,SAASC,kBAAAA,uBAAsD;AAE/D,SAASC,UAAAA,eAAc;AACvB,SAASC,kBAAkB;;;ACL3B,SACEC,YAAAA,WAAUC,aAAaC,oBAClB;AACP,SAASC,kBAAAA,uBAAsB;AAE/B,SAASC,sBAAsD;AAGxD,IAAMC,uBAAuB,8BAAOC,IAA+BC,iBAAkCC,QAA6BC,WAAAA;AAEvI,QAAMC,iBAAiBC,UAASL,GAAG,CAAA,GAAI,MAAM,wCAAA;AAC7C,QAAMM,eAAeD,UAASL,GAAG,CAAA,EAAGO,KAAKC,cAAAA,GAAiB,MAAM,wBAAA;AAChE,QAAMC,aAAaC,aAAaJ,aAAaG,UAAU;AACvD,QAAME,cAAcD,aAAaJ,aAAaK,WAAW;AACzD,QAAMC,SAASC,YAAYP,aAAaQ,UAAU;AAClD,QAAMC,QAAQF,YAAY,MAAMG,gBAAeC,KAAKb,cAAAA,CAAAA;AAMpD,QAAMc,WAAW,MAAMhB,OAAOiB,QAAQhB,MAAAA,EAAQiB,iBAAiBX,YAAYE,aAAaC,QAAQG,KAAAA;AAChG,QAAMM,UAAU,MAAMH,SAASI,KAAK,CAAA;AACpC,SAAOD,SAASJ;AAClB,GAhBoC;;;ACPpC,SACEM,6BACK;AAEA,IAAMC,uBAAuB,8BAClCC,YACAC,YAAAA;AAWA,QAAMC,mBAAmBF,WAAW,CAAA,EAAGG,OAAOC,CAAAA,MAAK,CAACC,sBAAsBD,CAAAA,CAAAA;AAC1E,QAAME,SAAS,MAAML,QAAQM,sBAAsBP,YAAYE,gBAAAA;AAC/D,SAAOI;AAMT,GArBoC;;;ACJpC,SAASE,YAAAA,WAAUC,eAAAA,oBAAmB;AAEtC,SAASC,kBAAAA,uBAAsD;AAgBxD,IAAMC,8BAA8B,8BACzCC,IACAC,iBACAC,QACAC,WAAAA;AAGA,QAAMC,eAAeC,UAASL,GAAG,CAAA,EAAGM,KAAKC,eAAAA,GAAiB,MAAM,wBAAA;AAChE,QAAMC,SAASC,aAAYL,aAAaM,UAAU;AAGlD,QAAMC,yBAAyB,MAAMT,OAAOU,gBAAe;AAC3D,QAAMC,gBAAgB,MAAMX,OAAOY,WAAU;AAG7C,QAAMC,qBAAqB,MAAMd,gBAAgBe,UAAUL,wBAAwBE,aAAAA;AACnF,QAAMV,QAAQc,IAAI,wBAAwBF,mBAAmBG,SAAQ,CAAA,EAAI;AACzE,SAAOH,sBAAsBP;AAC/B,GAlB2C;;;AClB3C,SAASW,YAAAA,WAAUC,eAAAA,oBAAmB;AAEtC,SAASC,kBAAAA,uBAAsD;AAgBxD,IAAMC,4BAA4B,8BACvCC,IACAC,iBACAC,QACAC,WAAAA;AAGA,QAAMC,eAAeC,UAASL,GAAG,CAAA,EAAGM,KAAKC,eAAAA,GAAiB,MAAM,wBAAA;AAChE,QAAMC,SAASC,aAAYL,aAAaM,UAAU;AAGlD,QAAMC,yBAAyB,MAAMT,OAAOU,gBAAe;AAG3D,QAAMC,UAAU,MAAMZ,gBAAgBa,UAAUH,sBAAAA;AAChD,QAAMR,QAAQY,IAAI,sBAAsBF,QAAQG,SAAQ,CAAA,EAAI;AAC5D,SAAOH,WAAWL;AACpB,GAjByC;;;AJHzC,IAAMS,QAAO;AACb,IAAMC,aAAY;AAEX,IAAMC,gBAAe,wBAACC,aAAmBC,aAAAA;AAC9C,QAAMC,SAASC,UAASF,UAAUC,QAAQ,MAAM,6BAAA;AAChD,QAAME,kBAAkBD,UAASF,UAAUG,iBAAiB,MAAM,sCAAA;AAClE,QAAMC,WAAWF,UAASF,UAAUK,eAAe,MAAM,oCAAA;AAEzD,QAAMC,SAAS,IAAIC,QACjBV,YACA,OAAOW,QAAAA;AACL,UAAM,EAAEC,GAAE,IAAKD,IAAIE;AACnB,UAAMC,OAAO,MAAMC,gBAAeD,KAAKF,GAAG,CAAA,CAAE;AAC5C,UAAMD,IAAIK,IAAI,IAAIF,IAAAA,6BAAiC;AACnD,UAAMH,IAAIK,IAAI,IAAIF,IAAAA,uDAA2D;AAC7E,QAAI,CAAC,MAAMG,4BAA4BL,IAAIN,iBAAiBF,QAAQO,GAAAA,GAAM;AACxE,YAAM,IAAIO,MAAM,+FAAA;IAClB;AACA,UAAMP,IAAIK,IAAI,IAAIF,IAAAA,sDAA0D;AAC5E,UAAMH,IAAIK,IAAI,IAAIF,IAAAA,qDAAyD;AAC3E,QAAI,CAAC,MAAMK,0BAA0BP,IAAIN,iBAAiBF,QAAQO,GAAAA,GAAM;AACtE,YAAM,IAAIO,MAAM,6FAAA;IAClB;AACA,UAAMP,IAAIK,IAAI,IAAIF,IAAAA,oDAAwD;AAC1E,UAAMH,IAAIK,IAAI,IAAIF,IAAAA,4BAAgC;AAClD,UAAMM,eAAef,UAASO,GAAG,CAAA,EAAGS,KAAKC,eAAAA,GAAiB,MAAM,wBAAA;AAChE,UAAMC,SAASC,aAAYJ,aAAaK,UAAU;AAClD,UAAMC,aAAaC,WAAWP,aAAaM,UAAU;AACrD,UAAME,cAAcD,WAAWP,aAAaQ,WAAW;AACvD,UAAMC,QAAQL,aAAY,MAAMT,gBAAeD,KAAKF,GAAG,CAAA,CAAE,CAAA;AACzD,UAAMkB,aAAa,MAAM1B,OAAO2B,YAAY,kBAAA,EAAoBC,oBAAoBN,YAAYE,aAAaL,QAAQM,KAAAA;AACrH,UAAMlB,IAAIK,IAAI,IAAIF,IAAAA,yBAA6B;AAC/C,UAAMH,IAAIK,IAAI,IAAIF,IAAAA,0BAA8B;AAChD,UAAMP,SAAS0B,IAAInB,MAAM;MAAEgB;IAAW,CAAA;AACtC,UAAMnB,IAAIK,IAAI,IAAIF,IAAAA,yBAA6B;AAC/C,UAAMH,IAAIK,IAAI,IAAIF,IAAAA,4BAAgC;AAClD,WAAO,CAAC;EACV,GACA;IAAEZ,YAAAA;EAAW,CAAA;AAGfO,SAAOyB,GAAG,UAAU,CAACvB,KAAKwB,QAAAA;AACxBC,YAAQC,MAAM,IAAItC,KAAAA,SAAaY,KAAK2B,EAAAA,YAAcH,IAAII,OAAO;EAC/D,CAAA;AAEA9B,SAAOyB,GAAG,SAAS,CAACC,QAAAA;AAClBC,YAAQC,MAAM,IAAItC,KAAAA,mBAAuBoC,GAAAA;EAC3C,CAAA;AACF,GA7C4B;AA+CrB,IAAMK,4BAA+C;EAC1DvC,cAAAA;EAAcF,MAAAA;EAAMC,WAAAA;AACtB;;;AKpEA,SAASyC,YAAAA,WAAUC,aAAAA,kBAAiB;AACpC,SAASC,kBAAAA,uBAAsB;AAG/B,SAASC,UAAAA,eAAc;AAavB,IAAMC,QAAO;AACb,IAAMC,aAAY;AAClB,IAAMC,gBAAe,wBAACC,aAAmBC,aAAAA;AACvC,QAAMC,SAASC,UAASF,UAAUC,QAAQ,MAAM,6BAAA;AAChD,QAAME,kBAAkBD,UAASF,UAAUG,iBAAiB,MAAM,sCAAA;AAClE,QAAMC,SAASF,UAASF,UAAUI,QAAQ,MAAM,6BAAA;AAChD,QAAMC,WAAWH,UAASF,UAAUM,eAAe,MAAM,oCAAA;AAEzD,QAAMC,SAAS,IAAIC,QACjBX,YACA,OAAOY,QAAAA;AACL,UAAM,EAAEC,GAAE,IAAKD,IAAIE;AACnB,UAAMC,OAAO,MAAMC,gBAAeD,KAAKF,GAAG,CAAA,CAAE;AAC5C,UAAMI,QAAQZ,UAAS,MAAMG,SAASU,IAAIH,IAAAA,GAAO,MAAM,IAAIA,IAAAA,mBAAuB;AAClF,UAAMI,aAAad,UAASY,OAAOE,YAAY,MAAM,IAAIJ,IAAAA,wBAA4B;AAGrF,UAAM,EAAEK,gBAAgBC,uBAAsB,IAAKJ;AACnD,QAAIK,WAAUD,sBAAAA,GAAyB;AACrC,YAAMT,IAAIW,IAAI,IAAIR,IAAAA,wDAA4DM,sBAAAA,EAAwB;AACtG,aAAO;QAAED,gBAAgBC;MAAuB;IAClD;AAGA,UAAMT,IAAIW,IAAI,IAAIR,IAAAA,qBAAyB;AAI3C,UAAMK,iBAAiBf,UAAS,MAAMmB,qBAAqBX,IAAIP,iBAAiBF,QAAQG,MAAAA,GAAS,MAAM,IAAIQ,IAAAA,uCAA2C;AAEtJ,UAAMH,IAAIW,IAAI,IAAIR,IAAAA,4DAAgEK,cAAAA,EAAgB;AAGlG,UAAMR,IAAIW,IAAI,IAAIR,IAAAA,8BAAkC;AACpDE,UAAMG,iBAAiBA;AACvB,UAAMZ,SAASiB,IAAIV,MAAME,KAAAA;AACzB,UAAML,IAAIW,IAAI,IAAIR,IAAAA,6BAAiC;AAEnD,WAAO;MAAEK;IAAe;EAqB1B,GACA;IAAElB,YAAAA;IAAYwB,aAAa;EAAE,CAAA;AAG/BhB,SAAOiB,GAAG,UAAU,CAACf,KAAKgB,QAAAA;AACxBC,YAAQC,MAAM,IAAI/B,KAAAA,SAAaa,KAAKmB,EAAAA,YAAcH,IAAII,OAAO;EAC/D,CAAA;AAEAtB,SAAOiB,GAAG,SAAS,CAACC,QAAAA;AAClBC,YAAQC,MAAM,IAAI/B,KAAAA,mBAAuB6B,GAAAA;EAC3C,CAAA;AACF,GApEqB;AAsEd,IAAMK,2BAA8C;EACzDhC,cAAAA;EAAcF,MAAAA;EAAMC,WAAAA;AACtB;;;AC1FA,SAASkC,UAAAA,eAAc;AAKvB,IAAMC,QAAO;AACb,IAAMC,aAAY;AAClB,IAAMC,gBAAe,wBAACC,gBAAAA;AACpB,QAAMC,SAAS,IAAIC,QACjBJ,YACA,OAAOK,QAAAA;AACL,UAAMA,IAAIC,IAAI,IAAID,IAAIN,IAAI,SAAS;AAEnC,UAAMM,IAAIC,IAAI,IAAID,IAAIN,IAAI,QAAQ;AAElC,WAAO;MAAEQ,IAAI;IAAK;EACpB,GACA;IAAEL,YAAAA;EAAW,CAAA;AAGfC,SAAOK,GAAG,UAAU,CAACH,KAAKI,QAAAA;AACxBC,YAAQC,MAAM,IAAIZ,KAAAA,SAAaM,KAAKO,EAAAA,YAAcH,IAAII,OAAO;EAC/D,CAAA;AAEAV,SAAOK,GAAG,SAAS,CAACC,QAAAA;AAClBC,YAAQC,MAAM,IAAIZ,KAAAA,mBAAuBU,GAAAA;EAC3C,CAAA;AACF,GApBqB;AAsBd,IAAMK,uBAA0C;EACrDb,cAAAA;EAAcF,MAAAA;EAAMC,WAAAA;AACtB;;;AChCA,SACEe,YAAAA,WAAUC,aAAAA,YAAWC,cAChB;AACP,SAASC,kBAAAA,uBAAsB;AAG/B,SAASC,oBAAoBC,UAAAA,eAAc;AAW3C,IAAMC,QAAO;AACb,IAAMC,aAAY;AAClB,IAAMC,gBAAe,wBAACC,aAAmBC,aAAAA;AACvC,QAAMC,UAAUC,UAASF,UAAUC,SAAS,MAAM,8BAAA;AAClD,QAAME,WAAWD,UAASF,UAAUI,eAAe,MAAM,oCAAA;AAEzD,QAAMC,SAAS,IAAIC,QACjBT,YACA,OAAOU,QAAAA;AACL,UAAM,EAAEC,GAAE,IAAKD,IAAIE;AAEnB,UAAMC,OAAO,MAAMC,gBAAeD,KAAKF,GAAG,CAAA,CAAE;AAE5C,UAAMI,SAASV,UAASD,QAAQF,WAAWa,QAAQ,MAAM,IAAIF,IAAAA,iCAAqC;AAClG,UAAMG,QAAQX,UAAS,MAAMC,SAASW,IAAIJ,IAAAA,GAAO,MAAM,IAAIA,IAAAA,mBAAuB;AAClF,UAAMK,iBAAiBb,UAASW,OAAOE,gBAAgB,MAAM,IAAIL,IAAAA,4BAAgC;AAGjG,UAAMH,IAAIS,IAAI,IAAIN,IAAAA,mDAAuD;AACzE,UAAMO,UAAU,MAAML,OAAOM,kBAAkBH,cAAAA;AAG/C,QAAII,WAAUF,OAAAA,KAAY,CAACG,OAAOH,OAAAA,GAAU;AAC1C,YAAMV,IAAIS,IAAI,IAAIN,IAAAA,8BAAkC;AAEpDG,YAAMQ,mBAAmB,MAAMV,gBAAeD,KAAKO,QAAQ,CAAA,CAAE;AAC7D,YAAMd,SAASmB,IAAIZ,MAAMG,KAAAA;AACzB,aAAO,CAAC;IACV;AAGA,UAAMU,qBAAqB,MAAMX,OAAOW,mBAAkB;AAC1D,QAAIf,GAAG,CAAA,EAAGgB,MAAMD,oBAAoB;AAClC,YAAMhB,IAAIS,IACR,IAAIN,IAAAA,kCAAsCF,GAAG,CAAA,EAAGgB,GAAG,mBAAmBD,kBAAAA,EAAoB;AAG5F,YAAM,IAAIE,mBAAmB,IAAIf,IAAAA,kDAAsD;IACzF;AAGA,UAAMH,IAAIS,IAAI,IAAIN,IAAAA,gDAAoD;AACtE,UAAM,IAAIgB,MAAM,IAAIhB,IAAAA,gCAAoC;EAC1D,GACA;IAAEX,YAAAA;EAAW,CAAA;AAGfM,SAAOsB,GAAG,UAAU,CAACpB,KAAKqB,QAAAA;AACxBC,YAAQC,MAAM,IAAIlC,KAAAA,SAAaW,KAAKwB,EAAAA,YAAcH,IAAII,OAAO;EAC/D,CAAA;AAEA3B,SAAOsB,GAAG,SAAS,CAACC,QAAAA;AAClBC,YAAQC,MAAM,IAAIlC,KAAAA,mBAAuBgC,GAAAA;EAC3C,CAAA;AACF,GApDqB;AAsDd,IAAMK,wBAA2C;EACtDnC,cAAAA;EAAcF,MAAAA;EAAMC,WAAAA;AACtB;;;AC3EA,SAASqC,YAAAA,iBAAgB;AACzB,SAASC,kBAAAA,uBAAsB;AAG/B,SAASC,UAAAA,eAAc;AAUvB,IAAMC,QAAO;AACb,IAAMC,aAAY;AAClB,IAAMC,gBAAe,wBAACC,aAAmBC,aAAAA;AACvC,QAAMC,WAAWC,UAASF,UAAUG,eAAe,MAAM,oCAAA;AAEzD,QAAMC,SAAS,IAAIC,QACjBR,YACA,OAAOS,QAAAA;AACL,UAAM,EAAEC,GAAE,IAAKD,IAAIE;AACnB,UAAMC,OAAO,MAAMC,gBAAeD,KAAKF,GAAG,CAAA,CAAE;AAC5C,UAAMD,IAAIK,IAAI,IAAIF,IAAAA,6BAAiC;AACnD,UAAMG,aAAaL;AACnB,UAAMD,IAAIK,IAAI,IAAIF,IAAAA,0BAA8B;AAChD,UAAMR,SAASY,IAAIJ,MAAM;MAAEG;IAAW,CAAA;AACtC,UAAMN,IAAIK,IAAI,IAAIF,IAAAA,yBAA6B;AAC/C,UAAMH,IAAIK,IAAI,IAAIF,IAAAA,4BAAgC;AAClD,WAAO,CAAC;EACV,GACA;IAAEV,YAAAA;EAAW,CAAA;AAGfK,SAAOU,GAAG,UAAU,CAACR,KAAKS,QAAAA;AACxBC,YAAQC,MAAM,IAAIrB,KAAAA,SAAaU,KAAKY,EAAAA,YAAcH,IAAII,OAAO;EAC/D,CAAA;AAEAf,SAAOU,GAAG,SAAS,CAACC,QAAAA;AAClBC,YAAQC,MAAM,IAAIrB,KAAAA,mBAAuBmB,GAAAA;EAC3C,CAAA;AACF,GA1BqB;AA4Bd,IAAMK,4BAA+C;EAC1DtB,cAAAA;EAAcF,MAAAA;EAAMC,WAAAA;AACtB;;;AC9CA,SAASwB,YAAAA,WAAUC,aAAAA,kBAAiB;AACpC,SAASC,kBAAAA,uBAAsB;AAG/B,SAASC,UAAAA,eAAc;AAavB,IAAMC,QAAO;AACb,IAAMC,aAAY;AAClB,IAAMC,gBAAe,wBAACC,aAAmBC,aAAAA;AACvC,QAAMC,UAAUC,UAASF,UAAUC,SAAS,MAAM,8BAAA;AAClD,QAAME,WAAWD,UAASF,UAAUI,eAAe,MAAM,oCAAA;AAEzD,QAAMC,SAAS,IAAIC,QACjBT,YACA,OAAOU,QAAAA;AACL,UAAM,EAAEC,GAAE,IAAKD,IAAIE;AAEnB,UAAMC,OAAO,MAAMC,gBAAeD,KAAKF,GAAG,CAAA,CAAE;AAE5C,UAAMI,QAAQV,UAAS,MAAMC,SAASU,IAAIH,IAAAA,GAAO,MAAM,IAAIA,IAAAA,mBAAuB;AAClF,UAAMI,aAAaZ,UAASU,OAAOE,YAAY,MAAM,IAAIJ,IAAAA,wBAA4B;AAGrF,UAAM,EAAEK,gBAAgBC,uBAAsB,IAAKJ;AACnD,QAAIK,WAAUD,sBAAAA,GAAyB;AACrC,YAAMT,IAAIW,IAAI,IAAIR,IAAAA,wDAA4DM,sBAAAA,EAAwB;AACtG,aAAO;QAAED,gBAAgBC;MAAuB;IAClD;AAGA,UAAMT,IAAIW,IAAI,IAAIR,IAAAA,qBAAyB;AAC3C,UAAM,CAACK,cAAAA,IAAkB,MAAMI,qBAAqBL,YAAYb,OAAAA;AAIhE,UAAMM,IAAIW,IAAI,IAAIR,IAAAA,oBAAwB;AAG1C,UAAMH,IAAIW,IAAI,IAAIR,IAAAA,8BAAkC;AACpDE,UAAMG,iBAAiBA;AACvB,UAAMZ,SAASiB,IAAIV,MAAME,KAAAA;AACzB,UAAML,IAAIW,IAAI,IAAIR,IAAAA,6BAAiC;AAEnD,WAAO;MAAEK;IAAe;EAC1B,GACA;IAAEhB,YAAAA;EAAW,CAAA;AAGfM,SAAOgB,GAAG,UAAU,CAACd,KAAKe,QAAAA;AACxBC,YAAQC,MAAM,IAAI5B,KAAAA,SAAaW,KAAKkB,EAAAA,YAAcH,IAAII,OAAO;EAC/D,CAAA;AAEArB,SAAOgB,GAAG,SAAS,CAACC,QAAAA;AAClBC,YAAQC,MAAM,IAAI5B,KAAAA,mBAAuB0B,GAAAA;EAC3C,CAAA;AACF,GA/CqB;AAiDd,IAAMK,2BAA8C;EACzD7B,cAAAA;EAAcF,MAAAA;EAAMC,WAAAA;AACtB;;;ACxDO,IAAM+B,0BAA0B,8BACrCC,eACAC,OAAAA;AAEA,QAAMC,OAAO,MAAMF,cAAaG,IAAI;IAClCC,MAAMC,qBAAqBD;IAC3BE,WAAWD,qBAAqBC;IAChCC,MAAM;MAAEN;IAAG;IACXO,UAAU;MACR;;QAEEJ,MAAMK,sBAAsBL;QAC5BE,WAAWG,sBAAsBH;QACjCC,MAAM;UAAEN;QAAG;QACXS,MAAM;UAAEC,UAAU;UAAIC,SAAS;YAAEC,MAAM;YAASC,OAAO;UAAK;QAAE;QAC9DN,UAAU;UACR;;YAEEJ,MAAMW,yBAAyBX;YAC/BE,WAAWS,yBAAyBT;YACpCC,MAAM;cAAEN;YAAG;YACXO,UAAU;cACR;;gBAEEJ,MAAMY,0BAA0BZ;gBAChCE,WAAWU,0BAA0BV;gBACrCC,MAAM;kBAAEN;gBAAG;gBACXO,UAAU;kBACR;;oBAEEJ,MAAMa,sBAAsBb;oBAC5BE,WAAWW,sBAAsBX;oBACjCC,MAAM;sBAAEN;oBAAG;oBACXS,MAAM;sBAAEC,UAAU;sBAAIC,SAAS;wBAAEC,MAAM;wBAASC,OAAO;sBAAK;oBAAE;oBAC9DN,UAAU;sBACR;;wBAEEJ,MAAMc,yBAAyBd;wBAC/BE,WAAWY,yBAAyBZ;wBACpCC,MAAM;0BAAEN;wBAAG;wBACXO,UAAU;0BACR;;4BAEEJ,MAAMe,0BAA0Bf;4BAChCE,WAAWa,0BAA0Bb;4BACrCC,MAAM;8BAAEN;4BAAG;0BACb;;sBAEJ;;kBAEJ;;cAEJ;;UAEJ;;MAEJ;;EAEJ,CAAA;AACA,SAAOC;AACT,GA5DuC;;;ACThC,IAAMkB,kBAAkB,wBAACC,KAAcC,WAAAA;AAC5C,QAAMC,cAAaC,cAAcF,MAAAA;AACjC,QAAMG,gBAAeC,gBAAgBH,WAAAA;AACrCF,MAAII,eAAeA;AACnB,SAAOJ;AACT,GAL+B;;;ACL/B,SAASM,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;AAExC,SAASC,yBAAyB;;;ACHlC,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,YAAAA,kBAAgB;AAG7B,IAAMC,4BAA4B,wBAACC,WAAAA;AACxC,QAAMC,UAAUC,WAAUF,OAAOG,aAAa;AAC9C,SAAOF;AACT,GAHyC;;;ACHzC,SAASG,aAAAA,YAAWC,YAAAA,kBAAgB;AAG7B,IAAMC,0BAA0B,wBAACC,WAAAA;AACtC,QAAMC,UAAUC,WAAUF,OAAOG,WAAW;AAC5C,SAAOF;AACT,GAHuC;;;ACAhC,IAAMG,kBAAkB,wBAACC,WAAAA;AAC9B,QAAM,EAAEC,UAAUC,mBAAkB,IAAKF;AACzC,SAAO;IAAEC;IAAUC;EAAmB;AACxC,GAH+B;;;ACDxB,IAAMC,qBAAqB,wBAACC,WAAAA;AACjC,QAAM,EAAEC,gBAAe,IAAKD;AAC5B,SAAOC;AACT,GAHkC;;;ACA3B,IAAMC,qBAAqB,wBAACC,WAAAA;AACjC,QAAM,EAAEC,gBAAe,IAAKD;AAC5B,SAAOC;AACT,GAHkC;;;ACHlC,SAASC,YAAAA,kBAAgB;AAMlB,IAAMC,mBAAmB,wBAACC,WAAAA;AAC/B,QAAMC,gBAAgBC,WAASC,UAAUH,OAAOC,aAAa,GAAG,MAAM,mCAAA;AACtE,SAAOA;AACT,GAHgC;;;ACLhC,SAASG,YAAAA,kBAAgB;AAKlB,IAAMC,wBAAwB,wBAACC,WAAAA;AACpC,QAAMC,QAAQC,QAAQF,OAAOG,kBAAkB;AAC/C,SAAOC,WAASH,OAAO,MAAM,6DAAA;AAC/B,GAHqC;;;ACLrC,SAASI,aAAAA,YAAWC,mBAAmB;AACvC,SAASC,gBAAgB;AAGzB,SAASC,eAAeC,uCAAuC;AAE/D,IAAIC;AAEG,IAAMC,yBAAyB,8BAAOC,WAAAA;AAC3C,MAAIF,wBAAyB,QAAOA;AACpC,MAAIG,eAAeD,OAAOE;AAC1B,MAAIC,YAAYF,YAAAA,GAAe;AAC7BG,YAAQC,IAAI,wCAAA;AACZ,UAAMC,iBAAiBC,SAASC,iBAAgB;AAChDJ,YAAQC,IAAI;;EAEdC,cAAAA;;KAEG;AACDL,mBAAeK;EACjB;AACA,QAAMG,SAAS,MAAMC,gCAAgCT,YAAAA;AACrD,QAAMU,UAAU,MAAMF,OAAOG,WAAWC,cAAcC,GAAG;AACzDhB,4BAA0Ba;AAC1B,SAAOb;AACT,GAjBsC;;;ACG/B,IAAMiB,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,YAAUC,aAAAA,kBAAiB;AAM7B,IAAMC,gBAAgB,wBAACC,WAAAA;AAC5B,QAAMC,aAAaD,OAAOC;AAC1B,MAAIC,WAAUD,UAAAA,GAAa;AACzB,WAAOE,WAASC,UAAUH,UAAAA,GAAa,MAAM,qCAAA;EAC/C;AACA,SAAOE,WAASC,UAAUJ,OAAOK,MAAMC,EAAE,GAAG,MAAM,4BAAA;AACpD,GAN6B;;;ACL7B,SAASC,aAAAA,kBAAiB;AAMnB,IAAMC,qBAAqB,wBAACC,WAAAA;AACjC,QAAMC,QAAQC,QAAQF,OAAOG,eAAe;AAC5C,MAAIC,WAAUH,KAAAA,EAAQ,QAAOA;AAC7B,SAAOI,cAAcL,MAAAA;AACvB,GAJkC;;;ACI3B,IAAMM,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;;;AdH1B,IAAME,0BAA0BC;AAGvC,IAAMC,kBAAkBC,wBAAwB;EAAEC,UAAUJ;AAAwB,CAAA;AAE7E,IAAMK,wBAAwB,wBAACC,WAAAA;AACpC,SAAO;IACLC,QAAQ;IACRC,MAAM;IACNC,UAAUP,gBAAgB,OAAOQ,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;;;AeZrC,SAASE,2BAAAA,gCAA+B;AACxC,SAASC,WAAWC,aAAa;AAEjC,SAASC,gCAAgC;AAEzC,SACEC,uCACAC,0CACK;AACP,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,WAAWC,yBAAyBC,kCAAAA,EAAoCC,OAC5EC,sCAAsCC,KAAK;AAE7C,QAAMC,mBAAkBC,yBAAwB;IAAEf;IAAQQ;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;AAExC,SACEC,kBAAAA,kBAAgBC,yBAAyBC,4BAAAA,iCACpC;AAIP,SACEC,uBAAuBC,sBAAAA,qBAAoBC,kCAAkCC,+BAA+BC,kCAAkCC,mBACzI;AACP,SAASC,KAAAA,UAAS;;;ACXlB,SAASC,eAAAA,cAAaC,SAAAA,cAAa;AAO5B,IAAMC,sBAAsB,wBAACC,WAAgBC,iBAAAA;AAClD,QAAM,EAAEC,UAAUC,mBAAkB,IAAKF;AAGzC,QAAMG,kBAAkBC,aAAYL,SAAAA;AAGpC,QAAMM,iBAAiBD,aAAYH,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;IACLV;IAAUO;IAAaT;EACzB;AACF,GAxBmC;;;ACPnC,SAASc,eAAAA,oBAAmB;AAE5B,SAASC,6BAA6B;AAa/B,IAAMC,uBAAuB,wBAACC,QAAiBC,WAAgBC,eAAwBC,aAAsBC,YAAAA;AAClH,QAAM,EAAEC,UAAUC,YAAW,IAAKF;AAClC,QAAMG,eAAeC,aAAYP,SAAAA;AACjC,QAAMQ,aAAaD,aAAYH,QAAAA,IAAYG,aAAYF,WAAAA;AACvD,QAAMI,YAEFR,kBAAkBC,cAEhB;IAAE,CAACA,WAAAA,GAAcI,eAAeE;EAAW,IAE3C;IAAE,CAACP,aAAAA,GAAgBK;IAAc,CAACJ,WAAAA,GAAcM;EAAW;AACjE,QAAME,WAAWC,sBAAsBZ,QAAQU,WAAWN,OAAAA;AAE1D,SAAOO;AACT,GAdoC;;;ACfpC,SAASE,aAAAA,kBAAiB;AAE1B,SAASC,kBAAAA,uBAAsB;AAI/B,SAASC,0BAA0B;AACnC,SAASC,UAAU;AAMZ,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;AAG3E,QAAMW,QAAQd,iBAAiBe,GAAAA;AAG/B,QAAMC,qBAAyC;;IAE7CC,KAAKV;IACLX,YAAYc;IACZb;IACAqB,UAAUV;;IAGVW,MAAMd;IACNP;IACAsB,YAAYvB;IACZwB,WAAWf;IACXQ;EACF;AACA,QAAMQ,eAA6B,IAAIC,gBAA6B;IAAEC,QAAQC;EAAmB,CAAA,EAAGC,OAAOV,kBAAAA,EAAoBW,MAAK;AAGpI,QAAMC,WAAWC,qBAAqBnB,QAAQb,WAAWI,eAAeG,aAAaQ,IAAAA;AAErF,SAAO;IAACU;IAAcM;;AACxB,GAxCsC;;;ACdtC,SAASE,eAAAA,oBAAmB;AAE5B,SAASC,kBAAAA,uBAAsB;AAaxB,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;;;ACf3C,SAASC,aAAAA,YAAWC,aAAAA,kBAAiB;AACrC,SACEC,mBAAmBC,uBAAuBC,gCACrC;AAEP,SAASC,kBAAAA,wBAAsB;AAmBxB,IAAMC,4BAA4B,8BACvCC,YACAC,QACAC,UACAC,WAAAA;AAEA,QAAM,EAAEC,WAAU,IAAKH;AAEvB,QAAMI,UAAUC,cAAcH,MAAAA;AAC9B,MAAIH,WAAWO,UAAUF,QAAS,QAAO;AAEzC,QAAMG,SAAS,MAAM,IAAIC,sBAAsBT,UAAAA,EAAYU,SAAQ;AACnE,MAAIC,WAAUH,MAAAA,KAAWA,OAAOI,SAAS,EAAG,QAAO;AAEnD,QAAMC,SAASC,WAAUV,YAAY,IAAA;AACrC,MAAI,CAACW,kBAAkBf,YAAYa,MAAAA,EAAS,QAAO;AAEnD,QAAMG,SAAS,MAAMC,iBAAeD,OAAO;IAACf;IAAQC;GAAS;AAC7D,MAAI,CAACgB,yBAAyBlB,YAAYgB,MAAAA,EAAS,QAAO;AAE1D,SAAO;AACT,GArByC;;;ALNlC,IAAMG,wBAAwBC,GAAEC,MAAM;EAC3CC;EACAC,wBAAwBC,mBAAAA,EAAoBC,OAAOC,sBAAsBC,KAAK;EAC9EC;CACD;AAGM,IAAMC,4BAA4BC,0BAAyBC,6BAAAA,EAA+BN,OAAOO,iCAAiCL,KAAK;AAGvI,IAAMM,0BAA0B,wBAACC,WAAAA;AACtC,QAAMC,SAASf,GAAEgB,OAAO;IAAEC,SAASC,oBAAoBJ,MAAAA;EAAQ,CAAA;AAE/D,QAAMK,mBAAkBC,yBAAwB;IAC9CL;IAAQM,MAAMtB;IAAuBuB,UAAUb;EACjD,CAAA;AACA,SAAO;IACLc,QAAQ;IACRC,MAAM;IACNC,UAAUN,iBAAgB,OAAOO,KAAKC,QAAAA;AACpC,YAAM,CAACC,YAAYC,cAAcC,QAAAA,IAAYJ,IAAIL;AACjD,YAAM,EAAEU,cAAAA,cAAY,IAAKL,IAAIM;AAG7B,YAAMC,mBAAmB,MAAMC,0BAA0BN,YAAYC,cAAcC,UAAUhB,MAAAA;AAC7F,UAAI,CAACmB,kBAAkB;AACrBN,YAAIQ,OAAO,GAAA,EAAKC,KAAI;AACpB;MACF;AAGA,YAAMC,gBAAgB,MAAMC,4BAA4BT,cAAcC,UAAUhB,MAAAA;AAChF,UAAI,CAACuB,eAAe;AAClBV,YAAIQ,OAAO,GAAA,EAAKC,KAAI;AACpB;MACF;AAGA,YAAMG,4BAAuD;QAACX;QAAY;UAACE;UAAUD;;;AACrF,YAAMW,wBAAwBT,eAAcQ,yBAAAA;AAG5C,YAAME,kBAAkB,MAAMC,iBAAeC,KAAKf,UAAAA;AAClD,YAAMgB,wBAAwB5C,GAAEgB,OAAO,CAAC,CAAA,EAAGX,OAAOO,iCAAiCL,KAAK;AACxF,YAAMsC,qBAAqBD,sBAAsBE,MAAMjB,YAAAA;AACvD,YAAMkB,0BAAyD;QAAE,GAAGF;QAAoBJ;MAAgB;AACxG,YAAMO,oBAA6C,IAAIN,iBACrD;QAAEO,QAAQtC;MAA8B,CAAA,EACxCuC,OAAOH,uBAAAA,EAAyBI,MAAK;AAGvCxB,UAAIyB,KAAKJ,iBAAAA;IACX,CAAA;EACF;AACF,GA5CuC;;;AM3BvC,SAASK,2BAAAA,gCAA+B;AACxC,SAASC,YAAAA,YAAUC,aAAAA,kBAAiB;AAEpC,SAASC,4BAAAA,iCAAgC;AAEzC,SACEC,yBAAAA,wBAAuBC,sBAAAA,qBAAoBC,0BAA0BC,kBAAkBC,4BAA4BC,eAAAA,oBAC9G;AACP,SAASC,KAAAA,UAAS;AAMX,IAAMC,gCAAgCC,uBAAsBC,KAAK;EACtEC,aAAa;EACbC,YAAY;EACZC,WAAW;AACb,CAAA;AAGO,IAAMC,oCAAoCC,GAAEC,MAAM;EACvDC;EACAC,0BAAyBC,mBAAAA,EAAoBC,OAAOX,uBAAsBY,KAAK;EAC/EC;CACD;AAIM,IAAMC,kCAAkC,wBAACC,QAAsBC,YAAAA;AACpE,QAAMC,SAASX,GAAEY,OAAO;IAAEC,SAASC,oBAAoBL,MAAAA;EAAQ,CAAA;AAC/D,QAAMM,mBAAkBC,yBAAwB;IAC9CL;IAAQM,MAAMxB;IAA+ByB,UAAUnB;EACzD,CAAA;AACA,SAAO;IACLoB,QAAQ;IACRC,MAAM;IACNC,UAAUN,iBAAgB,OAAOO,KAAKC,QAAAA;AACpC,YAAMC,aAAaC,cAAchB,MAAAA;AACjC,YAAM,EACJZ,YAAYC,WAAWF,YAAW,IAChC0B,IAAIL;AACR,YAAM,CAACS,cAAcC,QAAAA,IAAY,MAAMC,uBAAuB/B,YAAYC,WAAWF,aAAaa,MAAAA;AAClG,YAAMoB,SAASC,WAAUjC,UAAAA;AAGzB,YAAMkC,SAASC,WAAStB,QAAQuB,WAAWF,QAAQ,MAAM,IAAIG,MAAM,4CAAA,CAAA;AACnE,YAAMC,qBAAqB,MAAMJ,OAAOI,mBAAkB;AAE1D,YAAMC,MAAMC,iBAAiBF,oBAAoB,IAAA;AACjD,YAAMG,MAAMD,iBAAiBF,qBAAqB,KAAM,IAAA;AAExD,YAAM,CAACI,IAAAA,IAAQ,MAAMC,yBAAyBhB,YAAY;QAACG;SAAW;QAACD;SAAeU,KAAKE,KAAKT,MAAAA;AAGhGN,UAAIkB,KAAK;QAACF;QAAMb;QAAcC;OAAS;IACzC,CAAA;EACF;AACF,GA7B+C;;;AC7B/C,SAASe,2BAAAA,gCAA+B;AACxC,SACEC,aAAAA,YAAWC,SAAAA,QAAOC,SAAAA,cACb;AAEP,SAASC,4BAAAA,iCAAgC;AAEzC,SACEC,yCAAAA,wCAAuCC,sCAAAA,qCAAoCC,yBAAAA,wBAAuBC,sBAAAA,qBAAoBC,oCAAAA,mCACtHC,iCAAAA,sCACK;AACP,SAASC,KAAAA,UAAS;AAMX,IAAMC,kCAAkCC,GAAEC,MAAM;EACrDD,GAAEE,MAAM,CAAA,CAAE;EACVF,GAAEE,MAAM;IAACC,0BAAyBC,mBAAAA,EAAoBC,OAAOC,uBAAsBC,KAAK;GAAE;EAC1FP,GAAEE,MAAM;IACNC,0BAAyBC,mBAAAA,EAAoBC,OAAOC,uBAAsBC,KAAK;IAC/EJ,0BAAyBK,8BAAAA,EAA+BH,OAAOI,kCAAiCF,KAAK;GACtG;EACDP,GAAEE,MAAM;IACNC,0BAAyBC,mBAAAA,EAAoBC,OAAOC,uBAAsBC,KAAK;IAC/EJ,0BAAyBK,8BAAAA,EAA+BH,OAAOI,kCAAiCF,KAAK;IACrGJ,0BAAyBO,mCAAAA,EAAoCL,OAAOM,uCAAsCJ,KAAK;GAChH;CACF;AAGM,IAAMK,gCAAgC,wBAACC,WAAAA;AAC5C,QAAMC,SAASd,GAAEe,OAAO;IACtBC,SAASC,oBAAoBJ,MAAAA;IAC7BK,OAAOlB,GAAEmB,OAAM,EAAGC,SAAQ;EAC5B,CAAA;AACA,QAAMC,QAAQrB,GAAEe,OAAO;IAAEO,YAAYtB,GAAEuB,OAAOC,OAAM,EAAGC,QAAQ,CAAA;EAAG,CAAA;AAElE,QAAMC,mBAAkBC,yBAAwB;IAC9Cb;IAAQO;IAAOO,UAAU7B;EAC3B,CAAA;AAEA,SAAO;IACL8B,QAAQ;IACRC,MAAM;IACNC,UAAUL,iBAAgB,OAAOM,KAAKC,QAAAA;AACpC,YAAM,EAAEjB,QAAO,IAAKgB,IAAIlB;AACxB,YAAM,EAAEQ,aAAa,EAAC,IAAKU,IAAIX;AAC/B,YAAMa,SAA0D,CAAA;AAEhE,YAAM,EACJC,oBAAoBC,YAAYC,gBAAe,IAC7C,MAAMC,kBAAkBzB,MAAAA;AAE5B,YAAM0B,MAAMH;AACZ,YAAMI,aAAaC,WAAU,4CAA4C,IAAA;AACzE,YAAMC,YAAYC,OAAM,SAAS,IAAA;AACjC,YAAMC,WAAWP;AAEjB,YAAMQ,OAAO7B;AACb,YAAM8B,cAAcL,WAAU,4CAA4C,IAAA;AAC1E,YAAMM,aAAaJ,OAAM,SAAS,IAAA;AAClC,YAAMK,YAAYb;AAElB,UAAIb,eAAe,EAAG,QAAOW,IAAIgB,WAAW,GAAA;AAC5C,UAAI3B,aAAa,GAAG;AAClB,cAAM,CAAC4B,WAAAA,IAAe,MAAMC,uBAAuBX,YAAYE,WAAWI,aAAajC,QAAQmB,IAAIlB,OAAOI,KAAK;AAC/GgB,eAAO,CAAA,IAAKgB;MACd;AACA,UAAI5B,aAAa,GAAG;AAClB,cAAM4B,cAAuC;UAC3CE,QAAQ5C;UACRqC;UACAC;UACAC;UACAC;UACAT;UACAC;UACAE;UACAE;UACAS,iBAAiBC,OAAM,QAAA;QACzB;AACApB,eAAO,CAAA,IAAKgB;MACd;AACA,UAAI5B,aAAa,GAAG;AAClB,cAAM4B,cAA4C;UAChDE,QAAQ1C;UACRmC;UACAC;UACAC;UACAC;UACAT;UACAC;UACAE;UACAE;UACAW,kBAAkBD,OAAM,QAAA;QAC1B;AACApB,eAAO,CAAA,IAAKgB;MACd;AAEAjB,UAAIuB,KAAKtB,MAAAA;IACX,CAAA;EACF;AACF,GAxE6C;;;ACzBtC,IAAMuB,sBAAsB,wBAACC,QAAsBC,YAAAA;AACxD,SAAO;IACLC,sBAAsBF,MAAAA;IACtBG,gCAAgCH,QAAQC,OAAAA;IACxCG,wBAAwBJ,MAAAA;IACxBK,8BAA8BL,MAAAA;IAC9BM,gCAAgCN,MAAAA;;AAEpC,GARmC;;;ACF5B,IAAMO,kBAAkB,wBAACC,KAAcC,QAAsBC,YAAAA;AAClE,QAAMC,mBAAmBC,oBAAoBH,QAAQC,OAAAA;AACrD,aAAWG,cAAcF,kBAAkB;AACzCH,QAAIK,WAAWC,MAAM,EAAED,WAAWE,MAAMF,WAAWG,QAAQ;EAC7D;AACF,GAL+B;;;ACAxB,IAAMC,YAAY,wBAACC,KAAcC,QAAsBC,YAAAA;AAC5DC,kBAAgBH,KAAKC,QAAQC,OAAAA;AAC/B,GAFyB;;;A7CSlB,IAAME,SAAS,wBAACC,QAAsBC,YAAAA;AAC3CC,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;AAC5Bc,kBAAgBd,KAAKH,MAAAA;AACrBkB,YAAUf,KAAKH,QAAQC,OAAAA;AACvBE,MAAIG,IAAIa,cAAAA;AACR,SAAOhB;AACT,GAhBsB;;;A8CdtB,SAASiB,YAAAA,YAAUC,aAAAA,mBAAiB;AAEpC,SAASC,uBAAuB;AAChC,SAASC,0BAA0BC,oCAAoC;AACvE,SAASC,YAAAA,iBAAgB;AAEzB,SAASC,cAAAA,aAAYC,cAAc;;;ACPnC,SAASC,oBAAoD;AAC7D,SAASC,gBAAgB;AAEzB,SAASC,gBAAgBC,oBAAoB;AAStC,IAAMC,iBAAiB,8BAC5BC,QACAC,eAAAA;AAEA,QAAMC,cAAcF,OAAOG,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,UAAME,uBAAuB,IAAIC,aAAgB;MAAE,GAAGF;MAAkBf;IAAW,CAAA;AACnF,UAAMkB,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,GArB8B;;;ADMvB,IAAMC,cAAc,8BAAOC,SAA8BC,YAAAA;AAC9D,QAAM,EAAEC,OAAM,IAAKF;AAEnB,QAAMG,gBAAgB,MAAMC,eAAiCF,QAAQ,0CAAA;AACrE,QAAMG,gBAAgB,MAAMD,eAAiCF,QAAQ,0CAAA;AACrE,QAAMI,WAAW,MAAMC,gBAAgBP,OAAAA;AACvC,QAAM,EACJQ,6BAA6BC,6BAA6BC,oBAAoBC,SAAQ,IACpFT;AACJ,QAAMU,UAAUC,YAAUF,QAAAA,IAAY,MAAMG,UAASC,WAAWJ,QAAAA,IAAY,MAAMG,UAASE,OAAM;AACjG,QAAMC,SAAS,IAAIC,OAAOT,6BAA6BH,QAAAA;AACvD,QAAMa,kBAAkBC,yBAAyBC,QAAQC,YAAWZ,kBAAAA,GAAqBO,MAAAA;AACzF,QAAMM,SAASC,6BAA6BH,QAAQC,YAAWd,2BAAAA,GAA8BS,MAAAA;AAK7F,QAAMQ,cAAc,MAAMF,OAAOG,MAAK;AACtCC,EAAAA,WAASF,YAAYG,YAAW,MAAOX,OAAOY,QAAQD,YAAW,GAAI,MAAM,gDAAA;AAC3E,SAAO;IACLhB;IAASW;IAAQJ;IAAiBhB;IAAeF;IAASK;IAAUW;IAAQZ;EAC9E;AACF,GAtB2B;;;AEbpB,IAAMyB,aAAa,wBAACC,QAAsBC,aAAAA;AAC/C,QAAMC,cAAaC,cAAcH,MAAAA;AACjCI,gBAAcF,aAAYD,QAAAA;AAC5B,GAH0B;;;ACE1B,IAAMI,WAAW;AAGV,IAAMC,YAAY,8BAAOC,SAA8BC,YAAAA;AAC5D,QAAM,EAAEC,QAAQC,OAAM,IAAKH;AAC3B,QAAM,EAAEI,KAAI,IAAKD;AACjB,QAAME,MAAMC,OAAOH,QAAQF,OAAAA;AAC3B,QAAMM,WAAW,MAAMC,YAAYR,SAASC,OAAAA;AAC5CQ,aAAWN,QAAQI,QAAAA;AACnB,QAAMG,SAASL,IAAIM,OAAOP,MAAMN,UAAU,MAAMI,QAAQU,IAAI,uCAAuCd,QAAAA,IAAYM,IAAAA,EAAM,CAAA;AACrHM,SAAOG,WAAW,GAAA;AAClB,SAAOH;AACT,GATyB;;;;;;;;;;AlDQlB,IAAMI,cAAN,cAA0BC,QAAAA;SAAAA;;;EACrBC;EACFC;EAER,IAAcC,gBAAgB;AAC5B,WAAO,KAAKF;EACd;EAEA,MAAeG,gBAAgB;AAC7B,UAAM,MAAMA,cAAAA;AACZ,SAAKH,iBAAiB,MAAM,KAAKI,QAAQC,YAAYC,uBAAAA;EACvD;EAEA,MAAeC,eAAe;AAC5B,UAAM,MAAMA,aAAAA;AACZ,SAAKC,WAAU;AACf,UAAM,KAAKC,YAAW;EACxB;EAEA,MAAeC,cAAc;AAC3B,UAAM,MAAMA,YAAAA;AACZ,SAAKF,WAAU;EACjB;EAEA,MAAcC,cAAc;AAC1B,SAAKR,SAAS,MAAMU,UAAUC,sBAAsB,KAAKC,SAAS,IAAA,GAAO,KAAKb,cAAc;EAC9F;EAEQQ,aAAa;AACnB,SAAKP,QAAQa,MAAAA;AACb,SAAKb,SAASc;EAChB;AACF;;;;","names":["creatable","asBridgeConfigContext","ActorV3","XyoGatewayRunnerMoniker","customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","isDefined","Redis","connection","maxRetriesPerRequest","getConnection","config","isDefined","redisHost","host","redisPort","port","Redis","isDefined","FlowProducer","flowProducer","getFlowProducer","connection","isDefined","FlowProducer","createWorkers","connection","services","Xl1ToEthBridgeParent","createWorker","Xl1TransactionPreparation","Xl1TransactionSubmission","Xl1TransactionMonitor","EthTransactionPreparation","EthTransactionSubmission","EthTransactionMonitor","assertEx","PayloadBuilder","Worker","name","queueName","createWorker","connection","services","provider","assertEx","stateMap","ethTxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","submissionHash","receipt","getTransactionReceipt","log","blockNumber","blockHash","confirmationHash","set","on","err","console","error","id","message","EthTransactionMonitor","assertEx","hexToBigInt","PayloadBuilder","isBridgeIntent","Worker","getAddress","assertEx","hexToBigInt","toEthAddress","PayloadBuilder","isBridgeIntent","submitEthTransaction","tx","bridgeableToken","bridge","wallet","xl1Transaction","assertEx","bridgeIntent","find","isBridgeIntent","srcAddress","toEthAddress","destAddress","amount","hexToBigInt","destAmount","nonce","PayloadBuilder","hash","bridgeTx","connect","bridgeFromRemote","receipt","wait","isAllowedBlockPayload","submitXl1Transaction","preparedTx","gateway","offChainPayloads","filter","p","isAllowedBlockPayload","result","addTransactionToChain","assertEx","hexToBigInt","isBridgeIntent","validateSufficientAllowance","tx","bridgeableToken","bridge","logger","bridgeIntent","assertEx","find","isBridgeIntent","amount","hexToBigInt","destAmount","liquiditySourceAddress","liquiditySource","bridgeAddress","getAddress","remainingAllowance","allowance","log","toString","assertEx","hexToBigInt","isBridgeIntent","validateSufficientBalance","tx","bridgeableToken","bridge","logger","bridgeIntent","assertEx","find","isBridgeIntent","amount","hexToBigInt","destAmount","liquiditySourceAddress","liquiditySource","balance","balanceOf","log","toString","name","queueName","createWorker","connection","services","bridge","assertEx","bridgeableToken","stateMap","ethTxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","log","validateSufficientAllowance","Error","validateSufficientBalance","bridgeIntent","find","isBridgeIntent","amount","hexToBigInt","destAmount","srcAddress","getAddress","destAddress","nonce","preparedTx","getFunction","populateTransaction","set","on","err","console","error","id","message","EthTransactionPreparation","assertEx","isDefined","PayloadBuilder","Worker","name","queueName","createWorker","connection","services","bridge","assertEx","bridgeableToken","wallet","stateMap","ethTxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","preparedTx","submissionHash","existingSubmissionHash","isDefined","log","submitEthTransaction","set","concurrency","on","err","console","error","id","message","EthTransactionSubmission","Worker","name","queueName","createWorker","connection","worker","Worker","job","log","ok","on","err","console","error","id","message","Xl1ToEthBridgeParent","assertEx","isDefined","isNull","PayloadBuilder","UnrecoverableError","Worker","name","queueName","createWorker","connection","services","gateway","assertEx","stateMap","xl1TxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","viewer","state","get","submissionHash","log","foundTx","transactionByHash","isDefined","isNull","confirmationHash","set","currentBlockNumber","exp","UnrecoverableError","Error","on","err","console","error","id","message","Xl1TransactionMonitor","assertEx","PayloadBuilder","Worker","name","queueName","createWorker","connection","services","stateMap","assertEx","xl1TxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","log","preparedTx","set","on","err","console","error","id","message","Xl1TransactionPreparation","assertEx","isDefined","PayloadBuilder","Worker","name","queueName","createWorker","connection","services","gateway","assertEx","stateMap","xl1TxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","preparedTx","submissionHash","existingSubmissionHash","isDefined","log","submitXl1Transaction","set","on","err","console","error","id","message","Xl1TransactionSubmission","createXl1ToEthBridgeJob","flowProducer","tx","flow","add","name","Xl1ToEthBridgeParent","queueName","data","children","EthTransactionMonitor","opts","attempts","backoff","type","delay","EthTransactionSubmission","EthTransactionPreparation","Xl1TransactionMonitor","Xl1TransactionSubmission","Xl1TransactionPreparation","addFlowProducer","app","config","connection","getConnection","flowProducer","getFlowProducer","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","escrowAddress","asAddress","assertEx","tryGetBridgeFeesAddress","config","address","asAddress","feesAddress","getFeeStructure","config","feeFixed","feeRateBasisPoints","getMaxBridgeAmount","config","maxBridgeAmount","getMinBridgeAmount","config","minBridgeAmount","assertEx","getRemoteChainId","config","remoteChainId","assertEx","asChainId","assertEx","getRemoteTokenAddress","config","token","asToken","remoteTokenAddress","assertEx","isDefined","isUndefined","HDWallet","ADDRESS_INDEX","generateXyoBaseWalletFromPhrase","accountServiceSingleton","getBridgeWalletAccount","config","walletPhrase","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","isDefined","assertEx","asChainId","chain","id","isDefined","getXl1TokenAddress","config","token","asToken","xl1TokenAddress","isDefined","getXl1ChainId","getBridgeSettings","config","feeFixed","feeRateBasisPoints","getFeeStructure","feesAddress","escrowAddress","getTransferAddresses","maxBridgeAmount","getMaxBridgeAmount","minBridgeAmount","getMinBridgeAmount","remoteChainId","getRemoteChainId","remoteTokenAddress","getRemoteTokenAddress","xl1TokenAddress","getXl1TokenAddress","xl1ChainId","getXl1ChainId","BridgeConfigResponseZod","BridgeSettingsZod","validateRequest","requestHandlerValidator","response","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","PayloadBuilder","PayloadZodLooseOfSchema","PayloadZodStrictOfSchema","BridgeIntentFieldsZod","BridgeIntentSchema","BridgeSourceObservationFieldsZod","BridgeSourceObservationSchema","SignedTransactionBoundWitnessZod","TransferZod","z","hexToBigInt","toHex","calculateBridgeFees","srcAmount","feeStructure","feeFixed","feeRateBasisPoints","srcAmountBigInt","hexToBigInt","feeFixedBigInt","feeVariableBigInt","BigInt","feeVariable","toHex","feeTotalBigInt","destAmountBigInt","destAmount","hexToBigInt","createTransferPayload","createBridgeTransfer","sender","srcAmount","escrowAddress","feesAddress","context","feeFixed","feeVariable","escrowAmount","hexToBigInt","feesAmount","transfers","transfer","createTransferPayload","toAddress","PayloadBuilder","BridgeIntentSchema","v4","generateBridgeEstimate","srcAddress","srcAmount","destAddress","config","nonceOverride","escrowAddress","feeFixed","feeRateBasisPoints","feesAddress","remoteChainId","remoteTokenAddress","xl1ChainId","xl1TokenAddress","getBridgeSettings","sender","toAddress","fees","calculateBridgeFees","nonce","v4","bridgeIntentFields","src","srcToken","dest","destAmount","destToken","bridgeIntent","PayloadBuilder","schema","BridgeIntentSchema","fields","build","transfer","createBridgeTransfer","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","chainId","getXl1ChainId","chain","errors","BoundWitnessValidator","validate","isDefined","length","sender","asAddress","addressesContains","hashes","PayloadBuilder","payloadHashesContainsAll","BridgeToRemoteBodyZod","z","tuple","SignedTransactionBoundWitnessZod","PayloadZodLooseOfSchema","BridgeIntentSchema","extend","BridgeIntentFieldsZod","shape","TransferZod","BridgeToRemoteResponseZod","PayloadZodStrictOfSchema","BridgeSourceObservationSchema","BridgeSourceObservationFieldsZod","makeBridgeToRemoteRoute","config","params","object","chainId","getRemoteChainIdZod","validateRequest","requestHandlerValidator","body","response","method","path","handlers","req","res","signedTxBw","bridgeIntent","transfer","flowProducer","app","transactionValid","validateBridgeTransaction","status","send","estimateValid","validateBridgeEstimateExact","singedHydratedTransaction","createXl1ToEthBridgeJob","srcConfirmation","PayloadBuilder","hash","bridgeCommonFieldsZod","bridgeCommonFields","parse","bridgeObservationFields","bridgeObservation","schema","fields","build","json","requestHandlerValidator","assertEx","toAddress","PayloadZodStrictOfSchema","BridgeIntentFieldsZod","BridgeIntentSchema","buildUnsignedTransaction","toXL1BlockNumber","TransactionBoundWitnessZod","TransferZod","z","BridgeToRemoteEstimateBodyZod","BridgeIntentFieldsZod","pick","destAddress","srcAddress","srcAmount","BridgeToRemoteEstimateResponseZod","z","tuple","TransactionBoundWitnessZod","PayloadZodStrictOfSchema","BridgeIntentSchema","extend","shape","TransferZod","makeBridgeToRemoteEstimateRoute","config","gateway","params","object","chainId","getRemoteChainIdZod","validateRequest","requestHandlerValidator","body","response","method","path","handlers","req","res","xl1ChainId","getXl1ChainId","bridgeIntent","transfer","generateBridgeEstimate","sender","toAddress","viewer","assertEx","connection","Error","currentBlockNumber","nbf","toXL1BlockNumber","exp","txBw","buildUnsignedTransaction","json","requestHandlerValidator","asAddress","asHex","toHex","PayloadZodStrictOfSchema","BridgeDestinationObservationFieldsZod","BridgeDestinationObservationSchema","BridgeIntentFieldsZod","BridgeIntentSchema","BridgeSourceObservationFieldsZod","BridgeSourceObservationSchema","z","BridgeToRemoteStatusResponseZod","z","union","tuple","PayloadZodStrictOfSchema","BridgeIntentSchema","extend","BridgeIntentFieldsZod","shape","BridgeSourceObservationSchema","BridgeSourceObservationFieldsZod","BridgeDestinationObservationSchema","BridgeDestinationObservationFieldsZod","makeBridgeToRemoteStatusRoute","config","params","object","chainId","getRemoteChainIdZod","nonce","string","nonempty","query","mockStatus","coerce","number","default","validateRequest","requestHandlerValidator","response","method","path","handlers","req","res","result","remoteTokenAddress","xl1ChainId","xl1TokenAddress","getBridgeSettings","src","srcAddress","asAddress","srcAmount","asHex","srcToken","dest","destAddress","destAmount","destToken","sendStatus","observation","generateBridgeEstimate","schema","srcConfirmation","toHex","destConfirmation","json","getRouteDefinitions","config","gateway","makeBridgeConfigRoute","makeBridgeToRemoteEstimateRoute","makeBridgeToRemoteRoute","makeBridgeToRemoteStatusRoute","makeBridgeFromRemoteStatusRoute","addBridgeRoutes","app","config","gateway","routeDefinitions","getRouteDefinitions","definition","method","path","handlers","addRoutes","app","config","gateway","addBridgeRoutes","getApp","config","gateway","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addFlowProducer","addRoutes","standardErrors","assertEx","isDefined","initEvmProvider","BridgeableToken__factory","LiquidityPoolBridge__factory","HDWallet","getAddress","Wallet","BaseMongoSdk","MongoMap","hasMongoConfig","mapToMapType","getIterableMap","config","collection","mongoConfig","storage","mongo","hasMongoConfig","connectionString","dbConnectionString","database","dbName","domain","dbDomain","password","dbPassword","username","dbUserName","payloadSdkConfig","sdkBalanceSummaryMap","BaseMongoSdk","result","MongoMap","create","sdk","getCache","enabled","maxEntries","mapToMapType","Map","getServices","context","gateway","config","ethTxStateMap","getIterableMap","xl1TxStateMap","provider","initEvmProvider","remoteBridgeContractAddress","remoteChainWalletPrivateKey","remoteTokenAddress","mnemonic","account","isDefined","HDWallet","fromPhrase","random","wallet","Wallet","bridgeableToken","BridgeableToken__factory","connect","getAddress","bridge","LiquidityPoolBridge__factory","bridgeOwner","owner","assertEx","toLowerCase","address","addWorkers","config","services","connection","getConnection","createWorkers","hostname","getServer","context","gateway","logger","config","port","app","getApp","services","getServices","addWorkers","server","listen","log","setTimeout","BridgeActor","ActorV3","_gatewayRunner","server","gatewayRunner","createHandler","locator","getInstance","XyoGatewayRunnerMoniker","startHandler","stopServer","startServer","stopHandler","getServer","asBridgeConfigContext","context","close","undefined"]}