@xyo-network/xl1-rpc 1.7.11 → 1.7.13

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 (81) hide show
  1. package/README.md +539 -261
  2. package/dist/neutral/engine/rpcMethodHandlersFromSigner.d.ts.map +1 -1
  3. package/dist/neutral/index.mjs +251 -91
  4. package/dist/neutral/index.mjs.map +1 -1
  5. package/dist/neutral/provider/host/Abstract.d.ts +13 -0
  6. package/dist/neutral/provider/host/Abstract.d.ts.map +1 -0
  7. package/dist/neutral/provider/host/JsonRpcXyoGateway.d.ts +2 -11
  8. package/dist/neutral/provider/host/JsonRpcXyoGateway.d.ts.map +1 -1
  9. package/dist/neutral/provider/host/MemoryXyoGateway.d.ts +22 -0
  10. package/dist/neutral/provider/host/MemoryXyoGateway.d.ts.map +1 -0
  11. package/dist/neutral/provider/host/PermissionsStore/MemoryPermissionsStore.d.ts +11 -0
  12. package/dist/neutral/provider/host/PermissionsStore/MemoryPermissionsStore.d.ts.map +1 -0
  13. package/dist/neutral/provider/host/PermissionsStore/PermissionsStore.d.ts +8 -0
  14. package/dist/neutral/provider/host/PermissionsStore/PermissionsStore.d.ts.map +1 -0
  15. package/dist/neutral/provider/host/PermissionsStore/getPermissionsStoreFromTransport.d.ts +5 -0
  16. package/dist/neutral/provider/host/PermissionsStore/getPermissionsStoreFromTransport.d.ts.map +1 -0
  17. package/dist/neutral/provider/host/PermissionsStore/index.d.ts +4 -0
  18. package/dist/neutral/provider/host/PermissionsStore/index.d.ts.map +1 -0
  19. package/dist/neutral/provider/host/PermissionsStore/spec/MemoryPermissionsStore.spec.d.ts +2 -0
  20. package/dist/neutral/provider/host/PermissionsStore/spec/MemoryPermissionsStore.spec.d.ts.map +1 -0
  21. package/dist/neutral/provider/host/index.d.ts +3 -0
  22. package/dist/neutral/provider/host/index.d.ts.map +1 -1
  23. package/dist/neutral/provider/host/spec/MemoryXyoGateway.spec.d.ts +2 -0
  24. package/dist/neutral/provider/host/spec/MemoryXyoGateway.spec.d.ts.map +1 -0
  25. package/dist/neutral/provider/provider/XyoConnection.d.ts +6 -9
  26. package/dist/neutral/provider/provider/XyoConnection.d.ts.map +1 -1
  27. package/dist/neutral/provider/signer/JsonRpcXyoSigner.d.ts +9 -2
  28. package/dist/neutral/provider/signer/JsonRpcXyoSigner.d.ts.map +1 -1
  29. package/dist/neutral/provider/signer/MemoryXyoSigner.d.ts +3 -1
  30. package/dist/neutral/provider/signer/MemoryXyoSigner.d.ts.map +1 -1
  31. package/dist/neutral/transport/HttpRpcTransport.d.ts.map +1 -1
  32. package/dist/neutral/types/schema/XyoSignerRpcSchemas.d.ts.map +1 -1
  33. package/dist/node/engine/rpcMethodHandlersFromSigner.d.ts.map +1 -1
  34. package/dist/node/index-node.mjs +253 -93
  35. package/dist/node/index-node.mjs.map +1 -1
  36. package/dist/node/provider/host/Abstract.d.ts +13 -0
  37. package/dist/node/provider/host/Abstract.d.ts.map +1 -0
  38. package/dist/node/provider/host/JsonRpcXyoGateway.d.ts +2 -11
  39. package/dist/node/provider/host/JsonRpcXyoGateway.d.ts.map +1 -1
  40. package/dist/node/provider/host/MemoryXyoGateway.d.ts +22 -0
  41. package/dist/node/provider/host/MemoryXyoGateway.d.ts.map +1 -0
  42. package/dist/node/provider/host/PermissionsStore/MemoryPermissionsStore.d.ts +11 -0
  43. package/dist/node/provider/host/PermissionsStore/MemoryPermissionsStore.d.ts.map +1 -0
  44. package/dist/node/provider/host/PermissionsStore/PermissionsStore.d.ts +8 -0
  45. package/dist/node/provider/host/PermissionsStore/PermissionsStore.d.ts.map +1 -0
  46. package/dist/node/provider/host/PermissionsStore/getPermissionsStoreFromTransport.d.ts +5 -0
  47. package/dist/node/provider/host/PermissionsStore/getPermissionsStoreFromTransport.d.ts.map +1 -0
  48. package/dist/node/provider/host/PermissionsStore/index.d.ts +4 -0
  49. package/dist/node/provider/host/PermissionsStore/index.d.ts.map +1 -0
  50. package/dist/node/provider/host/PermissionsStore/spec/MemoryPermissionsStore.spec.d.ts +2 -0
  51. package/dist/node/provider/host/PermissionsStore/spec/MemoryPermissionsStore.spec.d.ts.map +1 -0
  52. package/dist/node/provider/host/index.d.ts +3 -0
  53. package/dist/node/provider/host/index.d.ts.map +1 -1
  54. package/dist/node/provider/host/spec/MemoryXyoGateway.spec.d.ts +2 -0
  55. package/dist/node/provider/host/spec/MemoryXyoGateway.spec.d.ts.map +1 -0
  56. package/dist/node/provider/provider/XyoConnection.d.ts +6 -9
  57. package/dist/node/provider/provider/XyoConnection.d.ts.map +1 -1
  58. package/dist/node/provider/signer/JsonRpcXyoSigner.d.ts +9 -2
  59. package/dist/node/provider/signer/JsonRpcXyoSigner.d.ts.map +1 -1
  60. package/dist/node/provider/signer/MemoryXyoSigner.d.ts +3 -1
  61. package/dist/node/provider/signer/MemoryXyoSigner.d.ts.map +1 -1
  62. package/dist/node/transport/HttpRpcTransport.d.ts.map +1 -1
  63. package/dist/node/types/schema/XyoSignerRpcSchemas.d.ts.map +1 -1
  64. package/package.json +26 -25
  65. package/src/engine/rpcMethodHandlersFromSigner.ts +1 -0
  66. package/src/provider/host/Abstract.ts +30 -0
  67. package/src/provider/host/JsonRpcXyoGateway.ts +2 -28
  68. package/src/provider/host/MemoryXyoGateway.ts +84 -0
  69. package/src/provider/host/PermissionsStore/MemoryPermissionsStore.ts +33 -0
  70. package/src/provider/host/PermissionsStore/PermissionsStore.ts +8 -0
  71. package/src/provider/host/PermissionsStore/getPermissionsStoreFromTransport.ts +13 -0
  72. package/src/provider/host/PermissionsStore/index.ts +3 -0
  73. package/src/provider/host/PermissionsStore/spec/MemoryPermissionsStore.spec.ts +78 -0
  74. package/src/provider/host/index.ts +3 -0
  75. package/src/provider/host/spec/MemoryXyoGateway.spec.ts +78 -0
  76. package/src/provider/provider/XyoConnection.ts +20 -10
  77. package/src/provider/signer/JsonRpcXyoSigner.ts +13 -2
  78. package/src/provider/signer/MemoryXyoSigner.ts +6 -1
  79. package/src/provider/signer/spec/RpcEngineXyoSigner.spec.ts +2 -2
  80. package/src/transport/HttpRpcTransport.ts +25 -16
  81. package/src/types/schema/XyoSignerRpcSchemas.ts +14 -1
