@xyo-network/chain-bridge 1.20.28 → 1.20.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/BridgeActor.ts","../../src/monitoring/createBalanceMonitor.ts","../../src/monitoring/createQueueMetrics.ts","../../src/queue/connection.ts","../../src/queue/flowProducer.ts","../../src/queue/prefix.ts","../../src/queue/workers/EthTransactionMonitor.ts","../../src/queue/workers/EthTransactionPreparation.ts","../../src/validation/validateBridgeEstimateExact.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/util/calculateBridgeFees.ts","../../src/util/calculateMaxBridgeAmount.ts","../../src/util/createBridgeTransfer.ts","../../src/util/generateBridgeEstimate.ts","../../src/validation/validateBridgeTransaction.ts","../../src/validation/validateSufficientLiquiditySourceAllowance.ts","../../src/validation/validateSufficientLiquiditySourceBalance.ts","../../src/validation/validateSufficientRunnerEthBalanceForGas.ts","../../src/validation/validateSufficientXL1SourceAddressBalance.ts","../../src/queue/workers/EthTransactionSubmission.ts","../../src/queue/workers/util/submitEthTransaction.ts","../../src/queue/workers/util/submitXl1Transaction.ts","../../src/queue/workers/EthTransactionSubmissionStorage.ts","../../src/queue/workers/Xl1ToEthBridgeParent.ts","../../src/queue/workers/Xl1TransactionMonitor.ts","../../src/queue/workers/Xl1TransactionPreparation.ts","../../src/queue/workers/Xl1TransactionSubmission.ts","../../src/queue/workers/Xl1TransactionSubmissionStorage.ts","../../src/queue/workers/createWorkers.ts","../../src/queue/flows/createXl1ToEthBridgeJob/getJobIdForXl1ToEthBridgeJob.ts","../../src/queue/flows/createXl1ToEthBridgeJob/createXl1ToEthBridgeJob.ts","../../src/queue/flows/createXl1ToEthBridgeJob/getXl1ToEthBridgeJob.ts","../../src/queue/getXl1ToEthQueueJobs.ts","../../src/queue/getXl1ToEthQueues.ts","../../src/queue/telemetry.ts","../../src/server/app.ts","../../src/server/addFlowProducer.ts","../../src/server/instrumentation.ts","../../src/server/routes/livez/get.ts","../../src/server/routes/readyz/get.ts","../../src/server/routes/startupz/get.ts","../../src/server/routes/addProbeRoutes.ts","../../src/server/routes/bridge/routeDefinitions/routes/bridgeConfig.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/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.ts","../../src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteMaxEstimate.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 type { Server } from 'node:http'\n\nimport { creatable } from '@xylabs/sdk-js'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { asBridgeConfigContext } from '@xyo-network/chain-orchestration'\nimport type {\n ActorParamsV3,\n XyoGatewayRunner,\n} from '@xyo-network/xl1-sdk'\nimport {\n ActorV3,\n XyoGatewayRunnerMoniker,\n} from '@xyo-network/xl1-sdk'\n\nimport type { BalanceMonitorHandle, QueueMetricsHandle } from './monitoring/index.ts'\nimport { createBalanceMonitor, createQueueMetrics } from './monitoring/index.ts'\nimport { getXl1ToEthQueues } from './queue/index.ts'\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 _balanceMonitor?: BalanceMonitorHandle\n private _queueMetrics?: QueueMetricsHandle\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._balanceMonitor?.stop()\n this._queueMetrics?.stop()\n this._balanceMonitor = undefined\n this._queueMetrics = undefined\n this.stopServer()\n }\n\n private async startServer() {\n const context = asBridgeConfigContext(this.context, true)\n const { server, services } = await getServer(context, this._gatewayRunner)\n this.server = server\n\n if (this.meter) {\n this._balanceMonitor = createBalanceMonitor({\n account: services.account,\n bridge: services.bridge,\n bridgeableToken: services.bridgeableToken,\n gateway: services.gateway,\n meter: this.meter,\n provider: services.provider,\n wallet: services.wallet,\n })\n this._balanceMonitor.start()\n\n const queues = getXl1ToEthQueues(context.config as BridgeConfig)\n this._queueMetrics = createQueueMetrics({\n meter: this.meter,\n queues,\n })\n this._queueMetrics.start()\n }\n }\n\n private stopServer() {\n this.server?.close()\n this.server = undefined\n }\n}\n","import type { Gauge, Meter } from '@opentelemetry/api'\nimport type { AccountInstance } from '@xyo-network/sdk-js'\nimport type { BridgeableToken, LiquidityPoolBridge } from '@xyo-network/typechain'\nimport type { XyoGatewayRunner } from '@xyo-network/xl1-sdk'\nimport type { Provider, Wallet } from 'ethers'\n\nexport interface BalanceMonitorConfig {\n account: AccountInstance\n bridge: LiquidityPoolBridge\n bridgeableToken: BridgeableToken\n gateway: XyoGatewayRunner\n intervalMs?: number\n meter: Meter\n provider: Provider\n wallet: Wallet\n}\n\nexport interface BalanceMonitorHandle {\n start: () => void\n stop: () => void\n}\n\nconst DEFAULT_INTERVAL_MS = 60_000\n\nconst WEI_PER_GWEI = 10n ** 9n\nconst TOKEN_DECIMALS = 10n ** 18n\n\nexport function createBalanceMonitor(config: BalanceMonitorConfig): BalanceMonitorHandle {\n const {\n account, bridge, bridgeableToken, gateway, meter, provider, wallet,\n intervalMs = DEFAULT_INTERVAL_MS,\n } = config\n\n let timer: ReturnType<typeof setInterval> | undefined\n\n const ethWalletGasBalance: Gauge = meter.createGauge(\n 'bridge_eth_wallet_gas_balance_gwei',\n { description: 'ETH balance of the bridge runner wallet (in gwei)', unit: 'gwei' },\n )\n\n const liquidityTokenBalance: Gauge = meter.createGauge(\n 'bridge_eth_liquidity_token_balance',\n { description: 'ERC-20 token balance of the liquidity source (in whole tokens)', unit: 'tokens' },\n )\n\n const liquidityTokenAllowance: Gauge = meter.createGauge(\n 'bridge_eth_liquidity_token_allowance',\n { description: 'ERC-20 token allowance from liquidity source to bridge contract (in whole tokens)', unit: 'tokens' },\n )\n\n const xl1AccountBalance: Gauge = meter.createGauge(\n 'bridge_xl1_account_balance',\n { description: 'XL1 native balance of the bridge account (in whole XL1)', unit: 'xl1' },\n )\n\n const walletAddress = wallet.address\n\n async function poll(): Promise<void> {\n // ETH wallet gas balance\n try {\n const balance = await provider.getBalance(walletAddress)\n ethWalletGasBalance.record(Number(balance / WEI_PER_GWEI), { address: walletAddress })\n } catch (err) {\n console.error('[BalanceMonitor] Failed to read ETH wallet gas balance:', err)\n }\n\n // Liquidity source token balance\n try {\n const liquiditySourceAddress = await bridge.liquiditySource()\n const balance = await bridgeableToken.balanceOf(liquiditySourceAddress)\n liquidityTokenBalance.record(Number(balance / TOKEN_DECIMALS), { address: liquiditySourceAddress })\n } catch (err) {\n console.error('[BalanceMonitor] Failed to read liquidity source token balance:', err)\n }\n\n // Liquidity source token allowance\n try {\n const liquiditySourceAddress = await bridge.liquiditySource()\n const bridgeAddress = await bridge.getAddress()\n const allowance = await bridgeableToken.allowance(liquiditySourceAddress, bridgeAddress)\n liquidityTokenAllowance.record(Number(allowance / TOKEN_DECIMALS), { address: liquiditySourceAddress })\n } catch (err) {\n console.error('[BalanceMonitor] Failed to read liquidity source token allowance:', err)\n }\n\n // XL1 account balance\n try {\n const viewer = gateway.connection.viewer\n if (viewer) {\n const balance = await viewer.account.balance.accountBalance(account.address)\n xl1AccountBalance.record(Number(balance / TOKEN_DECIMALS), { address: account.address.toString() })\n }\n } catch (err) {\n console.error('[BalanceMonitor] Failed to read XL1 account balance:', err)\n }\n }\n\n return {\n start() {\n void poll()\n timer = setInterval(() => void poll(), intervalMs)\n },\n stop() {\n if (timer) {\n clearInterval(timer)\n timer = undefined\n }\n },\n }\n}\n","import type { Gauge, Meter } from '@opentelemetry/api'\n\nimport type { Xl1ToEthQueues } from '../queue/index.ts'\n\nexport interface QueueMetricsConfig {\n intervalMs?: number\n meter: Meter\n queues: Xl1ToEthQueues\n}\n\nexport interface QueueMetricsHandle {\n start: () => void\n stop: () => void\n}\n\nconst DEFAULT_INTERVAL_MS = 30_000\n\nexport function createQueueMetrics(config: QueueMetricsConfig): QueueMetricsHandle {\n const {\n meter, queues,\n intervalMs = DEFAULT_INTERVAL_MS,\n } = config\n\n let timer: ReturnType<typeof setInterval> | undefined\n\n const waitingGauge: Gauge = meter.createGauge(\n 'bridge_queue_waiting',\n { description: 'Number of waiting jobs in the bridge queue' },\n )\n\n const activeGauge: Gauge = meter.createGauge(\n 'bridge_queue_active',\n { description: 'Number of active jobs in the bridge queue' },\n )\n\n const completedGauge: Gauge = meter.createGauge(\n 'bridge_queue_completed',\n { description: 'Number of completed jobs in the bridge queue' },\n )\n\n const failedGauge: Gauge = meter.createGauge(\n 'bridge_queue_failed',\n { description: 'Number of failed jobs in the bridge queue' },\n )\n\n const delayedGauge: Gauge = meter.createGauge(\n 'bridge_queue_delayed',\n { description: 'Number of delayed jobs in the bridge queue' },\n )\n\n async function poll(): Promise<void> {\n for (const [name, queue] of Object.entries(queues)) {\n try {\n const counts = await queue.getJobCounts('waiting', 'active', 'completed', 'failed', 'delayed')\n const attrs = { queue_name: name }\n waitingGauge.record(counts.waiting ?? 0, attrs)\n activeGauge.record(counts.active ?? 0, attrs)\n completedGauge.record(counts.completed ?? 0, attrs)\n failedGauge.record(counts.failed ?? 0, attrs)\n delayedGauge.record(counts.delayed ?? 0, attrs)\n } catch (err) {\n console.error(`[QueueMetrics] Failed to read job counts for queue ${name}:`, err)\n }\n }\n }\n\n return {\n start() {\n void poll()\n timer = setInterval(() => void poll(), intervalMs)\n },\n stop() {\n if (timer) {\n clearInterval(timer)\n timer = undefined\n }\n },\n }\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 { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport { prefix } from './prefix.ts'\n\nlet flowProducer: FlowProducer | undefined\n\nexport const getFlowProducer = (connection: Redis, telemetry?: BullMQOtel) => {\n if (isDefined(flowProducer)) return flowProducer\n flowProducer = new FlowProducer({\n connection, telemetry, prefix,\n })\n return flowProducer\n}\n","export const prefix = 'xl1-bridge'\n","import { assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport { prefix } from '../prefix.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1TransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type EthTransactionMonitorJobData = Xl1TransactionJobData\nexport interface EthTransactionMonitorJobReturn {\n blockHash: string\n blockNumber: number\n submissionHash: string\n}\nexport type EthTransactionMonitorJob = Job<EthTransactionMonitorJobData, EthTransactionMonitorJobReturn>\n\nconst name = 'Monitor Submitted ETH Transaction'\nconst queueName = 'eth-tx-monitor'\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel, 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: EthTransactionMonitorJob) => {\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 {\n blockHash, blockNumber, submissionHash,\n }\n },\n {\n connection, telemetry, prefix,\n },\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 } from '@xyo-network/xl1-sdk'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport { getAddress } from 'ethers'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport {\n validateSufficientLiquiditySourceAllowance, validateSufficientLiquiditySourceBalance, validateSufficientRunnerEthBalanceForGas,\n} from '../../validation/index.ts'\nimport { prefix } from '../prefix.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1DataLakeTransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type EthTransactionPreparationJobData = Xl1DataLakeTransactionJobData\nexport type EthTransactionPreparationJobReturn = Record<string, never>\nexport type EthTransactionPreparationJob = Job<EthTransactionPreparationJobData, EthTransactionPreparationJobReturn>\n\nconst name = 'Prepare ETH Transaction'\nconst queueName = 'eth-tx-prepare'\n\nexport const createWorker = (connection: Redis, telemetry?: BullMQOtel, 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 const wallet = assertEx(services?.wallet, () => 'wallet service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: EthTransactionPreparationJob) => {\n const { tx, offChainPayloads } = 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 validateSufficientLiquiditySourceAllowance(tx, offChainPayloads, 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 validateSufficientLiquiditySourceBalance(tx, offChainPayloads, 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 allPayloads = [...tx[1], ...offChainPayloads]\n const bridgeIntent = assertEx(allPayloads.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}] validating tx runner has sufficient ETH for gas`)\n if (!await validateSufficientRunnerEthBalanceForGas(preparedTx, wallet, job)) {\n throw new Error('Transaction runner does not have sufficient ETH to cover estimated gas (with buffer)')\n }\n await job.log(`[${hash}] validated tx runner has sufficient ETH for gas`)\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 {\n connection, telemetry, prefix,\n },\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 { hexToBigInt, 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 { getMaxBridgeAmount, getMinBridgeAmount } from '../config/index.ts'\nimport { generateBridgeEstimate } from '../util/index.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\n // Reject if the requested amount is outside the configured bounds\n if (hexToBigInt(srcAmount) < hexToBigInt(getMinBridgeAmount(config))) return false\n if (hexToBigInt(srcAmount) > hexToBigInt(getMaxBridgeAmount(config))) return false\n\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 { 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 } from '@xylabs/sdk-js'\nimport { resolveWalletForActor } from '@xyo-network/chain-orchestration'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { ActorConfig } 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 const accountPath = typeof config.accountPath === 'string' ? config.accountPath : undefined\n const account = await resolveWalletForActor(config.name, accountPath)\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 { 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 { Hex } from '@xylabs/sdk-js'\nimport { hexToBigInt, toHex } from '@xylabs/sdk-js'\n\nimport type { FeeStructure } from './calculateBridgeFees.ts'\n\n/**\n * Given a user's total available balance, calculates the maximum amount they can bridge\n * after accounting for the fixed and variable bridge fees.\n *\n * Solving for M where: M + feeFixed + (M * basisPoints / 10_000) = balance\n * => M = (balance - feeFixed) * 10_000 / (10_000 + basisPoints)\n */\nexport const calculateMaxBridgeAmount = (balance: Hex, feeStructure: FeeStructure): Hex => {\n const { feeFixed, feeRateBasisPoints } = feeStructure\n const balanceBigInt = hexToBigInt(balance)\n const feeFixedBigInt = hexToBigInt(feeFixed)\n\n if (balanceBigInt <= feeFixedBigInt) return toHex(0n)\n\n const maxAmount = ((balanceBigInt - feeFixedBigInt) * 10_000n) / (10_000n + BigInt(feeRateBasisPoints))\n return toHex(maxAmount)\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 { asAddress } from '@xylabs/sdk-js'\nimport {\n addressesContains, BoundWitnessValidator, payloadHashesContainsAll, payloadSchemasContainsAll,\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, TransactionBoundWitness, Transfer,\n} from '@xyo-network/xl1-sdk'\nimport { BridgeIntentSchema, TransferSchema } 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 // Ensure the transaction is for the correct source chain\n const chainId = getXl1ChainId(config)\n if (signedTxBw.chain !== chainId) return false\n\n // Ensure only the expected number of payloads exist (do not allow ambiguous extras)\n if (signedTxBw.payload_hashes.length != 2) return false\n // Ensure the payloads match the expected schemas\n if (!payloadSchemasContainsAll(signedTxBw, [BridgeIntentSchema, TransferSchema])) return false\n // Ensure the hashes match the intent and transfer\n const hashes = await PayloadBuilder.hashes([intent, transfer])\n if (!payloadHashesContainsAll(signedTxBw, hashes)) return false\n // Ensure the BoundWitness is valid and signed by the sender\n const errors = await new BoundWitnessValidator(signedTxBw).validate()\n if (errors.length > 0) return false\n\n // Ensure the sender's address is included in the addresses\n const sender = asAddress(srcAddress, true)\n if (!addressesContains(signedTxBw, sender)) return false\n\n return true\n}\n","import { assertEx, hexToBigInt } from '@xylabs/sdk-js'\nimport type { Payload } from '@xyo-network/sdk-js'\nimport type { BridgeableToken, LiquidityPoolBridge } from '@xyo-network/typechain'\nimport { isBridgeIntent, type SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\n\nimport type { AsyncLogger } from './AsyncLogger.ts'\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 offChainPayloads The payloads to put off chain\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 validateSufficientLiquiditySourceAllowance = async (\n tx: SignedHydratedTransaction,\n offChainPayloads: Payload[],\n bridgeableToken: BridgeableToken,\n bridge: LiquidityPoolBridge,\n logger?: AsyncLogger,\n) => {\n // Get the amount being bridged from the bridge intent\n const allPayloads = [...tx[1], ...offChainPayloads]\n const bridgeIntent = assertEx(allPayloads.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 { assertEx, hexToBigInt } from '@xylabs/sdk-js'\nimport type { Payload } from '@xyo-network/sdk-js'\nimport type { BridgeableToken, LiquidityPoolBridge } from '@xyo-network/typechain'\nimport { isBridgeIntent, type SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\n\nimport type { AsyncLogger } from './AsyncLogger.ts'\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 offChainPayloads The payloads to put off chain\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 validateSufficientLiquiditySourceBalance = async (\n tx: SignedHydratedTransaction,\n offChainPayloads: Payload[],\n bridgeableToken: BridgeableToken,\n bridge: LiquidityPoolBridge,\n logger?: AsyncLogger,\n) => {\n // Get the amount being bridged from the bridge intent\n const allPayloads = [...tx[1], ...offChainPayloads]\n const bridgeIntent = assertEx(allPayloads.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 } from '@xylabs/sdk-js'\nimport type { ContractTransaction, Wallet } from 'ethers'\n\nimport type { AsyncLogger } from './AsyncLogger.ts'\n\nconst DEFAULT_GAS_BUFFER_BPS = 2000n // 20%\n\n/**\n * Validates that the wallet (the account that will submit the tx) has enough ETH\n * to cover the estimated gas cost (plus a buffer) for the transaction.\n * @param preparedTx The transaction that is being prepared for submission.\n * This should be a fully populated transaction (to/from/data/value) except for gas fields.\n * @param wallet The wallet that will be used to submit the transaction.\n * @param logger Optional logger for asynchronous logging.\n * @param bufferBps The buffer to apply to the estimated gas cost, in basis points (1/100th of a percent).\n * @returns A boolean indicating whether the wallet has sufficient ETH to cover the estimated gas cost with the buffer applied.\n */\nexport const validateSufficientRunnerEthBalanceForGas = async (\n preparedTx: ContractTransaction,\n wallet: Wallet,\n logger?: AsyncLogger,\n bufferBps: bigint = DEFAULT_GAS_BUFFER_BPS,\n) => {\n const provider = assertEx(wallet.provider, () => 'Wallet provider is not defined')\n\n // Fee data (EIP-1559 preferred, gasPrice fallback)\n const feeData = await provider.getFeeData()\n const perGas = feeData.maxFeePerGas ?? feeData.gasPrice\n if (perGas == null) {\n await logger?.log('[gas] unable to resolve gas price / maxFeePerGas from provider')\n return true // don’t hard-fail; provider may not support fee data\n }\n\n // Estimate gas\n const transactionRequest = {\n ...preparedTx,\n from: await wallet.getAddress(),\n }\n const estGas = await provider.estimateGas(transactionRequest)\n\n // Include any value sent with the tx\n const txValue = preparedTx?.value ?? 0n\n\n // Required = (gas * perGas + value) * (1 + buffer)\n const baseRequired = estGas * perGas + txValue\n const required = (baseRequired * (10_000n + bufferBps)) / 10_000n\n\n const balance = await provider.getBalance(await wallet.getAddress())\n\n await logger?.log(\n `[gas] runner=${await wallet.getAddress()} balance=${balance.toString()} `\n + `estGas=${estGas.toString()} perGas=${perGas.toString()} value=${txValue.toString()} `\n + `requiredWithBuffer=${required.toString()} bufferBps=${bufferBps.toString()}`,\n )\n\n return balance >= required\n}\n","import {\n asAddress, assertEx, hexToBigInt,\n} from '@xylabs/sdk-js'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport type { BridgeIntent, XyoGatewayRunner } from '@xyo-network/xl1-sdk'\n\nimport { generateBridgeEstimate } from '../util/index.ts'\nimport type { AsyncLogger } from './AsyncLogger.ts'\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 bridgeIntent The bridge intent containing the details of the bridge transaction, including the source address and amount being bridged\n * @param gateway The XyoGatewayRunner to check the balance of the source address on XL1\n * @param config The bridge configuration, used to generate a bridge estimate for the transaction\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 validateSufficientXL1SourceAddressBalance = async (\n bridgeIntent: BridgeIntent,\n gateway: XyoGatewayRunner,\n config: BridgeConfig,\n logger?: AsyncLogger,\n) => {\n // Get the amount being bridged from the bridge intent\n const viewer = assertEx(gateway.connection.viewer, () => 'Gateway connection does not have a viewer')\n const {\n srcAddress, srcAmount, destAddress,\n } = bridgeIntent\n const srcAddressBranded = asAddress(srcAddress, () => `Invalid source address in bridge intent: ${srcAddress}`)\n const [_, calculatedTransfer] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config)\n const totalAmount = Object.values(calculatedTransfer.transfers).reduce((acc, transfer) => acc + hexToBigInt(transfer), 0n)\n\n // Check the srcAddress balance on XL1 for the bridge\n const accountBalance = await viewer.account.balance.accountBalance(srcAddressBranded)\n await logger?.log(`Account balance for ${srcAddressBranded}: ${accountBalance.toString()}`)\n return accountBalance >= totalAmount\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { EthTxState, IBridgeServiceCollection } from '../../services/index.ts'\nimport { prefix } from '../prefix.ts'\nimport { submitEthTransaction } from './util/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1DataLakeTransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type EthTransactionSubmissionJobData = Xl1DataLakeTransactionJobData\nexport interface EthTransactionSubmissionJobReturn {\n submissionHash: Required<EthTxState>['submissionHash']\n}\nexport type EthTransactionSubmissionJob = Job<EthTransactionSubmissionJobData, EthTransactionSubmissionJobReturn>\n\nconst name = 'Submit ETH Transaction'\nconst queueName = 'eth-tx-submit'\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel, services?: IBridgeServiceCollection) => {\n const bridge = assertEx(services?.bridge, () => 'bridge 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: EthTransactionSubmissionJob) => {\n const { tx, offChainPayloads } = job.data\n const hash = await PayloadBuilder.hash(tx[0])\n const state = assertEx(await stateMap.get(hash), () => `[${hash}] state 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 submissionHash = assertEx(await submitEthTransaction(tx, offChainPayloads, bridge, wallet), () => `[${hash}] submissionHash not found in receipt`)\n await job.log(`[${hash}] Submitted ETH tx and received submission response hash ${submissionHash}`)\n return { submissionHash }\n },\n {\n connection, telemetry, concurrency: 1, prefix,\n },\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 type { Payload } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { LiquidityPoolBridge } from '@xyo-network/typechain'\nimport { isBridgeIntent, type SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { Wallet } from 'ethers'\n\nexport const submitEthTransaction = async (\n tx: SignedHydratedTransaction,\n offChainPayloads: Payload[],\n bridge: LiquidityPoolBridge,\n wallet: Wallet,\n) => {\n // Approve the bridge to spend tokens\n const xl1Transaction = assertEx(tx[0], () => 'No corresponding XL1 transaction found')\n const allPayloads = [...tx[1], ...offChainPayloads]\n const bridgeIntent = assertEx(allPayloads.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 type { Payload } from '@xyo-network/sdk-js'\nimport { type SignedHydratedTransaction, type XyoGatewayRunner } from '@xyo-network/xl1-sdk'\n\nexport const submitXl1Transaction = async (\n preparedTx: SignedHydratedTransaction,\n offChain: Payload[] = [],\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 result = await gateway.addTransactionToChain(preparedTx, offChain)\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 { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { EthTxState, IBridgeServiceCollection } from '../../services/index.ts'\nimport { prefix } from '../prefix.ts'\nimport type { EthTransactionSubmissionJobReturn } from './EthTransactionSubmission.ts'\nimport { EthTransactionSubmission } from './EthTransactionSubmission.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1TransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type EthTransactionSubmissionStorageJobData = Xl1TransactionJobData\nexport interface EthTransactionSubmissionStorageJobReturn {\n submissionHash: Required<EthTxState>['submissionHash']\n}\nexport type EthTransactionSubmissionStorageJob = Job<EthTransactionSubmissionStorageJobData, EthTransactionSubmissionStorageJobReturn>\n\nconst name = 'Store ETH Transaction Submission'\nconst queueName = 'eth-tx-store-submission'\n\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel, services?: IBridgeServiceCollection) => {\n const stateMap = assertEx(services?.ethTxStateMap, () => 'ethTxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: EthTransactionSubmissionStorageJob) => {\n const { tx } = job.data\n // Get the hash of the transaction\n const hash = await PayloadBuilder.hash(tx[0])\n\n // Get the state of the transaction\n const state = assertEx(await stateMap.get(hash), () => `[${hash}] state not found`)\n\n // Idempotency check against re-store\n const { submissionHash: existingSubmissionHash } = state\n if (isDefined(existingSubmissionHash)) {\n await job.log(`[${hash}] submissionHash already stored as ${existingSubmissionHash}`)\n return { submissionHash: existingSubmissionHash }\n }\n\n // In a Flow, this job should be the PARENT and the submit job should be a CHILD.\n // That lets us read the child job’s return value(s) here.\n const childrenValues = await job.getChildrenValues()\n const jobKey = `${prefix}:${EthTransactionSubmission.queueName}:${hash}`\n const childValues = childrenValues?.[jobKey] as EthTransactionSubmissionJobReturn | undefined\n const submissionHash = childValues?.submissionHash\n\n const resolvedSubmissionHash = assertEx(submissionHash, () => `[${hash}] child submissionHash not found in children values`)\n\n // Store the submission hash in the state\n await job.log(`[${hash}] Storing ETH submissionHash`)\n state.submissionHash = resolvedSubmissionHash\n await stateMap.set(hash, state)\n await job.log(`[${hash}] Stored ETH submissionHash`)\n return { submissionHash: resolvedSubmissionHash }\n },\n {\n connection, telemetry, prefix,\n },\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 EthTransactionSubmissionStorage: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport { prefix } from '../prefix.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1DataLakeTransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type Xl1ToEthBridgeParentJobData = Xl1DataLakeTransactionJobData\nexport interface Xl1ToEthBridgeParentJobReturn { }\nexport type Xl1ToEthBridgeParentJob = Job<Xl1ToEthBridgeParentJobData, Xl1ToEthBridgeParentJobReturn>\n\nconst name = 'Bridge XL1 to Ethereum'\nconst queueName = 'xl1-to-eth-bridge'\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel) => {\n const worker = new Worker(\n queueName,\n async (job: Xl1ToEthBridgeParentJob) => {\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 return {}\n },\n {\n connection, telemetry, prefix,\n },\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 type { BrandedHash } from '@xylabs/sdk-js'\nimport {\n assertEx, isDefined, isNull,\n} from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { Job } from 'bullmq'\nimport { UnrecoverableError, Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport { prefix } from '../prefix.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1TransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type Xl1TransactionMonitorJobData = Xl1TransactionJobData\nexport interface Xl1TransactionMonitorJobReturn {\n submissionHash: BrandedHash\n}\nexport type Xl1TransactionMonitorJob = Job<Xl1TransactionMonitorJobData, Xl1TransactionMonitorJobReturn>\n\nconst name = 'Monitor Submitted XL1 Transaction'\nconst queueName = 'xl1-tx-monitor'\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel, services?: IBridgeServiceCollection) => {\n const gateway = assertEx(services?.gateway, () => 'gateway service not provided')\n const stateMap = assertEx(services?.xl1TxStateMap, () => 'xl1TxStateMap service not provided')\n const viewer = assertEx(gateway.connection.viewer, () => 'viewer not defined on gateway')\n\n const worker = new Worker(\n queueName,\n async (job: Xl1TransactionMonitorJob) => {\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 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.transaction.byHash(submissionHash)\n // const foundTx = await viewer.transaction.byHash(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 const submissionHash = await PayloadBuilder.hash(foundTx[0])\n return { submissionHash }\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 {\n connection, telemetry, prefix,\n },\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 { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport { prefix } from '../prefix.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1DataLakeTransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type Xl1TransactionPreparationJobData = Xl1DataLakeTransactionJobData\nexport interface Xl1TransactionPreparationJobReturn { preparedTx: SignedHydratedTransaction }\nexport type Xl1TransactionPreparationJob = Job<Xl1TransactionPreparationJobData, Xl1TransactionPreparationJobReturn>\n\nconst name = 'Prepare XL1 Transaction'\nconst queueName = 'xl1-tx-prepare'\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel, services?: IBridgeServiceCollection) => {\n const stateMap = assertEx(services?.xl1TxStateMap, () => 'xl1TxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Xl1TransactionPreparationJob) => {\n const { tx, offChainPayloads = [] } = 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, { offChainPayloads, preparedTx })\n await job.log(`[${hash}] stored XL1 preparedTx`)\n await job.log(`[${hash}] prepared XL1 transaction`)\n return { preparedTx }\n },\n {\n connection, telemetry, prefix,\n },\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 { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection, Xl1TxState } from '../../services/index.ts'\nimport { prefix } from '../prefix.ts'\nimport { submitXl1Transaction } from './util/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1TransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type Xl1TransactionSubmissionJobData = Xl1TransactionJobData\nexport interface Xl1TransactionSubmissionJobReturn {\n submissionHash: Required<Xl1TxState>['submissionHash']\n}\nexport type Xl1TransactionSubmissionJob = Job<Xl1TransactionSubmissionJobData, Xl1TransactionSubmissionJobReturn>\n\nconst name = 'Submit XL1 Transaction'\nconst queueName = 'xl1-tx-submit'\n\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel, 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: Xl1TransactionSubmissionJob) => {\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 {\n preparedTx, offChainPayloads = [], submissionHash: existingSubmissionHash,\n } = state\n\n // Idempotency check against resubmission\n if (isDefined(existingSubmissionHash)) {\n await job.log(`[${hash}] Tx already submitted with submission response hash ${existingSubmissionHash}`)\n return { submissionHash: existingSubmissionHash }\n }\n const txToSubmit = assertEx(preparedTx, () => `[${hash}] preparedTx not found`)\n\n // Submit the transaction to the XL1 network\n await job.log(`[${hash}] Submitting XL1 tx`)\n const [submissionHash] = await submitXl1Transaction(txToSubmit, offChainPayloads, gateway)\n await job.log(`[${hash}] Submitted XL1 tx`)\n\n // This worker intentionally does NOT store state as subsequent steps will do that.\n return { submissionHash }\n },\n {\n connection, telemetry, prefix,\n },\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 { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection, Xl1TxState } from '../../services/index.ts'\nimport { prefix } from '../prefix.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1TransactionJobData } from './Xl1TransactionJobData.ts'\nimport type { Xl1TransactionSubmissionJobReturn } from './Xl1TransactionSubmission.ts'\nimport { Xl1TransactionSubmission } from './Xl1TransactionSubmission.ts'\n\nexport type Xl1TransactionSubmissionStorageJobData = Xl1TransactionJobData\nexport interface Xl1TransactionSubmissionStorageJobReturn {\n submissionHash: Required<Xl1TxState>['submissionHash']\n}\nexport type Xl1TransactionSubmissionStorageJob = Job<Xl1TransactionSubmissionStorageJobData, Xl1TransactionSubmissionStorageJobReturn>\n\nconst name = 'Store XL1 Transaction Submission'\nconst queueName = 'xl1-tx-store-submission'\n\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel, services?: IBridgeServiceCollection) => {\n const stateMap = assertEx(services?.xl1TxStateMap, () => 'xl1TxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Xl1TransactionSubmissionStorageJob) => {\n const { tx } = job.data\n // Get the hash of the transaction\n const hash = await PayloadBuilder.hash(tx[0])\n\n // Get the state of the transaction\n const state = assertEx(await stateMap.get(hash), () => `[${hash}] state not found`)\n\n // Idempotency check against re-store\n const { submissionHash: existingSubmissionHash } = state\n if (isDefined(existingSubmissionHash)) {\n await job.log(`[${hash}] submissionHash already stored as ${existingSubmissionHash}`)\n return { submissionHash: existingSubmissionHash }\n }\n\n // In a Flow, this job should be the PARENT and the submit job should be a CHILD.\n // That lets us read the child job’s return value(s) here.\n const childrenValues = await job.getChildrenValues()\n const jobKey = `${prefix}:${Xl1TransactionSubmission.queueName}:${hash}`\n const childValues = childrenValues?.[jobKey] as Xl1TransactionSubmissionJobReturn | undefined\n const submissionHash = childValues?.submissionHash\n\n const resolvedSubmissionHash = assertEx(submissionHash, () => `[${hash}] child submissionHash not found in children values`)\n\n // Store the submission hash in the state\n await job.log(`[${hash}] Storing XL1 submissionHash`)\n state.submissionHash = resolvedSubmissionHash\n await stateMap.set(hash, state)\n await job.log(`[${hash}] Stored XL1 submissionHash`)\n\n return { submissionHash: resolvedSubmissionHash }\n },\n {\n connection, telemetry, prefix,\n },\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 Xl1TransactionSubmissionStorage: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport { EthTransactionMonitor } from './EthTransactionMonitor.ts'\nimport { EthTransactionPreparation } from './EthTransactionPreparation.ts'\nimport { EthTransactionSubmission } from './EthTransactionSubmission.ts'\nimport { EthTransactionSubmissionStorage } from './EthTransactionSubmissionStorage.ts'\nimport { Xl1ToEthBridgeParent } from './Xl1ToEthBridgeParent.ts'\nimport { Xl1TransactionMonitor } from './Xl1TransactionMonitor.ts'\nimport { Xl1TransactionPreparation } from './Xl1TransactionPreparation.ts'\nimport { Xl1TransactionSubmission } from './Xl1TransactionSubmission.ts'\nimport { Xl1TransactionSubmissionStorage } from './Xl1TransactionSubmissionStorage.ts'\n\nexport const createWorkers = (connection: Redis, telemetry: BullMQOtel, services: IBridgeServiceCollection) => {\n // TODO: Uncomment when EthToXl1 flow is ready\n // EthToXl1BridgeParent.createWorker(connection, telemetry)\n EthTransactionMonitor.createWorker(connection, telemetry, services)\n EthTransactionPreparation.createWorker(connection, telemetry, services)\n EthTransactionSubmission.createWorker(connection, telemetry, services)\n EthTransactionSubmissionStorage.createWorker(connection, telemetry, services)\n Xl1ToEthBridgeParent.createWorker(connection, telemetry)\n Xl1TransactionMonitor.createWorker(connection, telemetry, services)\n Xl1TransactionPreparation.createWorker(connection, telemetry, services)\n Xl1TransactionSubmission.createWorker(connection, telemetry, services)\n Xl1TransactionSubmissionStorage.createWorker(connection, telemetry, services)\n}\n","import { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\n\n/**\n * Returns a deterministic & repeatable job ID based off the Transaction hash. This is to ensure\n * that if the same transaction is attempted to be bridged multiple times, it will have the same\n * job ID and not create duplicate jobs.\n * https://docs.bullmq.io/guide/jobs/job-ids\n * \"The main reason to be able to specify a custom id is in cases when you want to avoid duplicated\n * jobs. Since ids must be unique, if you add a job with an existing id then that job will just be\n * ignored and not added to the queue at all.\"\n * @param tx The transaction to bridge from XL1 to ETH\n * @returns A deterministic job ID for the bridge job\n */\nexport const getJobIdForXl1ToEthBridgeJob = async (tx: SignedHydratedTransaction) => {\n const jobId = await PayloadBuilder.hash(tx[0])\n return jobId\n}\n","import type { Payload } from '@xyo-network/sdk-js'\nimport type { SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { FlowProducer } from 'bullmq'\n\nimport type {\n EthTransactionMonitorJobData,\n EthTransactionPreparationJobData,\n EthTransactionSubmissionJobData,\n EthTransactionSubmissionStorageJobData,\n Xl1ToEthBridgeParentJobData,\n Xl1TransactionMonitorJobData,\n Xl1TransactionPreparationJobData,\n Xl1TransactionSubmissionJobData,\n Xl1TransactionSubmissionStorageJobData,\n} from '../../workers/index.ts'\nimport {\n EthTransactionMonitor, EthTransactionPreparation, EthTransactionSubmission, EthTransactionSubmissionStorage, Xl1ToEthBridgeParent, Xl1TransactionMonitor,\n Xl1TransactionPreparation, Xl1TransactionSubmission, Xl1TransactionSubmissionStorage,\n} from '../../workers/index.ts'\nimport { getJobIdForXl1ToEthBridgeJob } from './getJobIdForXl1ToEthBridgeJob.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 * @param offChainPayloads The payloads to put off chain\n * @returns The JobNode representing the XL1 to ETH bridge job\n */\nexport const createXl1ToEthBridgeJob = async (\n flowProducer: FlowProducer,\n tx: SignedHydratedTransaction,\n offChainPayloads: Payload[] = [],\n) => {\n const jobId = await getJobIdForXl1ToEthBridgeJob(tx)\n const flow = await flowProducer.add({\n // Step 0 (runs first as parent job)\n name: Xl1ToEthBridgeParent.name,\n queueName: Xl1ToEthBridgeParent.queueName,\n data: { tx, offChainPayloads } as Xl1ToEthBridgeParentJobData,\n opts: { jobId },\n children: [\n {\n // Step 8\n name: EthTransactionMonitor.name,\n queueName: EthTransactionMonitor.queueName,\n data: { tx } as EthTransactionMonitorJobData,\n opts: {\n jobId, attempts: 60, backoff: { type: 'fixed', delay: 5000 },\n },\n children: [\n {\n // Step 7\n name: EthTransactionSubmissionStorage.name,\n queueName: EthTransactionSubmissionStorage.queueName,\n data: { tx } as EthTransactionSubmissionStorageJobData,\n opts: {\n jobId, attempts: 60, backoff: { type: 'fixed', delay: 5000 },\n },\n children: [\n {\n // Step 6\n name: EthTransactionSubmission.name,\n queueName: EthTransactionSubmission.queueName,\n data: { tx, offChainPayloads } as EthTransactionSubmissionJobData,\n opts: { jobId },\n children: [\n {\n // Step 5\n name: EthTransactionPreparation.name,\n queueName: EthTransactionPreparation.queueName,\n data: { tx, offChainPayloads } as EthTransactionPreparationJobData,\n opts: {\n jobId, attempts: 60, backoff: { type: 'fixed', delay: 5000 },\n },\n children: [\n {\n // Step 4\n name: Xl1TransactionMonitor.name,\n queueName: Xl1TransactionMonitor.queueName,\n data: { tx } as Xl1TransactionMonitorJobData,\n opts: {\n jobId, attempts: 60, backoff: { type: 'fixed', delay: 5000 },\n },\n children: [\n {\n // Step 3\n name: Xl1TransactionSubmissionStorage.name,\n queueName: Xl1TransactionSubmissionStorage.queueName,\n data: { tx } as Xl1TransactionSubmissionStorageJobData,\n opts: {\n jobId, attempts: 60, backoff: { type: 'fixed', delay: 5000 },\n },\n children: [\n {\n // Step 2\n name: Xl1TransactionSubmission.name,\n queueName: Xl1TransactionSubmission.queueName,\n data: { tx } as Xl1TransactionSubmissionJobData,\n opts: { jobId },\n children: [\n {\n // Step 1 (runs first as deepest child)\n name: Xl1TransactionPreparation.name,\n queueName: Xl1TransactionPreparation.queueName,\n data: { tx, offChainPayloads } as Xl1TransactionPreparationJobData,\n opts: {\n jobId, attempts: 60, backoff: { type: 'fixed', delay: 5000 },\n },\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n })\n return flow\n}\n","import type { SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { FlowProducer } from 'bullmq'\n\nimport { Xl1ToEthBridgeParent } from '../../workers/index.ts'\nimport { getJobIdForXl1ToEthBridgeJob } from './getJobIdForXl1ToEthBridgeJob.ts'\n\nexport const getXl1ToEthBridgeJob = async (flowProducer: FlowProducer, tx: SignedHydratedTransaction) => {\n const id = await getJobIdForXl1ToEthBridgeJob(tx)\n const flow = await flowProducer.getFlow({ queueName: Xl1ToEthBridgeParent.queueName, id })\n return flow\n}\n","import type { Xl1ToEthQueues } from './getXl1ToEthQueues.ts'\nimport type {\n EthTransactionMonitorJob, EthTransactionPreparationJob,\n EthTransactionSubmissionJob,\n Xl1ToEthBridgeParentJob,\n Xl1TransactionMonitorJob, Xl1TransactionPreparationJob, Xl1TransactionSubmissionJob,\n Xl1TransactionSubmissionStorageJob,\n} from './workers/index.ts'\n\nexport interface StatusQueueJobs {\n ethTransactionMonitorJob?: EthTransactionMonitorJob\n ethTransactionPreparationJob?: EthTransactionPreparationJob\n ethTransactionSubmissionJob?: EthTransactionSubmissionJob\n xl1ToEthBridgeParentJob?: Xl1ToEthBridgeParentJob\n xl1TransactionMonitorJob?: Xl1TransactionMonitorJob\n xl1TransactionPreparationJob?: Xl1TransactionPreparationJob\n xl1TransactionSubmissionJob?: Xl1TransactionSubmissionJob\n xl1TransactionSubmissionStorageJob?: Xl1TransactionSubmissionStorageJob\n}\n\n/**\n * Checks all the relevant status queues for a job with the given id and returns the jobs found in an object\n * @param queues The status queues to check for jobs\n * @param jobId The job id to look for in the queues, which is the same as the tx hash of the bridge transaction\n * @returns An object containing the jobs found in the status queues corresponding to the given job id\n */\nexport const getStatusQueueJobs = async (queues: Xl1ToEthQueues, jobId: string): Promise<StatusQueueJobs> => {\n const [\n ethTransactionMonitorJob,\n ethTransactionPreparationJob,\n ethTransactionSubmissionJob,\n xl1ToEthBridgeParentJob,\n xl1TransactionMonitorJob,\n xl1TransactionPreparationJob,\n xl1TransactionSubmissionJob,\n xl1TransactionSubmissionStorageJob,\n ] = await Promise.all([\n queues.ethTransactionMonitor.getJob(jobId),\n queues.ethTransactionPreparation.getJob(jobId),\n queues.ethTransactionSubmission.getJob(jobId),\n queues.xl1ToEthBridgeParent.getJob(jobId),\n queues.xl1TransactionMonitor.getJob(jobId),\n queues.xl1TransactionPreparation.getJob(jobId),\n queues.xl1TransactionSubmission.getJob(jobId),\n queues.xl1TransactionSubmissionStorage.getJob(jobId),\n ])\n return {\n ethTransactionMonitorJob,\n ethTransactionPreparationJob,\n ethTransactionSubmissionJob,\n xl1ToEthBridgeParentJob,\n xl1TransactionMonitorJob,\n xl1TransactionPreparationJob,\n xl1TransactionSubmissionStorageJob,\n xl1TransactionSubmissionJob,\n }\n}\n","import type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { Queue } from 'bullmq'\n\nimport { getConnection } from './connection.ts'\nimport { prefix } from './prefix.ts'\nimport {\n EthTransactionMonitor, EthTransactionPreparation, EthTransactionSubmission, Xl1ToEthBridgeParent, Xl1TransactionMonitor, Xl1TransactionPreparation,\n Xl1TransactionSubmission,\n Xl1TransactionSubmissionStorage,\n} from './workers/index.ts'\n\nexport interface Xl1ToEthQueues {\n ethTransactionMonitor: Queue\n ethTransactionPreparation: Queue\n ethTransactionSubmission: Queue\n xl1ToEthBridgeParent: Queue\n xl1TransactionMonitor: Queue\n xl1TransactionPreparation: Queue\n xl1TransactionSubmission: Queue\n xl1TransactionSubmissionStorage: Queue\n}\n\nlet xl1ToEthQueues: Xl1ToEthQueues | undefined\n\nexport const getXl1ToEthQueues = (config: BridgeConfig): Xl1ToEthQueues => {\n if (xl1ToEthQueues) return xl1ToEthQueues\n const connection = getConnection(config)\n xl1ToEthQueues = {\n ethTransactionMonitor: new Queue(EthTransactionMonitor.queueName, { connection, prefix }),\n ethTransactionPreparation: new Queue(EthTransactionPreparation.queueName, { connection, prefix }),\n ethTransactionSubmission: new Queue(EthTransactionSubmission.queueName, { connection, prefix }),\n xl1ToEthBridgeParent: new Queue(Xl1ToEthBridgeParent.queueName, { connection, prefix }),\n xl1TransactionMonitor: new Queue(Xl1TransactionMonitor.queueName, { connection, prefix }),\n xl1TransactionPreparation: new Queue(Xl1TransactionPreparation.queueName, { connection, prefix }),\n xl1TransactionSubmission: new Queue(Xl1TransactionSubmission.queueName, { connection, prefix }),\n xl1TransactionSubmissionStorage: new Queue(Xl1TransactionSubmissionStorage.queueName, { connection, prefix }),\n }\n return xl1ToEthQueues\n}\n","import { isDefined } from '@xylabs/sdk-js'\nimport type { BullMQOtelOptions } from 'bullmq-otel'\nimport { BullMQOtel } from 'bullmq-otel'\n\nlet telemetry: BullMQOtel | undefined\nconst options: BullMQOtelOptions = { enableMetrics: true }\n\nexport const getTelemetry = () => {\n if (isDefined(telemetry)) return telemetry\n telemetry = new BullMQOtel(options)\n return telemetry\n}\n","import { standardErrors } from '@xylabs/express'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { sharedMiddleware } from '@xyo-network/chain-orchestration'\nimport type { XyoGatewayRunner } from '@xyo-network/xl1-sdk'\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 sharedMiddleware(app)\n addFlowProducer(app, config)\n addRoutes(app, config, gateway)\n app.use(standardErrors)\n return app\n}\n","import type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport type { Express } from 'express'\n\nimport {\n getConnection, getFlowProducer, getTelemetry,\n} from '../queue/index.ts'\n\nexport const addFlowProducer = (app: Express, config: BridgeConfig): Express => {\n const connection = getConnection(config)\n const telemetry = getTelemetry()\n const flowProducer = getFlowProducer(connection, telemetry)\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 { NoReqParams } from '@xylabs/express'\nimport { setRawResponseFormat } from '@xylabs/express'\nimport type { RequestHandler } from 'express'\nimport { ReasonPhrases } from 'http-status-codes'\n\nconst message = ReasonPhrases.OK\n\nconst handler: RequestHandler<NoReqParams> = (_req, res) => {\n setRawResponseFormat(res)\n res.status(200).send({ message })\n}\n\nexport const getLivez: RequestHandler<NoReqParams> = handler\n","import type { NoReqParams } from '@xylabs/express'\nimport { setRawResponseFormat } from '@xylabs/express'\nimport type { RequestHandler } from 'express'\nimport { ReasonPhrases } from 'http-status-codes'\n\nconst message = ReasonPhrases.OK\n\nconst handler: RequestHandler<NoReqParams> = (_req, res) => {\n setRawResponseFormat(res)\n res.status(200).send({ message })\n}\n\nexport const getReadyz: RequestHandler<NoReqParams> = handler\n","import type { NoReqParams } from '@xylabs/express'\nimport { setRawResponseFormat } from '@xylabs/express'\nimport type { RequestHandler } from 'express'\nimport { ReasonPhrases } from 'http-status-codes'\n\nconst message = ReasonPhrases.OK\n\nconst handler: RequestHandler<NoReqParams> = (_req, res) => {\n setRawResponseFormat(res)\n res.status(200).send({ message })\n}\n\nexport const getStartupz: RequestHandler<NoReqParams> = handler\n","import type { Express } from 'express'\n\nimport { getLivez } from './livez/index.ts'\nimport { getReadyz } from './readyz/index.ts'\nimport { getStartupz } from './startupz/index.ts'\n\nexport const addProbeRoutes = (app: Express) => {\n app.get('/livez', getLivez)\n app.get('/readyz', getReadyz)\n app.get('/startupz', getStartupz)\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 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 { isDefined } from '@xylabs/sdk-js'\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, getXl1ToEthBridgeJob } from '../../../../../queue/index.ts'\nimport {\n validateBridgeEstimateExact, validateBridgeTransaction, validateSufficientXL1SourceAddressBalance,\n} from '../../../../../validation/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 const { gateway } = req.app.services\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 // Validate sufficient balance\n const sufficientBalance = await validateSufficientXL1SourceAddressBalance(bridgeIntent, gateway, config)\n if (!sufficientBalance) {\n res.status(400).send()\n return\n }\n\n // Create the signed hydrated transaction for the job\n const singedHydratedTransaction: SignedHydratedTransaction = [signedTxBw, [transfer]]\n\n // Check if a job already exists for this transaction\n const existingFlow = await getXl1ToEthBridgeJob(flowProducer, singedHydratedTransaction)\n if (isDefined(existingFlow)) {\n res.status(200).send()\n return\n }\n\n // Submit to job queue\n await createXl1ToEthBridgeJob(flowProducer, singedHydratedTransaction, [bridgeIntent])\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.status(202).json(bridgeObservation)\n }),\n }\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport {\n assertEx, hexToBigInt, toAddress,\n} 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 { getBridgeSettings, 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\n const { maxBridgeAmount, minBridgeAmount } = await getBridgeSettings(config)\n if (hexToBigInt(srcAmount) < hexToBigInt(minBridgeAmount) || hexToBigInt(srcAmount) > hexToBigInt(maxBridgeAmount)) {\n res.status(400).send()\n return\n }\n\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 assertEx, hexToBigInt, toAddress, toHex,\n} 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 { getBridgeSettings } from '../../../../../config/index.ts'\nimport { calculateMaxBridgeAmount, generateBridgeEstimate } from '../../../../../util/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nexport const BridgeToRemoteMaxEstimateBodyZod = BridgeIntentFieldsZod.pick({\n destAddress: true,\n srcAddress: true,\n srcAmount: true,\n})\nexport type BridgeToRemoteMaxEstimateBody = z.infer<typeof BridgeToRemoteMaxEstimateBodyZod>\n\nexport const BridgeToRemoteMaxEstimateResponseZod = z.tuple([\n TransactionBoundWitnessZod,\n PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),\n TransferZod,\n])\n\nexport type BridgeToRemoteMaxEstimateResponse = z.infer<typeof BridgeToRemoteMaxEstimateResponseZod>\n\nexport const makeBridgeToRemoteMaxEstimateRoute = (config: BridgeConfig, gateway: XyoGatewayRunner): RouteDefinition => {\n const params = z.object({ chainId: getRemoteChainIdZod(config) })\n const validateRequest = requestHandlerValidator({\n params, body: BridgeToRemoteMaxEstimateBodyZod, response: BridgeToRemoteMaxEstimateResponseZod,\n })\n return {\n method: 'post',\n path: '/bridge/chains/:chainId/bridgeToRemote/maxEstimate',\n handlers: validateRequest(async (req, res) => {\n const {\n feeFixed, feeRateBasisPoints, maxBridgeAmount: configMax, xl1ChainId,\n } = await getBridgeSettings(config)\n const {\n srcAddress, srcAmount: balance, destAddress,\n } = req.body\n\n const balanceMax = calculateMaxBridgeAmount(balance, { feeFixed, feeRateBasisPoints })\n const maxBridgeAmount = toHex(hexToBigInt(balanceMax) < hexToBigInt(configMax) ? balanceMax : configMax)\n\n const [bridgeIntent, transfer] = await generateBridgeEstimate(srcAddress, maxBridgeAmount, destAddress, config)\n const sender = toAddress(srcAddress)\n\n const viewer = assertEx(gateway.connection.viewer, () => new Error('Viewer not available on gateway connection'))\n const currentBlockNumber = await viewer.currentBlockNumber()\n const nbf = toXL1BlockNumber(currentBlockNumber, true)\n const exp = toXL1BlockNumber(currentBlockNumber + 1000, true)\n const [txBw] = await buildUnsignedTransaction(xl1ChainId, [transfer], [bridgeIntent], nbf, exp, sender)\n\n res.json([txBw, bridgeIntent, transfer])\n }),\n }\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport { asHex, isDefined } from '@xylabs/sdk-js'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { PayloadBuilder, PayloadZodStrictOfSchema } from '@xyo-network/sdk-js'\nimport type { BridgeDestinationObservation, BridgeSourceObservation } from '@xyo-network/xl1-sdk'\nimport {\n asBridgeIntent, BridgeDestinationObservationFieldsZod, BridgeDestinationObservationSchema, BridgeIntentFieldsZod, BridgeIntentSchema,\n BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, isBridgeIntent,\n} from '@xyo-network/xl1-sdk'\nimport { z } from 'zod'\n\nimport { getStatusQueueJobs, getXl1ToEthQueues } from '../../../../../queue/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nconst BridgeIntentResponseZod = PayloadZodStrictOfSchema(BridgeIntentSchema)\n .extend(BridgeIntentFieldsZod.shape)\n\nconst BridgeSourceResponseZod = PayloadZodStrictOfSchema(BridgeSourceObservationSchema)\n .extend(BridgeSourceObservationFieldsZod.shape)\n\nconst BridgeDestinationResponseZod = PayloadZodStrictOfSchema(BridgeDestinationObservationSchema)\n .extend(BridgeDestinationObservationFieldsZod.shape)\n\nexport const BridgeToRemoteStatusResponseZod = z.union([\n z.tuple([]),\n z.tuple([BridgeIntentResponseZod]),\n z.tuple([BridgeIntentResponseZod, BridgeSourceResponseZod]),\n z.tuple([BridgeIntentResponseZod, BridgeSourceResponseZod, BridgeDestinationResponseZod]),\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\n const validateRequest = requestHandlerValidator({ params, response: BridgeToRemoteStatusResponseZod })\n\n return {\n method: 'get',\n path: '/bridge/chains/:chainId/bridgeToRemote/status/:nonce',\n handlers: validateRequest(async (req, res) => {\n const jobId = req.params.nonce\n const result: z.infer<typeof BridgeToRemoteStatusResponseZod> = [] as z.infer<typeof BridgeToRemoteStatusResponseZod>\n const queues = getXl1ToEthQueues(config)\n\n const statusQueueJobs = await getStatusQueueJobs(queues, jobId)\n\n // Check for the transaction hash in the parent job\n const { tx, offChainPayloads = [] } = statusQueueJobs.xl1ToEthBridgeParentJob?.data ?? {}\n\n // If the job does not exist return Not Found\n if (!tx) return res.sendStatus(404)\n\n // If the tx is not the right shape for bridging return Not Found\n const allPayloads = [...tx[1], ...offChainPayloads]\n const bridgeIntent = allPayloads.find(isBridgeIntent)\n if (!bridgeIntent) return res.sendStatus(404)\n\n // At this point we know we have a valid bridge intent, so we can start building the response\n result[0] = asBridgeIntent(PayloadBuilder.omitMeta(bridgeIntent))\n\n // Check the state of the XL1 monitor job to determine if we can include the source observation\n const { xl1TransactionMonitorJob } = statusQueueJobs\n const xl1MonitorState = xl1TransactionMonitorJob ? await xl1TransactionMonitorJob.getState() : undefined\n if (xl1MonitorState === 'completed') {\n const srcConfirmation = xl1TransactionMonitorJob?.returnvalue?.submissionHash\n if (isDefined(srcConfirmation)) {\n const schema = BridgeSourceObservationSchema\n const bridgeSourceObservationFields = BridgeSourceObservationFieldsZod.parse(bridgeIntent)\n const observation: BridgeSourceObservation = {\n schema, ...bridgeSourceObservationFields, srcConfirmation,\n }\n result[1] = observation\n }\n }\n\n // Check the state of the ETH monitor job to determine if we can include the destination observation\n const { ethTransactionMonitorJob } = statusQueueJobs\n const ethMonitorState = ethTransactionMonitorJob ? await ethTransactionMonitorJob.getState() : undefined\n if (ethMonitorState === 'completed') {\n const destConfirmation = asHex(ethTransactionMonitorJob?.returnvalue?.submissionHash)\n if (isDefined(destConfirmation)) {\n const schema = BridgeDestinationObservationSchema\n const bridgeDestinationObservationFields = BridgeDestinationObservationFieldsZod.parse(bridgeIntent)\n const observation: BridgeDestinationObservation = {\n schema, ...bridgeDestinationObservationFields, destConfirmation,\n }\n result[2] = observation\n }\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, makeBridgeToRemoteMaxEstimateRoute, 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 makeBridgeToRemoteMaxEstimateRoute(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 { addProbeRoutes } from './addProbeRoutes.ts'\nimport { addBridgeRoutes } from './bridge/index.ts'\n\nexport const addRoutes = (app: Express, config: BridgeConfig, gateway: XyoGatewayRunner) => {\n addProbeRoutes(app)\n addBridgeRoutes(app, config, gateway)\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { BridgeConfig, BridgeConfigContext } from '@xyo-network/chain-orchestration'\nimport { initEvmProvider, resolveWalletForActor } from '@xyo-network/chain-orchestration'\nimport { BridgeableToken__factory, LiquidityPoolBridge__factory } from '@xyo-network/typechain'\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, accountPath,\n } = config as BridgeConfig\n const account = await resolveWalletForActor(config.name, accountPath)\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-driver-mongodb'\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 {\n createWorkers, getConnection,\n getTelemetry,\n} 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 const telemetry = getTelemetry()\n createWorkers(connection, telemetry, services)\n}\n","import type { Server } from 'node:http'\n\nimport type { BridgeConfigContext } from '@xyo-network/chain-orchestration'\nimport type { XyoGatewayRunner } from '@xyo-network/xl1-sdk'\n\nimport type { IBridgeServiceCollection } from '../services/index.ts'\nimport { getServices } from '../services/index.ts'\nimport { addWorkers } from './addWorkers.ts'\nimport { getApp } from './app.ts'\n\nexport interface GetServerResult {\n server: Server\n services: IBridgeServiceCollection\n}\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\nexport const getServer = async (context: BridgeConfigContext, gateway: XyoGatewayRunner): Promise<GetServerResult> => {\n const { logger, config } = context\n const { port } = config\n const app = getApp(config, gateway)\n const services = await getServices(context, gateway)\n app.services = services\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, services }\n}\n"],"mappings":"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","names":["creatable","asBridgeConfigContext","ActorV3","XyoGatewayRunnerMoniker","DEFAULT_INTERVAL_MS","WEI_PER_GWEI","TOKEN_DECIMALS","createBalanceMonitor","config","account","bridge","bridgeableToken","gateway","meter","provider","wallet","intervalMs","timer","ethWalletGasBalance","createGauge","description","unit","liquidityTokenBalance","liquidityTokenAllowance","xl1AccountBalance","walletAddress","address","poll","balance","getBalance","record","Number","err","console","error","liquiditySourceAddress","liquiditySource","balanceOf","bridgeAddress","getAddress","allowance","viewer","connection","accountBalance","toString","start","setInterval","stop","clearInterval","undefined","DEFAULT_INTERVAL_MS","createQueueMetrics","config","meter","queues","intervalMs","timer","waitingGauge","createGauge","description","activeGauge","completedGauge","failedGauge","delayedGauge","poll","name","queue","Object","entries","counts","getJobCounts","attrs","queue_name","record","waiting","active","completed","failed","delayed","err","console","error","start","setInterval","stop","clearInterval","undefined","isDefined","Redis","connection","maxRetriesPerRequest","getConnection","config","isDefined","redisHost","host","redisPort","port","Redis","isDefined","FlowProducer","prefix","flowProducer","getFlowProducer","connection","telemetry","isDefined","FlowProducer","prefix","assertEx","PayloadBuilder","Worker","name","queueName","createWorker","connection","telemetry","services","provider","assertEx","stateMap","ethTxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","submissionHash","receipt","getTransactionReceipt","log","blockNumber","blockHash","confirmationHash","set","prefix","on","err","console","error","id","message","EthTransactionMonitor","assertEx","hexToBigInt","PayloadBuilder","isBridgeIntent","Worker","getAddress","hexToBigInt","isUndefined","PayloadBuilder","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","resolveWalletForActor","accountServiceSingleton","getBridgeWalletAccount","config","accountPath","undefined","account","resolveWalletForActor","name","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","hexToBigInt","toHex","calculateBridgeFees","srcAmount","feeStructure","feeFixed","feeRateBasisPoints","srcAmountBigInt","hexToBigInt","feeVariableBigInt","BigInt","feeVariable","toHex","hexToBigInt","toHex","calculateMaxBridgeAmount","balance","feeStructure","feeFixed","feeRateBasisPoints","balanceBigInt","hexToBigInt","feeFixedBigInt","toHex","maxAmount","BigInt","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","validateBridgeEstimateExact","intent","transfer","config","srcAddress","srcAmount","destAddress","hexToBigInt","getMinBridgeAmount","getMaxBridgeAmount","calculatedIntent","calculatedTransfer","generateBridgeEstimate","isUndefined","nonce","expectedIntentNonce","expectedIntentStatic","actualIntentNonce","actualIntentStatic","PayloadBuilder","dataHash","epoch","expectedTransferEpoch","expectedTransferStatic","actualTransferEpoch","actualTransferStatic","asAddress","addressesContains","BoundWitnessValidator","payloadHashesContainsAll","payloadSchemasContainsAll","PayloadBuilder","BridgeIntentSchema","TransferSchema","validateBridgeTransaction","signedTxBw","intent","transfer","config","srcAddress","chainId","getXl1ChainId","chain","payload_hashes","length","payloadSchemasContainsAll","BridgeIntentSchema","TransferSchema","hashes","PayloadBuilder","payloadHashesContainsAll","errors","BoundWitnessValidator","validate","sender","asAddress","addressesContains","assertEx","hexToBigInt","isBridgeIntent","validateSufficientLiquiditySourceAllowance","tx","offChainPayloads","bridgeableToken","bridge","logger","allPayloads","bridgeIntent","assertEx","find","isBridgeIntent","amount","hexToBigInt","destAmount","liquiditySourceAddress","liquiditySource","bridgeAddress","getAddress","remainingAllowance","allowance","log","toString","assertEx","hexToBigInt","isBridgeIntent","validateSufficientLiquiditySourceBalance","tx","offChainPayloads","bridgeableToken","bridge","logger","allPayloads","bridgeIntent","assertEx","find","isBridgeIntent","amount","hexToBigInt","destAmount","liquiditySourceAddress","liquiditySource","balance","balanceOf","log","toString","assertEx","DEFAULT_GAS_BUFFER_BPS","validateSufficientRunnerEthBalanceForGas","preparedTx","wallet","logger","bufferBps","provider","assertEx","feeData","getFeeData","perGas","maxFeePerGas","gasPrice","log","transactionRequest","from","getAddress","estGas","estimateGas","txValue","value","baseRequired","required","balance","getBalance","toString","asAddress","assertEx","hexToBigInt","validateSufficientXL1SourceAddressBalance","bridgeIntent","gateway","config","logger","viewer","assertEx","connection","srcAddress","srcAmount","destAddress","srcAddressBranded","asAddress","_","calculatedTransfer","generateBridgeEstimate","totalAmount","Object","values","transfers","reduce","acc","transfer","hexToBigInt","accountBalance","account","balance","log","toString","name","queueName","createWorker","connection","telemetry","services","bridge","assertEx","bridgeableToken","stateMap","ethTxStateMap","wallet","worker","Worker","job","tx","offChainPayloads","data","hash","PayloadBuilder","log","validateSufficientLiquiditySourceAllowance","Error","validateSufficientLiquiditySourceBalance","allPayloads","bridgeIntent","find","isBridgeIntent","amount","hexToBigInt","destAmount","srcAddress","getAddress","destAddress","nonce","preparedTx","getFunction","populateTransaction","validateSufficientRunnerEthBalanceForGas","set","prefix","on","err","console","error","id","message","EthTransactionPreparation","assertEx","isDefined","PayloadBuilder","Worker","assertEx","hexToBigInt","toEthAddress","PayloadBuilder","isBridgeIntent","submitEthTransaction","tx","offChainPayloads","bridge","wallet","xl1Transaction","assertEx","allPayloads","bridgeIntent","find","isBridgeIntent","srcAddress","toEthAddress","destAddress","amount","hexToBigInt","destAmount","nonce","PayloadBuilder","hash","bridgeTx","connect","bridgeFromRemote","receipt","wait","submitXl1Transaction","preparedTx","offChain","gateway","result","addTransactionToChain","name","queueName","createWorker","connection","telemetry","services","bridge","assertEx","wallet","stateMap","ethTxStateMap","worker","Worker","job","tx","offChainPayloads","data","hash","PayloadBuilder","state","get","submissionHash","existingSubmissionHash","isDefined","log","submitEthTransaction","concurrency","prefix","on","err","console","error","id","message","EthTransactionSubmission","assertEx","isDefined","PayloadBuilder","Worker","name","queueName","createWorker","connection","telemetry","services","stateMap","assertEx","ethTxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","submissionHash","existingSubmissionHash","isDefined","log","childrenValues","getChildrenValues","jobKey","prefix","EthTransactionSubmission","childValues","resolvedSubmissionHash","set","on","err","console","error","id","message","EthTransactionSubmissionStorage","Worker","name","queueName","createWorker","connection","telemetry","worker","Worker","job","log","prefix","on","err","console","error","id","message","Xl1ToEthBridgeParent","assertEx","isDefined","isNull","PayloadBuilder","UnrecoverableError","Worker","name","queueName","createWorker","connection","telemetry","services","gateway","assertEx","stateMap","xl1TxStateMap","viewer","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","submissionHash","log","foundTx","transaction","byHash","isDefined","isNull","currentBlockNumber","exp","UnrecoverableError","Error","prefix","on","err","console","error","id","message","Xl1TransactionMonitor","assertEx","PayloadBuilder","Worker","name","queueName","createWorker","connection","telemetry","services","stateMap","assertEx","xl1TxStateMap","worker","Worker","job","tx","offChainPayloads","data","hash","PayloadBuilder","log","preparedTx","set","prefix","on","err","console","error","id","message","Xl1TransactionPreparation","assertEx","isDefined","PayloadBuilder","Worker","name","queueName","createWorker","connection","telemetry","services","gateway","assertEx","stateMap","xl1TxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","preparedTx","offChainPayloads","submissionHash","existingSubmissionHash","isDefined","log","txToSubmit","submitXl1Transaction","prefix","on","err","console","error","id","message","Xl1TransactionSubmission","assertEx","isDefined","PayloadBuilder","Worker","name","queueName","createWorker","connection","telemetry","services","stateMap","assertEx","xl1TxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","submissionHash","existingSubmissionHash","isDefined","log","childrenValues","getChildrenValues","jobKey","prefix","Xl1TransactionSubmission","childValues","resolvedSubmissionHash","set","on","err","console","error","id","message","Xl1TransactionSubmissionStorage","createWorkers","connection","telemetry","services","EthTransactionMonitor","createWorker","EthTransactionPreparation","EthTransactionSubmission","EthTransactionSubmissionStorage","Xl1ToEthBridgeParent","Xl1TransactionMonitor","Xl1TransactionPreparation","Xl1TransactionSubmission","Xl1TransactionSubmissionStorage","PayloadBuilder","getJobIdForXl1ToEthBridgeJob","tx","jobId","PayloadBuilder","hash","createXl1ToEthBridgeJob","flowProducer","tx","offChainPayloads","jobId","getJobIdForXl1ToEthBridgeJob","flow","add","name","Xl1ToEthBridgeParent","queueName","data","opts","children","EthTransactionMonitor","attempts","backoff","type","delay","EthTransactionSubmissionStorage","EthTransactionSubmission","EthTransactionPreparation","Xl1TransactionMonitor","Xl1TransactionSubmissionStorage","Xl1TransactionSubmission","Xl1TransactionPreparation","getXl1ToEthBridgeJob","flowProducer","tx","id","getJobIdForXl1ToEthBridgeJob","flow","getFlow","queueName","Xl1ToEthBridgeParent","getStatusQueueJobs","queues","jobId","ethTransactionMonitorJob","ethTransactionPreparationJob","ethTransactionSubmissionJob","xl1ToEthBridgeParentJob","xl1TransactionMonitorJob","xl1TransactionPreparationJob","xl1TransactionSubmissionJob","xl1TransactionSubmissionStorageJob","Promise","all","ethTransactionMonitor","getJob","ethTransactionPreparation","ethTransactionSubmission","xl1ToEthBridgeParent","xl1TransactionMonitor","xl1TransactionPreparation","xl1TransactionSubmission","xl1TransactionSubmissionStorage","Queue","xl1ToEthQueues","getXl1ToEthQueues","config","connection","getConnection","ethTransactionMonitor","Queue","EthTransactionMonitor","queueName","prefix","ethTransactionPreparation","EthTransactionPreparation","ethTransactionSubmission","EthTransactionSubmission","xl1ToEthBridgeParent","Xl1ToEthBridgeParent","xl1TransactionMonitor","Xl1TransactionMonitor","xl1TransactionPreparation","Xl1TransactionPreparation","xl1TransactionSubmission","Xl1TransactionSubmission","xl1TransactionSubmissionStorage","Xl1TransactionSubmissionStorage","isDefined","BullMQOtel","telemetry","options","enableMetrics","getTelemetry","isDefined","BullMQOtel","standardErrors","sharedMiddleware","express","addFlowProducer","app","config","connection","getConnection","telemetry","getTelemetry","flowProducer","getFlowProducer","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","setRawResponseFormat","ReasonPhrases","message","ReasonPhrases","OK","handler","_req","res","setRawResponseFormat","status","send","getLivez","setRawResponseFormat","ReasonPhrases","message","ReasonPhrases","OK","handler","_req","res","setRawResponseFormat","status","send","getReadyz","setRawResponseFormat","ReasonPhrases","message","ReasonPhrases","OK","handler","_req","res","setRawResponseFormat","status","send","getStartupz","addProbeRoutes","app","get","getLivez","getReadyz","getStartupz","requestHandlerValidator","BridgeSettingsZod","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","isDefined","PayloadBuilder","PayloadZodLooseOfSchema","PayloadZodStrictOfSchema","BridgeIntentFieldsZod","BridgeIntentSchema","BridgeSourceObservationFieldsZod","BridgeSourceObservationSchema","SignedTransactionBoundWitnessZod","TransferZod","z","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","gateway","services","transactionValid","validateBridgeTransaction","status","send","estimateValid","validateBridgeEstimateExact","sufficientBalance","validateSufficientXL1SourceAddressBalance","singedHydratedTransaction","existingFlow","getXl1ToEthBridgeJob","isDefined","createXl1ToEthBridgeJob","srcConfirmation","PayloadBuilder","hash","bridgeCommonFieldsZod","bridgeCommonFields","parse","bridgeObservationFields","bridgeObservation","schema","fields","build","json","requestHandlerValidator","assertEx","hexToBigInt","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","maxBridgeAmount","minBridgeAmount","getBridgeSettings","hexToBigInt","status","send","bridgeIntent","transfer","generateBridgeEstimate","sender","toAddress","viewer","assertEx","connection","Error","currentBlockNumber","nbf","toXL1BlockNumber","exp","txBw","buildUnsignedTransaction","json","requestHandlerValidator","assertEx","hexToBigInt","toAddress","toHex","PayloadZodStrictOfSchema","BridgeIntentFieldsZod","BridgeIntentSchema","buildUnsignedTransaction","toXL1BlockNumber","TransactionBoundWitnessZod","TransferZod","z","BridgeToRemoteMaxEstimateBodyZod","BridgeIntentFieldsZod","pick","destAddress","srcAddress","srcAmount","BridgeToRemoteMaxEstimateResponseZod","z","tuple","TransactionBoundWitnessZod","PayloadZodStrictOfSchema","BridgeIntentSchema","extend","shape","TransferZod","makeBridgeToRemoteMaxEstimateRoute","config","gateway","params","object","chainId","getRemoteChainIdZod","validateRequest","requestHandlerValidator","body","response","method","path","handlers","req","res","feeFixed","feeRateBasisPoints","maxBridgeAmount","configMax","xl1ChainId","getBridgeSettings","balance","balanceMax","calculateMaxBridgeAmount","toHex","hexToBigInt","bridgeIntent","transfer","generateBridgeEstimate","sender","toAddress","viewer","assertEx","connection","Error","currentBlockNumber","nbf","toXL1BlockNumber","exp","txBw","buildUnsignedTransaction","json","requestHandlerValidator","asHex","isDefined","PayloadBuilder","PayloadZodStrictOfSchema","asBridgeIntent","BridgeDestinationObservationFieldsZod","BridgeDestinationObservationSchema","BridgeIntentFieldsZod","BridgeIntentSchema","BridgeSourceObservationFieldsZod","BridgeSourceObservationSchema","isBridgeIntent","z","BridgeIntentResponseZod","PayloadZodStrictOfSchema","BridgeIntentSchema","extend","BridgeIntentFieldsZod","shape","BridgeSourceResponseZod","BridgeSourceObservationSchema","BridgeSourceObservationFieldsZod","BridgeDestinationResponseZod","BridgeDestinationObservationSchema","BridgeDestinationObservationFieldsZod","BridgeToRemoteStatusResponseZod","z","union","tuple","makeBridgeToRemoteStatusRoute","config","params","object","chainId","getRemoteChainIdZod","nonce","string","nonempty","validateRequest","requestHandlerValidator","response","method","path","handlers","req","res","jobId","result","queues","getXl1ToEthQueues","statusQueueJobs","getStatusQueueJobs","tx","offChainPayloads","xl1ToEthBridgeParentJob","data","sendStatus","allPayloads","bridgeIntent","find","isBridgeIntent","asBridgeIntent","PayloadBuilder","omitMeta","xl1TransactionMonitorJob","xl1MonitorState","getState","undefined","srcConfirmation","returnvalue","submissionHash","isDefined","schema","bridgeSourceObservationFields","parse","observation","ethTransactionMonitorJob","ethMonitorState","destConfirmation","asHex","bridgeDestinationObservationFields","json","getRouteDefinitions","config","gateway","makeBridgeConfigRoute","makeBridgeToRemoteEstimateRoute","makeBridgeToRemoteMaxEstimateRoute","makeBridgeToRemoteRoute","makeBridgeToRemoteStatusRoute","makeBridgeFromRemoteStatusRoute","addBridgeRoutes","app","config","gateway","routeDefinitions","getRouteDefinitions","definition","method","path","handlers","addRoutes","app","config","gateway","addProbeRoutes","addBridgeRoutes","getApp","config","gateway","addInstrumentation","app","express","sharedMiddleware","addFlowProducer","addRoutes","use","standardErrors","assertEx","initEvmProvider","resolveWalletForActor","BridgeableToken__factory","LiquidityPoolBridge__factory","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","accountPath","account","resolveWalletForActor","name","wallet","Wallet","bridgeableToken","BridgeableToken__factory","connect","getAddress","bridge","LiquidityPoolBridge__factory","bridgeOwner","owner","assertEx","toLowerCase","address","addWorkers","config","services","connection","getConnection","telemetry","getTelemetry","createWorkers","hostname","getServer","context","gateway","logger","config","port","app","getApp","services","getServices","addWorkers","server","listen","log","setTimeout","BridgeActor","ActorV3","_gatewayRunner","_balanceMonitor","_queueMetrics","server","gatewayRunner","createHandler","locator","getInstance","XyoGatewayRunnerMoniker","startHandler","stopServer","startServer","stopHandler","stop","undefined","context","asBridgeConfigContext","services","getServer","meter","createBalanceMonitor","account","bridge","bridgeableToken","gateway","provider","wallet","start","queues","getXl1ToEthQueues","config","createQueueMetrics","close"]}
|
|
1
|
+
{"version":3,"sources":["../../src/BridgeActor.ts","../../src/monitoring/createBalanceMonitor.ts","../../src/monitoring/createQueueMetrics.ts","../../src/queue/connection.ts","../../src/queue/flowProducer.ts","../../src/queue/prefix.ts","../../src/queue/workers/EthTransactionMonitor.ts","../../src/queue/workers/EthTransactionPreparation.ts","../../src/validation/validateBridgeEstimateExact.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/util/calculateBridgeFees.ts","../../src/util/calculateMaxBridgeAmount.ts","../../src/util/createBridgeTransfer.ts","../../src/util/generateBridgeEstimate.ts","../../src/validation/validateBridgeTransaction.ts","../../src/validation/validateSufficientLiquiditySourceAllowance.ts","../../src/validation/validateSufficientLiquiditySourceBalance.ts","../../src/validation/validateSufficientRunnerEthBalanceForGas.ts","../../src/validation/validateSufficientXL1SourceAddressBalance.ts","../../src/queue/workers/EthTransactionSubmission.ts","../../src/queue/workers/util/submitEthTransaction.ts","../../src/queue/workers/util/submitXl1Transaction.ts","../../src/queue/workers/EthTransactionSubmissionStorage.ts","../../src/queue/workers/Xl1ToEthBridgeParent.ts","../../src/queue/workers/Xl1TransactionMonitor.ts","../../src/queue/workers/Xl1TransactionPreparation.ts","../../src/queue/workers/Xl1TransactionSubmission.ts","../../src/queue/workers/Xl1TransactionSubmissionStorage.ts","../../src/queue/workers/createWorkers.ts","../../src/queue/flows/createXl1ToEthBridgeJob/getJobIdForXl1ToEthBridgeJob.ts","../../src/queue/flows/createXl1ToEthBridgeJob/createXl1ToEthBridgeJob.ts","../../src/queue/flows/createXl1ToEthBridgeJob/getXl1ToEthBridgeJob.ts","../../src/queue/getXl1ToEthQueueJobs.ts","../../src/queue/getXl1ToEthQueues.ts","../../src/queue/telemetry.ts","../../src/server/app.ts","../../src/server/addFlowProducer.ts","../../src/server/instrumentation.ts","../../src/server/routes/livez/get.ts","../../src/server/routes/readyz/get.ts","../../src/server/routes/startupz/get.ts","../../src/server/routes/addProbeRoutes.ts","../../src/server/routes/bridge/routeDefinitions/routes/bridgeConfig.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/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.ts","../../src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteMaxEstimate.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 type { Server } from 'node:http'\n\nimport { creatable } from '@xylabs/sdk-js'\nimport type { ActorCapabilityNeeds, ActorParamsV3, BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { ActorV3, asBridgeConfigContext } from '@xyo-network/chain-orchestration'\nimport type { XyoGatewayRunner } from '@xyo-network/xl1-sdk'\nimport { XyoGatewayRunnerMoniker, XyoViewerMoniker } from '@xyo-network/xl1-sdk'\n\nimport type { BalanceMonitorHandle, QueueMetricsHandle } from './monitoring/index.ts'\nimport { createBalanceMonitor, createQueueMetrics } from './monitoring/index.ts'\nimport { getXl1ToEthQueues } from './queue/index.ts'\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 static readonly needs: ActorCapabilityNeeds = {\n required: [\n XyoGatewayRunnerMoniker,\n XyoViewerMoniker,\n ],\n }\n\n protected _gatewayRunner!: XyoGatewayRunner\n private _balanceMonitor?: BalanceMonitorHandle\n private _queueMetrics?: QueueMetricsHandle\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._balanceMonitor?.stop()\n this._queueMetrics?.stop()\n this._balanceMonitor = undefined\n this._queueMetrics = undefined\n this.stopServer()\n }\n\n private async startServer() {\n const context = asBridgeConfigContext(this.context, true)\n const { server, services } = await getServer(context, this._gatewayRunner)\n this.server = server\n\n if (this.meter) {\n this._balanceMonitor = createBalanceMonitor({\n account: services.account,\n bridge: services.bridge,\n bridgeableToken: services.bridgeableToken,\n gateway: services.gateway,\n meter: this.meter,\n provider: services.provider,\n wallet: services.wallet,\n })\n this._balanceMonitor.start()\n\n const queues = getXl1ToEthQueues(context.config as BridgeConfig)\n this._queueMetrics = createQueueMetrics({\n meter: this.meter,\n queues,\n })\n this._queueMetrics.start()\n }\n }\n\n private stopServer() {\n this.server?.close()\n this.server = undefined\n }\n}\n","import type { Gauge, Meter } from '@opentelemetry/api'\nimport type { AccountInstance } from '@xyo-network/sdk-js'\nimport type { BridgeableToken, LiquidityPoolBridge } from '@xyo-network/typechain'\nimport type { XyoGatewayRunner } from '@xyo-network/xl1-sdk'\nimport type { Provider, Wallet } from 'ethers'\n\nexport interface BalanceMonitorConfig {\n account: AccountInstance\n bridge: LiquidityPoolBridge\n bridgeableToken: BridgeableToken\n gateway: XyoGatewayRunner\n intervalMs?: number\n meter: Meter\n provider: Provider\n wallet: Wallet\n}\n\nexport interface BalanceMonitorHandle {\n start: () => void\n stop: () => void\n}\n\nconst DEFAULT_INTERVAL_MS = 60_000\n\nconst WEI_PER_GWEI = 10n ** 9n\nconst TOKEN_DECIMALS = 10n ** 18n\n\nexport function createBalanceMonitor(config: BalanceMonitorConfig): BalanceMonitorHandle {\n const {\n account, bridge, bridgeableToken, gateway, meter, provider, wallet,\n intervalMs = DEFAULT_INTERVAL_MS,\n } = config\n\n let timer: ReturnType<typeof setInterval> | undefined\n\n const ethWalletGasBalance: Gauge = meter.createGauge(\n 'bridge_eth_wallet_gas_balance_gwei',\n { description: 'ETH balance of the bridge runner wallet (in gwei)', unit: 'gwei' },\n )\n\n const liquidityTokenBalance: Gauge = meter.createGauge(\n 'bridge_eth_liquidity_token_balance',\n { description: 'ERC-20 token balance of the liquidity source (in whole tokens)', unit: 'tokens' },\n )\n\n const liquidityTokenAllowance: Gauge = meter.createGauge(\n 'bridge_eth_liquidity_token_allowance',\n { description: 'ERC-20 token allowance from liquidity source to bridge contract (in whole tokens)', unit: 'tokens' },\n )\n\n const xl1AccountBalance: Gauge = meter.createGauge(\n 'bridge_xl1_account_balance',\n { description: 'XL1 native balance of the bridge account (in whole XL1)', unit: 'xl1' },\n )\n\n const walletAddress = wallet.address\n\n async function poll(): Promise<void> {\n // ETH wallet gas balance\n try {\n const balance = await provider.getBalance(walletAddress)\n ethWalletGasBalance.record(Number(balance / WEI_PER_GWEI), { address: walletAddress })\n } catch (err) {\n console.error('[BalanceMonitor] Failed to read ETH wallet gas balance:', err)\n }\n\n // Liquidity source token balance\n try {\n const liquiditySourceAddress = await bridge.liquiditySource()\n const balance = await bridgeableToken.balanceOf(liquiditySourceAddress)\n liquidityTokenBalance.record(Number(balance / TOKEN_DECIMALS), { address: liquiditySourceAddress })\n } catch (err) {\n console.error('[BalanceMonitor] Failed to read liquidity source token balance:', err)\n }\n\n // Liquidity source token allowance\n try {\n const liquiditySourceAddress = await bridge.liquiditySource()\n const bridgeAddress = await bridge.getAddress()\n const allowance = await bridgeableToken.allowance(liquiditySourceAddress, bridgeAddress)\n liquidityTokenAllowance.record(Number(allowance / TOKEN_DECIMALS), { address: liquiditySourceAddress })\n } catch (err) {\n console.error('[BalanceMonitor] Failed to read liquidity source token allowance:', err)\n }\n\n // XL1 account balance\n try {\n const viewer = gateway.connection.viewer\n if (viewer) {\n const balance = await viewer.account.balance.accountBalance(account.address)\n xl1AccountBalance.record(Number(balance / TOKEN_DECIMALS), { address: account.address.toString() })\n }\n } catch (err) {\n console.error('[BalanceMonitor] Failed to read XL1 account balance:', err)\n }\n }\n\n return {\n start() {\n void poll()\n timer = setInterval(() => void poll(), intervalMs)\n },\n stop() {\n if (timer) {\n clearInterval(timer)\n timer = undefined\n }\n },\n }\n}\n","import type { Gauge, Meter } from '@opentelemetry/api'\n\nimport type { Xl1ToEthQueues } from '../queue/index.ts'\n\nexport interface QueueMetricsConfig {\n intervalMs?: number\n meter: Meter\n queues: Xl1ToEthQueues\n}\n\nexport interface QueueMetricsHandle {\n start: () => void\n stop: () => void\n}\n\nconst DEFAULT_INTERVAL_MS = 30_000\n\nexport function createQueueMetrics(config: QueueMetricsConfig): QueueMetricsHandle {\n const {\n meter, queues,\n intervalMs = DEFAULT_INTERVAL_MS,\n } = config\n\n let timer: ReturnType<typeof setInterval> | undefined\n\n const waitingGauge: Gauge = meter.createGauge(\n 'bridge_queue_waiting',\n { description: 'Number of waiting jobs in the bridge queue' },\n )\n\n const activeGauge: Gauge = meter.createGauge(\n 'bridge_queue_active',\n { description: 'Number of active jobs in the bridge queue' },\n )\n\n const completedGauge: Gauge = meter.createGauge(\n 'bridge_queue_completed',\n { description: 'Number of completed jobs in the bridge queue' },\n )\n\n const failedGauge: Gauge = meter.createGauge(\n 'bridge_queue_failed',\n { description: 'Number of failed jobs in the bridge queue' },\n )\n\n const delayedGauge: Gauge = meter.createGauge(\n 'bridge_queue_delayed',\n { description: 'Number of delayed jobs in the bridge queue' },\n )\n\n async function poll(): Promise<void> {\n for (const [name, queue] of Object.entries(queues)) {\n try {\n const counts = await queue.getJobCounts('waiting', 'active', 'completed', 'failed', 'delayed')\n const attrs = { queue_name: name }\n waitingGauge.record(counts.waiting ?? 0, attrs)\n activeGauge.record(counts.active ?? 0, attrs)\n completedGauge.record(counts.completed ?? 0, attrs)\n failedGauge.record(counts.failed ?? 0, attrs)\n delayedGauge.record(counts.delayed ?? 0, attrs)\n } catch (err) {\n console.error(`[QueueMetrics] Failed to read job counts for queue ${name}:`, err)\n }\n }\n }\n\n return {\n start() {\n void poll()\n timer = setInterval(() => void poll(), intervalMs)\n },\n stop() {\n if (timer) {\n clearInterval(timer)\n timer = undefined\n }\n },\n }\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 { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport { prefix } from './prefix.ts'\n\nlet flowProducer: FlowProducer | undefined\n\nexport const getFlowProducer = (connection: Redis, telemetry?: BullMQOtel) => {\n if (isDefined(flowProducer)) return flowProducer\n flowProducer = new FlowProducer({\n connection, telemetry, prefix,\n })\n return flowProducer\n}\n","export const prefix = 'xl1-bridge'\n","import { assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport { prefix } from '../prefix.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1TransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type EthTransactionMonitorJobData = Xl1TransactionJobData\nexport interface EthTransactionMonitorJobReturn {\n blockHash: string\n blockNumber: number\n submissionHash: string\n}\nexport type EthTransactionMonitorJob = Job<EthTransactionMonitorJobData, EthTransactionMonitorJobReturn>\n\nconst name = 'Monitor Submitted ETH Transaction'\nconst queueName = 'eth-tx-monitor'\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel, 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: EthTransactionMonitorJob) => {\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 {\n blockHash, blockNumber, submissionHash,\n }\n },\n {\n connection, telemetry, prefix,\n },\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 } from '@xyo-network/xl1-sdk'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport { getAddress } from 'ethers'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport {\n validateSufficientLiquiditySourceAllowance, validateSufficientLiquiditySourceBalance, validateSufficientRunnerEthBalanceForGas,\n} from '../../validation/index.ts'\nimport { prefix } from '../prefix.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1DataLakeTransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type EthTransactionPreparationJobData = Xl1DataLakeTransactionJobData\nexport type EthTransactionPreparationJobReturn = Record<string, never>\nexport type EthTransactionPreparationJob = Job<EthTransactionPreparationJobData, EthTransactionPreparationJobReturn>\n\nconst name = 'Prepare ETH Transaction'\nconst queueName = 'eth-tx-prepare'\n\nexport const createWorker = (connection: Redis, telemetry?: BullMQOtel, 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 const wallet = assertEx(services?.wallet, () => 'wallet service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: EthTransactionPreparationJob) => {\n const { tx, offChainPayloads } = 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 validateSufficientLiquiditySourceAllowance(tx, offChainPayloads, 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 validateSufficientLiquiditySourceBalance(tx, offChainPayloads, 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 allPayloads = [...tx[1], ...offChainPayloads]\n const bridgeIntent = assertEx(allPayloads.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}] validating tx runner has sufficient ETH for gas`)\n if (!await validateSufficientRunnerEthBalanceForGas(preparedTx, wallet, job)) {\n throw new Error('Transaction runner does not have sufficient ETH to cover estimated gas (with buffer)')\n }\n await job.log(`[${hash}] validated tx runner has sufficient ETH for gas`)\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 {\n connection, telemetry, prefix,\n },\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 { hexToBigInt, 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 { getMaxBridgeAmount, getMinBridgeAmount } from '../config/index.ts'\nimport { generateBridgeEstimate } from '../util/index.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\n // Reject if the requested amount is outside the configured bounds\n if (hexToBigInt(srcAmount) < hexToBigInt(getMinBridgeAmount(config))) return false\n if (hexToBigInt(srcAmount) > hexToBigInt(getMaxBridgeAmount(config))) return false\n\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 { 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 } from '@xylabs/sdk-js'\nimport { resolveWalletForActor } from '@xyo-network/chain-orchestration'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { ActorConfig } 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 const accountPath = typeof config.accountPath === 'string' ? config.accountPath : undefined\n const account = await resolveWalletForActor(config.name, accountPath)\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 { 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 { Hex } from '@xylabs/sdk-js'\nimport { hexToBigInt, toHex } from '@xylabs/sdk-js'\n\nimport type { FeeStructure } from './calculateBridgeFees.ts'\n\n/**\n * Given a user's total available balance, calculates the maximum amount they can bridge\n * after accounting for the fixed and variable bridge fees.\n *\n * Solving for M where: M + feeFixed + (M * basisPoints / 10_000) = balance\n * => M = (balance - feeFixed) * 10_000 / (10_000 + basisPoints)\n */\nexport const calculateMaxBridgeAmount = (balance: Hex, feeStructure: FeeStructure): Hex => {\n const { feeFixed, feeRateBasisPoints } = feeStructure\n const balanceBigInt = hexToBigInt(balance)\n const feeFixedBigInt = hexToBigInt(feeFixed)\n\n if (balanceBigInt <= feeFixedBigInt) return toHex(0n)\n\n const maxAmount = ((balanceBigInt - feeFixedBigInt) * 10_000n) / (10_000n + BigInt(feeRateBasisPoints))\n return toHex(maxAmount)\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 { asAddress } from '@xylabs/sdk-js'\nimport {\n addressesContains, BoundWitnessValidator, payloadHashesContainsAll, payloadSchemasContainsAll,\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, TransactionBoundWitness, Transfer,\n} from '@xyo-network/xl1-sdk'\nimport { BridgeIntentSchema, TransferSchema } 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 // Ensure the transaction is for the correct source chain\n const chainId = getXl1ChainId(config)\n if (signedTxBw.chain !== chainId) return false\n\n // Ensure only the expected number of payloads exist (do not allow ambiguous extras)\n if (signedTxBw.payload_hashes.length != 2) return false\n // Ensure the payloads match the expected schemas\n if (!payloadSchemasContainsAll(signedTxBw, [BridgeIntentSchema, TransferSchema])) return false\n // Ensure the hashes match the intent and transfer\n const hashes = await PayloadBuilder.hashes([intent, transfer])\n if (!payloadHashesContainsAll(signedTxBw, hashes)) return false\n // Ensure the BoundWitness is valid and signed by the sender\n const errors = await new BoundWitnessValidator(signedTxBw).validate()\n if (errors.length > 0) return false\n\n // Ensure the sender's address is included in the addresses\n const sender = asAddress(srcAddress, true)\n if (!addressesContains(signedTxBw, sender)) return false\n\n return true\n}\n","import { assertEx, hexToBigInt } from '@xylabs/sdk-js'\nimport type { Payload } from '@xyo-network/sdk-js'\nimport type { BridgeableToken, LiquidityPoolBridge } from '@xyo-network/typechain'\nimport { isBridgeIntent, type SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\n\nimport type { AsyncLogger } from './AsyncLogger.ts'\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 offChainPayloads The payloads to put off chain\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 validateSufficientLiquiditySourceAllowance = async (\n tx: SignedHydratedTransaction,\n offChainPayloads: Payload[],\n bridgeableToken: BridgeableToken,\n bridge: LiquidityPoolBridge,\n logger?: AsyncLogger,\n) => {\n // Get the amount being bridged from the bridge intent\n const allPayloads = [...tx[1], ...offChainPayloads]\n const bridgeIntent = assertEx(allPayloads.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 { assertEx, hexToBigInt } from '@xylabs/sdk-js'\nimport type { Payload } from '@xyo-network/sdk-js'\nimport type { BridgeableToken, LiquidityPoolBridge } from '@xyo-network/typechain'\nimport { isBridgeIntent, type SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\n\nimport type { AsyncLogger } from './AsyncLogger.ts'\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 offChainPayloads The payloads to put off chain\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 validateSufficientLiquiditySourceBalance = async (\n tx: SignedHydratedTransaction,\n offChainPayloads: Payload[],\n bridgeableToken: BridgeableToken,\n bridge: LiquidityPoolBridge,\n logger?: AsyncLogger,\n) => {\n // Get the amount being bridged from the bridge intent\n const allPayloads = [...tx[1], ...offChainPayloads]\n const bridgeIntent = assertEx(allPayloads.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 } from '@xylabs/sdk-js'\nimport type { ContractTransaction, Wallet } from 'ethers'\n\nimport type { AsyncLogger } from './AsyncLogger.ts'\n\nconst DEFAULT_GAS_BUFFER_BPS = 2000n // 20%\n\n/**\n * Validates that the wallet (the account that will submit the tx) has enough ETH\n * to cover the estimated gas cost (plus a buffer) for the transaction.\n * @param preparedTx The transaction that is being prepared for submission.\n * This should be a fully populated transaction (to/from/data/value) except for gas fields.\n * @param wallet The wallet that will be used to submit the transaction.\n * @param logger Optional logger for asynchronous logging.\n * @param bufferBps The buffer to apply to the estimated gas cost, in basis points (1/100th of a percent).\n * @returns A boolean indicating whether the wallet has sufficient ETH to cover the estimated gas cost with the buffer applied.\n */\nexport const validateSufficientRunnerEthBalanceForGas = async (\n preparedTx: ContractTransaction,\n wallet: Wallet,\n logger?: AsyncLogger,\n bufferBps: bigint = DEFAULT_GAS_BUFFER_BPS,\n) => {\n const provider = assertEx(wallet.provider, () => 'Wallet provider is not defined')\n\n // Fee data (EIP-1559 preferred, gasPrice fallback)\n const feeData = await provider.getFeeData()\n const perGas = feeData.maxFeePerGas ?? feeData.gasPrice\n if (perGas == null) {\n await logger?.log('[gas] unable to resolve gas price / maxFeePerGas from provider')\n return true // don’t hard-fail; provider may not support fee data\n }\n\n // Estimate gas\n const transactionRequest = {\n ...preparedTx,\n from: await wallet.getAddress(),\n }\n const estGas = await provider.estimateGas(transactionRequest)\n\n // Include any value sent with the tx\n const txValue = preparedTx?.value ?? 0n\n\n // Required = (gas * perGas + value) * (1 + buffer)\n const baseRequired = estGas * perGas + txValue\n const required = (baseRequired * (10_000n + bufferBps)) / 10_000n\n\n const balance = await provider.getBalance(await wallet.getAddress())\n\n await logger?.log(\n `[gas] runner=${await wallet.getAddress()} balance=${balance.toString()} `\n + `estGas=${estGas.toString()} perGas=${perGas.toString()} value=${txValue.toString()} `\n + `requiredWithBuffer=${required.toString()} bufferBps=${bufferBps.toString()}`,\n )\n\n return balance >= required\n}\n","import {\n asAddress, assertEx, hexToBigInt,\n} from '@xylabs/sdk-js'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport type { BridgeIntent, XyoGatewayRunner } from '@xyo-network/xl1-sdk'\n\nimport { generateBridgeEstimate } from '../util/index.ts'\nimport type { AsyncLogger } from './AsyncLogger.ts'\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 bridgeIntent The bridge intent containing the details of the bridge transaction, including the source address and amount being bridged\n * @param gateway The XyoGatewayRunner to check the balance of the source address on XL1\n * @param config The bridge configuration, used to generate a bridge estimate for the transaction\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 validateSufficientXL1SourceAddressBalance = async (\n bridgeIntent: BridgeIntent,\n gateway: XyoGatewayRunner,\n config: BridgeConfig,\n logger?: AsyncLogger,\n) => {\n // Get the amount being bridged from the bridge intent\n const viewer = assertEx(gateway.connection.viewer, () => 'Gateway connection does not have a viewer')\n const {\n srcAddress, srcAmount, destAddress,\n } = bridgeIntent\n const srcAddressBranded = asAddress(srcAddress, () => `Invalid source address in bridge intent: ${srcAddress}`)\n const [_, calculatedTransfer] = await generateBridgeEstimate(srcAddress, srcAmount, destAddress, config)\n const totalAmount = Object.values(calculatedTransfer.transfers).reduce((acc, transfer) => acc + hexToBigInt(transfer), 0n)\n\n // Check the srcAddress balance on XL1 for the bridge\n const accountBalance = await viewer.account.balance.accountBalance(srcAddressBranded)\n await logger?.log(`Account balance for ${srcAddressBranded}: ${accountBalance.toString()}`)\n return accountBalance >= totalAmount\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { EthTxState, IBridgeServiceCollection } from '../../services/index.ts'\nimport { prefix } from '../prefix.ts'\nimport { submitEthTransaction } from './util/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1DataLakeTransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type EthTransactionSubmissionJobData = Xl1DataLakeTransactionJobData\nexport interface EthTransactionSubmissionJobReturn {\n submissionHash: Required<EthTxState>['submissionHash']\n}\nexport type EthTransactionSubmissionJob = Job<EthTransactionSubmissionJobData, EthTransactionSubmissionJobReturn>\n\nconst name = 'Submit ETH Transaction'\nconst queueName = 'eth-tx-submit'\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel, services?: IBridgeServiceCollection) => {\n const bridge = assertEx(services?.bridge, () => 'bridge 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: EthTransactionSubmissionJob) => {\n const { tx, offChainPayloads } = job.data\n const hash = await PayloadBuilder.hash(tx[0])\n const state = assertEx(await stateMap.get(hash), () => `[${hash}] state 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 submissionHash = assertEx(await submitEthTransaction(tx, offChainPayloads, bridge, wallet), () => `[${hash}] submissionHash not found in receipt`)\n await job.log(`[${hash}] Submitted ETH tx and received submission response hash ${submissionHash}`)\n return { submissionHash }\n },\n {\n connection, telemetry, concurrency: 1, prefix,\n },\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 type { Payload } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { LiquidityPoolBridge } from '@xyo-network/typechain'\nimport { isBridgeIntent, type SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { Wallet } from 'ethers'\n\nexport const submitEthTransaction = async (\n tx: SignedHydratedTransaction,\n offChainPayloads: Payload[],\n bridge: LiquidityPoolBridge,\n wallet: Wallet,\n) => {\n // Approve the bridge to spend tokens\n const xl1Transaction = assertEx(tx[0], () => 'No corresponding XL1 transaction found')\n const allPayloads = [...tx[1], ...offChainPayloads]\n const bridgeIntent = assertEx(allPayloads.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 type { Payload } from '@xyo-network/sdk-js'\nimport { type SignedHydratedTransaction, type XyoGatewayRunner } from '@xyo-network/xl1-sdk'\n\nexport const submitXl1Transaction = async (\n preparedTx: SignedHydratedTransaction,\n offChain: Payload[] = [],\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 result = await gateway.addTransactionToChain(preparedTx, offChain)\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 { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { EthTxState, IBridgeServiceCollection } from '../../services/index.ts'\nimport { prefix } from '../prefix.ts'\nimport type { EthTransactionSubmissionJobReturn } from './EthTransactionSubmission.ts'\nimport { EthTransactionSubmission } from './EthTransactionSubmission.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1TransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type EthTransactionSubmissionStorageJobData = Xl1TransactionJobData\nexport interface EthTransactionSubmissionStorageJobReturn {\n submissionHash: Required<EthTxState>['submissionHash']\n}\nexport type EthTransactionSubmissionStorageJob = Job<EthTransactionSubmissionStorageJobData, EthTransactionSubmissionStorageJobReturn>\n\nconst name = 'Store ETH Transaction Submission'\nconst queueName = 'eth-tx-store-submission'\n\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel, services?: IBridgeServiceCollection) => {\n const stateMap = assertEx(services?.ethTxStateMap, () => 'ethTxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: EthTransactionSubmissionStorageJob) => {\n const { tx } = job.data\n // Get the hash of the transaction\n const hash = await PayloadBuilder.hash(tx[0])\n\n // Get the state of the transaction\n const state = assertEx(await stateMap.get(hash), () => `[${hash}] state not found`)\n\n // Idempotency check against re-store\n const { submissionHash: existingSubmissionHash } = state\n if (isDefined(existingSubmissionHash)) {\n await job.log(`[${hash}] submissionHash already stored as ${existingSubmissionHash}`)\n return { submissionHash: existingSubmissionHash }\n }\n\n // In a Flow, this job should be the PARENT and the submit job should be a CHILD.\n // That lets us read the child job’s return value(s) here.\n const childrenValues = await job.getChildrenValues()\n const jobKey = `${prefix}:${EthTransactionSubmission.queueName}:${hash}`\n const childValues = childrenValues?.[jobKey] as EthTransactionSubmissionJobReturn | undefined\n const submissionHash = childValues?.submissionHash\n\n const resolvedSubmissionHash = assertEx(submissionHash, () => `[${hash}] child submissionHash not found in children values`)\n\n // Store the submission hash in the state\n await job.log(`[${hash}] Storing ETH submissionHash`)\n state.submissionHash = resolvedSubmissionHash\n await stateMap.set(hash, state)\n await job.log(`[${hash}] Stored ETH submissionHash`)\n return { submissionHash: resolvedSubmissionHash }\n },\n {\n connection, telemetry, prefix,\n },\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 EthTransactionSubmissionStorage: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport { prefix } from '../prefix.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1DataLakeTransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type Xl1ToEthBridgeParentJobData = Xl1DataLakeTransactionJobData\nexport interface Xl1ToEthBridgeParentJobReturn { }\nexport type Xl1ToEthBridgeParentJob = Job<Xl1ToEthBridgeParentJobData, Xl1ToEthBridgeParentJobReturn>\n\nconst name = 'Bridge XL1 to Ethereum'\nconst queueName = 'xl1-to-eth-bridge'\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel) => {\n const worker = new Worker(\n queueName,\n async (job: Xl1ToEthBridgeParentJob) => {\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 return {}\n },\n {\n connection, telemetry, prefix,\n },\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 type { BrandedHash } from '@xylabs/sdk-js'\nimport {\n assertEx, isDefined, isNull,\n} from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { Job } from 'bullmq'\nimport { UnrecoverableError, Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport { prefix } from '../prefix.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1TransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type Xl1TransactionMonitorJobData = Xl1TransactionJobData\nexport interface Xl1TransactionMonitorJobReturn {\n submissionHash: BrandedHash\n}\nexport type Xl1TransactionMonitorJob = Job<Xl1TransactionMonitorJobData, Xl1TransactionMonitorJobReturn>\n\nconst name = 'Monitor Submitted XL1 Transaction'\nconst queueName = 'xl1-tx-monitor'\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel, services?: IBridgeServiceCollection) => {\n const gateway = assertEx(services?.gateway, () => 'gateway service not provided')\n const stateMap = assertEx(services?.xl1TxStateMap, () => 'xl1TxStateMap service not provided')\n const viewer = assertEx(gateway.connection.viewer, () => 'viewer not defined on gateway')\n\n const worker = new Worker(\n queueName,\n async (job: Xl1TransactionMonitorJob) => {\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 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.transaction.byHash(submissionHash)\n // const foundTx = await viewer.transaction.byHash(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 const submissionHash = await PayloadBuilder.hash(foundTx[0])\n return { submissionHash }\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 {\n connection, telemetry, prefix,\n },\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 { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport { prefix } from '../prefix.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1DataLakeTransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type Xl1TransactionPreparationJobData = Xl1DataLakeTransactionJobData\nexport interface Xl1TransactionPreparationJobReturn { preparedTx: SignedHydratedTransaction }\nexport type Xl1TransactionPreparationJob = Job<Xl1TransactionPreparationJobData, Xl1TransactionPreparationJobReturn>\n\nconst name = 'Prepare XL1 Transaction'\nconst queueName = 'xl1-tx-prepare'\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel, services?: IBridgeServiceCollection) => {\n const stateMap = assertEx(services?.xl1TxStateMap, () => 'xl1TxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Xl1TransactionPreparationJob) => {\n const { tx, offChainPayloads = [] } = 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, { offChainPayloads, preparedTx })\n await job.log(`[${hash}] stored XL1 preparedTx`)\n await job.log(`[${hash}] prepared XL1 transaction`)\n return { preparedTx }\n },\n {\n connection, telemetry, prefix,\n },\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 { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection, Xl1TxState } from '../../services/index.ts'\nimport { prefix } from '../prefix.ts'\nimport { submitXl1Transaction } from './util/index.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1TransactionJobData } from './Xl1TransactionJobData.ts'\n\nexport type Xl1TransactionSubmissionJobData = Xl1TransactionJobData\nexport interface Xl1TransactionSubmissionJobReturn {\n submissionHash: Required<Xl1TxState>['submissionHash']\n}\nexport type Xl1TransactionSubmissionJob = Job<Xl1TransactionSubmissionJobData, Xl1TransactionSubmissionJobReturn>\n\nconst name = 'Submit XL1 Transaction'\nconst queueName = 'xl1-tx-submit'\n\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel, 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: Xl1TransactionSubmissionJob) => {\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 {\n preparedTx, offChainPayloads = [], submissionHash: existingSubmissionHash,\n } = state\n\n // Idempotency check against resubmission\n if (isDefined(existingSubmissionHash)) {\n await job.log(`[${hash}] Tx already submitted with submission response hash ${existingSubmissionHash}`)\n return { submissionHash: existingSubmissionHash }\n }\n const txToSubmit = assertEx(preparedTx, () => `[${hash}] preparedTx not found`)\n\n // Submit the transaction to the XL1 network\n await job.log(`[${hash}] Submitting XL1 tx`)\n const [submissionHash] = await submitXl1Transaction(txToSubmit, offChainPayloads, gateway)\n await job.log(`[${hash}] Submitted XL1 tx`)\n\n // This worker intentionally does NOT store state as subsequent steps will do that.\n return { submissionHash }\n },\n {\n connection, telemetry, prefix,\n },\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 { assertEx, isDefined } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { Job } from 'bullmq'\nimport { Worker } from 'bullmq'\nimport type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection, Xl1TxState } from '../../services/index.ts'\nimport { prefix } from '../prefix.ts'\nimport type { WorkerDescription } from './WorkerDescription.ts'\nimport type { Xl1TransactionJobData } from './Xl1TransactionJobData.ts'\nimport type { Xl1TransactionSubmissionJobReturn } from './Xl1TransactionSubmission.ts'\nimport { Xl1TransactionSubmission } from './Xl1TransactionSubmission.ts'\n\nexport type Xl1TransactionSubmissionStorageJobData = Xl1TransactionJobData\nexport interface Xl1TransactionSubmissionStorageJobReturn {\n submissionHash: Required<Xl1TxState>['submissionHash']\n}\nexport type Xl1TransactionSubmissionStorageJob = Job<Xl1TransactionSubmissionStorageJobData, Xl1TransactionSubmissionStorageJobReturn>\n\nconst name = 'Store XL1 Transaction Submission'\nconst queueName = 'xl1-tx-store-submission'\n\nconst createWorker = (connection: Redis, telemetry?: BullMQOtel, services?: IBridgeServiceCollection) => {\n const stateMap = assertEx(services?.xl1TxStateMap, () => 'xl1TxStateMap service not provided')\n\n const worker = new Worker(\n queueName,\n async (job: Xl1TransactionSubmissionStorageJob) => {\n const { tx } = job.data\n // Get the hash of the transaction\n const hash = await PayloadBuilder.hash(tx[0])\n\n // Get the state of the transaction\n const state = assertEx(await stateMap.get(hash), () => `[${hash}] state not found`)\n\n // Idempotency check against re-store\n const { submissionHash: existingSubmissionHash } = state\n if (isDefined(existingSubmissionHash)) {\n await job.log(`[${hash}] submissionHash already stored as ${existingSubmissionHash}`)\n return { submissionHash: existingSubmissionHash }\n }\n\n // In a Flow, this job should be the PARENT and the submit job should be a CHILD.\n // That lets us read the child job’s return value(s) here.\n const childrenValues = await job.getChildrenValues()\n const jobKey = `${prefix}:${Xl1TransactionSubmission.queueName}:${hash}`\n const childValues = childrenValues?.[jobKey] as Xl1TransactionSubmissionJobReturn | undefined\n const submissionHash = childValues?.submissionHash\n\n const resolvedSubmissionHash = assertEx(submissionHash, () => `[${hash}] child submissionHash not found in children values`)\n\n // Store the submission hash in the state\n await job.log(`[${hash}] Storing XL1 submissionHash`)\n state.submissionHash = resolvedSubmissionHash\n await stateMap.set(hash, state)\n await job.log(`[${hash}] Stored XL1 submissionHash`)\n\n return { submissionHash: resolvedSubmissionHash }\n },\n {\n connection, telemetry, prefix,\n },\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 Xl1TransactionSubmissionStorage: WorkerDescription = {\n createWorker, name, queueName,\n}\n","import type { BullMQOtel } from 'bullmq-otel'\nimport type { Redis } from 'ioredis'\n\nimport type { IBridgeServiceCollection } from '../../services/index.ts'\nimport { EthTransactionMonitor } from './EthTransactionMonitor.ts'\nimport { EthTransactionPreparation } from './EthTransactionPreparation.ts'\nimport { EthTransactionSubmission } from './EthTransactionSubmission.ts'\nimport { EthTransactionSubmissionStorage } from './EthTransactionSubmissionStorage.ts'\nimport { Xl1ToEthBridgeParent } from './Xl1ToEthBridgeParent.ts'\nimport { Xl1TransactionMonitor } from './Xl1TransactionMonitor.ts'\nimport { Xl1TransactionPreparation } from './Xl1TransactionPreparation.ts'\nimport { Xl1TransactionSubmission } from './Xl1TransactionSubmission.ts'\nimport { Xl1TransactionSubmissionStorage } from './Xl1TransactionSubmissionStorage.ts'\n\nexport const createWorkers = (connection: Redis, telemetry: BullMQOtel, services: IBridgeServiceCollection) => {\n // TODO: Uncomment when EthToXl1 flow is ready\n // EthToXl1BridgeParent.createWorker(connection, telemetry)\n EthTransactionMonitor.createWorker(connection, telemetry, services)\n EthTransactionPreparation.createWorker(connection, telemetry, services)\n EthTransactionSubmission.createWorker(connection, telemetry, services)\n EthTransactionSubmissionStorage.createWorker(connection, telemetry, services)\n Xl1ToEthBridgeParent.createWorker(connection, telemetry)\n Xl1TransactionMonitor.createWorker(connection, telemetry, services)\n Xl1TransactionPreparation.createWorker(connection, telemetry, services)\n Xl1TransactionSubmission.createWorker(connection, telemetry, services)\n Xl1TransactionSubmissionStorage.createWorker(connection, telemetry, services)\n}\n","import { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\n\n/**\n * Returns a deterministic & repeatable job ID based off the Transaction hash. This is to ensure\n * that if the same transaction is attempted to be bridged multiple times, it will have the same\n * job ID and not create duplicate jobs.\n * https://docs.bullmq.io/guide/jobs/job-ids\n * \"The main reason to be able to specify a custom id is in cases when you want to avoid duplicated\n * jobs. Since ids must be unique, if you add a job with an existing id then that job will just be\n * ignored and not added to the queue at all.\"\n * @param tx The transaction to bridge from XL1 to ETH\n * @returns A deterministic job ID for the bridge job\n */\nexport const getJobIdForXl1ToEthBridgeJob = async (tx: SignedHydratedTransaction) => {\n const jobId = await PayloadBuilder.hash(tx[0])\n return jobId\n}\n","import type { Payload } from '@xyo-network/sdk-js'\nimport type { SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { FlowProducer } from 'bullmq'\n\nimport type {\n EthTransactionMonitorJobData,\n EthTransactionPreparationJobData,\n EthTransactionSubmissionJobData,\n EthTransactionSubmissionStorageJobData,\n Xl1ToEthBridgeParentJobData,\n Xl1TransactionMonitorJobData,\n Xl1TransactionPreparationJobData,\n Xl1TransactionSubmissionJobData,\n Xl1TransactionSubmissionStorageJobData,\n} from '../../workers/index.ts'\nimport {\n EthTransactionMonitor, EthTransactionPreparation, EthTransactionSubmission, EthTransactionSubmissionStorage, Xl1ToEthBridgeParent, Xl1TransactionMonitor,\n Xl1TransactionPreparation, Xl1TransactionSubmission, Xl1TransactionSubmissionStorage,\n} from '../../workers/index.ts'\nimport { getJobIdForXl1ToEthBridgeJob } from './getJobIdForXl1ToEthBridgeJob.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 * @param offChainPayloads The payloads to put off chain\n * @returns The JobNode representing the XL1 to ETH bridge job\n */\nexport const createXl1ToEthBridgeJob = async (\n flowProducer: FlowProducer,\n tx: SignedHydratedTransaction,\n offChainPayloads: Payload[] = [],\n) => {\n const jobId = await getJobIdForXl1ToEthBridgeJob(tx)\n const flow = await flowProducer.add({\n // Step 0 (runs first as parent job)\n name: Xl1ToEthBridgeParent.name,\n queueName: Xl1ToEthBridgeParent.queueName,\n data: { tx, offChainPayloads } as Xl1ToEthBridgeParentJobData,\n opts: { jobId },\n children: [\n {\n // Step 8\n name: EthTransactionMonitor.name,\n queueName: EthTransactionMonitor.queueName,\n data: { tx } as EthTransactionMonitorJobData,\n opts: {\n jobId, attempts: 60, backoff: { type: 'fixed', delay: 5000 },\n },\n children: [\n {\n // Step 7\n name: EthTransactionSubmissionStorage.name,\n queueName: EthTransactionSubmissionStorage.queueName,\n data: { tx } as EthTransactionSubmissionStorageJobData,\n opts: {\n jobId, attempts: 60, backoff: { type: 'fixed', delay: 5000 },\n },\n children: [\n {\n // Step 6\n name: EthTransactionSubmission.name,\n queueName: EthTransactionSubmission.queueName,\n data: { tx, offChainPayloads } as EthTransactionSubmissionJobData,\n opts: { jobId },\n children: [\n {\n // Step 5\n name: EthTransactionPreparation.name,\n queueName: EthTransactionPreparation.queueName,\n data: { tx, offChainPayloads } as EthTransactionPreparationJobData,\n opts: {\n jobId, attempts: 60, backoff: { type: 'fixed', delay: 5000 },\n },\n children: [\n {\n // Step 4\n name: Xl1TransactionMonitor.name,\n queueName: Xl1TransactionMonitor.queueName,\n data: { tx } as Xl1TransactionMonitorJobData,\n opts: {\n jobId, attempts: 60, backoff: { type: 'fixed', delay: 5000 },\n },\n children: [\n {\n // Step 3\n name: Xl1TransactionSubmissionStorage.name,\n queueName: Xl1TransactionSubmissionStorage.queueName,\n data: { tx } as Xl1TransactionSubmissionStorageJobData,\n opts: {\n jobId, attempts: 60, backoff: { type: 'fixed', delay: 5000 },\n },\n children: [\n {\n // Step 2\n name: Xl1TransactionSubmission.name,\n queueName: Xl1TransactionSubmission.queueName,\n data: { tx } as Xl1TransactionSubmissionJobData,\n opts: { jobId },\n children: [\n {\n // Step 1 (runs first as deepest child)\n name: Xl1TransactionPreparation.name,\n queueName: Xl1TransactionPreparation.queueName,\n data: { tx, offChainPayloads } as Xl1TransactionPreparationJobData,\n opts: {\n jobId, attempts: 60, backoff: { type: 'fixed', delay: 5000 },\n },\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n })\n return flow\n}\n","import type { SignedHydratedTransaction } from '@xyo-network/xl1-sdk'\nimport type { FlowProducer } from 'bullmq'\n\nimport { Xl1ToEthBridgeParent } from '../../workers/index.ts'\nimport { getJobIdForXl1ToEthBridgeJob } from './getJobIdForXl1ToEthBridgeJob.ts'\n\nexport const getXl1ToEthBridgeJob = async (flowProducer: FlowProducer, tx: SignedHydratedTransaction) => {\n const id = await getJobIdForXl1ToEthBridgeJob(tx)\n const flow = await flowProducer.getFlow({ queueName: Xl1ToEthBridgeParent.queueName, id })\n return flow\n}\n","import type { Xl1ToEthQueues } from './getXl1ToEthQueues.ts'\nimport type {\n EthTransactionMonitorJob, EthTransactionPreparationJob,\n EthTransactionSubmissionJob,\n Xl1ToEthBridgeParentJob,\n Xl1TransactionMonitorJob, Xl1TransactionPreparationJob, Xl1TransactionSubmissionJob,\n Xl1TransactionSubmissionStorageJob,\n} from './workers/index.ts'\n\nexport interface StatusQueueJobs {\n ethTransactionMonitorJob?: EthTransactionMonitorJob\n ethTransactionPreparationJob?: EthTransactionPreparationJob\n ethTransactionSubmissionJob?: EthTransactionSubmissionJob\n xl1ToEthBridgeParentJob?: Xl1ToEthBridgeParentJob\n xl1TransactionMonitorJob?: Xl1TransactionMonitorJob\n xl1TransactionPreparationJob?: Xl1TransactionPreparationJob\n xl1TransactionSubmissionJob?: Xl1TransactionSubmissionJob\n xl1TransactionSubmissionStorageJob?: Xl1TransactionSubmissionStorageJob\n}\n\n/**\n * Checks all the relevant status queues for a job with the given id and returns the jobs found in an object\n * @param queues The status queues to check for jobs\n * @param jobId The job id to look for in the queues, which is the same as the tx hash of the bridge transaction\n * @returns An object containing the jobs found in the status queues corresponding to the given job id\n */\nexport const getStatusQueueJobs = async (queues: Xl1ToEthQueues, jobId: string): Promise<StatusQueueJobs> => {\n const [\n ethTransactionMonitorJob,\n ethTransactionPreparationJob,\n ethTransactionSubmissionJob,\n xl1ToEthBridgeParentJob,\n xl1TransactionMonitorJob,\n xl1TransactionPreparationJob,\n xl1TransactionSubmissionJob,\n xl1TransactionSubmissionStorageJob,\n ] = await Promise.all([\n queues.ethTransactionMonitor.getJob(jobId),\n queues.ethTransactionPreparation.getJob(jobId),\n queues.ethTransactionSubmission.getJob(jobId),\n queues.xl1ToEthBridgeParent.getJob(jobId),\n queues.xl1TransactionMonitor.getJob(jobId),\n queues.xl1TransactionPreparation.getJob(jobId),\n queues.xl1TransactionSubmission.getJob(jobId),\n queues.xl1TransactionSubmissionStorage.getJob(jobId),\n ])\n return {\n ethTransactionMonitorJob,\n ethTransactionPreparationJob,\n ethTransactionSubmissionJob,\n xl1ToEthBridgeParentJob,\n xl1TransactionMonitorJob,\n xl1TransactionPreparationJob,\n xl1TransactionSubmissionStorageJob,\n xl1TransactionSubmissionJob,\n }\n}\n","import type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { Queue } from 'bullmq'\n\nimport { getConnection } from './connection.ts'\nimport { prefix } from './prefix.ts'\nimport {\n EthTransactionMonitor, EthTransactionPreparation, EthTransactionSubmission, Xl1ToEthBridgeParent, Xl1TransactionMonitor, Xl1TransactionPreparation,\n Xl1TransactionSubmission,\n Xl1TransactionSubmissionStorage,\n} from './workers/index.ts'\n\nexport interface Xl1ToEthQueues {\n ethTransactionMonitor: Queue\n ethTransactionPreparation: Queue\n ethTransactionSubmission: Queue\n xl1ToEthBridgeParent: Queue\n xl1TransactionMonitor: Queue\n xl1TransactionPreparation: Queue\n xl1TransactionSubmission: Queue\n xl1TransactionSubmissionStorage: Queue\n}\n\nlet xl1ToEthQueues: Xl1ToEthQueues | undefined\n\nexport const getXl1ToEthQueues = (config: BridgeConfig): Xl1ToEthQueues => {\n if (xl1ToEthQueues) return xl1ToEthQueues\n const connection = getConnection(config)\n xl1ToEthQueues = {\n ethTransactionMonitor: new Queue(EthTransactionMonitor.queueName, { connection, prefix }),\n ethTransactionPreparation: new Queue(EthTransactionPreparation.queueName, { connection, prefix }),\n ethTransactionSubmission: new Queue(EthTransactionSubmission.queueName, { connection, prefix }),\n xl1ToEthBridgeParent: new Queue(Xl1ToEthBridgeParent.queueName, { connection, prefix }),\n xl1TransactionMonitor: new Queue(Xl1TransactionMonitor.queueName, { connection, prefix }),\n xl1TransactionPreparation: new Queue(Xl1TransactionPreparation.queueName, { connection, prefix }),\n xl1TransactionSubmission: new Queue(Xl1TransactionSubmission.queueName, { connection, prefix }),\n xl1TransactionSubmissionStorage: new Queue(Xl1TransactionSubmissionStorage.queueName, { connection, prefix }),\n }\n return xl1ToEthQueues\n}\n","import { isDefined } from '@xylabs/sdk-js'\nimport type { BullMQOtelOptions } from 'bullmq-otel'\nimport { BullMQOtel } from 'bullmq-otel'\n\nlet telemetry: BullMQOtel | undefined\nconst options: BullMQOtelOptions = { enableMetrics: true }\n\nexport const getTelemetry = () => {\n if (isDefined(telemetry)) return telemetry\n telemetry = new BullMQOtel(options)\n return telemetry\n}\n","import { standardErrors } from '@xylabs/express'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { sharedMiddleware } from '@xyo-network/chain-orchestration'\nimport type { XyoGatewayRunner } from '@xyo-network/xl1-sdk'\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 sharedMiddleware(app)\n addFlowProducer(app, config)\n addRoutes(app, config, gateway)\n app.use(standardErrors)\n return app\n}\n","import type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport type { Express } from 'express'\n\nimport {\n getConnection, getFlowProducer, getTelemetry,\n} from '../queue/index.ts'\n\nexport const addFlowProducer = (app: Express, config: BridgeConfig): Express => {\n const connection = getConnection(config)\n const telemetry = getTelemetry()\n const flowProducer = getFlowProducer(connection, telemetry)\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 { NoReqParams } from '@xylabs/express'\nimport { setRawResponseFormat } from '@xylabs/express'\nimport type { RequestHandler } from 'express'\nimport { ReasonPhrases } from 'http-status-codes'\n\nconst message = ReasonPhrases.OK\n\nconst handler: RequestHandler<NoReqParams> = (_req, res) => {\n setRawResponseFormat(res)\n res.status(200).send({ message })\n}\n\nexport const getLivez: RequestHandler<NoReqParams> = handler\n","import type { NoReqParams } from '@xylabs/express'\nimport { setRawResponseFormat } from '@xylabs/express'\nimport type { RequestHandler } from 'express'\nimport { ReasonPhrases } from 'http-status-codes'\n\nconst message = ReasonPhrases.OK\n\nconst handler: RequestHandler<NoReqParams> = (_req, res) => {\n setRawResponseFormat(res)\n res.status(200).send({ message })\n}\n\nexport const getReadyz: RequestHandler<NoReqParams> = handler\n","import type { NoReqParams } from '@xylabs/express'\nimport { setRawResponseFormat } from '@xylabs/express'\nimport type { RequestHandler } from 'express'\nimport { ReasonPhrases } from 'http-status-codes'\n\nconst message = ReasonPhrases.OK\n\nconst handler: RequestHandler<NoReqParams> = (_req, res) => {\n setRawResponseFormat(res)\n res.status(200).send({ message })\n}\n\nexport const getStartupz: RequestHandler<NoReqParams> = handler\n","import type { Express } from 'express'\n\nimport { getLivez } from './livez/index.ts'\nimport { getReadyz } from './readyz/index.ts'\nimport { getStartupz } from './startupz/index.ts'\n\nexport const addProbeRoutes = (app: Express) => {\n app.get('/livez', getLivez)\n app.get('/readyz', getReadyz)\n app.get('/startupz', getStartupz)\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 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 { isDefined } from '@xylabs/sdk-js'\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, getXl1ToEthBridgeJob } from '../../../../../queue/index.ts'\nimport {\n validateBridgeEstimateExact, validateBridgeTransaction, validateSufficientXL1SourceAddressBalance,\n} from '../../../../../validation/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 const { gateway } = req.app.services\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 // Validate sufficient balance\n const sufficientBalance = await validateSufficientXL1SourceAddressBalance(bridgeIntent, gateway, config)\n if (!sufficientBalance) {\n res.status(400).send()\n return\n }\n\n // Create the signed hydrated transaction for the job\n const singedHydratedTransaction: SignedHydratedTransaction = [signedTxBw, [transfer]]\n\n // Check if a job already exists for this transaction\n const existingFlow = await getXl1ToEthBridgeJob(flowProducer, singedHydratedTransaction)\n if (isDefined(existingFlow)) {\n res.status(200).send()\n return\n }\n\n // Submit to job queue\n await createXl1ToEthBridgeJob(flowProducer, singedHydratedTransaction, [bridgeIntent])\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.status(202).json(bridgeObservation)\n }),\n }\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport {\n assertEx, hexToBigInt, toAddress,\n} 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 { getBridgeSettings, 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\n const { maxBridgeAmount, minBridgeAmount } = await getBridgeSettings(config)\n if (hexToBigInt(srcAmount) < hexToBigInt(minBridgeAmount) || hexToBigInt(srcAmount) > hexToBigInt(maxBridgeAmount)) {\n res.status(400).send()\n return\n }\n\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 assertEx, hexToBigInt, toAddress, toHex,\n} 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 { getBridgeSettings } from '../../../../../config/index.ts'\nimport { calculateMaxBridgeAmount, generateBridgeEstimate } from '../../../../../util/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nexport const BridgeToRemoteMaxEstimateBodyZod = BridgeIntentFieldsZod.pick({\n destAddress: true,\n srcAddress: true,\n srcAmount: true,\n})\nexport type BridgeToRemoteMaxEstimateBody = z.infer<typeof BridgeToRemoteMaxEstimateBodyZod>\n\nexport const BridgeToRemoteMaxEstimateResponseZod = z.tuple([\n TransactionBoundWitnessZod,\n PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),\n TransferZod,\n])\n\nexport type BridgeToRemoteMaxEstimateResponse = z.infer<typeof BridgeToRemoteMaxEstimateResponseZod>\n\nexport const makeBridgeToRemoteMaxEstimateRoute = (config: BridgeConfig, gateway: XyoGatewayRunner): RouteDefinition => {\n const params = z.object({ chainId: getRemoteChainIdZod(config) })\n const validateRequest = requestHandlerValidator({\n params, body: BridgeToRemoteMaxEstimateBodyZod, response: BridgeToRemoteMaxEstimateResponseZod,\n })\n return {\n method: 'post',\n path: '/bridge/chains/:chainId/bridgeToRemote/maxEstimate',\n handlers: validateRequest(async (req, res) => {\n const {\n feeFixed, feeRateBasisPoints, maxBridgeAmount: configMax, xl1ChainId,\n } = await getBridgeSettings(config)\n const {\n srcAddress, srcAmount: balance, destAddress,\n } = req.body\n\n const balanceMax = calculateMaxBridgeAmount(balance, { feeFixed, feeRateBasisPoints })\n const maxBridgeAmount = toHex(hexToBigInt(balanceMax) < hexToBigInt(configMax) ? balanceMax : configMax)\n\n const [bridgeIntent, transfer] = await generateBridgeEstimate(srcAddress, maxBridgeAmount, destAddress, config)\n const sender = toAddress(srcAddress)\n\n const viewer = assertEx(gateway.connection.viewer, () => new Error('Viewer not available on gateway connection'))\n const currentBlockNumber = await viewer.currentBlockNumber()\n const nbf = toXL1BlockNumber(currentBlockNumber, true)\n const exp = toXL1BlockNumber(currentBlockNumber + 1000, true)\n const [txBw] = await buildUnsignedTransaction(xl1ChainId, [transfer], [bridgeIntent], nbf, exp, sender)\n\n res.json([txBw, bridgeIntent, transfer])\n }),\n }\n}\n","import type { RouteDefinition } from '@xylabs/express'\nimport { requestHandlerValidator } from '@xylabs/express'\nimport { asHex, isDefined } from '@xylabs/sdk-js'\nimport type { BridgeConfig } from '@xyo-network/chain-orchestration'\nimport { PayloadBuilder, PayloadZodStrictOfSchema } from '@xyo-network/sdk-js'\nimport type { BridgeDestinationObservation, BridgeSourceObservation } from '@xyo-network/xl1-sdk'\nimport {\n asBridgeIntent, BridgeDestinationObservationFieldsZod, BridgeDestinationObservationSchema, BridgeIntentFieldsZod, BridgeIntentSchema,\n BridgeSourceObservationFieldsZod, BridgeSourceObservationSchema, isBridgeIntent,\n} from '@xyo-network/xl1-sdk'\nimport { z } from 'zod'\n\nimport { getStatusQueueJobs, getXl1ToEthQueues } from '../../../../../queue/index.ts'\nimport { getRemoteChainIdZod } from '../pathParams/index.ts'\n\nconst BridgeIntentResponseZod = PayloadZodStrictOfSchema(BridgeIntentSchema)\n .extend(BridgeIntentFieldsZod.shape)\n\nconst BridgeSourceResponseZod = PayloadZodStrictOfSchema(BridgeSourceObservationSchema)\n .extend(BridgeSourceObservationFieldsZod.shape)\n\nconst BridgeDestinationResponseZod = PayloadZodStrictOfSchema(BridgeDestinationObservationSchema)\n .extend(BridgeDestinationObservationFieldsZod.shape)\n\nexport const BridgeToRemoteStatusResponseZod = z.union([\n z.tuple([]),\n z.tuple([BridgeIntentResponseZod]),\n z.tuple([BridgeIntentResponseZod, BridgeSourceResponseZod]),\n z.tuple([BridgeIntentResponseZod, BridgeSourceResponseZod, BridgeDestinationResponseZod]),\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\n const validateRequest = requestHandlerValidator({ params, response: BridgeToRemoteStatusResponseZod })\n\n return {\n method: 'get',\n path: '/bridge/chains/:chainId/bridgeToRemote/status/:nonce',\n handlers: validateRequest(async (req, res) => {\n const jobId = req.params.nonce\n const result: z.infer<typeof BridgeToRemoteStatusResponseZod> = [] as z.infer<typeof BridgeToRemoteStatusResponseZod>\n const queues = getXl1ToEthQueues(config)\n\n const statusQueueJobs = await getStatusQueueJobs(queues, jobId)\n\n // Check for the transaction hash in the parent job\n const { tx, offChainPayloads = [] } = statusQueueJobs.xl1ToEthBridgeParentJob?.data ?? {}\n\n // If the job does not exist return Not Found\n if (!tx) return res.sendStatus(404)\n\n // If the tx is not the right shape for bridging return Not Found\n const allPayloads = [...tx[1], ...offChainPayloads]\n const bridgeIntent = allPayloads.find(isBridgeIntent)\n if (!bridgeIntent) return res.sendStatus(404)\n\n // At this point we know we have a valid bridge intent, so we can start building the response\n result[0] = asBridgeIntent(PayloadBuilder.omitMeta(bridgeIntent))\n\n // Check the state of the XL1 monitor job to determine if we can include the source observation\n const { xl1TransactionMonitorJob } = statusQueueJobs\n const xl1MonitorState = xl1TransactionMonitorJob ? await xl1TransactionMonitorJob.getState() : undefined\n if (xl1MonitorState === 'completed') {\n const srcConfirmation = xl1TransactionMonitorJob?.returnvalue?.submissionHash\n if (isDefined(srcConfirmation)) {\n const schema = BridgeSourceObservationSchema\n const bridgeSourceObservationFields = BridgeSourceObservationFieldsZod.parse(bridgeIntent)\n const observation: BridgeSourceObservation = {\n schema, ...bridgeSourceObservationFields, srcConfirmation,\n }\n result[1] = observation\n }\n }\n\n // Check the state of the ETH monitor job to determine if we can include the destination observation\n const { ethTransactionMonitorJob } = statusQueueJobs\n const ethMonitorState = ethTransactionMonitorJob ? await ethTransactionMonitorJob.getState() : undefined\n if (ethMonitorState === 'completed') {\n const destConfirmation = asHex(ethTransactionMonitorJob?.returnvalue?.submissionHash)\n if (isDefined(destConfirmation)) {\n const schema = BridgeDestinationObservationSchema\n const bridgeDestinationObservationFields = BridgeDestinationObservationFieldsZod.parse(bridgeIntent)\n const observation: BridgeDestinationObservation = {\n schema, ...bridgeDestinationObservationFields, destConfirmation,\n }\n result[2] = observation\n }\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, makeBridgeToRemoteMaxEstimateRoute, 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 makeBridgeToRemoteMaxEstimateRoute(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 { addProbeRoutes } from './addProbeRoutes.ts'\nimport { addBridgeRoutes } from './bridge/index.ts'\n\nexport const addRoutes = (app: Express, config: BridgeConfig, gateway: XyoGatewayRunner) => {\n addProbeRoutes(app)\n addBridgeRoutes(app, config, gateway)\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { BridgeConfig, BridgeConfigContext } from '@xyo-network/chain-orchestration'\nimport { initEvmProvider, resolveWalletForActor } from '@xyo-network/chain-orchestration'\nimport { BridgeableToken__factory, LiquidityPoolBridge__factory } from '@xyo-network/typechain'\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, accountPath,\n } = config as BridgeConfig\n const account = await resolveWalletForActor(config.name, accountPath)\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-driver-mongodb'\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 {\n createWorkers, getConnection,\n getTelemetry,\n} 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 const telemetry = getTelemetry()\n createWorkers(connection, telemetry, services)\n}\n","import type { Server } from 'node:http'\n\nimport type { BridgeConfigContext } from '@xyo-network/chain-orchestration'\nimport type { XyoGatewayRunner } from '@xyo-network/xl1-sdk'\n\nimport type { IBridgeServiceCollection } from '../services/index.ts'\nimport { getServices } from '../services/index.ts'\nimport { addWorkers } from './addWorkers.ts'\nimport { getApp } from './app.ts'\n\nexport interface GetServerResult {\n server: Server\n services: IBridgeServiceCollection\n}\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\nexport const getServer = async (context: BridgeConfigContext, gateway: XyoGatewayRunner): Promise<GetServerResult> => {\n const { logger, config } = context\n const { port } = config\n const app = getApp(config, gateway)\n const services = await getServices(context, gateway)\n app.services = services\n addWorkers(config, services)\n const server = await new Promise<ReturnType<typeof app.listen>>((resolve, reject) => {\n const srv = app.listen(port, hostname, () => {\n logger?.log(`[Bridge] Server listening at http://${hostname}:${port}`)\n resolve(srv)\n })\n srv.once('error', reject)\n })\n server.setTimeout(20_000)\n return { server, services }\n}\n"],"mappings":"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","names":["creatable","ActorV3","asBridgeConfigContext","XyoGatewayRunnerMoniker","XyoViewerMoniker","DEFAULT_INTERVAL_MS","WEI_PER_GWEI","TOKEN_DECIMALS","createBalanceMonitor","config","account","bridge","bridgeableToken","gateway","meter","provider","wallet","intervalMs","timer","ethWalletGasBalance","createGauge","description","unit","liquidityTokenBalance","liquidityTokenAllowance","xl1AccountBalance","walletAddress","address","poll","balance","getBalance","record","Number","err","console","error","liquiditySourceAddress","liquiditySource","balanceOf","bridgeAddress","getAddress","allowance","viewer","connection","accountBalance","toString","start","setInterval","stop","clearInterval","undefined","DEFAULT_INTERVAL_MS","createQueueMetrics","config","meter","queues","intervalMs","timer","waitingGauge","createGauge","description","activeGauge","completedGauge","failedGauge","delayedGauge","poll","name","queue","Object","entries","counts","getJobCounts","attrs","queue_name","record","waiting","active","completed","failed","delayed","err","console","error","start","setInterval","stop","clearInterval","undefined","isDefined","Redis","connection","maxRetriesPerRequest","getConnection","config","isDefined","redisHost","host","redisPort","port","Redis","isDefined","FlowProducer","prefix","flowProducer","getFlowProducer","connection","telemetry","isDefined","FlowProducer","prefix","assertEx","PayloadBuilder","Worker","name","queueName","createWorker","connection","telemetry","services","provider","assertEx","stateMap","ethTxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","submissionHash","receipt","getTransactionReceipt","log","blockNumber","blockHash","confirmationHash","set","prefix","on","err","console","error","id","message","EthTransactionMonitor","assertEx","hexToBigInt","PayloadBuilder","isBridgeIntent","Worker","getAddress","hexToBigInt","isUndefined","PayloadBuilder","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","resolveWalletForActor","accountServiceSingleton","getBridgeWalletAccount","config","accountPath","undefined","account","resolveWalletForActor","name","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","hexToBigInt","toHex","calculateBridgeFees","srcAmount","feeStructure","feeFixed","feeRateBasisPoints","srcAmountBigInt","hexToBigInt","feeVariableBigInt","BigInt","feeVariable","toHex","hexToBigInt","toHex","calculateMaxBridgeAmount","balance","feeStructure","feeFixed","feeRateBasisPoints","balanceBigInt","hexToBigInt","feeFixedBigInt","toHex","maxAmount","BigInt","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","validateBridgeEstimateExact","intent","transfer","config","srcAddress","srcAmount","destAddress","hexToBigInt","getMinBridgeAmount","getMaxBridgeAmount","calculatedIntent","calculatedTransfer","generateBridgeEstimate","isUndefined","nonce","expectedIntentNonce","expectedIntentStatic","actualIntentNonce","actualIntentStatic","PayloadBuilder","dataHash","epoch","expectedTransferEpoch","expectedTransferStatic","actualTransferEpoch","actualTransferStatic","asAddress","addressesContains","BoundWitnessValidator","payloadHashesContainsAll","payloadSchemasContainsAll","PayloadBuilder","BridgeIntentSchema","TransferSchema","validateBridgeTransaction","signedTxBw","intent","transfer","config","srcAddress","chainId","getXl1ChainId","chain","payload_hashes","length","payloadSchemasContainsAll","BridgeIntentSchema","TransferSchema","hashes","PayloadBuilder","payloadHashesContainsAll","errors","BoundWitnessValidator","validate","sender","asAddress","addressesContains","assertEx","hexToBigInt","isBridgeIntent","validateSufficientLiquiditySourceAllowance","tx","offChainPayloads","bridgeableToken","bridge","logger","allPayloads","bridgeIntent","assertEx","find","isBridgeIntent","amount","hexToBigInt","destAmount","liquiditySourceAddress","liquiditySource","bridgeAddress","getAddress","remainingAllowance","allowance","log","toString","assertEx","hexToBigInt","isBridgeIntent","validateSufficientLiquiditySourceBalance","tx","offChainPayloads","bridgeableToken","bridge","logger","allPayloads","bridgeIntent","assertEx","find","isBridgeIntent","amount","hexToBigInt","destAmount","liquiditySourceAddress","liquiditySource","balance","balanceOf","log","toString","assertEx","DEFAULT_GAS_BUFFER_BPS","validateSufficientRunnerEthBalanceForGas","preparedTx","wallet","logger","bufferBps","provider","assertEx","feeData","getFeeData","perGas","maxFeePerGas","gasPrice","log","transactionRequest","from","getAddress","estGas","estimateGas","txValue","value","baseRequired","required","balance","getBalance","toString","asAddress","assertEx","hexToBigInt","validateSufficientXL1SourceAddressBalance","bridgeIntent","gateway","config","logger","viewer","assertEx","connection","srcAddress","srcAmount","destAddress","srcAddressBranded","asAddress","_","calculatedTransfer","generateBridgeEstimate","totalAmount","Object","values","transfers","reduce","acc","transfer","hexToBigInt","accountBalance","account","balance","log","toString","name","queueName","createWorker","connection","telemetry","services","bridge","assertEx","bridgeableToken","stateMap","ethTxStateMap","wallet","worker","Worker","job","tx","offChainPayloads","data","hash","PayloadBuilder","log","validateSufficientLiquiditySourceAllowance","Error","validateSufficientLiquiditySourceBalance","allPayloads","bridgeIntent","find","isBridgeIntent","amount","hexToBigInt","destAmount","srcAddress","getAddress","destAddress","nonce","preparedTx","getFunction","populateTransaction","validateSufficientRunnerEthBalanceForGas","set","prefix","on","err","console","error","id","message","EthTransactionPreparation","assertEx","isDefined","PayloadBuilder","Worker","assertEx","hexToBigInt","toEthAddress","PayloadBuilder","isBridgeIntent","submitEthTransaction","tx","offChainPayloads","bridge","wallet","xl1Transaction","assertEx","allPayloads","bridgeIntent","find","isBridgeIntent","srcAddress","toEthAddress","destAddress","amount","hexToBigInt","destAmount","nonce","PayloadBuilder","hash","bridgeTx","connect","bridgeFromRemote","receipt","wait","submitXl1Transaction","preparedTx","offChain","gateway","result","addTransactionToChain","name","queueName","createWorker","connection","telemetry","services","bridge","assertEx","wallet","stateMap","ethTxStateMap","worker","Worker","job","tx","offChainPayloads","data","hash","PayloadBuilder","state","get","submissionHash","existingSubmissionHash","isDefined","log","submitEthTransaction","concurrency","prefix","on","err","console","error","id","message","EthTransactionSubmission","assertEx","isDefined","PayloadBuilder","Worker","name","queueName","createWorker","connection","telemetry","services","stateMap","assertEx","ethTxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","submissionHash","existingSubmissionHash","isDefined","log","childrenValues","getChildrenValues","jobKey","prefix","EthTransactionSubmission","childValues","resolvedSubmissionHash","set","on","err","console","error","id","message","EthTransactionSubmissionStorage","Worker","name","queueName","createWorker","connection","telemetry","worker","Worker","job","log","prefix","on","err","console","error","id","message","Xl1ToEthBridgeParent","assertEx","isDefined","isNull","PayloadBuilder","UnrecoverableError","Worker","name","queueName","createWorker","connection","telemetry","services","gateway","assertEx","stateMap","xl1TxStateMap","viewer","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","submissionHash","log","foundTx","transaction","byHash","isDefined","isNull","currentBlockNumber","exp","UnrecoverableError","Error","prefix","on","err","console","error","id","message","Xl1TransactionMonitor","assertEx","PayloadBuilder","Worker","name","queueName","createWorker","connection","telemetry","services","stateMap","assertEx","xl1TxStateMap","worker","Worker","job","tx","offChainPayloads","data","hash","PayloadBuilder","log","preparedTx","set","prefix","on","err","console","error","id","message","Xl1TransactionPreparation","assertEx","isDefined","PayloadBuilder","Worker","name","queueName","createWorker","connection","telemetry","services","gateway","assertEx","stateMap","xl1TxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","preparedTx","offChainPayloads","submissionHash","existingSubmissionHash","isDefined","log","txToSubmit","submitXl1Transaction","prefix","on","err","console","error","id","message","Xl1TransactionSubmission","assertEx","isDefined","PayloadBuilder","Worker","name","queueName","createWorker","connection","telemetry","services","stateMap","assertEx","xl1TxStateMap","worker","Worker","job","tx","data","hash","PayloadBuilder","state","get","submissionHash","existingSubmissionHash","isDefined","log","childrenValues","getChildrenValues","jobKey","prefix","Xl1TransactionSubmission","childValues","resolvedSubmissionHash","set","on","err","console","error","id","message","Xl1TransactionSubmissionStorage","createWorkers","connection","telemetry","services","EthTransactionMonitor","createWorker","EthTransactionPreparation","EthTransactionSubmission","EthTransactionSubmissionStorage","Xl1ToEthBridgeParent","Xl1TransactionMonitor","Xl1TransactionPreparation","Xl1TransactionSubmission","Xl1TransactionSubmissionStorage","PayloadBuilder","getJobIdForXl1ToEthBridgeJob","tx","jobId","PayloadBuilder","hash","createXl1ToEthBridgeJob","flowProducer","tx","offChainPayloads","jobId","getJobIdForXl1ToEthBridgeJob","flow","add","name","Xl1ToEthBridgeParent","queueName","data","opts","children","EthTransactionMonitor","attempts","backoff","type","delay","EthTransactionSubmissionStorage","EthTransactionSubmission","EthTransactionPreparation","Xl1TransactionMonitor","Xl1TransactionSubmissionStorage","Xl1TransactionSubmission","Xl1TransactionPreparation","getXl1ToEthBridgeJob","flowProducer","tx","id","getJobIdForXl1ToEthBridgeJob","flow","getFlow","queueName","Xl1ToEthBridgeParent","getStatusQueueJobs","queues","jobId","ethTransactionMonitorJob","ethTransactionPreparationJob","ethTransactionSubmissionJob","xl1ToEthBridgeParentJob","xl1TransactionMonitorJob","xl1TransactionPreparationJob","xl1TransactionSubmissionJob","xl1TransactionSubmissionStorageJob","Promise","all","ethTransactionMonitor","getJob","ethTransactionPreparation","ethTransactionSubmission","xl1ToEthBridgeParent","xl1TransactionMonitor","xl1TransactionPreparation","xl1TransactionSubmission","xl1TransactionSubmissionStorage","Queue","xl1ToEthQueues","getXl1ToEthQueues","config","connection","getConnection","ethTransactionMonitor","Queue","EthTransactionMonitor","queueName","prefix","ethTransactionPreparation","EthTransactionPreparation","ethTransactionSubmission","EthTransactionSubmission","xl1ToEthBridgeParent","Xl1ToEthBridgeParent","xl1TransactionMonitor","Xl1TransactionMonitor","xl1TransactionPreparation","Xl1TransactionPreparation","xl1TransactionSubmission","Xl1TransactionSubmission","xl1TransactionSubmissionStorage","Xl1TransactionSubmissionStorage","isDefined","BullMQOtel","telemetry","options","enableMetrics","getTelemetry","isDefined","BullMQOtel","standardErrors","sharedMiddleware","express","addFlowProducer","app","config","connection","getConnection","telemetry","getTelemetry","flowProducer","getFlowProducer","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","setRawResponseFormat","ReasonPhrases","message","ReasonPhrases","OK","handler","_req","res","setRawResponseFormat","status","send","getLivez","setRawResponseFormat","ReasonPhrases","message","ReasonPhrases","OK","handler","_req","res","setRawResponseFormat","status","send","getReadyz","setRawResponseFormat","ReasonPhrases","message","ReasonPhrases","OK","handler","_req","res","setRawResponseFormat","status","send","getStartupz","addProbeRoutes","app","get","getLivez","getReadyz","getStartupz","requestHandlerValidator","BridgeSettingsZod","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","isDefined","PayloadBuilder","PayloadZodLooseOfSchema","PayloadZodStrictOfSchema","BridgeIntentFieldsZod","BridgeIntentSchema","BridgeSourceObservationFieldsZod","BridgeSourceObservationSchema","SignedTransactionBoundWitnessZod","TransferZod","z","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","gateway","services","transactionValid","validateBridgeTransaction","status","send","estimateValid","validateBridgeEstimateExact","sufficientBalance","validateSufficientXL1SourceAddressBalance","singedHydratedTransaction","existingFlow","getXl1ToEthBridgeJob","isDefined","createXl1ToEthBridgeJob","srcConfirmation","PayloadBuilder","hash","bridgeCommonFieldsZod","bridgeCommonFields","parse","bridgeObservationFields","bridgeObservation","schema","fields","build","json","requestHandlerValidator","assertEx","hexToBigInt","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","maxBridgeAmount","minBridgeAmount","getBridgeSettings","hexToBigInt","status","send","bridgeIntent","transfer","generateBridgeEstimate","sender","toAddress","viewer","assertEx","connection","Error","currentBlockNumber","nbf","toXL1BlockNumber","exp","txBw","buildUnsignedTransaction","json","requestHandlerValidator","assertEx","hexToBigInt","toAddress","toHex","PayloadZodStrictOfSchema","BridgeIntentFieldsZod","BridgeIntentSchema","buildUnsignedTransaction","toXL1BlockNumber","TransactionBoundWitnessZod","TransferZod","z","BridgeToRemoteMaxEstimateBodyZod","BridgeIntentFieldsZod","pick","destAddress","srcAddress","srcAmount","BridgeToRemoteMaxEstimateResponseZod","z","tuple","TransactionBoundWitnessZod","PayloadZodStrictOfSchema","BridgeIntentSchema","extend","shape","TransferZod","makeBridgeToRemoteMaxEstimateRoute","config","gateway","params","object","chainId","getRemoteChainIdZod","validateRequest","requestHandlerValidator","body","response","method","path","handlers","req","res","feeFixed","feeRateBasisPoints","maxBridgeAmount","configMax","xl1ChainId","getBridgeSettings","balance","balanceMax","calculateMaxBridgeAmount","toHex","hexToBigInt","bridgeIntent","transfer","generateBridgeEstimate","sender","toAddress","viewer","assertEx","connection","Error","currentBlockNumber","nbf","toXL1BlockNumber","exp","txBw","buildUnsignedTransaction","json","requestHandlerValidator","asHex","isDefined","PayloadBuilder","PayloadZodStrictOfSchema","asBridgeIntent","BridgeDestinationObservationFieldsZod","BridgeDestinationObservationSchema","BridgeIntentFieldsZod","BridgeIntentSchema","BridgeSourceObservationFieldsZod","BridgeSourceObservationSchema","isBridgeIntent","z","BridgeIntentResponseZod","PayloadZodStrictOfSchema","BridgeIntentSchema","extend","BridgeIntentFieldsZod","shape","BridgeSourceResponseZod","BridgeSourceObservationSchema","BridgeSourceObservationFieldsZod","BridgeDestinationResponseZod","BridgeDestinationObservationSchema","BridgeDestinationObservationFieldsZod","BridgeToRemoteStatusResponseZod","z","union","tuple","makeBridgeToRemoteStatusRoute","config","params","object","chainId","getRemoteChainIdZod","nonce","string","nonempty","validateRequest","requestHandlerValidator","response","method","path","handlers","req","res","jobId","result","queues","getXl1ToEthQueues","statusQueueJobs","getStatusQueueJobs","tx","offChainPayloads","xl1ToEthBridgeParentJob","data","sendStatus","allPayloads","bridgeIntent","find","isBridgeIntent","asBridgeIntent","PayloadBuilder","omitMeta","xl1TransactionMonitorJob","xl1MonitorState","getState","undefined","srcConfirmation","returnvalue","submissionHash","isDefined","schema","bridgeSourceObservationFields","parse","observation","ethTransactionMonitorJob","ethMonitorState","destConfirmation","asHex","bridgeDestinationObservationFields","json","getRouteDefinitions","config","gateway","makeBridgeConfigRoute","makeBridgeToRemoteEstimateRoute","makeBridgeToRemoteMaxEstimateRoute","makeBridgeToRemoteRoute","makeBridgeToRemoteStatusRoute","makeBridgeFromRemoteStatusRoute","addBridgeRoutes","app","config","gateway","routeDefinitions","getRouteDefinitions","definition","method","path","handlers","addRoutes","app","config","gateway","addProbeRoutes","addBridgeRoutes","getApp","config","gateway","addInstrumentation","app","express","sharedMiddleware","addFlowProducer","addRoutes","use","standardErrors","assertEx","initEvmProvider","resolveWalletForActor","BridgeableToken__factory","LiquidityPoolBridge__factory","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","accountPath","account","resolveWalletForActor","name","wallet","Wallet","bridgeableToken","BridgeableToken__factory","connect","getAddress","bridge","LiquidityPoolBridge__factory","bridgeOwner","owner","assertEx","toLowerCase","address","addWorkers","config","services","connection","getConnection","telemetry","getTelemetry","createWorkers","hostname","getServer","context","gateway","logger","config","port","app","getApp","services","getServices","addWorkers","server","Promise","resolve","reject","srv","listen","log","once","setTimeout","BridgeActor","ActorV3","needs","required","XyoGatewayRunnerMoniker","XyoViewerMoniker","_gatewayRunner","_balanceMonitor","_queueMetrics","server","gatewayRunner","createHandler","locator","getInstance","startHandler","stopServer","startServer","stopHandler","stop","undefined","context","asBridgeConfigContext","services","getServer","meter","createBalanceMonitor","account","bridge","bridgeableToken","gateway","provider","wallet","start","queues","getXl1ToEthQueues","config","createQueueMetrics","close"]}
|