@xyo-network/chain-bridge 1.15.2 → 1.15.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/README.md +1 -1
  2. package/dist/node/driver/indexer/ChainHydratedBlocksObservable.d.ts +4 -4
  3. package/dist/node/driver/indexer/ChainHydratedBlocksObservable.d.ts.map +1 -1
  4. package/dist/node/driver/mongo/MongoMap.d.ts +3 -2
  5. package/dist/node/driver/mongo/MongoMap.d.ts.map +1 -1
  6. package/dist/node/index.mjs +300 -683
  7. package/dist/node/index.mjs.map +1 -1
  8. package/dist/node/interface/interface/IntentIndexerInterface.d.ts +5 -3
  9. package/dist/node/interface/interface/IntentIndexerInterface.d.ts.map +1 -1
  10. package/dist/node/interface/service/Observer/ERC20TransferObserver/ERC20TransferObserver.d.ts +28 -0
  11. package/dist/node/interface/service/Observer/ERC20TransferObserver/ERC20TransferObserver.d.ts.map +1 -0
  12. package/dist/node/interface/service/Observer/ERC20TransferObserver/index.d.ts +2 -0
  13. package/dist/node/interface/service/Observer/ERC20TransferObserver/index.d.ts.map +1 -0
  14. package/dist/node/interface/service/Observer/ERC20TransferObserver/spec/ERC20TransferObserver.spec.d.ts +2 -0
  15. package/dist/node/interface/service/Observer/ERC20TransferObserver/spec/ERC20TransferObserver.spec.d.ts.map +1 -0
  16. package/dist/node/interface/service/Observer/LiquidityPoolBridgeObserver/LiquidityPoolBridgeObserver.d.ts +36 -0
  17. package/dist/node/interface/service/Observer/LiquidityPoolBridgeObserver/LiquidityPoolBridgeObserver.d.ts.map +1 -0
  18. package/dist/node/interface/service/Observer/LiquidityPoolBridgeObserver/index.d.ts +2 -0
  19. package/dist/node/interface/service/Observer/LiquidityPoolBridgeObserver/index.d.ts.map +1 -0
  20. package/dist/node/interface/service/Observer/LiquidityPoolBridgeObserver/spec/LiquidityPoolBridgeObserver.spec.d.ts +2 -0
  21. package/dist/node/interface/service/Observer/LiquidityPoolBridgeObserver/spec/LiquidityPoolBridgeObserver.spec.d.ts.map +1 -0
  22. package/dist/node/interface/service/Observer/Observer.d.ts +1 -1
  23. package/dist/node/interface/service/Observer/Observer.d.ts.map +1 -1
  24. package/dist/node/interface/service/{ChainBridgeRelay → Relay/ChainBridgeRelay}/ChainBridgeRelayInterface.d.ts +1 -1
  25. package/dist/node/interface/service/Relay/ChainBridgeRelay/ChainBridgeRelayInterface.d.ts.map +1 -0
  26. package/dist/node/interface/service/{ChainBridgeRelay → Relay/ChainBridgeRelay}/ChainBridgeRelayService.d.ts +1 -1
  27. package/dist/node/interface/service/Relay/ChainBridgeRelay/ChainBridgeRelayService.d.ts.map +1 -0
  28. package/dist/node/interface/service/Relay/ChainBridgeRelay/index.d.ts.map +1 -0
  29. package/dist/node/interface/service/Relay/ChainBridgeRelay/spec/ChainBridgeRelayService.spec.d.ts.map +1 -0
  30. package/dist/node/interface/service/Relay/LiquidityPoolBridgeRelay/LiquidityPoolBridgeRelay.d.ts +57 -0
  31. package/dist/node/interface/service/Relay/LiquidityPoolBridgeRelay/LiquidityPoolBridgeRelay.d.ts.map +1 -0
  32. package/dist/node/interface/service/Relay/LiquidityPoolBridgeRelay/index.d.ts +2 -0
  33. package/dist/node/interface/service/Relay/LiquidityPoolBridgeRelay/index.d.ts.map +1 -0
  34. package/dist/node/interface/service/Relay/LiquidityPoolBridgeRelay/spec/LiquidityPoolBridgeRelay.spec.d.ts +2 -0
  35. package/dist/node/interface/service/Relay/LiquidityPoolBridgeRelay/spec/LiquidityPoolBridgeRelay.spec.d.ts.map +1 -0
  36. package/dist/node/interface/service/Relay/index.d.ts +2 -0
  37. package/dist/node/interface/service/Relay/index.d.ts.map +1 -0
  38. package/dist/node/interface/service/index.d.ts +1 -1
  39. package/dist/node/interface/service/index.d.ts.map +1 -1
  40. package/dist/node/manifest/getLocator.d.ts.map +1 -1
  41. package/dist/node/manifest/public/index.d.ts +6 -2
  42. package/dist/node/manifest/public/index.d.ts.map +1 -1
  43. package/dist/node/server/app.d.ts +1 -2
  44. package/dist/node/server/app.d.ts.map +1 -1
  45. package/dist/node/server/routes/addRoutes.d.ts.map +1 -1
  46. package/dist/node/server/routes/bridge/addBridgeRoutes.d.ts +3 -0
  47. package/dist/node/server/routes/bridge/addBridgeRoutes.d.ts.map +1 -0
  48. package/dist/node/server/routes/bridge/index.d.ts +2 -0
  49. package/dist/node/server/routes/bridge/index.d.ts.map +1 -0
  50. package/dist/node/server/routes/bridge/middleware/index.d.ts +2 -0
  51. package/dist/node/server/routes/bridge/middleware/index.d.ts.map +1 -0
  52. package/dist/node/server/routes/bridge/middleware/requestHandlerValidator.d.ts +32 -0
  53. package/dist/node/server/routes/bridge/middleware/requestHandlerValidator.d.ts.map +1 -0
  54. package/dist/node/server/routes/bridge/routeDefinitions/getRouteDefinitions.d.ts +3 -0
  55. package/dist/node/server/routes/bridge/routeDefinitions/getRouteDefinitions.d.ts.map +1 -0
  56. package/dist/node/server/routes/bridge/routeDefinitions/index.d.ts +2 -0
  57. package/dist/node/server/routes/bridge/routeDefinitions/index.d.ts.map +1 -0
  58. package/dist/node/server/routes/bridge/routeDefinitions/pathParams/ChainIdPathParam.d.ts +6 -0
  59. package/dist/node/server/routes/bridge/routeDefinitions/pathParams/ChainIdPathParam.d.ts.map +1 -0
  60. package/dist/node/server/routes/bridge/routeDefinitions/pathParams/index.d.ts +2 -0
  61. package/dist/node/server/routes/bridge/routeDefinitions/pathParams/index.d.ts.map +1 -0
  62. package/dist/node/server/routes/bridge/routeDefinitions/routeDefinition.d.ts +8 -0
  63. package/dist/node/server/routes/bridge/routeDefinitions/routeDefinition.d.ts.map +1 -0
  64. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeFromRemoteStatus.d.ts +3 -0
  65. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeFromRemoteStatus.d.ts.map +1 -0
  66. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.d.ts +3 -0
  67. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.d.ts.map +1 -0
  68. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.d.ts +3 -0
  69. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.d.ts.map +1 -0
  70. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.d.ts +3 -0
  71. package/dist/node/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.d.ts.map +1 -0
  72. package/dist/node/server/routes/bridge/routeDefinitions/routes/index.d.ts +5 -0
  73. package/dist/node/server/routes/bridge/routeDefinitions/routes/index.d.ts.map +1 -0
  74. package/dist/node/server/routes/healthz/get.d.ts +2 -1
  75. package/dist/node/server/routes/healthz/get.d.ts.map +1 -1
  76. package/dist/node/server/routes/index.d.ts +0 -1
  77. package/dist/node/server/routes/index.d.ts.map +1 -1
  78. package/dist/node/server/server.d.ts.map +1 -1
  79. package/package.json +62 -55
  80. package/src/driver/indexer/ChainHydratedBlocksObservable.ts +5 -5
  81. package/src/driver/indexer/spec/ChainBlocksObservable.spec.ts +6 -3
  82. package/src/driver/indexer/spec/ChainHydratedBlocksObservable.spec.ts +10 -4
  83. package/src/driver/mongo/MongoMap.ts +13 -3
  84. package/src/interface/interface/IntentIndexerInterface.ts +5 -4
  85. package/src/interface/service/Observer/ERC20TransferObserver/ERC20TransferObserver.ts +181 -0
  86. package/src/interface/service/Observer/ERC20TransferObserver/index.ts +1 -0
  87. package/src/interface/service/Observer/ERC20TransferObserver/spec/ERC20TransferObserver.spec.ts +271 -0
  88. package/src/interface/service/Observer/LiquidityPoolBridgeObserver/LiquidityPoolBridgeObserver.ts +212 -0
  89. package/src/interface/service/Observer/LiquidityPoolBridgeObserver/index.ts +1 -0
  90. package/src/interface/service/Observer/LiquidityPoolBridgeObserver/spec/LiquidityPoolBridgeObserver.spec.ts +313 -0
  91. package/src/interface/service/Observer/Observer.ts +1 -1
  92. package/src/interface/service/{ChainBridgeRelay → Relay/ChainBridgeRelay}/ChainBridgeRelayInterface.ts +1 -1
  93. package/src/interface/service/{ChainBridgeRelay → Relay/ChainBridgeRelay}/ChainBridgeRelayService.ts +1 -1
  94. package/src/interface/service/{ChainBridgeRelay → Relay/ChainBridgeRelay}/spec/ChainBridgeRelayService.spec.ts +7 -5
  95. package/src/interface/service/Relay/LiquidityPoolBridgeRelay/LiquidityPoolBridgeRelay.ts +227 -0
  96. package/src/interface/service/Relay/LiquidityPoolBridgeRelay/index.ts +1 -0
  97. package/src/interface/service/Relay/LiquidityPoolBridgeRelay/spec/LiquidityPoolBridgeRelay.spec.ts +237 -0
  98. package/src/interface/service/Relay/index.ts +1 -0
  99. package/src/interface/service/index.ts +1 -1
  100. package/src/manifest/getLocator.ts +7 -6
  101. package/src/manifest/node.json +1 -1
  102. package/src/manifest/public/Chain.json +3 -109
  103. package/src/manifest/public/Ethereum.json +88 -0
  104. package/src/manifest/public/XL1.json +88 -0
  105. package/src/manifest/public/index.ts +15 -6
  106. package/src/server/app.ts +5 -12
  107. package/src/server/routes/addRoutes.ts +2 -6
  108. package/src/server/routes/bridge/addBridgeRoutes.ts +10 -0
  109. package/src/server/routes/bridge/index.ts +1 -0
  110. package/src/server/routes/bridge/middleware/index.ts +1 -0
  111. package/src/server/routes/bridge/middleware/requestHandlerValidator.ts +120 -0
  112. package/src/server/routes/bridge/routeDefinitions/getRouteDefinitions.ts +13 -0
  113. package/src/server/routes/bridge/routeDefinitions/index.ts +1 -0
  114. package/src/server/routes/bridge/routeDefinitions/pathParams/ChainIdPathParam.ts +18 -0
  115. package/src/server/routes/bridge/routeDefinitions/pathParams/index.ts +1 -0
  116. package/src/server/routes/bridge/routeDefinitions/routeDefinition.ts +18 -0
  117. package/src/server/routes/bridge/routeDefinitions/routes/bridgeFromRemoteStatus.ts +55 -0
  118. package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemote.ts +58 -0
  119. package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteEstimate.ts +83 -0
  120. package/src/server/routes/bridge/routeDefinitions/routes/bridgeToRemoteStatus.ts +55 -0
  121. package/src/server/routes/bridge/routeDefinitions/routes/index.ts +4 -0
  122. package/src/server/routes/healthz/get.ts +1 -1
  123. package/src/server/routes/index.ts +0 -2
  124. package/src/server/server.ts +11 -14
  125. package/dist/node/interface/service/ChainBridgeRelay/ChainBridgeRelayInterface.d.ts.map +0 -1
  126. package/dist/node/interface/service/ChainBridgeRelay/ChainBridgeRelayService.d.ts.map +0 -1
  127. package/dist/node/interface/service/ChainBridgeRelay/index.d.ts.map +0 -1
  128. package/dist/node/interface/service/ChainBridgeRelay/spec/ChainBridgeRelayService.spec.d.ts.map +0 -1
  129. package/dist/node/server/routes/rpc/index.d.ts +0 -2
  130. package/dist/node/server/routes/rpc/index.d.ts.map +0 -1
  131. package/dist/node/server/routes/rpc/routes/addRpcRoutes.d.ts +0 -3
  132. package/dist/node/server/routes/rpc/routes/addRpcRoutes.d.ts.map +0 -1
  133. package/dist/node/server/routes/rpc/routes/index.d.ts +0 -2
  134. package/dist/node/server/routes/rpc/routes/index.d.ts.map +0 -1
  135. package/src/manifest/public/Pending.json +0 -35
  136. package/src/server/routes/rpc/index.ts +0 -1
  137. package/src/server/routes/rpc/routes/addRpcRoutes.ts +0 -22
  138. package/src/server/routes/rpc/routes/index.ts +0 -1
  139. /package/dist/node/interface/service/{ChainBridgeRelay → Relay/ChainBridgeRelay}/index.d.ts +0 -0
  140. /package/dist/node/interface/service/{ChainBridgeRelay → Relay/ChainBridgeRelay}/spec/ChainBridgeRelayService.spec.d.ts +0 -0
  141. /package/src/interface/service/{ChainBridgeRelay → Relay/ChainBridgeRelay}/index.ts +0 -0