@@ -0,0 +1,78 @@
1
+ import { Account } from '@xyo-network/account'
2
+ import type { AccountInstance } from '@xyo-network/account-model'
3
+ import {
4
+ beforeEach, describe, expect, it,
5
+ } from 'vitest'
6
+
7
+ import { RpcXyoConnection } from '../../provider/index.ts'
8
+ import { MemoryXyoSigner } from '../../signer/index.ts'
9
+ import { MemoryXyoGateway } from '../MemoryXyoGateway.ts'
10
+ import { MemoryPermissionsStore } from '../PermissionsStore/index.ts'
11
+
12
+ describe('MemoryXyoGateway', () => {
13
+ const endpoint = 'http://localhost:8080/rpc'
14
+ const dataLakeEndpoint = 'http://localhost:8080/chain/archivist'
15
+ let account: AccountInstance
16
+ let signer: MemoryXyoSigner
17
+ let store: MemoryPermissionsStore
18
+ let sut: MemoryXyoGateway
19
+
20
+ beforeEach(async () => {
21
+ account = await Account.random()
22
+ signer = new MemoryXyoSigner(account)
23
+
24
+ store = new MemoryPermissionsStore()
25
+ sut = new MemoryXyoGateway(signer, store)
26
+ })
27
+
28
+ describe('addConnection', () => {
29
+ describe('should return the added', () => {
30
+ it('with config', async () => {
31
+ const config = {
32
+ name: 'localhost', dataLakeEndpoint, networkEndpoint: endpoint,
33
+ }
34
+ const response = await sut.addConnection(config)
35
+ expect(response).toBeDefined()
36
+ })
37
+ it('with connection', async () => {
38
+ const connection = new RpcXyoConnection({ endpoint, account })
39
+ const response = await sut.addConnection('localhost', connection)
40
+ expect(response).toBeDefined()
41
+ expect(response).toBe(connection)
42
+ })
43
+ })
44
+ })
45
+
46
+ describe('activeConnection', () => {
47
+ describe('with no connections', () => {
48
+ it('should have no active connection', () => {
49
+ expect(sut.activeConnection()).toBeUndefined()
50
+ })
51
+ })
52
+ describe('with connections', () => {
53
+ it('should return the active connection', async () => {
54
+ const connection = new RpcXyoConnection({ endpoint, account })
55
+ await sut.addConnection('localhost', connection)
56
+ expect(sut.activeConnection()).toBeDefined()
57
+ })
58
+ })
59
+ })
60
+
61
+ describe('connections', () => {
62
+ describe('with connections', () => {
63
+ const name = 'localhost'
64
+ let connection: RpcXyoConnection
65
+ beforeEach(async () => {
66
+ connection = new RpcXyoConnection({ endpoint, account })
67
+ await sut.addConnection(name, connection)
68
+ })
69
+ it('should return connections', async () => {
70
+ const response = await sut.connections()
71
+ expect(response).toBeDefined()
72
+ expect(response).toHaveProperty(name)
73
+ expect(Object.keys(response)).toHaveLength(1)
74
+ expect(response[name]).toBe(connection)
75
+ })
76
+ })
77
+ })
78
+ })
@@ -1,30 +1,35 @@
1
1
  import { assertEx } from '@xylabs/assert'
