@xyo-network/chain-services 1.16.9 → 1.16.10
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/neutral/AccountBalance/BaseAccountBalanceService.d.ts +14 -4
- package/dist/neutral/AccountBalance/BaseAccountBalanceService.d.ts.map +1 -1
- package/dist/neutral/AccountTransfers/index.d.ts +0 -1
- package/dist/neutral/AccountTransfers/index.d.ts.map +1 -1
- package/dist/neutral/BlockProducer/BaseBlockProducerService.d.ts +2 -6
- package/dist/neutral/BlockProducer/BaseBlockProducerService.d.ts.map +1 -1
- package/dist/neutral/BlockProducer/spec/BaseBlockProducerService.spec.d.ts.map +1 -1
- package/dist/neutral/ChainValidator/XyoValidator.d.ts +2 -6
- package/dist/neutral/ChainValidator/XyoValidator.d.ts.map +1 -1
- package/dist/neutral/StakeIntent/XyoStakeIntentService.d.ts +1 -3
- package/dist/neutral/StakeIntent/XyoStakeIntentService.d.ts.map +1 -1
- package/dist/neutral/Time/BaseTimeSyncService.d.ts +7 -10
- package/dist/neutral/Time/BaseTimeSyncService.d.ts.map +1 -1
- package/dist/neutral/blockViewerFromChainIteratorAndArchivist.d.ts +4 -0
- package/dist/neutral/blockViewerFromChainIteratorAndArchivist.d.ts.map +1 -0
- package/dist/neutral/index.mjs +187 -232
- package/dist/neutral/index.mjs.map +1 -1
- package/package.json +25 -25
- package/src/AccountBalance/BaseAccountBalanceService.ts +31 -5
- package/src/AccountTransfers/index.ts +0 -1
- package/src/BlockProducer/BaseBlockProducerService.ts +2 -2
- package/src/BlockProducer/spec/BaseBlockProducerService.spec.ts +2 -5
- package/src/StakeIntent/XyoStakeIntentService.ts +2 -2
- package/src/Time/BaseTimeSyncService.ts +24 -78
- package/src/blockViewerFromChainIteratorAndArchivist.ts +61 -0
- package/dist/neutral/AccountTransfers/accountTransfersServiceFromArchivist.d.ts +0 -6
- package/dist/neutral/AccountTransfers/accountTransfersServiceFromArchivist.d.ts.map +0 -1
- package/src/AccountTransfers/accountTransfersServiceFromArchivist.ts +0 -39
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "http://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@xyo-network/chain-services",
|
|
4
|
-
"version": "1.16.
|
|
4
|
+
"version": "1.16.10",
|
|
5
5
|
"description": "XYO Layer One SDK Services",
|
|
6
6
|
"homepage": "https://xylabs.com",
|
|
7
7
|
"bugs": {
|
|
@@ -37,53 +37,53 @@
|
|
|
37
37
|
],
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@opentelemetry/api": "~1.9.0",
|
|
40
|
-
"@xylabs/array": "~5.0.
|
|
41
|
-
"@xylabs/assert": "~5.0.
|
|
42
|
-
"@xylabs/creatable": "~5.0.
|
|
43
|
-
"@xylabs/decimal-precision": "~5.0.
|
|
44
|
-
"@xylabs/events": "~5.0.
|
|
45
|
-
"@xylabs/exists": "~5.0.
|
|
46
|
-
"@xylabs/forget": "~5.0.
|
|
47
|
-
"@xylabs/hex": "~5.0.
|
|
48
|
-
"@xylabs/object": "~5.0.
|
|
49
|
-
"@xylabs/promise": "~5.0.
|
|
50
|
-
"@xylabs/telemetry": "~5.0.
|
|
51
|
-
"@xylabs/typeof": "~5.0.
|
|
40
|
+
"@xylabs/array": "~5.0.25",
|
|
41
|
+
"@xylabs/assert": "~5.0.25",
|
|
42
|
+
"@xylabs/creatable": "~5.0.25",
|
|
43
|
+
"@xylabs/decimal-precision": "~5.0.25",
|
|
44
|
+
"@xylabs/events": "~5.0.25",
|
|
45
|
+
"@xylabs/exists": "~5.0.25",
|
|
46
|
+
"@xylabs/forget": "~5.0.25",
|
|
47
|
+
"@xylabs/hex": "~5.0.25",
|
|
48
|
+
"@xylabs/object": "~5.0.25",
|
|
49
|
+
"@xylabs/promise": "~5.0.25",
|
|
50
|
+
"@xylabs/telemetry": "~5.0.25",
|
|
51
|
+
"@xylabs/typeof": "~5.0.25",
|
|
52
52
|
"@xyo-network/account-model": "~5.1.21",
|
|
53
53
|
"@xyo-network/archivist-memory": "~5.1.21",
|
|
54
54
|
"@xyo-network/archivist-model": "~5.1.21",
|
|
55
55
|
"@xyo-network/boundwitness-model": "~5.1.21",
|
|
56
56
|
"@xyo-network/boundwitness-validator": "~5.1.21",
|
|
57
57
|
"@xyo-network/boundwitness-wrapper": "~5.1.21",
|
|
58
|
-
"@xyo-network/chain-analyze": "~1.16.
|
|
59
|
-
"@xyo-network/chain-modules": "~1.16.
|
|
60
|
-
"@xyo-network/chain-protocol": "~1.16.
|
|
61
|
-
"@xyo-network/chain-utils": "~1.16.
|
|
58
|
+
"@xyo-network/chain-analyze": "~1.16.10",
|
|
59
|
+
"@xyo-network/chain-modules": "~1.16.10",
|
|
60
|
+
"@xyo-network/chain-protocol": "~1.16.10",
|
|
61
|
+
"@xyo-network/chain-utils": "~1.16.10",
|
|
62
62
|
"@xyo-network/payload-builder": "~5.1.21",
|
|
63
63
|
"@xyo-network/payload-model": "~5.1.21",
|
|
64
64
|
"@xyo-network/typechain": "~4.0.10",
|
|
65
|
-
"@xyo-network/xl1-protocol": "~1.13.
|
|
66
|
-
"@xyo-network/xl1-protocol-sdk": "~1.16.
|
|
67
|
-
"@xyo-network/xl1-validation": "~1.16.
|
|
68
|
-
"@xyo-network/xl1-wrappers": "~1.16.
|
|
65
|
+
"@xyo-network/xl1-protocol": "~1.13.11",
|
|
66
|
+
"@xyo-network/xl1-protocol-sdk": "~1.16.10",
|
|
67
|
+
"@xyo-network/xl1-validation": "~1.16.10",
|
|
68
|
+
"@xyo-network/xl1-wrappers": "~1.16.10",
|
|
69
69
|
"async-mutex": "~0.5.0",
|
|
70
70
|
"ethers": "6.15.0",
|
|
71
71
|
"lru-cache": "~11.2.2"
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
74
74
|
"@types/node": "~24.10.1",
|
|
75
|
-
"@xylabs/delay": "~5.0.
|
|
75
|
+
"@xylabs/delay": "~5.0.25",
|
|
76
76
|
"@xylabs/ts-scripts-yarn3": "~7.2.8",
|
|
77
77
|
"@xylabs/tsconfig": "~7.2.8",
|
|
78
|
-
"@xylabs/vitest-extended": "~5.0.
|
|
78
|
+
"@xylabs/vitest-extended": "~5.0.25",
|
|
79
79
|
"@xyo-network/account": "~5.1.21",
|
|
80
80
|
"@xyo-network/account-model": "~5.1.21",
|
|
81
|
-
"@xyo-network/chain-validation": "~1.16.
|
|
81
|
+
"@xyo-network/chain-validation": "~1.16.10",
|
|
82
82
|
"@xyo-network/wallet": "~5.1.21",
|
|
83
83
|
"eslint": "^9.39.1",
|
|
84
84
|
"tslib": "~2.8.1",
|
|
85
85
|
"typescript": "~5.9.3",
|
|
86
|
-
"vitest": "~4.0.
|
|
86
|
+
"vitest": "~4.0.9",
|
|
87
87
|
"vitest-mock-extended": "~3.1.0",
|
|
88
88
|
"web3-types": "~1.10.0"
|
|
89
89
|
},
|
|
@@ -1,31 +1,45 @@
|
|
|
1
1
|
import { creatable } from '@xylabs/creatable'
|
|
2
2
|
import { Address, Hash } from '@xylabs/hex'
|
|
3
|
-
import { Promisable } from '@xylabs/promise'
|
|
4
3
|
import { spanRootAsync } from '@xylabs/telemetry'
|
|
4
|
+
import { ReadArchivist } from '@xyo-network/archivist-model'
|
|
5
5
|
import { AttoXL1, XL1BlockRange } from '@xyo-network/xl1-protocol'
|
|
6
6
|
import {
|
|
7
7
|
AccountBalanceHistoryItem,
|
|
8
8
|
AccountBalanceService,
|
|
9
9
|
balancesSummary,
|
|
10
10
|
BalanceStepSummaryContext,
|
|
11
|
+
BlockViewer,
|
|
12
|
+
EventingChainBlockNumberIteratorService,
|
|
13
|
+
SimpleAccountBalanceViewer,
|
|
14
|
+
TransfersStepSummaryContext,
|
|
11
15
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
12
16
|
|
|
13
17
|
import { BaseService } from '../BaseService.ts'
|
|
18
|
+
import { blockViewerFromChainIteratorAndArchivist } from '../blockViewerFromChainIteratorAndArchivist.ts'
|
|
14
19
|
import { BaseServiceParams } from '../model/index.ts'
|
|
15
20
|
|
|
16
21
|
export interface BaseAccountBalanceServiceParams extends BaseServiceParams {
|
|
22
|
+
chainArchivist: ReadArchivist
|
|
23
|
+
chainIterator: EventingChainBlockNumberIteratorService
|
|
17
24
|
context: BalanceStepSummaryContext
|
|
25
|
+
transferContext: TransfersStepSummaryContext
|
|
18
26
|
}
|
|
19
27
|
|
|
20
28
|
@creatable()
|
|
21
29
|
export class BaseAccountBalanceService extends BaseService<BaseAccountBalanceServiceParams> implements AccountBalanceService {
|
|
30
|
+
protected accountBalanceViewer!: AccountBalanceService
|
|
31
|
+
protected blockViewer!: BlockViewer
|
|
32
|
+
|
|
22
33
|
async accountBalance(address: Address, headOrRange?: XL1BlockRange | Hash): Promise<AttoXL1> {
|
|
23
34
|
const balances = await this.accountBalances([address], headOrRange)
|
|
24
35
|
return balances[address] ?? AttoXL1(0n)
|
|
25
36
|
}
|
|
26
37
|
|
|
27
|
-
accountBalanceHistory(
|
|
28
|
-
|
|
38
|
+
async accountBalanceHistory(address: Address): Promise<AccountBalanceHistoryItem[]>
|
|
39
|
+
async accountBalanceHistory(address: Address, head: Hash): Promise<AccountBalanceHistoryItem[]>
|
|
40
|
+
async accountBalanceHistory(address: Address, range: XL1BlockRange): Promise<AccountBalanceHistoryItem[]>
|
|
41
|
+
async accountBalanceHistory(address: Address, headOrRange?: Hash | XL1BlockRange): Promise<AccountBalanceHistoryItem[]> {
|
|
42
|
+
return await this.accountBalanceViewer.accountBalanceHistory(address, headOrRange)
|
|
29
43
|
}
|
|
30
44
|
|
|
31
45
|
async accountBalances(address: Address[], _headOrRange?: XL1BlockRange | Hash): Promise<Partial<Record<Address, AttoXL1>>> {
|
|
@@ -42,7 +56,19 @@ export class BaseAccountBalanceService extends BaseService<BaseAccountBalanceSer
|
|
|
42
56
|
})
|
|
43
57
|
}
|
|
44
58
|
|
|
45
|
-
accountBalancesHistories(
|
|
46
|
-
|
|
59
|
+
async accountBalancesHistories(addresses: Address[]): Promise<Partial<Record<Address, AccountBalanceHistoryItem[]>>>
|
|
60
|
+
async accountBalancesHistories(addresses: Address[], head: Hash): Promise<Partial<Record<Address, AccountBalanceHistoryItem[]>>>
|
|
61
|
+
async accountBalancesHistories(addresses: Address[], range: XL1BlockRange): Promise<Partial<Record<Address, AccountBalanceHistoryItem[]>>>
|
|
62
|
+
async accountBalancesHistories(addresses: Address[], headOrRange?: Hash | XL1BlockRange): Promise<Partial<Record<Address, AccountBalanceHistoryItem[]>>> {
|
|
63
|
+
return await this.accountBalanceViewer.accountBalancesHistories(addresses, headOrRange)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
override createHandler() {
|
|
67
|
+
this.blockViewer = blockViewerFromChainIteratorAndArchivist(this.params.chainIterator, this.params.chainArchivist)
|
|
68
|
+
this.accountBalanceViewer = new SimpleAccountBalanceViewer(
|
|
69
|
+
this.params.context,
|
|
70
|
+
this.params.transferContext,
|
|
71
|
+
this.blockViewer,
|
|
72
|
+
)
|
|
47
73
|
}
|
|
48
74
|
}
|
|
@@ -3,7 +3,7 @@ import { assertEx } from '@xylabs/assert'
|
|
|
3
3
|
import { creatable } from '@xylabs/creatable'
|
|
4
4
|
import { exists } from '@xylabs/exists'
|
|
5
5
|
import {
|
|
6
|
-
Address, Hex, hexToBigInt, toHex,
|
|
6
|
+
Address, asHash, Hex, hexToBigInt, toHex,
|
|
7
7
|
} from '@xylabs/hex'
|
|
8
8
|
import { isDefined } from '@xylabs/typeof'
|
|
9
9
|
import { ArchivistInstance } from '@xyo-network/archivist-model'
|
|
@@ -277,7 +277,7 @@ export class BaseBlockProducerService extends BaseService<BaseBlockProducerServi
|
|
|
277
277
|
|
|
278
278
|
private async generateTimePayload(head: WithStorageMeta<BlockBoundWitness>) {
|
|
279
279
|
const [ethereum, ethHashOrNull] = await this.time.currentTimeAndHash('ethereum')
|
|
280
|
-
const ethereumHash =
|
|
280
|
+
const ethereumHash = asHash(ethHashOrNull, () => 'No ethereum hash available from time sync service')
|
|
281
281
|
const timePayload: TimePayload = {
|
|
282
282
|
schema: TimeSchema,
|
|
283
283
|
// note, this is for the previous block
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/* eslint-disable max-statements */
|
|
2
1
|
import '@xylabs/vitest-extended'
|
|
3
2
|
|
|
4
3
|
import { filterAs } from '@xylabs/array'
|
|
@@ -287,10 +286,8 @@ describe('XyoBlockProducer', () => {
|
|
|
287
286
|
expect(blockRewardTransfer).toBeDefined()
|
|
288
287
|
let totalTransfer = 0n
|
|
289
288
|
for (const value of Object.values(blockRewardTransfer?.transfers ?? {})) {
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
totalTransfer += bigIntValue
|
|
293
|
-
}
|
|
289
|
+
const bigIntValue = hexToBigInt(value)
|
|
290
|
+
totalTransfer += bigIntValue
|
|
294
291
|
}
|
|
295
292
|
expect(totalTransfer).toEqual(3_000_000_000_000_000_000_000n)
|
|
296
293
|
}
|
|
@@ -94,14 +94,14 @@ export class XyoStakeIntentService extends BaseService<XyoStakeIntentServicePara
|
|
|
94
94
|
|
|
95
95
|
async getDeclaredCandidateRanges(address: Address, intent: Intent): Promise<Readonly<Readonly<[number, number]>[]>> {
|
|
96
96
|
await Promise.resolve()
|
|
97
|
-
assertEx(intent === 'producer', () => `
|
|
97
|
+
assertEx(intent === 'producer', () => `Support not yet added for intent ${intent}`)
|
|
98
98
|
const results = this._producers.get(address)
|
|
99
99
|
return results ?? []
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
async getDeclaredCandidatesForBlock(block: number, intent: Intent): Promise<Address[]> {
|
|
103
103
|
return await this.spanAsync('getDeclaredCandidatesForBlock', async () => {
|
|
104
|
-
assertEx(intent === 'producer', () => `
|
|
104
|
+
assertEx(intent === 'producer', () => `Support not yet added for intent ${intent}`)
|
|
105
105
|
const results = this._producers.findAllContaining(block)
|
|
106
106
|
const candidates = [...results]
|
|
107
107
|
const requiredMinimumStake = this.getRequiredMinimumStakeForIntent(intent)
|
|
@@ -1,24 +1,16 @@
|
|
|
1
|
-
import { assertEx } from '@xylabs/assert'
|
|
2
1
|
import { creatable } from '@xylabs/creatable'
|
|
3
|
-
import { asHash, Hash } from '@xylabs/hex'
|
|
4
2
|
import { EmptyObject } from '@xylabs/object'
|
|
5
|
-
import { Promisable } from '@xylabs/promise'
|
|
6
3
|
import { ReadArchivist } from '@xyo-network/archivist-model'
|
|
7
|
-
import {
|
|
4
|
+
import { TimeDomain, TimePayload } from '@xyo-network/xl1-protocol'
|
|
8
5
|
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
} from '@xyo-network/xl1-protocol'
|
|
12
|
-
import { EventingChainBlockNumberIteratorService, TimeSyncViewer } from '@xyo-network/xl1-protocol-sdk'
|
|
6
|
+
EventingChainBlockNumberIteratorService, SimpleTimeSyncViewer, TimeSyncViewer,
|
|
7
|
+
} from '@xyo-network/xl1-protocol-sdk'
|
|
13
8
|
import { Provider } from 'ethers'
|
|
14
9
|
|
|
15
10
|
import { BaseService } from '../BaseService.ts'
|
|
11
|
+
import { blockViewerFromChainIteratorAndArchivist } from '../blockViewerFromChainIteratorAndArchivist.ts'
|
|
16
12
|
import { BaseServiceParams } from '../model/index.ts'
|
|
17
13
|
|
|
18
|
-
export interface TimeProvider {
|
|
19
|
-
currentTime(): Promise<[string, number]>
|
|
20
|
-
}
|
|
21
|
-
|
|
22
14
|
export interface BaseTimeServiceParams<TConfig extends EmptyObject = EmptyObject> extends BaseServiceParams<TConfig> {
|
|
23
15
|
chainArchivist: ReadArchivist
|
|
24
16
|
chainIterator: EventingChainBlockNumberIteratorService
|
|
@@ -27,88 +19,42 @@ export interface BaseTimeServiceParams<TConfig extends EmptyObject = EmptyObject
|
|
|
27
19
|
|
|
28
20
|
@creatable()
|
|
29
21
|
export class BaseTimeSyncService extends BaseService<BaseTimeServiceParams> implements TimeSyncViewer {
|
|
30
|
-
|
|
22
|
+
protected timeSyncViewer!: TimeSyncViewer
|
|
23
|
+
|
|
24
|
+
protected get chainArchivist() {
|
|
31
25
|
return this.params.chainArchivist
|
|
32
26
|
}
|
|
33
27
|
|
|
34
|
-
get chainIterator() {
|
|
28
|
+
protected get chainIterator() {
|
|
35
29
|
return this.params.chainIterator
|
|
36
30
|
}
|
|
37
31
|
|
|
38
|
-
get ethProvider() {
|
|
32
|
+
protected get ethProvider() {
|
|
39
33
|
return this.params.ethProvider
|
|
40
34
|
}
|
|
41
35
|
|
|
42
36
|
async convertTime(fromDomain: TimeDomain, toDomain: TimeDomain, from: number): Promise<number> {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return timePayload.xl1 ?? 0
|
|
54
|
-
}
|
|
55
|
-
case 'epoch': {
|
|
56
|
-
return timePayload.epoch ?? 0
|
|
57
|
-
}
|
|
58
|
-
case 'ethereum': {
|
|
59
|
-
return timePayload.ethereum ?? 0
|
|
60
|
-
}
|
|
61
|
-
default: {
|
|
62
|
-
throw new Error(`Unsupported to toDomain: ${toDomain}`)
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
default: {
|
|
67
|
-
throw new Error(`Unsupported from fromDomain: ${fromDomain}`)
|
|
68
|
-
}
|
|
69
|
-
}
|
|
37
|
+
return await this.timeSyncViewer.convertTime(fromDomain, toDomain, from)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
override async createHandler(): Promise<void> {
|
|
41
|
+
await super.createHandler()
|
|
42
|
+
const blockViewer = blockViewerFromChainIteratorAndArchivist(
|
|
43
|
+
this.chainIterator,
|
|
44
|
+
this.chainArchivist,
|
|
45
|
+
)
|
|
46
|
+
this.timeSyncViewer = new SimpleTimeSyncViewer(blockViewer, this.ethProvider)
|
|
70
47
|
}
|
|
71
48
|
|
|
72
49
|
async currentTime(domain: TimeDomain): Promise<[string, number]> {
|
|
73
|
-
|
|
74
|
-
case 'xl1': {
|
|
75
|
-
return ['xl1', (await this.chainIterator.head()).block]
|
|
76
|
-
}
|
|
77
|
-
case 'epoch': {
|
|
78
|
-
return ['epoch', Date.now()]
|
|
79
|
-
}
|
|
80
|
-
case 'ethereum': {
|
|
81
|
-
return ['ethereum', (await this.ethProvider?.getBlockNumber()) ?? 0]
|
|
82
|
-
}
|
|
83
|
-
default: {
|
|
84
|
-
throw new Error(`Unknown time domain: ${domain}`)
|
|
85
|
-
}
|
|
86
|
-
}
|
|
50
|
+
return await this.timeSyncViewer.currentTime(domain)
|
|
87
51
|
}
|
|
88
52
|
|
|
89
|
-
async currentTimeAndHash(domain: TimeDomain): Promise<[number,
|
|
90
|
-
|
|
91
|
-
case 'xl1': {
|
|
92
|
-
const head = await this.chainIterator.head()
|
|
93
|
-
return [head.block, await PayloadBuilder.hash(head)]
|
|
94
|
-
}
|
|
95
|
-
case 'epoch': {
|
|
96
|
-
return [Date.now(), null]
|
|
97
|
-
}
|
|
98
|
-
case 'ethereum': {
|
|
99
|
-
const provider = assertEx(this.ethProvider, () => 'Ethereum provider not configured')
|
|
100
|
-
const blockNumber = (await provider.getBlockNumber()) ?? 0
|
|
101
|
-
const block = await provider.getBlock(blockNumber)
|
|
102
|
-
const blockHash = asHash(assertEx(block?.hash, () => 'Block hash not found'), true)
|
|
103
|
-
return [blockNumber, blockHash]
|
|
104
|
-
}
|
|
105
|
-
default: {
|
|
106
|
-
throw new Error(`Unknown time domain: ${domain}`)
|
|
107
|
-
}
|
|
108
|
-
}
|
|
53
|
+
async currentTimeAndHash(domain: TimeDomain): Promise<[number, string | null]> {
|
|
54
|
+
return await this.timeSyncViewer.currentTimeAndHash(domain)
|
|
109
55
|
}
|
|
110
56
|
|
|
111
|
-
currentTimePayload():
|
|
112
|
-
|
|
57
|
+
async currentTimePayload(): Promise<TimePayload> {
|
|
58
|
+
return await this.timeSyncViewer.currentTimePayload()
|
|
113
59
|
}
|
|
114
60
|
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { Hash } from '@xylabs/hex'
|
|
2
|
+
import { isDefined } from '@xylabs/typeof'
|
|
3
|
+
import type { ReadArchivist } from '@xyo-network/archivist-model'
|
|
4
|
+
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
5
|
+
import type {
|
|
6
|
+
HydratedBlock,
|
|
7
|
+
XL1BlockNumber,
|
|
8
|
+
} from '@xyo-network/xl1-protocol'
|
|
9
|
+
import { asBlockBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol'
|
|
10
|
+
import type { BlockViewer, EventingChainBlockNumberIteratorService } from '@xyo-network/xl1-protocol-sdk'
|
|
11
|
+
|
|
12
|
+
export function blockViewerFromChainIteratorAndArchivist(
|
|
13
|
+
chainIterator: EventingChainBlockNumberIteratorService,
|
|
14
|
+
chainArchivist: ReadArchivist,
|
|
15
|
+
): BlockViewer {
|
|
16
|
+
const result = {
|
|
17
|
+
blockByHash: async function (hash: Hash): Promise<HydratedBlock | null> {
|
|
18
|
+
const [payload] = await chainArchivist.get([hash])
|
|
19
|
+
const block = asBlockBoundWitnessWithStorageMeta(payload)
|
|
20
|
+
if (isDefined(block)) {
|
|
21
|
+
const payloads = await chainArchivist.get(block.payload_hashes)
|
|
22
|
+
return [block, payloads]
|
|
23
|
+
}
|
|
24
|
+
return null
|
|
25
|
+
},
|
|
26
|
+
blockByNumber: async function (blockNumber: XL1BlockNumber): Promise<HydratedBlock | null> {
|
|
27
|
+
const payload = await chainIterator.get(blockNumber)
|
|
28
|
+
const block = payload ? await PayloadBuilder.addStorageMeta(payload) : undefined
|
|
29
|
+
if (isDefined(block)) {
|
|
30
|
+
const payloads = await chainArchivist.get(block.payload_hashes)
|
|
31
|
+
return [block, payloads]
|
|
32
|
+
}
|
|
33
|
+
return null
|
|
34
|
+
},
|
|
35
|
+
blocksByHash: async function (hash: Hash, limit = 10): Promise<HydratedBlock[]> {
|
|
36
|
+
const results: HydratedBlock[] = []
|
|
37
|
+
for (let i = 0; i < limit; i++) {
|
|
38
|
+
const block = await this.blockByHash(hash)
|
|
39
|
+
if (block) {
|
|
40
|
+
results.push(block)
|
|
41
|
+
} else {
|
|
42
|
+
break
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return results
|
|
46
|
+
},
|
|
47
|
+
currentBlock: async function (): Promise<HydratedBlock> {
|
|
48
|
+
const head = await chainIterator.head()
|
|
49
|
+
return this.blockByHash(head._hash) as Promise<HydratedBlock>
|
|
50
|
+
},
|
|
51
|
+
currentBlockHash: async function (): Promise<Hash> {
|
|
52
|
+
const head = await chainIterator.head()
|
|
53
|
+
return head._hash
|
|
54
|
+
},
|
|
55
|
+
currentBlockNumber: async function (): Promise<XL1BlockNumber> {
|
|
56
|
+
const head = await chainIterator.head()
|
|
57
|
+
return head.block
|
|
58
|
+
},
|
|
59
|
+
} satisfies BlockViewer
|
|
60
|
+
return result
|
|
61
|
+
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { ReadArchivist } from '@xyo-network/archivist-model';
|
|
2
|
-
import type { Payload, WithStorageMeta } from '@xyo-network/payload-model';
|
|
3
|
-
import type { ChainId } from '@xyo-network/xl1-protocol';
|
|
4
|
-
import type { AccountTransfersService } from '@xyo-network/xl1-protocol-sdk';
|
|
5
|
-
export declare const accountTransfersServiceFromArchivist: (chainId: ChainId, archivist: ReadArchivist<WithStorageMeta<Payload>>) => Promise<AccountTransfersService>;
|
|
6
|
-
//# sourceMappingURL=accountTransfersServiceFromArchivist.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accountTransfersServiceFromArchivist.d.ts","sourceRoot":"","sources":["../../../src/AccountTransfers/accountTransfersServiceFromArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAEjE,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAExD,OAAO,KAAK,EAAE,uBAAuB,EAAwB,MAAM,+BAA+B,CAAA;AAMlG,eAAO,MAAM,oCAAoC,GAC/C,SAAS,OAAO,EAChB,WAAW,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,KACjD,OAAO,CAAC,uBAAuB,CAsBjC,CAAA"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { assertEx } from '@xylabs/assert'
|
|
2
|
-
import type { Hash } from '@xylabs/hex'
|
|
3
|
-
import type { ReadArchivist } from '@xyo-network/archivist-model'
|
|
4
|
-
import { findMostRecentBlock } from '@xyo-network/chain-protocol'
|
|
5
|
-
import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
|
|
6
|
-
import type { ChainId } from '@xyo-network/xl1-protocol'
|
|
7
|
-
import { StepSizes } from '@xyo-network/xl1-protocol'
|
|
8
|
-
import type { AccountTransfersService, TransfersStepSummary } from '@xyo-network/xl1-protocol-sdk'
|
|
9
|
-
import { LruCacheMap, readPayloadMapFromStore } from '@xyo-network/xl1-protocol-sdk'
|
|
10
|
-
import { Semaphore } from 'async-mutex'
|
|
11
|
-
|
|
12
|
-
import { BaseAccountTransfersService } from './BaseAccountTransfersService.ts'
|
|
13
|
-
|
|
14
|
-
export const accountTransfersServiceFromArchivist = async (
|
|
15
|
-
chainId: ChainId,
|
|
16
|
-
archivist: ReadArchivist<WithStorageMeta<Payload>>,
|
|
17
|
-
): Promise<AccountTransfersService> => {
|
|
18
|
-
const summaryMap = new LruCacheMap<string, TransfersStepSummary>({
|
|
19
|
-
max: 100_000,
|
|
20
|
-
allowStale: true,
|
|
21
|
-
noDisposeOnSet: false,
|
|
22
|
-
updateAgeOnGet: true,
|
|
23
|
-
})
|
|
24
|
-
const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(archivist)
|
|
25
|
-
const headFunc = async (): Promise<[Hash, number]> => {
|
|
26
|
-
const head = await findMostRecentBlock(archivist)
|
|
27
|
-
return [assertEx(head?._hash, () => 'No head found in chainArchivist'), assertEx(head?.block, () => 'No head found in chainArchivist')]
|
|
28
|
-
}
|
|
29
|
-
const service = await BaseAccountTransfersService.create({
|
|
30
|
-
context: {
|
|
31
|
-
chainId,
|
|
32
|
-
store: { chainMap },
|
|
33
|
-
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
34
|
-
summaryMap,
|
|
35
|
-
head: headFunc,
|
|
36
|
-
},
|
|
37
|
-
})
|
|
38
|
-
return service
|
|
39
|
-
}
|