@@ -1,11 +1,7 @@
1
1
  import type { Express } from 'express'
2
2
 
3
- import { addNodeRoutes } from './address/index.ts'
4
- import { addDataLakeRoutes } from './dataLake/index.ts'
5
- import { addRpcRoutes } from './rpc/index.ts'
3
+ import { addBridgeRoutes } from './bridge/index.ts'
6
4
 
7
5
  export const addRoutes = (app: Express) => {
8
- addRpcRoutes(app)
9
- addDataLakeRoutes(app)
10
- addNodeRoutes(app)
6
+ addBridgeRoutes(app)
11
7
  }
@@ -0,0 +1,10 @@
1
+ import type { Express } from 'express'
2
+
3
+ import { getRouteDefinitions } from './routeDefinitions/index.ts'
4
+
5
+ export const addBridgeRoutes = (app: Express) => {
6
+ const routeDefinitions = getRouteDefinitions()
7
+ for (const definition of routeDefinitions) {
8
+ app[definition.method](definition.path, definition.handlers)
9
+ }
10
+ }
@@ -0,0 +1 @@
1
+ export * from './addBridgeRoutes.ts'
@@ -0,0 +1 @@
1
+ export * from './requestHandlerValidator.ts'
@@ -0,0 +1,120 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import type { ExpressError } from '@xylabs/express'
3
+ import { isPromise } from '@xylabs/typeof'
4
+ import type {
5
+ NextFunction, Request, RequestHandler, Response,
6
+ } from 'express'
7
+ import { ReasonPhrases, StatusCodes } from 'http-status-codes'
8
+ import type { ZodType } from 'zod'
9
+ import { z } from 'zod'
10
+
11
+ /**
12
+ * Empty Zod schema for requests with no parameters.
13
+ */
14
+ export const EmptyParamsZod = z.object({}).catchall(z.string())
15
+
16
+ /**
17
+ * Empty Zod schema for requests with no query parameters.
18
+ */
19
+ export const EmptyQueryParamsZod = z.object({}).catchall(z.union([z.string(), z.array(z.string())]))
20
+
21
+ /**
22
+ * Default validation schemas for request handler validator.
23
+ */
24
+ export const ValidateRequestDefaults = {
25
+ params: EmptyParamsZod,
26
+ query: EmptyQueryParamsZod,
27
+ body: z.json(),
28
+ response: z.json(),
29
+ }
30
+
31
+ type ValidatableRequestKey = 'params' | 'query' | 'body'
32
+
33
+ /**
34
+ * Factory for Express middleware that validates request and response objects using Zod schemas.
35
+ * @param schemas The Zod schemas to use for validation.
36
+ * @returns A middleware function for validating requests and responses.
37
+ */
38
+ export function requestHandlerValidator<
39
+ TParams extends typeof EmptyQueryParamsZod | ZodType<Record<string, string>> = typeof EmptyQueryParamsZod,
40
+ TQuery extends typeof EmptyQueryParamsZod | ZodType<Record<string, string | string[]>> = typeof EmptyQueryParamsZod,
41
+ TBody extends ZodType<unknown> = ZodType<unknown>,
42
+ TResponse extends ZodType<unknown> = ZodType<unknown>,
43
+ >(schemas?: Partial<{
44
+ body: TBody
45
+ params: TParams
46
+ query: TQuery
47
+ response: TResponse
48
+ }>) {
49
+ type Params = z.infer<TParams>
50
+ type Query = z.infer<TQuery>
51
+ type Body = z.infer<TBody>
52
+ type Res = z.infer<TResponse>
53
+ const validators = { ...ValidateRequestDefaults, ...schemas }
54
+
55
+ return (handler: (req: Request<Params, Res, Body, Query>, res: Response<Res>, next: NextFunction) => unknown): RequestHandler => {
56
+ return async (req: Request, res: Response, next: NextFunction) => {
57
+ const originalJson = res.json.bind(res)
58
+ try {
59
+ // Validate incoming request
60
+ const errors: string[] = []
61
+ const keys: ValidatableRequestKey[] = ['params', 'query', 'body']
62
+ for (const key of keys) {
63
+ const validator = validators[key]
64
+ const result = validator.safeParse(req[key])
65
+ if (result.success) {
66
+ Object.assign(req[key], result.data)
67
+ } else {
68
+ errors.push(
69
+ ...result.error.issues.map(
70
+ issue => (issue.path.length === 0)
71
+ ? `${key}: ${issue.message}`
72
+ : `${key}.${issue.path.join('.')}: ${issue.message}`,
73
+ ),
74
+ )
75
+ }
76
+ }
77
+
78
+ // If there were validation errors, short-circuit and return Bad Request
79
+ if (errors.length > 0) {
80
+ const message = errors.join('; ')
81
+ const err: ExpressError = new Error(message)
82
+ err.name = ReasonPhrases.BAD_REQUEST
83
+ err.statusCode = StatusCodes.BAD_REQUEST
84
+ next(err)
85
+ return false
86
+ }
87
+
88
+ // Wrap res.json to validate outgoing response
89
+ res.json = (data: any) => {
90
+ const result = validators.response.safeParse(data)
91
+ if (result.success) {
92
+ return originalJson(result.data)
93
+ } else {
94
+ const message = result.error.issues.map(
95
+ issue => (issue.path.length === 0)
96
+ ? `response: ${issue.message}`
97
+ : `response.${issue.path.join('.')}: ${issue.message}`,
98
+ ).join('; ')
99
+ const err: ExpressError = new Error(message)
100
+ err.name = ReasonPhrases.INTERNAL_SERVER_ERROR
101
+ err.statusCode = StatusCodes.INTERNAL_SERVER_ERROR
102
+
103
+ // Restore original json function in case the error handler wants to use it
104
+ res.json = originalJson
105
+ throw err
106
+ }
107
+ }
108
+
109
+ // Automatically handle async errors
110
+ const result = handler(req as any, res as any, next)
111
+ if (result && isPromise(result)) {
112
+ await result
113
+ }
114
+ } catch (err) {
115
+ res.json = originalJson
116
+ next(err)
117
+ }
118
+ }
119
+ }
120
+ }
@@ -0,0 +1,13 @@
1
+ import type { RouteDefinition } from './routeDefinition.ts'
2
+ import {
3
+ bridgeFromRemoteStatus, bridgeToRemote, bridgeToRemoteEstimate, bridgeToRemoteStatus,
4
+ } from './routes/index.ts'
5
+
6
+ export const getRouteDefinitions = (): RouteDefinition[] => {
7
+ return [
8
+ bridgeFromRemoteStatus,
9
+ bridgeToRemote,
10
+ bridgeToRemoteEstimate,
11
+ bridgeToRemoteStatus,
12
+ ]
13
+ }
@@ -0,0 +1 @@
1
+ export * from './getRouteDefinitions.ts'
@@ -0,0 +1,18 @@
1
+ import {
2
+ hexFromHexString, HexZod, isAddress, toAddress,
3
+ } from '@xylabs/hex'
4
+ import { isUndefined } from '@xylabs/typeof'
5
+ import type { ChainId } from '@xyo-network/xl1-protocol'
6
+
7
+ const remoteChainId: ChainId = toAddress('0x01')
8
+
9
+ export const ChainIdPathParam = HexZod.refine(
10
+ (val) => {
11
+ const chainIdHex = hexFromHexString(val, { prefix: true })
12
+ if (isAddress(chainIdHex)) return false
13
+ const suppliedChainId = toAddress(chainIdHex)
14
+ if (isUndefined(suppliedChainId)) return false
15
+ return suppliedChainId === remoteChainId
16
+ },
17
+ { message: `Only ${remoteChainId} is supported` },
18
+ )
@@ -0,0 +1 @@
1
+ export * from './ChainIdPathParam.ts'
@@ -0,0 +1,18 @@
1
+ import type { RequestHandler } from 'express'
2
+
3
+ export type HttpMethod
4
+ = | 'get'
5
+ | 'post'
6
+ | 'put'
7
+ | 'patch'
8
+ | 'delete'
9
+ | 'options'
10
+ | 'head'
11
+
12
+ export interface RouteDefinition<
13
+ H extends RequestHandler = RequestHandler,
14
+ > {
15
+ handlers: H[] | H
16
+ method: HttpMethod
17
+ path: string | RegExp
18
+ }
@@ -0,0 +1,55 @@
1
+ import { toAddress, toHex } from '@xylabs/hex'
2
+ import { PayloadZodStrictOfSchema } from '@xyo-network/payload-model'
3
+ import type { BridgeDestinationObservation } from '@xyo-network/xl1-protocol'
4
+ import {
5
+ BridgeDestinationObservationFieldsZod,
6
+ BridgeDestinationObservationSchema,
7
+ } from '@xyo-network/xl1-protocol'
8
+ import { z } from 'zod'
9
+
10
+ import { requestHandlerValidator } from '../../middleware/index.ts'
11
+ import { ChainIdPathParam } from '../pathParams/index.ts'
12
+ import type { RouteDefinition } from '../routeDefinition.ts'
13
+
14
+ const params = z.object({
15
+ chainId: ChainIdPathParam,
16
+ nonce: z.string(),
17
+ })
18
+ const response = PayloadZodStrictOfSchema(BridgeDestinationObservationSchema).extend(
19
+ BridgeDestinationObservationFieldsZod.shape,
20
+ )
21
+
22
+ const validateRequest = requestHandlerValidator({
23
+ params,
24
+ response,
25
+ })
26
+
27
+ export const bridgeFromRemoteStatus: RouteDefinition = {
28
+ method: 'get',
29
+ path: '/bridge/chains/:chainId/bridgeFromRemote/status/:nonce',
30
+ handlers: validateRequest(async (req, res) => {
31
+ const { chainId } = req.params
32
+ const rand = await Promise.resolve(Math.random())
33
+
34
+ // TODO: Replace with actual lookup logic (e.g. database or chain query)
35
+ const found = rand > 0.5 // simulate lookup
36
+ if (!found) return res.sendStatus(404)
37
+
38
+ const confirmed = rand > 0.8 // simulate pending/confirmed
39
+ if (!confirmed) return res.sendStatus(204)
40
+
41
+ const observation: BridgeDestinationObservation = {
42
+ schema: BridgeDestinationObservationSchema,
43
+ dest: chainId,
44
+ destAddress: toAddress('0xabc'),
45
+ destAmount: toHex('0x100'),
46
+ destToken: toAddress('0xdef'),
47
+ src: toAddress('0x02'),
48
+ srcAddress: toAddress('0x123'),
49
+ srcAmount: toHex('0x200'),
50
+ srcToken: toHex('0x456'),
51
+ destConfirmation: toHex('0x9999'),
52
+ }
53
+ res.json(observation)
54
+ }),
55
+ }
@@ -0,0 +1,58 @@
1
+ import { asHash, toAddress } from '@xylabs/hex'
2
+ import { PayloadBuilder } from '@xyo-network/payload-builder'
3
+ import { PayloadZodLooseOfSchema, PayloadZodStrictOfSchema } from '@xyo-network/payload-model'
4
+ import type {
5
+ BridgeSourceObservation, BridgeSourceObservationFields, ChainId,
6
+ } from '@xyo-network/xl1-protocol'
7
+ import {
8
+ BridgeIntentFieldsZod,
9
+ BridgeIntentSchema,
10
+ BridgeSourceObservationFieldsZod,
11
+ BridgeSourceObservationSchema,
12
+ TransferSchema,
13
+ } from '@xyo-network/xl1-protocol'
14
+ import { z } from 'zod'
15
+
16
+ import { requestHandlerValidator } from '../../middleware/index.ts'
17
+ import { ChainIdPathParam } from '../pathParams/index.ts'
18
+ import type { RouteDefinition } from '../routeDefinition.ts'
19
+
20
+ // TODO: Replace with actual chain logic / contract integration
21
+ const remoteChainId: ChainId = toAddress('0x01')
22
+
23
+ const params = z.object({ chainId: ChainIdPathParam })
24
+ const body = z.tuple([
25
+ // TODO: TransactionBoundWitness
26
+ PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),
27
+ PayloadZodLooseOfSchema(TransferSchema),
28
+ ])
29
+ const response = PayloadZodStrictOfSchema(BridgeSourceObservationSchema).extend(BridgeSourceObservationFieldsZod.shape)
30
+
31
+ const validateRequest = requestHandlerValidator({
32
+ params,
33
+ body,
34
+ response,
35
+ })
36
+
37
+ export const bridgeToRemote: RouteDefinition = {
38
+ method: 'post',
39
+ path: '/bridge/chains/:chainId/bridgeToRemote',
40
+ handlers: validateRequest(async (req, res) => {
41
+ const { body } = req
42
+ const [bridgeIntent, transfer] = body
43
+ // TODO: Execute bridge transaction on-chain
44
+ const srcConfirmation = await Promise.resolve(asHash('0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'))
45
+
46
+ // Extract common fields for BridgeSourceObservation from BridgeIntent
47
+ const bridgeCommonFieldsZod = z.object({}).extend(BridgeSourceObservationFieldsZod.shape)
48
+ const bridgeCommonFields = bridgeCommonFieldsZod.parse(bridgeIntent)
49
+ const bridgeObservationFields: BridgeSourceObservationFields = {
50
+ ...bridgeCommonFields,
51
+ srcConfirmation,
52
+ }
53
+ const bridgeObservation: BridgeSourceObservation = new PayloadBuilder<BridgeSourceObservation>(
54
+ { schema: BridgeSourceObservationSchema },
55
+ ).fields(bridgeObservationFields).build()
56
+ res.json(bridgeObservation)
57
+ }),
58
+ }
@@ -0,0 +1,83 @@
1
+ import {
2
+ hexToBigInt, toAddress, toHex,
3
+ } from '@xylabs/hex'
4
+ import { createTransferPayload } from '@xyo-network/chain-protocol'
5
+ import { PayloadBuilder } from '@xyo-network/payload-builder'
6
+ import { PayloadZodLooseOfSchema, PayloadZodStrictOfSchema } from '@xyo-network/payload-model'
7
+ import type {
8
+ BridgeIntent, BridgeIntentFields, ChainId, Transfer,
9
+ } from '@xyo-network/xl1-protocol'
10
+ import {
11
+ BridgeIntentFieldsZod, BridgeIntentSchema, TransferSchema,
12
+ } from '@xyo-network/xl1-protocol'
13
+ import { v4 } from 'uuid'
14
+ import { z } from 'zod'
15
+
16
+ import { requestHandlerValidator } from '../../middleware/index.ts'
17
+ import { ChainIdPathParam } from '../pathParams/index.ts'
18
+ import type { RouteDefinition } from '../routeDefinition.ts'
19
+
20
+ // TODO: Get from config
21
+ const TOKEN_ADDRESS = '0x5FbDB2315678afecb367f032d93F642f64180aa3'
22
+ const bridgeableTokenContract = toHex(TOKEN_ADDRESS)
23
+ const xl1ChainId: ChainId = toAddress('0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9')
24
+ const fixedFee: bigint = 1_000_000_000_000_000n
25
+ const percentFee: bigint = 5n // 0.5%
26
+ const bridgeEscrowAddress = toAddress('0x0a')
27
+ const bridgeFeesAddress = toAddress('0x0b')
28
+ const remoteChainId: ChainId = toHex('0x01')
29
+
30
+ const params = z.object({ chainId: ChainIdPathParam })
31
+ const body = BridgeIntentFieldsZod.pick({
32
+ destAddress: true,
33
+ srcAddress: true,
34
+ srcAmount: true,
35
+ })
36
+ const response = z.tuple([
37
+ PayloadZodStrictOfSchema(BridgeIntentSchema).extend(BridgeIntentFieldsZod.shape),
38
+ PayloadZodLooseOfSchema(TransferSchema),
39
+ ])
40
+ const validateRequest = requestHandlerValidator({
41
+ params, body, response,
42
+ })
43
+
44
+ export const bridgeToRemoteEstimate: RouteDefinition = {
45
+ method: 'post',
46
+ path: '/bridge/chains/:chainId/bridgeToRemote/estimate',
47
+ handlers: validateRequest((req, res) => {
48
+ const {
49
+ srcAddress, srcAmount, destAddress,
50
+ } = req.body
51
+
52
+ const srcAmountBigInt = hexToBigInt(srcAmount)
53
+ const feeAmount = fixedFee + ((srcAmountBigInt * percentFee) / 100n)
54
+ const destAmountBigInt = srcAmountBigInt > feeAmount ? srcAmountBigInt - feeAmount : 0n
55
+ const destAmount = toHex(destAmountBigInt)
56
+ const nonce = v4()
57
+
58
+ const sender = toAddress(srcAddress)
59
+
60
+ const bridgeIntentFields: BridgeIntentFields = {
61
+ // Source
62
+ src: xl1ChainId,
63
+ srcAddress,
64
+ srcAmount,
65
+ srcToken: xl1ChainId,
66
+
67
+ // Destination
68
+ dest: remoteChainId,
69
+ destAddress,
70
+ destAmount,
71
+ destToken: bridgeableTokenContract,
72
+ nonce,
73
+ }
74
+ const bridgeIntent: BridgeIntent = new PayloadBuilder<BridgeIntent>({ schema: BridgeIntentSchema }).fields(bridgeIntentFields).build()
75
+
76
+ const transfer: Transfer = createTransferPayload(sender, {
77
+ [bridgeEscrowAddress]: destAmountBigInt,
78
+ [bridgeFeesAddress]: feeAmount,
79
+ })
80
+
81
+ res.json([bridgeIntent, transfer])
82
+ }),
83
+ }
@@ -0,0 +1,55 @@
1
+ import { toAddress, toHex } from '@xylabs/hex'
2
+ import { PayloadZodStrictOfSchema } from '@xyo-network/payload-model'
3
+ import type { BridgeDestinationObservation } from '@xyo-network/xl1-protocol'
4
+ import {
5
+ BridgeDestinationObservationFieldsZod,
6
+ BridgeDestinationObservationSchema,
7
+ } from '@xyo-network/xl1-protocol'
8
+ import { z } from 'zod'
9
+
10
+ import { requestHandlerValidator } from '../../middleware/index.ts'
11
+ import { ChainIdPathParam } from '../pathParams/index.ts'
12
+ import type { RouteDefinition } from '../routeDefinition.ts'
13
+
14
+ const params = z.object({
15
+ chainId: ChainIdPathParam,
16
+ nonce: z.string(),
17
+ })
18
+ const response = PayloadZodStrictOfSchema(BridgeDestinationObservationSchema).extend(
19
+ BridgeDestinationObservationFieldsZod.shape,
20
+ )
21
+
22
+ const validateRequest = requestHandlerValidator({
23
+ params,
24
+ response,
25
+ })
26
+
27
+ export const bridgeToRemoteStatus: RouteDefinition = {
28
+ method: 'get',
29
+ path: '/bridge/chains/:chainId/bridgeToRemote/status/:nonce',
30
+ handlers: validateRequest(async (req, res) => {
31
+ const { chainId } = req.params
32
+ const rand = await Promise.resolve(Math.random())
33
+
34
+ // TODO: Replace with actual lookup logic (e.g. database or chain query)
35
+ const found = rand > 0.5 // simulate lookup
36
+ if (!found) return res.sendStatus(404)
37
+
38
+ const confirmed = rand > 0.8 // simulate pending/confirmed
39
+ if (!confirmed) return res.sendStatus(204)
40
+
41
+ const observation: BridgeDestinationObservation = {
42
+ schema: BridgeDestinationObservationSchema,
43
+ dest: chainId,
44
+ destAddress: toAddress('0xabc'),
45
+ destAmount: toHex('0x100'),
46
+ destToken: toAddress('0xdef'),
47
+ src: toAddress('0x02'),
48
+ srcAddress: toAddress('0x123'),
49
+ srcAmount: toHex('0x200'),
50
+ srcToken: toHex('0x456'),
51
+ destConfirmation: toHex('0x9999'),
52
+ }
53
+ res.json(observation)
54
+ }),
55
+ }
@@ -0,0 +1,4 @@
1
+ export * from './bridgeFromRemoteStatus.ts'
2
+ export * from './bridgeToRemote.ts'
3
+ export * from './bridgeToRemoteEstimate.ts'
4
+ export * from './bridgeToRemoteStatus.ts'
@@ -17,4 +17,4 @@ const handler: RequestHandler<NoReqParams> = (_req, res) => {
17
17
  res.status(200).send(data)
18
18
  }
