@xyo-network/xl1-rpc 1.16.15 → 1.16.17
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/package.json +7 -4
- package/dist/neutral/provider/connection/spec/XyoConnection.spec.d.ts +0 -2
- package/dist/neutral/provider/connection/spec/XyoConnection.spec.d.ts.map +0 -1
- package/dist/neutral/provider/signer/spec/RpcEngineXyoSigner.spec.d.ts +0 -2
- package/dist/neutral/provider/signer/spec/RpcEngineXyoSigner.spec.d.ts.map +0 -1
- package/dist/neutral/provider/viewer/spec/JsonRpcXyoViewer.spec.d.ts +0 -2
- package/dist/neutral/provider/viewer/spec/JsonRpcXyoViewer.spec.d.ts.map +0 -1
- package/dist/neutral/spec/MemoryXyoClient.spec.d.ts +0 -2
- package/dist/neutral/spec/MemoryXyoClient.spec.d.ts.map +0 -1
- package/dist/neutral/spec/MemoryXyoGateway.spec.d.ts +0 -2
- package/dist/neutral/spec/MemoryXyoGateway.spec.d.ts.map +0 -1
- package/dist/neutral/types/schema/common/spec/BigIntZod.spec.d.ts +0 -2
- package/dist/neutral/types/schema/common/spec/BigIntZod.spec.d.ts.map +0 -1
- package/dist/neutral/types/schema/common/spec/HydratedBlockSchema.spec.d.ts +0 -2
- package/dist/neutral/types/schema/common/spec/HydratedBlockSchema.spec.d.ts.map +0 -1
- package/dist/neutral/types/schema/common/spec/HydratedTransaction.spec.d.ts +0 -2
- package/dist/neutral/types/schema/common/spec/HydratedTransaction.spec.d.ts.map +0 -1
- package/dist/neutral/types/schema/common/spec/Payload.spec.d.ts +0 -2
- package/dist/neutral/types/schema/common/spec/Payload.spec.d.ts.map +0 -1
- package/dist/neutral/types/schema/common/spec/TransactionBoundWitnessZod.spec.d.ts +0 -2
- package/dist/neutral/types/schema/common/spec/TransactionBoundWitnessZod.spec.d.ts.map +0 -1
- package/dist/neutral/types/schema/common/spec/UnsignedHydratedTransactionSchema.spec.d.ts +0 -2
- package/dist/neutral/types/schema/common/spec/UnsignedHydratedTransactionSchema.spec.d.ts.map +0 -1
- package/dist/node/provider/connection/spec/XyoConnection.spec.d.ts +0 -2
- package/dist/node/provider/connection/spec/XyoConnection.spec.d.ts.map +0 -1
- package/dist/node/provider/signer/spec/RpcEngineXyoSigner.spec.d.ts +0 -2
- package/dist/node/provider/signer/spec/RpcEngineXyoSigner.spec.d.ts.map +0 -1
- package/dist/node/provider/viewer/spec/JsonRpcXyoViewer.spec.d.ts +0 -2
- package/dist/node/provider/viewer/spec/JsonRpcXyoViewer.spec.d.ts.map +0 -1
- package/dist/node/spec/MemoryXyoClient.spec.d.ts +0 -2
- package/dist/node/spec/MemoryXyoClient.spec.d.ts.map +0 -1
- package/dist/node/spec/MemoryXyoGateway.spec.d.ts +0 -2
- package/dist/node/spec/MemoryXyoGateway.spec.d.ts.map +0 -1
- package/dist/node/types/schema/common/spec/BigIntZod.spec.d.ts +0 -2
- package/dist/node/types/schema/common/spec/BigIntZod.spec.d.ts.map +0 -1
- package/dist/node/types/schema/common/spec/HydratedBlockSchema.spec.d.ts +0 -2
- package/dist/node/types/schema/common/spec/HydratedBlockSchema.spec.d.ts.map +0 -1
- package/dist/node/types/schema/common/spec/HydratedTransaction.spec.d.ts +0 -2
- package/dist/node/types/schema/common/spec/HydratedTransaction.spec.d.ts.map +0 -1
- package/dist/node/types/schema/common/spec/Payload.spec.d.ts +0 -2
- package/dist/node/types/schema/common/spec/Payload.spec.d.ts.map +0 -1
- package/dist/node/types/schema/common/spec/TransactionBoundWitnessZod.spec.d.ts +0 -2
- package/dist/node/types/schema/common/spec/TransactionBoundWitnessZod.spec.d.ts.map +0 -1
- package/dist/node/types/schema/common/spec/UnsignedHydratedTransactionSchema.spec.d.ts +0 -2
- package/dist/node/types/schema/common/spec/UnsignedHydratedTransactionSchema.spec.d.ts.map +0 -1
- package/src/provider/connection/spec/XyoConnection.spec.ts +0 -29
- package/src/provider/signer/spec/RpcEngineXyoSigner.spec.ts +0 -87
- package/src/provider/viewer/spec/JsonRpcXyoViewer.spec.ts +0 -173
- package/src/spec/MemoryXyoClient.spec.ts +0 -66
- package/src/spec/MemoryXyoGateway.spec.ts +0 -99
- package/src/types/schema/common/spec/BigIntZod.spec.ts +0 -19
- package/src/types/schema/common/spec/HydratedBlockSchema.spec.ts +0 -18
- package/src/types/schema/common/spec/HydratedTransaction.spec.ts +0 -18
- package/src/types/schema/common/spec/Payload.spec.ts +0 -28
- package/src/types/schema/common/spec/TransactionBoundWitnessZod.spec.ts +0 -18
- package/src/types/schema/common/spec/UnsignedHydratedTransactionSchema.spec.ts +0 -53
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "http://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@xyo-network/xl1-rpc",
|
|
4
|
-
"version": "1.16.
|
|
4
|
+
"version": "1.16.17",
|
|
5
5
|
"description": "XYO Layer One API",
|
|
6
6
|
"homepage": "https://xylabs.com",
|
|
7
7
|
"bugs": {
|
|
@@ -42,7 +42,10 @@
|
|
|
42
42
|
},
|
|
43
43
|
"files": [
|
|
44
44
|
"dist",
|
|
45
|
-
"src"
|
|
45
|
+
"src",
|
|
46
|
+
"!**/*.bench.*",
|
|
47
|
+
"!**/*.spec.*",
|
|
48
|
+
"!**/*.test.*"
|
|
46
49
|
],
|
|
47
50
|
"scripts": {
|
|
48
51
|
"build": "xy build-package",
|
|
@@ -65,7 +68,7 @@
|
|
|
65
68
|
"@xyo-network/payload-builder": "~5.1.23",
|
|
66
69
|
"@xyo-network/payload-model": "~5.1.23",
|
|
67
70
|
"@xyo-network/xl1-protocol": "~1.13.11",
|
|
68
|
-
"@xyo-network/xl1-protocol-sdk": "~1.16.
|
|
71
|
+
"@xyo-network/xl1-protocol-sdk": "~1.16.17",
|
|
69
72
|
"axios": "~1.13.2",
|
|
70
73
|
"uuid": "~13.0.0",
|
|
71
74
|
"zod": "~4.1.12"
|
|
@@ -79,7 +82,7 @@
|
|
|
79
82
|
"@xylabs/vitest-extended": "~5.0.34",
|
|
80
83
|
"@xyo-network/account": "~5.1.23",
|
|
81
84
|
"@xyo-network/account-model": "~5.1.23",
|
|
82
|
-
"@xyo-network/chain-protocol": "~1.16.
|
|
85
|
+
"@xyo-network/chain-protocol": "~1.16.17",
|
|
83
86
|
"@xyo-network/wallet": "~5.1.23",
|
|
84
87
|
"dotenv": "~17.2.3",
|
|
85
88
|
"eslint": "^9.39.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"XyoConnection.spec.d.ts","sourceRoot":"","sources":["../../../../../src/provider/connection/spec/XyoConnection.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RpcEngineXyoSigner.spec.d.ts","sourceRoot":"","sources":["../../../../../src/provider/signer/spec/RpcEngineXyoSigner.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"JsonRpcXyoViewer.spec.d.ts","sourceRoot":"","sources":["../../../../../src/provider/viewer/spec/JsonRpcXyoViewer.spec.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryXyoClient.spec.d.ts","sourceRoot":"","sources":["../../../src/spec/MemoryXyoClient.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryXyoGateway.spec.d.ts","sourceRoot":"","sources":["../../../src/spec/MemoryXyoGateway.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BigIntZod.spec.d.ts","sourceRoot":"","sources":["../../../../../../src/types/schema/common/spec/BigIntZod.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HydratedBlockSchema.spec.d.ts","sourceRoot":"","sources":["../../../../../../src/types/schema/common/spec/HydratedBlockSchema.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HydratedTransaction.spec.d.ts","sourceRoot":"","sources":["../../../../../../src/types/schema/common/spec/HydratedTransaction.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Payload.spec.d.ts","sourceRoot":"","sources":["../../../../../../src/types/schema/common/spec/Payload.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionBoundWitnessZod.spec.d.ts","sourceRoot":"","sources":["../../../../../../src/types/schema/common/spec/TransactionBoundWitnessZod.spec.ts"],"names":[],"mappings":""}
|
package/dist/neutral/types/schema/common/spec/UnsignedHydratedTransactionSchema.spec.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UnsignedHydratedTransactionSchema.spec.d.ts","sourceRoot":"","sources":["../../../../../../src/types/schema/common/spec/UnsignedHydratedTransactionSchema.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"XyoConnection.spec.d.ts","sourceRoot":"","sources":["../../../../../src/provider/connection/spec/XyoConnection.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RpcEngineXyoSigner.spec.d.ts","sourceRoot":"","sources":["../../../../../src/provider/signer/spec/RpcEngineXyoSigner.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"JsonRpcXyoViewer.spec.d.ts","sourceRoot":"","sources":["../../../../../src/provider/viewer/spec/JsonRpcXyoViewer.spec.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryXyoClient.spec.d.ts","sourceRoot":"","sources":["../../../src/spec/MemoryXyoClient.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryXyoGateway.spec.d.ts","sourceRoot":"","sources":["../../../src/spec/MemoryXyoGateway.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BigIntZod.spec.d.ts","sourceRoot":"","sources":["../../../../../../src/types/schema/common/spec/BigIntZod.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HydratedBlockSchema.spec.d.ts","sourceRoot":"","sources":["../../../../../../src/types/schema/common/spec/HydratedBlockSchema.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HydratedTransaction.spec.d.ts","sourceRoot":"","sources":["../../../../../../src/types/schema/common/spec/HydratedTransaction.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Payload.spec.d.ts","sourceRoot":"","sources":["../../../../../../src/types/schema/common/spec/Payload.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionBoundWitnessZod.spec.d.ts","sourceRoot":"","sources":["../../../../../../src/types/schema/common/spec/TransactionBoundWitnessZod.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UnsignedHydratedTransactionSchema.spec.d.ts","sourceRoot":"","sources":["../../../../../../src/types/schema/common/spec/UnsignedHydratedTransactionSchema.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { SimpleXyoRunner, type XyoConnection } from '@xyo-network/xl1-protocol-sdk'
|
|
2
|
-
import {
|
|
3
|
-
beforeAll, describe, expect, it,
|
|
4
|
-
} from 'vitest'
|
|
5
|
-
|
|
6
|
-
import { rpcEngineFromConnection } from '../../../engine-node/index.ts'
|
|
7
|
-
import { MemoryRpcTransport } from '../../../transport/index.ts'
|
|
8
|
-
import { AllRpcSchemas } from '../../../types/index.ts'
|
|
9
|
-
import { JsonRpcNetworkStakeViewer, JsonRpcXyoViewer } from '../../viewer/index.ts'
|
|
10
|
-
import { XyoBaseConnection } from '../XyoBaseConnection.ts'
|
|
11
|
-
|
|
12
|
-
describe('RpcEngine - XyoProvider', () => {
|
|
13
|
-
let sut: XyoConnection
|
|
14
|
-
beforeAll(() => {
|
|
15
|
-
const runner = new SimpleXyoRunner()
|
|
16
|
-
const connection = new XyoBaseConnection({ runner })
|
|
17
|
-
const engine = rpcEngineFromConnection(connection)
|
|
18
|
-
const transport = new MemoryRpcTransport(engine, AllRpcSchemas)
|
|
19
|
-
const networkStakeViewer = new JsonRpcNetworkStakeViewer(transport)
|
|
20
|
-
const viewer = new JsonRpcXyoViewer(transport, { networkStakeViewer })
|
|
21
|
-
sut = new XyoBaseConnection({ runner, viewer })
|
|
22
|
-
})
|
|
23
|
-
it('should expose a runner', () => {
|
|
24
|
-
expect(sut.runner).toBeDefined()
|
|
25
|
-
})
|
|
26
|
-
it('should expose a viewer', () => {
|
|
27
|
-
expect(sut.viewer).toBeDefined()
|
|
28
|
-
})
|
|
29
|
-
})
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { createAsyncMiddleware, JsonRpcEngine } from '@metamask/json-rpc-engine'
|
|
2
|
-
import type { Json } from '@metamask/utils'
|
|
3
|
-
import { asAddress, toAddress } from '@xylabs/sdk-js'
|
|
4
|
-
import { Account } from '@xyo-network/account'
|
|
5
|
-
import type { ChainId } from '@xyo-network/xl1-protocol'
|
|
6
|
-
import { defaultTransactionFees } from '@xyo-network/xl1-protocol'
|
|
7
|
-
import type { XyoSigner } from '@xyo-network/xl1-protocol-sdk'
|
|
8
|
-
import { buildUnsignedTransaction, SimpleXyoSigner } from '@xyo-network/xl1-protocol-sdk'
|
|
9
|
-
import {
|
|
10
|
-
beforeAll, describe, expect, it,
|
|
11
|
-
} from 'vitest'
|
|
12
|
-
|
|
13
|
-
import { requestSchemas, rpcMethodHandlersFromSigner } from '../../../engine/index.ts'
|
|
14
|
-
import { MemoryRpcTransport } from '../../../transport/index.ts'
|
|
15
|
-
import {
|
|
16
|
-
createRequestSchema, JsonRpcErrorCodes, XyoSignerRpcSchemas,
|
|
17
|
-
} from '../../../types/index.ts'
|
|
18
|
-
import { RpcXyoSigner } from '../JsonRpcXyoSigner.ts'
|
|
19
|
-
|
|
20
|
-
describe('RpcEngine - XyoSigner', () => {
|
|
21
|
-
let sut: XyoSigner
|
|
22
|
-
const chain = toAddress('2AAE728aFd1777b79c34D79c4523797F9D9965b0') as ChainId
|
|
23
|
-
beforeAll(async () => {
|
|
24
|
-
const account = await Account.random()
|
|
25
|
-
const signer = new SimpleXyoSigner(account)
|
|
26
|
-
const handlers = rpcMethodHandlersFromSigner(signer)
|
|
27
|
-
const engine = new JsonRpcEngine()
|
|
28
|
-
engine.push(
|
|
29
|
-
createAsyncMiddleware(async (req, res) => {
|
|
30
|
-
// Get method name
|
|
31
|
-
const method = req.method as keyof typeof handlers & keyof typeof requestSchemas
|
|
32
|
-
// Get schema for method
|
|
33
|
-
const handler = handlers[method]
|
|
34
|
-
// Get handler for method
|
|
35
|
-
const schema = XyoSignerRpcSchemas[method]
|
|
36
|
-
|
|
37
|
-
// If no schema or handler exists
|
|
38
|
-
if (schema === undefined || handler === undefined) {
|
|
39
|
-
// return method not found error
|
|
40
|
-
res.error = JsonRpcErrorCodes.MethodNotFound
|
|
41
|
-
return
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Validate request according to schema
|
|
45
|
-
let requestSchema = requestSchemas[method]
|
|
46
|
-
if (requestSchema == undefined) {
|
|
47
|
-
requestSchema = createRequestSchema(method, schema.params.from)
|
|
48
|
-
requestSchemas[method] = requestSchema
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const parsed = requestSchema.safeParse(req)
|
|
52
|
-
// If validation fails
|
|
53
|
-
if (!parsed.success) {
|
|
54
|
-
res.error = {
|
|
55
|
-
// Return invalid params error
|
|
56
|
-
...JsonRpcErrorCodes.InvalidParams,
|
|
57
|
-
// with the specific validation error message
|
|
58
|
-
message: parsed.error.message,
|
|
59
|
-
}
|
|
60
|
-
return
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Call handler with validated params
|
|
64
|
-
const { params } = parsed.data
|
|
65
|
-
const result = await handler(params as never)
|
|
66
|
-
// Parse handler result according to schema
|
|
67
|
-
res.result = schema.result.to.parse(result) as Json
|
|
68
|
-
}),
|
|
69
|
-
)
|
|
70
|
-
const transport = new MemoryRpcTransport(engine, XyoSignerRpcSchemas)
|
|
71
|
-
sut = new RpcXyoSigner(transport)
|
|
72
|
-
})
|
|
73
|
-
describe('address', () => {
|
|
74
|
-
it('should return signer addresses', async () => {
|
|
75
|
-
const address = await sut.address()
|
|
76
|
-
expect(asAddress(address)).toBeDefined()
|
|
77
|
-
})
|
|
78
|
-
})
|
|
79
|
-
describe('signTransaction', () => {
|
|
80
|
-
it('should return signed transaction', async () => {
|
|
81
|
-
const address = await sut.address()
|
|
82
|
-
const unsignedTransaction = await buildUnsignedTransaction(chain, [], [], 0, 1000, address, defaultTransactionFees)
|
|
83
|
-
const signedTransaction = await sut.signTransaction(unsignedTransaction)
|
|
84
|
-
expect(signedTransaction).toBeDefined()
|
|
85
|
-
})
|
|
86
|
-
})
|
|
87
|
-
})
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
import '@xylabs/vitest-extended'
|
|
2
|
-
|
|
3
|
-
import type { Address, Hash } from '@xylabs/sdk-js'
|
|
4
|
-
import {
|
|
5
|
-
AddressRegEx, asAddress, asHash, assertEx,
|
|
6
|
-
} from '@xylabs/sdk-js'
|
|
7
|
-
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
8
|
-
import type { HydratedBlock } from '@xyo-network/xl1-protocol'
|
|
9
|
-
import {
|
|
10
|
-
beforeAll,
|
|
11
|
-
describe, expect, it,
|
|
12
|
-
} from 'vitest'
|
|
13
|
-
|
|
14
|
-
import { HttpRpcTransport } from '../../../transport/index.ts'
|
|
15
|
-
import { NetworkStakeViewerRpcSchemas, XyoViewerRpcSchemas } from '../../../types/index.ts'
|
|
16
|
-
import { JsonRpcNetworkStakeViewer } from '../JsonRpcNetworkStakeViewer/index.ts'
|
|
17
|
-
import { JsonRpcXyoViewer } from '../JsonRpcXyoViewer.ts'
|
|
18
|
-
|
|
19
|
-
describe.skip('RpcXyoViewer - live integration tests', () => {
|
|
20
|
-
const transport = new HttpRpcTransport('http://localhost:8080/rpc', { ...XyoViewerRpcSchemas, ...NetworkStakeViewerRpcSchemas })
|
|
21
|
-
const sut = new JsonRpcXyoViewer(transport, { networkStakeViewer: new JsonRpcNetworkStakeViewer(transport) })
|
|
22
|
-
|
|
23
|
-
describe('accountBalance', () => {
|
|
24
|
-
const TEST_ADDRESS = '796c74fb1c23dc2dcc4e40b8c4284f05da51210f' as Address
|
|
25
|
-
|
|
26
|
-
it('should return account balance', async () => {
|
|
27
|
-
const balance = await sut.accountBalance(TEST_ADDRESS)
|
|
28
|
-
expect(typeof balance === 'bigint').toBeTruthy()
|
|
29
|
-
expect(balance).toBeGreaterThan(0n)
|
|
30
|
-
})
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
describe('blockByHash', () => {
|
|
34
|
-
let blockHash: Hash
|
|
35
|
-
|
|
36
|
-
beforeAll(async () => {
|
|
37
|
-
blockHash = await sut.currentBlockHash()
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
it('should return block by number', async () => {
|
|
41
|
-
const block = await sut.blockByHash(blockHash)
|
|
42
|
-
expect(block).not.toBeNull()
|
|
43
|
-
})
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
describe('blockByNumber', () => {
|
|
47
|
-
let blockNumber: number
|
|
48
|
-
|
|
49
|
-
beforeAll(async () => {
|
|
50
|
-
blockNumber = await sut.currentBlockNumber()
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
it('should return block by number', async () => {
|
|
54
|
-
const block = await sut.blockByNumber(blockNumber)
|
|
55
|
-
expect(block).not.toBeNull()
|
|
56
|
-
})
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
describe('blocksByHash', () => {
|
|
60
|
-
let blockHash: Hash
|
|
61
|
-
const count = 2
|
|
62
|
-
|
|
63
|
-
beforeAll(async () => {
|
|
64
|
-
blockHash = await sut.currentBlockHash()
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
it('should return block by number', async () => {
|
|
68
|
-
const block = await sut.blocksByHash(blockHash, count)
|
|
69
|
-
expect(block).toBeArrayOfSize(count)
|
|
70
|
-
})
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
describe('chainId', () => {
|
|
74
|
-
it('should return chain ID', async () => {
|
|
75
|
-
const chainId = await sut.chainId()
|
|
76
|
-
expect(chainId).toMatch(new RegExp(AddressRegEx))
|
|
77
|
-
expect(asAddress(chainId)).toBeDefined()
|
|
78
|
-
})
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
describe('currentBlockNumber', () => {
|
|
82
|
-
it('should return current block number', async () => {
|
|
83
|
-
const blockNumber = await sut.currentBlockNumber()
|
|
84
|
-
expect(typeof blockNumber).toBe('number')
|
|
85
|
-
expect(blockNumber).toBeGreaterThan(0)
|
|
86
|
-
})
|
|
87
|
-
})
|
|
88
|
-
|
|
89
|
-
describe('currentBlock', () => {
|
|
90
|
-
it('should return current block', async () => {
|
|
91
|
-
const block = await sut.currentBlock()
|
|
92
|
-
expect(block).toBeDefined()
|
|
93
|
-
})
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
describe('currentBlockHash', () => {
|
|
97
|
-
it('should return current block hash', async () => {
|
|
98
|
-
const hash = await sut.currentBlockHash()
|
|
99
|
-
expect(asHash(hash)).toBeDefined()
|
|
100
|
-
})
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
describe('currentBlockNumber', () => {
|
|
104
|
-
it('should return current block number', async () => {
|
|
105
|
-
const latestBlockNumber = await sut.currentBlockNumber()
|
|
106
|
-
expect(latestBlockNumber).toBeNumber()
|
|
107
|
-
})
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
describe('transactionByBlockHashAndIndex', () => {
|
|
111
|
-
let block: HydratedBlock
|
|
112
|
-
|
|
113
|
-
beforeAll(async () => {
|
|
114
|
-
block = await sut.currentBlock()
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
it('should return a transaction if valid block hash and index are provided', async () => {
|
|
118
|
-
const blockHash = block[0]._hash
|
|
119
|
-
const txIndex = 0
|
|
120
|
-
const tx = await sut.transactionByBlockHashAndIndex(blockHash, txIndex)
|
|
121
|
-
// Depending on your chain setup, this might sometimes be null
|
|
122
|
-
expect(tx === null || typeof tx === 'object').toBeTruthy()
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
it('should return null for invalid transaction index', async () => {
|
|
126
|
-
const block = await sut.currentBlock()
|
|
127
|
-
const blockHash = block[0]._hash
|
|
128
|
-
const tx = await sut.transactionByBlockHashAndIndex(blockHash, 9999)
|
|
129
|
-
expect(tx).toBeNull()
|
|
130
|
-
})
|
|
131
|
-
})
|
|
132
|
-
|
|
133
|
-
describe('transactionByBlockNumberAndIndex', () => {
|
|
134
|
-
let blockNumber: number
|
|
135
|
-
|
|
136
|
-
beforeAll(async () => {
|
|
137
|
-
blockNumber = await sut.currentBlockNumber()
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
it('should return a transaction if valid block number and index are provided', async () => {
|
|
141
|
-
const tx = await sut.transactionByBlockNumberAndIndex(blockNumber, 0)
|
|
142
|
-
expect(tx).not.toBeNull()
|
|
143
|
-
})
|
|
144
|
-
|
|
145
|
-
it('should return null for invalid block number', async () => {
|
|
146
|
-
const tx = await sut.transactionByBlockNumberAndIndex(Number.MAX_SAFE_INTEGER, 0)
|
|
147
|
-
expect(tx).toBeNull()
|
|
148
|
-
})
|
|
149
|
-
|
|
150
|
-
it('should return null for invalid transaction index', async () => {
|
|
151
|
-
const tx = await sut.transactionByBlockNumberAndIndex(blockNumber, 1_000_000)
|
|
152
|
-
expect(tx).toBeNull()
|
|
153
|
-
})
|
|
154
|
-
})
|
|
155
|
-
|
|
156
|
-
describe('transactionByHash', () => {
|
|
157
|
-
let transactionHash: Hash
|
|
158
|
-
beforeAll(async () => {
|
|
159
|
-
const blockNumber = await sut.currentBlockNumber()
|
|
160
|
-
const tx = await sut.transactionByBlockNumberAndIndex(blockNumber, 0)
|
|
161
|
-
expect(tx).not.toBeNull()
|
|
162
|
-
transactionHash = await PayloadBuilder.hash(assertEx(tx)[0])
|
|
163
|
-
})
|
|
164
|
-
it('should return tx by hash', async () => {
|
|
165
|
-
const tx = await sut.transactionByHash(transactionHash)
|
|
166
|
-
expect(tx).not.toBeNull()
|
|
167
|
-
})
|
|
168
|
-
it('should return null for unknown tx hash', async () => {
|
|
169
|
-
const tx = await sut.transactionByHash('4b5958c6d16b26d6790e33f5be45578728b0ea36e40a0d1b9c9164822341cac1' as Hash)
|
|
170
|
-
expect(tx).toBeNull()
|
|
171
|
-
})
|
|
172
|
-
})
|
|
173
|
-
})
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import type { AccountInstance } from '@xyo-network/account-model'
|
|
2
|
-
import { HDWallet } from '@xyo-network/wallet'
|
|
3
|
-
import type { GatewayName } from '@xyo-network/xl1-protocol'
|
|
4
|
-
import type {
|
|
5
|
-
XyoClient, XyoConnection,
|
|
6
|
-
XyoGateway,
|
|
7
|
-
XyoPermissions,
|
|
8
|
-
} from '@xyo-network/xl1-protocol-sdk'
|
|
9
|
-
import {
|
|
10
|
-
ADDRESS_INDEX, generateXyoBaseWalletFromPhrase, MemoryPermissionsStore, SimpleXyoClient, SimpleXyoGateway,
|
|
11
|
-
SimpleXyoPermissions,
|
|
12
|
-
SimpleXyoSigner,
|
|
13
|
-
} from '@xyo-network/xl1-protocol-sdk'
|
|
14
|
-
import {
|
|
15
|
-
beforeEach, describe, expect, it,
|
|
16
|
-
} from 'vitest'
|
|
17
|
-
|
|
18
|
-
import { HttpRpcXyoConnection } from '../provider/connection/index.ts'
|
|
19
|
-
|
|
20
|
-
describe('Client', () => {
|
|
21
|
-
const endpoint = 'http://localhost:8080/rpc'
|
|
22
|
-
const invoker = 'http://localhost:3000'
|
|
23
|
-
// const dataLakeEndpoint = 'http://localhost:8080/chain/archivist'
|
|
24
|
-
let account: AccountInstance
|
|
25
|
-
let signer: SimpleXyoSigner
|
|
26
|
-
let store
|
|
27
|
-
let permissions: XyoPermissions
|
|
28
|
-
let connection: XyoConnection
|
|
29
|
-
let gateway: XyoGateway
|
|
30
|
-
let client: XyoClient
|
|
31
|
-
|
|
32
|
-
beforeEach(async () => {
|
|
33
|
-
const mnemonic = process.env.XL1_PRODUCER__MNEMONIC ?? HDWallet.generateMnemonic()
|
|
34
|
-
const wallet = await generateXyoBaseWalletFromPhrase(mnemonic)
|
|
35
|
-
account = await wallet.derivePath(ADDRESS_INDEX.XYO)
|
|
36
|
-
signer = new SimpleXyoSigner(account)
|
|
37
|
-
store = new MemoryPermissionsStore(invoker)
|
|
38
|
-
permissions = new SimpleXyoPermissions(store)
|
|
39
|
-
connection = new HttpRpcXyoConnection({
|
|
40
|
-
endpoint,
|
|
41
|
-
// storage: dataLakeEndpoint,
|
|
42
|
-
})
|
|
43
|
-
gateway = new SimpleXyoGateway(signer, connection)
|
|
44
|
-
client = new SimpleXyoClient({ localhost: gateway }, permissions)
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
describe('permissions', () => {
|
|
48
|
-
it('should be have permissions', () => {
|
|
49
|
-
const permissions = client.permissions
|
|
50
|
-
expect(permissions).toBeDefined()
|
|
51
|
-
})
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
describe('gateways', () => {
|
|
55
|
-
describe('connection', () => {
|
|
56
|
-
it('should be defined', () => {
|
|
57
|
-
const gateway = client.gateways['localhost' as GatewayName].connection
|
|
58
|
-
expect(gateway).toBeDefined()
|
|
59
|
-
})
|
|
60
|
-
it('should allow retrieving the chain ID', async () => {
|
|
61
|
-
const chainId = await (await client.gateways['localhost' as GatewayName]?.connection())?.viewer?.chainId()
|
|
62
|
-
expect(chainId).toBeDefined()
|
|
63
|
-
})
|
|
64
|
-
})
|
|
65
|
-
})
|
|
66
|
-
})
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import type { Hash } from '@xylabs/sdk-js'
|
|
2
|
-
import { isHash } from '@xylabs/sdk-js'
|
|
3
|
-
import { Account } from '@xyo-network/account'
|
|
4
|
-
import type { AccountInstance } from '@xyo-network/account-model'
|
|
5
|
-
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
6
|
-
import type { AnyPayload, Payload } from '@xyo-network/payload-model'
|
|
7
|
-
import type { AllowedBlockPayload, SignedHydratedTransaction } from '@xyo-network/xl1-protocol'
|
|
8
|
-
import type { XyoGatewayRunner } from '@xyo-network/xl1-protocol-sdk'
|
|
9
|
-
import {
|
|
10
|
-
buildUnsignedTransaction, SimpleXyoGatewayRunner,
|
|
11
|
-
SimpleXyoSigner,
|
|
12
|
-
} from '@xyo-network/xl1-protocol-sdk'
|
|
13
|
-
import {
|
|
14
|
-
beforeEach, describe, expect, it,
|
|
15
|
-
vi,
|
|
16
|
-
} from 'vitest'
|
|
17
|
-
|
|
18
|
-
import { HttpRpcXyoConnection } from '../provider/connection/index.ts'
|
|
19
|
-
|
|
20
|
-
describe('MemoryXyoGateway', () => {
|
|
21
|
-
const endpoint = 'http://localhost:8080/rpc'
|
|
22
|
-
// const dataLakeEndpoint = 'http://localhost:8080/chain/archivist'
|
|
23
|
-
let account: AccountInstance
|
|
24
|
-
let signer: SimpleXyoSigner
|
|
25
|
-
let connection: HttpRpcXyoConnection
|
|
26
|
-
let sut: XyoGatewayRunner
|
|
27
|
-
|
|
28
|
-
beforeEach(async () => {
|
|
29
|
-
account = await Account.random()
|
|
30
|
-
signer = new SimpleXyoSigner(account)
|
|
31
|
-
|
|
32
|
-
connection = new HttpRpcXyoConnection({
|
|
33
|
-
endpoint,
|
|
34
|
-
// storage: dataLakeEndpoint,
|
|
35
|
-
})
|
|
36
|
-
sut = new SimpleXyoGatewayRunner(connection, signer)
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
describe('connection', () => {
|
|
40
|
-
it('should return the connection', () => {
|
|
41
|
-
expect(sut.connection).toBeDefined()
|
|
42
|
-
})
|
|
43
|
-
})
|
|
44
|
-
describe('signer', () => {
|
|
45
|
-
it('should return the signer', () => {
|
|
46
|
-
expect(sut.signer).toBeDefined()
|
|
47
|
-
})
|
|
48
|
-
})
|
|
49
|
-
describe('submitTransaction', () => {
|
|
50
|
-
it('should submit the transaction', async () => {
|
|
51
|
-
const elevatedPayloads: AllowedBlockPayload[] = []
|
|
52
|
-
const additionalPayloads: Payload[] = []
|
|
53
|
-
const chainId = await connection.viewer?.chainId()
|
|
54
|
-
const nbf = await connection.viewer?.currentBlockNumber() ?? 0
|
|
55
|
-
const signer = await sut.signer()
|
|
56
|
-
const signerAddress = await signer.address()
|
|
57
|
-
expect(chainId).toBeDefined()
|
|
58
|
-
if (chainId) {
|
|
59
|
-
const unsignedTransaction = await buildUnsignedTransaction(chainId, elevatedPayloads, additionalPayloads, nbf, nbf + 1000, signerAddress)
|
|
60
|
-
const tx = await signer.signTransaction(unsignedTransaction)
|
|
61
|
-
expect(tx).toBeDefined()
|
|
62
|
-
}
|
|
63
|
-
})
|
|
64
|
-
})
|
|
65
|
-
describe('addPayloadsToChain', () => {
|
|
66
|
-
it('should add payloads to the chain', async () => {
|
|
67
|
-
const mockRunner = vi.spyOn(connection.runner!, 'broadcastTransaction').mockImplementation(async (tx: SignedHydratedTransaction) => {
|
|
68
|
-
return await PayloadBuilder.hash(tx[0])
|
|
69
|
-
})
|
|
70
|
-
const chainId = (await Account.random()).address
|
|
71
|
-
const mockSigner = vi.spyOn(signer, 'signTransaction')
|
|
72
|
-
const elevatedPayloads: AllowedBlockPayload[] = [
|
|
73
|
-
{ schema: 'network.xyo.hash', hash: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef' as Hash },
|
|
74
|
-
]
|
|
75
|
-
const additionalPayloads: AnyPayload[] = [{
|
|
76
|
-
schema: 'network.xyo.data',
|
|
77
|
-
data: 'foo',
|
|
78
|
-
}]
|
|
79
|
-
const result = await sut.addPayloadsToChain(elevatedPayloads, additionalPayloads, {
|
|
80
|
-
nbf: 0,
|
|
81
|
-
exp: 1000,
|
|
82
|
-
chain: chainId,
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
// Verify mocks were called
|
|
86
|
-
expect(mockRunner).toHaveBeenCalled()
|
|
87
|
-
expect(mockSigner).toHaveBeenCalled()
|
|
88
|
-
|
|
89
|
-
// Verify result
|
|
90
|
-
expect(result[0]).toEqual(await PayloadBuilder.hash(result[1][0]))
|
|
91
|
-
expect(result).toBeDefined()
|
|
92
|
-
expect(result.length).toBe(2)
|
|
93
|
-
expect(isHash(result[0])).toBe(true)
|
|
94
|
-
expect(result[1][0].nbf).toBe(0)
|
|
95
|
-
expect(result[1][0].exp).toBe(1000)
|
|
96
|
-
expect(result[1][0].chain).toBe(chainId)
|
|
97
|
-
})
|
|
98
|
-
})
|
|
99
|
-
})
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { BigIntToJsonZod, JsonToBigIntZod } from '@xylabs/sdk-js'
|
|
2
|
-
import {
|
|
3
|
-
describe, expect, it,
|
|
4
|
-
} from 'vitest'
|
|
5
|
-
|
|
6
|
-
describe('BigIntZod', () => {
|
|
7
|
-
describe('JsonToBigIntZod', () => {
|
|
8
|
-
it.each(['0', '00', '01010101', '0308'])('should bigint from string', (input) => {
|
|
9
|
-
const result = JsonToBigIntZod.safeParse(input)
|
|
10
|
-
expect(result.success).toBe(true)
|
|
11
|
-
})
|
|
12
|
-
})
|
|
13
|
-
describe('BigIntToJsonZod', () => {
|
|
14
|
-
it.each([0n, 1n, 100n, 1000n, 1_000_000n])('should parse bigint to string', (input) => {
|
|
15
|
-
const result = BigIntToJsonZod.safeParse(input)
|
|
16
|
-
expect(result.success).toBe(true)
|
|
17
|
-
})
|
|
18
|
-
})
|
|
19
|
-
})
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { Account } from '@xyo-network/account'
|
|
2
|
-
import { buildRandomChain } from '@xyo-network/chain-protocol'
|
|
3
|
-
import {
|
|
4
|
-
describe, expect, it,
|
|
5
|
-
} from 'vitest'
|
|
6
|
-
|
|
7
|
-
import { SignedHydratedBlockWithStorageMetaZod } from '../HydratedBlock.ts'
|
|
8
|
-
|
|
9
|
-
const account = await Account.random()
|
|
10
|
-
const signedHydratedBlock = (await buildRandomChain(account, 3))[1]
|
|
11
|
-
|
|
12
|
-
describe('SignedHydratedBlockZod', () => {
|
|
13
|
-
it('should parse a signed hydrated block', () => {
|
|
14
|
-
const result = SignedHydratedBlockWithStorageMetaZod.safeParse(signedHydratedBlock)
|
|
15
|
-
expect(result.data).toEqual(signedHydratedBlock)
|
|
16
|
-
expect(result.success).toBe(true)
|
|
17
|
-
})
|
|
18
|
-
})
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { ZERO_ADDRESS } from '@xylabs/sdk-js'
|
|
2
|
-
import { buildRandomTransaction } from '@xyo-network/chain-protocol'
|
|
3
|
-
import { asHydratedTransactionWithStorageMeta } from '@xyo-network/xl1-protocol'
|
|
4
|
-
import {
|
|
5
|
-
describe, expect, it,
|
|
6
|
-
} from 'vitest'
|
|
7
|
-
|
|
8
|
-
import { HydratedTransactionZod } from '../HydratedTransaction.ts'
|
|
9
|
-
|
|
10
|
-
const hydratedTransaction = await buildRandomTransaction(ZERO_ADDRESS)
|
|
11
|
-
|
|
12
|
-
describe('HydratedTransaction', () => {
|
|
13
|
-
it('should parse a HydratedTransaction', () => {
|
|
14
|
-
const result = HydratedTransactionZod.safeParse(hydratedTransaction)
|
|
15
|
-
expect(result.success).toBe(true)
|
|
16
|
-
expect(result.data).toEqual(asHydratedTransactionWithStorageMeta(hydratedTransaction))
|
|
17
|
-
})
|
|
18
|
-
})
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { asHash } from '@xylabs/sdk-js'
|
|
2
|
-
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
3
|
-
import { PayloadZod, WithStorageMetaZod } from '@xyo-network/payload-model'
|
|
4
|
-
import type { HashPayload } from '@xyo-network/xl1-protocol'
|
|
5
|
-
import { HashSchema } from '@xyo-network/xl1-protocol'
|
|
6
|
-
import {
|
|
7
|
-
describe, expect, it,
|
|
8
|
-
} from 'vitest'
|
|
9
|
-
|
|
10
|
-
const hashPayload: HashPayload = {
|
|
11
|
-
schema: HashSchema,
|
|
12
|
-
hash: asHash('e70f82c755ac75847f9d1c6b45d96099b343571d724e5383569724c85cc9d303', true),
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const hashPayloadWithMeta = await PayloadBuilder.addStorageMeta(hashPayload)
|
|
16
|
-
|
|
17
|
-
describe('Payload', () => {
|
|
18
|
-
it('should parse a HashPayload', () => {
|
|
19
|
-
const result = PayloadZod.safeParse(hashPayload)
|
|
20
|
-
expect(result.success).toBe(true)
|
|
21
|
-
expect(result.data).toEqual(hashPayload)
|
|
22
|
-
})
|
|
23
|
-
it('should parse a HashPayload with storage Meta', () => {
|
|
24
|
-
const result = WithStorageMetaZod(PayloadZod).safeParse(hashPayloadWithMeta)
|
|
25
|
-
expect(result.success).toBe(true)
|
|
26
|
-
expect(result.data).toEqual(hashPayloadWithMeta)
|
|
27
|
-
})
|
|
28
|
-
})
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { ZERO_ADDRESS } from '@xylabs/sdk-js'
|
|
2
|
-
import { buildRandomTransaction } from '@xyo-network/chain-protocol'
|
|
3
|
-
import { asTransactionBoundWitness } from '@xyo-network/xl1-protocol'
|
|
4
|
-
import {
|
|
5
|
-
describe, expect, it,
|
|
6
|
-
} from 'vitest'
|
|
7
|
-
|
|
8
|
-
import { TransactionBoundWitnessZod } from '../TransactionBoundWitness.ts'
|
|
9
|
-
|
|
10
|
-
const txBoundWitness = (await buildRandomTransaction(ZERO_ADDRESS))[0]
|
|
11
|
-
|
|
12
|
-
describe('TransactionBoundWitness', () => {
|
|
13
|
-
it('should parse a TransactionBoundWitness', () => {
|
|
14
|
-
const result = TransactionBoundWitnessZod.safeParse(txBoundWitness)
|
|
15
|
-
expect(result.success).toEqual(true)
|
|
16
|
-
expect(asTransactionBoundWitness(result.data)).toEqual(txBoundWitness)
|
|
17
|
-
})
|
|
18
|
-
})
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
describe, expect, it,
|
|
3
|
-
} from 'vitest'
|
|
4
|
-
|
|
5
|
-
import { UnsignedHydratedTransactionZod } from '../HydratedTransaction.ts'
|
|
6
|
-
|
|
7
|
-
const unsignedHydratedTransaction = [
|
|
8
|
-
{
|
|
9
|
-
$signatures: [],
|
|
10
|
-
chain: '0000000000000000000000000000000000000000',
|
|
11
|
-
fees: {
|
|
12
|
-
base: 'e8d4a51000',
|
|
13
|
-
gasLimit: '038d7ea4c68000',
|
|
14
|
-
gasPrice: '02540be400',
|
|
15
|
-
priority: '00',
|
|
16
|
-
},
|
|
17
|
-
nbf: 1,
|
|
18
|
-
exp: 1001,
|
|
19
|
-
from: 'ce544b3bab3131c8c68954873e281fda3ede8f3b',
|
|
20
|
-
script: [
|
|
21
|
-
'elevate|e70f82c755ac75847f9d1c6b45d96099b343571d724e5383569724c85cc9d303',
|
|
22
|
-
],
|
|
23
|
-
addresses: [],
|
|
24
|
-
payload_hashes: [
|
|
25
|
-
'e70f82c755ac75847f9d1c6b45d96099b343571d724e5383569724c85cc9d303',
|
|
26
|
-
'd5ab1ca9dba010cfe626b8e6a75df0665005dfe4b85c16a30d4c9520cc021970',
|
|
27
|
-
],
|
|
28
|
-
payload_schemas: [
|
|
29
|
-
'network.xyo.hash',
|
|
30
|
-
'network.xyo.id',
|
|
31
|
-
],
|
|
32
|
-
previous_hashes: [],
|
|
33
|
-
schema: 'network.xyo.boundwitness',
|
|
34
|
-
},
|
|
35
|
-
[
|
|
36
|
-
{
|
|
37
|
-
hash: 'd5ab1ca9dba010cfe626b8e6a75df0665005dfe4b85c16a30d4c9520cc021970',
|
|
38
|
-
schema: 'network.xyo.hash',
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
salt: 'Hello from Sample - 2025-08-08T17:47:51.106Z',
|
|
42
|
-
schema: 'network.xyo.id',
|
|
43
|
-
},
|
|
44
|
-
],
|
|
45
|
-
]
|
|
46
|
-
|
|
47
|
-
describe('UnsignedHydratedTransaction', () => {
|
|
48
|
-
it('should parse an UnsignedHydratedTransaction', () => {
|
|
49
|
-
const result = UnsignedHydratedTransactionZod.safeParse(unsignedHydratedTransaction)
|
|
50
|
-
expect(result.success).toBe(true)
|
|
51
|
-
expect(result.data).toEqual(unsignedHydratedTransaction)
|
|
52
|
-
})
|
|
53
|
-
})
|