2
2
  import type { Address } from '@xylabs/hex'
3
3
  import type { Signed } from '@xyo-network/boundwitness-model'
4
+ import { HydratedTransactionWrapper } from '@xyo-network/chain-wrappers'
4
5
  import { PayloadBuilder } from '@xyo-network/payload-builder'
5
- import type { Payload } from '@xyo-network/payload-model'
6
+ import { isAnyPayload, type Payload } from '@xyo-network/payload-model'
6
7
  import type {
7
8
  AllowedBlockPayload,
8
9
  HydratedTransaction,
9
- TransactionBoundWitness, TransactionFeesBigInt, XyoConnectionProvider, XyoNetwork, XyoRunner, XyoSigner, XyoViewer,
10
+ TransactionBoundWitness, TransactionFeesBigInt,
11
+ TransactionSubmitterOptions, XyoConnectionProvider, XyoDataLakeProvider, XyoDataLakeViewer, XyoNetwork, XyoRunner, XyoSigner, XyoViewer,
10
12
  } from '@xyo-network/xl1-protocol'
11
- import { defaultTransactionFees } from '@xyo-network/xl1-protocol'
13
+ import { defaultTransactionFees, isDataLakeProvider } from '@xyo-network/xl1-protocol'
12
14
 
13
15
  export class XyoConnection implements XyoConnectionProvider {
14
16
  private readonly _network?: XyoNetwork
15
17
  private readonly _runner?: XyoRunner
16
18
  private readonly _signer?: XyoSigner
19
+ private readonly _storage?: XyoDataLakeProvider | XyoDataLakeViewer
17
20
  private readonly _viewer?: XyoViewer
18
21
 
19
22
  constructor(params?: {
20
23
  network?: XyoNetwork
21
24
  runner?: XyoRunner
22
25
  signer?: XyoSigner
26
+ storage?: XyoDataLakeProvider | XyoDataLakeViewer
23
27
  viewer?: XyoViewer
24
28
  }) {
25
29
  this._network = params?.network
26
30
  this._runner = params?.runner
27
31
  this._signer = params?.signer
32
+ this._storage = params?.storage
28
33
  this._viewer = params?.viewer
29
34
  }
30
35
 
@@ -40,6 +45,10 @@ export class XyoConnection implements XyoConnectionProvider {
40
45
  return this._signer
41
46
  }
42
47
 
48
+ get storage(): XyoDataLakeProvider | XyoDataLakeViewer | undefined {
49
+ return this._storage
50
+ }
51
+
43
52
  get viewer(): XyoViewer | undefined {
44
53
  return this._viewer
45
54
  }
@@ -64,17 +73,12 @@ export class XyoConnection implements XyoConnectionProvider {
64
73
  additionalPayloads: Payload[],
65
74
  {
66
75
  chain, exp, fees, from, nbf,
67
- }: {
68
- chain?: Address
69
- exp?: number
70
- fees?: TransactionFeesBigInt
71
- from?: Address
72
- nbf?: number
73
- } = {},
76
+ }: TransactionSubmitterOptions = {},
74
77
  ): Promise<HydratedTransaction> {
75
78
  const viewer = assertEx(this.viewer, () => 'No viewer available')
76
79
  const signer = assertEx(this.signer, () => 'No signer available')
77
80
  const runner = assertEx(this.runner, () => 'No runner available')
81
+ const storage = this.storage
78
82
  const chainResolved = chain ?? await viewer.chainId()
79
83
  if (chainResolved === undefined) throw new Error('Failed to determine chain')
80
84
  const nbfResolved = Math.max(await viewer.currentBlockNumber() ?? 0, nbf ?? 0)
@@ -94,6 +98,12 @@ export class XyoConnection implements XyoConnectionProvider {
94
98
  const hydratedTransaction: HydratedTransaction = [await PayloadBuilder.addStorageMeta(signedTransaction),
95
99
  await PayloadBuilder.addStorageMeta(elevatedPayloads)]
96
100
 
101
+ // if storage configured, add the external payloads to it
102
+ if (isDataLakeProvider(storage)) {
103
+ const wrapper = await HydratedTransactionWrapper.parse(hydratedTransaction)
104
+ await storage.add(Object.values(wrapper.externalPayloads).filter(isAnyPayload))
105
+ }
106
+
97
107
  assertEx(await runner.broadcastTransaction(hydratedTransaction), () => 'Failed to broadcast transaction')
98
108
 
99
109
  return hydratedTransaction
@@ -1,5 +1,6 @@
1
1
  import { type Address } from '@xylabs/hex'
2
- import type { Signed } from '@xyo-network/boundwitness-model'
2
+ import type { Promisable } from '@xylabs/promise'
3
+ import type { Signed, UnsignedBoundWitness } from '@xyo-network/boundwitness-model'
3
4
  import type { Payload } from '@xyo-network/payload-model'
4
5
  import type {
5
6
  AllowedBlockPayload,
@@ -10,7 +11,8 @@ import type {
10
11
 
11
12
  import type { RpcTransport } from '../../transport/index.ts'
12
13
  import type { XyoSignerRpcSchemas } from '../../types/index.ts'
13
- export class JsonRpcXyoSigner implements XyoSigner {
14
+
15
+ export class RpcXyoSigner implements XyoSigner {
14
16
  protected readonly transport: RpcTransport<typeof XyoSignerRpcSchemas>
15
17
 
16
18
  constructor(transport: RpcTransport<typeof XyoSignerRpcSchemas>) {
@@ -40,4 +42,13 @@ export class JsonRpcXyoSigner implements XyoSigner {
40
42
  from,
41
43
  ])
42
44
  }
45
+
46
+ signTransaction(tx: [UnsignedBoundWitness<TransactionBoundWitness>, Payload[]]): Promisable<[Signed<TransactionBoundWitness>, Payload[]]> {
47
+ throw new Error('Method not implemented.')
48
+ }
43
49
  }
50
+
51
+ /**
52
+ * @deprecated Use `RpcXyoSigner` instead.
53
+ */
54
+ export class JsonRpcXyoSigner extends RpcXyoSigner {}
@@ -1,6 +1,7 @@
1
1
  import type { Address } from '@xylabs/hex'
2
+ import type { Promisable } from '@xylabs/promise'
2
3
  import type { AccountInstance } from '@xyo-network/account-model'
3
- import type { Signed } from '@xyo-network/boundwitness-model'
4
+ import type { Signed, UnsignedBoundWitness } from '@xyo-network/boundwitness-model'
4
5
  import { type Payload } from '@xyo-network/payload-model'
5
6
  import type {
6
7
  AllowedBlockPayload, TransactionBoundWitness, TransactionFeesBigInt, XyoSigner,
@@ -40,4 +41,8 @@ export class MemoryXyoSigner implements XyoSigner {
40
41
  )
41
42
  return transaction[0]
42
43
  }
44
+
45
+ signTransaction(_tx: [UnsignedBoundWitness<TransactionBoundWitness>, Payload[]]): Promisable<[Signed<TransactionBoundWitness>, Payload[]]> {
46
+ throw new Error('Method not implemented.')
47
+ }
43
48
  }
@@ -10,7 +10,7 @@ import {
10
10
  import { rpcEngineFromProvider } from '../../../engine/index-node.ts'
11
11
  import { MemoryRpcTransport } from '../../../transport/index.ts'
12
12
  import { XyoConnection } from '../../provider/index.ts'
13
- import { JsonRpcXyoSigner } from '../JsonRpcXyoSigner.ts'
13
+ import { RpcXyoSigner } from '../JsonRpcXyoSigner.ts'
14
14
  import { MemoryXyoSigner } from '../MemoryXyoSigner.ts'
15
15
 
16
16
  describe('RpcEngine - XyoSigner', () => {
@@ -22,7 +22,7 @@ describe('RpcEngine - XyoSigner', () => {
22
22
  const provider = new XyoConnection({ signer })
23
23
  const engine = rpcEngineFromProvider(provider)
24
24
  const transport = new MemoryRpcTransport(engine)
25
- sut = new JsonRpcXyoSigner(transport)
25
+ sut = new RpcXyoSigner(transport)
26
26
  })
27
27
  describe('address', () => {
28
28
  it('should return signer addresses', async () => {
@@ -2,7 +2,8 @@ import type {
2
2
  JsonRpcFailure, JsonRpcRequest, JsonRpcSuccess,
3
3
  } from '@metamask/utils'
4
4
  import { AxiosJson } from '@xylabs/axios'
5
- import { isUndefinedOrNull } from '@xylabs/typeof'
5
+ import { isError, isUndefinedOrNull } from '@xylabs/typeof'
6
+ import { isAxiosError } from 'axios'
6
7
  import { v4 } from 'uuid'
7
8
  import type { z } from 'zod'
8
9
 
@@ -37,24 +38,32 @@ export class HttpRpcTransport<T extends RpcSchemaMap = RpcSchemaMap> implements
37
38
  method: TMethod,
38
39
  params?: z.infer<TSchemas[TMethod]['params']['to']>,
39
40
  ): Promise<z.infer<TSchemas[TMethod]['result']['from']>> {
40
- const id = v4()
41
- const body: JsonRpcRequest = {
42
- jsonrpc,
43
- id,
44
- method: method as string,
45
- }
41
+ try {
42
+ const id = v4()
43
+ const body: JsonRpcRequest = {
44
+ jsonrpc,
45
+ id,
46
+ method: method as string,
47
+ }
46
48
 
47
- if (params) {
48
- body.params = schemas[method].params.to.parse(params)
49
- }
49
+ if (params) {
50
+ body.params = schemas[method].params.to.parse(params)
51
+ }
50
52
 
51
- const res = await new AxiosJson().post(url, body)
53
+ const res = await new AxiosJson().post(url, body)
52
54
 
53
- const json = res.data
54
- if (isUndefinedOrNull(json) || (json as Partial<JsonRpcFailure>).error) {
55
- throw new Error((json as JsonRpcFailure).error.message)
56
- }
55
+ const json = res.data
56
+ if (isUndefinedOrNull(json) || (json as Partial<JsonRpcFailure>).error) {
57
+ throw new Error((json as JsonRpcFailure).error.message)
58
+ }
57
59
 
58
- return schemas[method].result.from.parse((json as JsonRpcSuccess).result)
60
+ return schemas[method].result.from.parse((json as JsonRpcSuccess).result)
61
+ } catch (ex) {
62
+ let message = isError(ex) ? ex.message : String(ex)
63
+ if (isAxiosError(ex)) {
64
+ message = `Http error occurred [${ex.status}|${ex.code ?? '<unknown>'}]: ${ex.message}`
65
+ }
66
+ throw new Error(`Error occurred while calling RPC method ${String(method)}: ${message}`)
67
+ }
59
68
  }
60
69
  }
@@ -2,7 +2,10 @@ import { z } from 'zod'
2
2
 
3
3
  import type { XyoSignerRpcMethodName } from '../XyoSignerRpc.ts'
4
4
  import {
5
- AddressFromStringSchema, AddressToStringSchema, PayloadSchema, SignedTransactionBoundWitnessSchema, TransactionFeesFromStingSchema,
5
+ AddressFromStringSchema, AddressToStringSchema,
6
+ HydratedTransactionSchema,
7
+ PayloadSchema, SignedHydratedTransactionSchema, SignedTransactionBoundWitnessSchema,
8
+ TransactionFeesFromStingSchema,
6
9
  TransactionFeesToStingSchema,
7
10
  } from './common/index.ts'
8
11
  import type { RpcSchemaMap } from './RpcSchemaMap.ts'
@@ -44,4 +47,14 @@ export const XyoSignerRpcSchemas: RpcSchemaMap<XyoSignerRpcMethodName> = {
44
47
  from: SignedTransactionBoundWitnessSchema,
45
48
  },
46
49
  },
50
+ xyoSigner_signTransaction: {
51
+ params: {
52
+ to: z.tuple([HydratedTransactionSchema]),
53
+ from: z.tuple([HydratedTransactionSchema]),
54
+ },
55
+ result: {
56
+ to: SignedHydratedTransactionSchema,
57
+ from: SignedHydratedTransactionSchema,
58
+ },
59
+ },
47
60
  }