19
19
 
20
- export const getHealthz = handler
20
+ export const getHealthz: RequestHandler<NoReqParams> = handler
@@ -1,5 +1,3 @@
1
1
  export * from './address/index.ts'
2
- // export * from './hash.ts'
3
2
  export * from './addRoutes.ts'
4
3
  export * from './healthz/index.ts'
5
- export * from './rpc/index.ts'
@@ -1,13 +1,11 @@
1
1
  import { assertEx } from '@xylabs/assert'
2
2
  import type { Logger } from '@xylabs/logger'
3
- import { isDefined, isString } from '@xylabs/typeof'
4
- import { boot } from '@xyo-network/bios'
3
+ import { isString } from '@xylabs/typeof'
5
4
  import type { BiosExternalInterface } from '@xyo-network/bios-model'
6
5
  import type { NodeInstance } from '@xyo-network/node-model'
7
6
  import { HDWallet } from '@xyo-network/wallet'
8
7
  import { type Config } from '@xyo-network/xl1-protocol-sdk'
9
8
 
10
- import { getNode } from '../manifest/index.ts'
11
9
  import { getApp } from './app.ts'
12
10
 
13
11
  const hostname = '::'
@@ -42,17 +40,16 @@ interface GetServerContext {
42
40
  }
43
41
 
44
42
  export const getServer = async (context: GetServerContext) => {
45
- const {
46
- config, logger, node,
47
- } = context
48
- const { mnemonic, port } = context.config.api
49
- const bios = await boot()
50
- const seedPhrase = isDefined(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger)
51
- const wallet = await HDWallet.fromPhrase(seedPhrase)
52
- const nodeContext = {
53
- wallet, logger, config,
54
- }
55
- const app = getApp(node ?? await getNode(nodeContext))
43
+ const { logger } = context
44
+ const { port } = context.config.bridge
45
+ await Promise.resolve() // bios booting is currently disabled
46
+ // const bios = await boot()
47
+ // const seedPhrase = isDefined(mnemonic) ? mnemonic : await getSeedPhrase(bios, config, logger)
48
+ // const wallet = await HDWallet.fromPhrase(seedPhrase)
49
+ // const nodeContext = {
50
+ // wallet, logger, config,
51
+ // }
52
+ const app = getApp()
56
53
  const server = app.listen(port, hostname, () => logger?.log(`[Bridge] Server listening at http://${hostname}:${port}`))
57
54
  server.setTimeout(20_000)
58
55
  return server
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChainBridgeRelayInterface.d.ts","sourceRoot":"","sources":["../../../../../src/interface/service/ChainBridgeRelay/ChainBridgeRelayInterface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE3F,OAAO,KAAK,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AAErG,MAAM,WAAW,wBAAyB,SAAQ,yBAAyB,CAAC,YAAY,EAAE,4BAA4B,CAAC;CAAG;AAE1H,MAAM,WAAW,gBAAiB,SAAQ,0BAA0B,CAAC,YAAY,EAAE,4BAA4B,CAAC;CAAG;AAEnH,MAAM,WAAW,yBAA0B,SACzC,0BAA0B,CAAC,YAAY,EAAE,4BAA4B,CAAC,EACtE,yBAAyB,CAAC,YAAY,EAAE,4BAA4B,CAAC;CAAG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChainBridgeRelayService.d.ts","sourceRoot":"","sources":["../../../../../src/interface/service/ChainBridgeRelay/ChainBridgeRelayService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,KAAK,EAAE,4BAA4B,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE3F,OAAO,KAAK,EACV,4CAA4C,EAAE,4BAA4B,EAC1E,mBAAmB,EACnB,uCAAuC,EAAE,yBAAyB,EAAE,qCAAqC,EACzG,uCAAuC,EACxC,MAAM,0BAA0B,CAAA;AAEjC,qBAAa,uBAAuB,CAAC,OAAO,SAAS,mBAAmB,GAAG,mBAAmB,CAC5F,SAAQ,sBAAsB,CAAC,OAAO,CAAE,YAAW,yBAAyB;IAC5E,SAAS,KAAK,OAAO,yDAEpB;IAED,SAAS,KAAK,uBAAuB,IAAI,4CAA4C,CAEpF;IAED,SAAS,KAAK,gBAAgB,IAAI,yBAAyB,CAE1D;IAED,SAAS,KAAK,eAAe,IAAI,qCAAqC,CAErE;IAED,SAAS,KAAK,gBAAgB,IAAI,uCAAuC,CAExE;IAED,SAAS,KAAK,oBAAoB,IAAI,4BAA4B,CAEjE;IAED,SAAS,KAAK,kBAAkB,IAAI,uCAAuC,CAE1E;IAED;;;;OAIG;IACG,UAAU,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB9D;;;;OAIG;IACG,wBAAwB,CAAC,4BAA4B,EAAE,4BAA4B,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB5G;;;;OAIG;IACG,SAAS,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,4BAA4B,GAAG,IAAI,CAAC;CAqB1F"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/interface/service/ChainBridgeRelay/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChainBridgeRelayService.spec.d.ts","sourceRoot":"","sources":["../../../../../../src/interface/service/ChainBridgeRelay/spec/ChainBridgeRelayService.spec.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export * from './routes/index.ts';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/server/routes/rpc/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
@@ -1,3 +0,0 @@
1
- import type { Express } from 'express';
2
- export declare const addRpcRoutes: (app: Express) => void;
3
- //# sourceMappingURL=addRpcRoutes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"addRpcRoutes.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/rpc/routes/addRpcRoutes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,eAAO,MAAM,YAAY,GAAI,KAAK,OAAO,SAaxC,CAAA"}
@@ -1,2 +0,0 @@
1
- export * from './addRpcRoutes.ts';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/server/routes/rpc/routes/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
@@ -1,35 +0,0 @@
1
- {
2
- "$schema": "https://raw.githubusercontent.com/XYOracleNetwork/sdk-xyo-client-js/main/packages/manifest/src/schema.json",
3
- "nodes": [
4
- {
5
- "config": {
6
- "accountPath": "2",
7
- "name": "Pending",
8
- "schema": "network.xyo.node.config"
9
- },
10
- "modules": {
11
- "private": [],
12
- "public": [
13
- {
14
- "config": {
15
- "accountPath": "2/1/2",
16
- "name": "PendingTransactions",
17
- "getCache": {
18
- "enabled": true,
19
- "maxEntries": 5000
20
- },
21
- "labels": {
22
- "network.xyo.storage.class": "mongodb"
23
- },
24
- "payloadSdkConfig": {
25
- "collection": "pending_bundles"
26
- },
27
- "schema": "network.xyo.archivist.config"
28
- }
29
- }
30
- ]
31
- }
32
- }
33
- ],
34
- "schema": "network.xyo.manifest"
35
- }
@@ -1 +0,0 @@
1
- export * from './routes/index.ts'
@@ -1,22 +0,0 @@
1
- import { setRawResponseFormat } from '@xylabs/express'
2
- import { NodeXyoViewer } from '@xyo-network/chain-rpc'
3
- import {
4
- NodeXyoRunner, rpcEngineFromConnection,
5
- XyoBaseConnection,
6
- } from '@xyo-network/xl1-rpc'
7
- import type { Express } from 'express'
8
-
9
- export const addRpcRoutes = (app: Express) => {
10
- const { node } = app
11
- const runner = new NodeXyoRunner(node)
12
- const viewer = new NodeXyoViewer(node)
13
- const connection = new XyoBaseConnection({ runner, viewer })
14
- const engine = rpcEngineFromConnection(connection)
15
-
16
- app.post('/rpc', (req, res) => {
17
- setRawResponseFormat(res)
18
- engine.handle(req.body, (_, rpcResponse) => {
19
- res.json(rpcResponse)
20
- })
21
- })
22
- }
@@ -1 +0,0 @@
1
- export * from './addRpcRoutes.ts'