@xyo-network/chain-services 1.16.8 → 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/AccountBalance/accountBalanceServiceFromArchivist.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/BaseService.d.ts +2 -5
- package/dist/neutral/BaseService.d.ts.map +1 -1
- package/dist/neutral/BlockProducer/BaseBlockProducerService.d.ts +4 -8
- 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/BlockReward/BaseBlockRewardService.d.ts +2 -1
- package/dist/neutral/BlockReward/BaseBlockRewardService.d.ts.map +1 -1
- package/dist/neutral/BlockReward/EvmBlockRewardService.d.ts +2 -2
- package/dist/neutral/BlockReward/EvmBlockRewardService.d.ts.map +1 -1
- package/dist/neutral/ChainService/Memory/Memory.d.ts +2 -2
- package/dist/neutral/ChainService/Memory/Memory.d.ts.map +1 -1
- package/dist/neutral/ChainValidator/XyoValidator.d.ts +4 -7
- package/dist/neutral/ChainValidator/XyoValidator.d.ts.map +1 -1
- package/dist/neutral/StakeIntent/XyoStakeIntentService.d.ts +3 -5
- package/dist/neutral/StakeIntent/XyoStakeIntentService.d.ts.map +1 -1
- package/dist/neutral/StepStake/BaseStepStakeService.d.ts +2 -2
- package/dist/neutral/StepStake/BaseStepStakeService.d.ts.map +1 -1
- package/dist/neutral/Time/BaseTimeSyncService.d.ts +11 -13
- 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 -235
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/neutral/model/Params.d.ts +4 -4
- package/dist/neutral/model/Params.d.ts.map +1 -1
- package/package.json +25 -24
- package/src/AccountBalance/BaseAccountBalanceService.ts +31 -5
- package/src/AccountBalance/accountBalanceServiceFromArchivist.ts +1 -0
- package/src/AccountTransfers/index.ts +0 -1
- package/src/BaseService.ts +2 -8
- package/src/BlockProducer/BaseBlockProducerService.ts +4 -4
- package/src/BlockProducer/spec/BaseBlockProducerService.spec.ts +2 -5
- package/src/BlockReward/BaseBlockRewardService.ts +2 -1
- package/src/BlockReward/EvmBlockRewardService.ts +4 -2
- package/src/ChainService/Memory/Memory.ts +2 -2
- package/src/ChainValidator/XyoValidator.ts +2 -1
- package/src/StakeIntent/XyoStakeIntentService.ts +4 -3
- package/src/StepStake/BaseStepStakeService.ts +2 -2
- package/src/Time/BaseTimeSyncService.ts +27 -80
- package/src/blockViewerFromChainIteratorAndArchivist.ts +61 -0
- package/src/model/Params.ts +4 -4
- package/dist/neutral/AccountTransfers/accountTransfersServiceFromArchivist.d.ts +0 -6
- package/dist/neutral/AccountTransfers/accountTransfersServiceFromArchivist.d.ts.map +0 -1
- package/dist/neutral/ChainBlockIteration/ChainBlockNumberIterationService.d.ts +0 -21
- package/dist/neutral/ChainBlockIteration/ChainBlockNumberIterationService.d.ts.map +0 -1
- package/dist/neutral/ChainBlockIteration/index.d.ts +0 -3
- package/dist/neutral/ChainBlockIteration/index.d.ts.map +0 -1
- package/dist/neutral/ChainBlockIteration/model/BlockNumberIteration.d.ts +0 -7
- package/dist/neutral/ChainBlockIteration/model/BlockNumberIteration.d.ts.map +0 -1
- package/dist/neutral/ChainBlockIteration/model/Params.d.ts +0 -8
- package/dist/neutral/ChainBlockIteration/model/Params.d.ts.map +0 -1
- package/dist/neutral/ChainBlockIteration/model/index.d.ts +0 -3
- package/dist/neutral/ChainBlockIteration/model/index.d.ts.map +0 -1
- package/src/AccountTransfers/accountTransfersServiceFromArchivist.ts +0 -39
- package/src/ChainBlockIteration/ChainBlockNumberIterationService.ts +0 -105
- package/src/ChainBlockIteration/index.ts +0 -2
- package/src/ChainBlockIteration/model/BlockNumberIteration.ts +0 -7
- package/src/ChainBlockIteration/model/Params.ts +0 -9
- package/src/ChainBlockIteration/model/index.ts +0 -2
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { CreatableParams } from '@xylabs/creatable';
|
|
2
|
+
import type { EmptyObject } from '@xylabs/object';
|
|
2
3
|
import type { AccountInstance } from '@xyo-network/account-model';
|
|
3
4
|
import type { OpenTelemetryProviders } from '@xyo-network/xl1-protocol';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
config: Config;
|
|
5
|
+
export interface BaseServiceParams<TConfig extends EmptyObject = EmptyObject> extends CreatableParams, OpenTelemetryProviders {
|
|
6
|
+
config: TConfig;
|
|
7
7
|
}
|
|
8
|
-
export interface BaseAccountableServiceParams extends BaseServiceParams {
|
|
8
|
+
export interface BaseAccountableServiceParams<TConfig extends EmptyObject = EmptyObject> extends BaseServiceParams<TConfig> {
|
|
9
9
|
account: AccountInstance;
|
|
10
10
|
}
|
|
11
11
|
//# sourceMappingURL=Params.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Params.d.ts","sourceRoot":"","sources":["../../../src/model/Params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"Params.d.ts","sourceRoot":"","sources":["../../../src/model/Params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AAEvE,MAAM,WAAW,iBAAiB,CAAC,OAAO,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,eAAe,EAAE,sBAAsB;IAC3H,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,4BAA4B,CAAC,OAAO,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,iBAAiB,CAAC,OAAO,CAAC;IACzH,OAAO,EAAE,eAAe,CAAA;CACzB"}
|
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,52 +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/
|
|
49
|
-
"@xylabs/
|
|
50
|
-
"@xylabs/
|
|
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",
|
|
51
52
|
"@xyo-network/account-model": "~5.1.21",
|
|
52
53
|
"@xyo-network/archivist-memory": "~5.1.21",
|
|
53
54
|
"@xyo-network/archivist-model": "~5.1.21",
|
|
54
55
|
"@xyo-network/boundwitness-model": "~5.1.21",
|
|
55
56
|
"@xyo-network/boundwitness-validator": "~5.1.21",
|
|
56
57
|
"@xyo-network/boundwitness-wrapper": "~5.1.21",
|
|
57
|
-
"@xyo-network/chain-analyze": "~1.16.
|
|
58
|
-
"@xyo-network/chain-modules": "~1.16.
|
|
59
|
-
"@xyo-network/chain-protocol": "~1.16.
|
|
60
|
-
"@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",
|
|
61
62
|
"@xyo-network/payload-builder": "~5.1.21",
|
|
62
63
|
"@xyo-network/payload-model": "~5.1.21",
|
|
63
64
|
"@xyo-network/typechain": "~4.0.10",
|
|
64
|
-
"@xyo-network/xl1-protocol": "~1.13.
|
|
65
|
-
"@xyo-network/xl1-protocol-sdk": "~1.16.
|
|
66
|
-
"@xyo-network/xl1-validation": "~1.16.
|
|
67
|
-
"@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",
|
|
68
69
|
"async-mutex": "~0.5.0",
|
|
69
70
|
"ethers": "6.15.0",
|
|
70
71
|
"lru-cache": "~11.2.2"
|
|
71
72
|
},
|
|
72
73
|
"devDependencies": {
|
|
73
74
|
"@types/node": "~24.10.1",
|
|
74
|
-
"@xylabs/delay": "~5.0.
|
|
75
|
+
"@xylabs/delay": "~5.0.25",
|
|
75
76
|
"@xylabs/ts-scripts-yarn3": "~7.2.8",
|
|
76
77
|
"@xylabs/tsconfig": "~7.2.8",
|
|
77
|
-
"@xylabs/vitest-extended": "~5.0.
|
|
78
|
+
"@xylabs/vitest-extended": "~5.0.25",
|
|
78
79
|
"@xyo-network/account": "~5.1.21",
|
|
79
80
|
"@xyo-network/account-model": "~5.1.21",
|
|
80
|
-
"@xyo-network/chain-validation": "~1.16.
|
|
81
|
+
"@xyo-network/chain-validation": "~1.16.10",
|
|
81
82
|
"@xyo-network/wallet": "~5.1.21",
|
|
82
83
|
"eslint": "^9.39.1",
|
|
83
84
|
"tslib": "~2.8.1",
|
|
84
85
|
"typescript": "~5.9.3",
|
|
85
|
-
"vitest": "~4.0.
|
|
86
|
+
"vitest": "~4.0.9",
|
|
86
87
|
"vitest-mock-extended": "~3.1.0",
|
|
87
88
|
"web3-types": "~1.10.0"
|
|
88
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
|
}
|
|
@@ -11,6 +11,7 @@ import { Semaphore } from 'async-mutex'
|
|
|
11
11
|
|
|
12
12
|
import { BaseAccountBalanceService } from './BaseAccountBalanceService.ts'
|
|
13
13
|
|
|
14
|
+
// this is intended to only be used for testing
|
|
14
15
|
export const accountBalancesServiceFromArchivist = async (
|
|
15
16
|
chainId: ChainId,
|
|
16
17
|
archivist: ReadArchivist<WithStorageMeta<Payload>>,
|
package/src/BaseService.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { AbstractCreatable, creatable } from '@xylabs/creatable'
|
|
2
2
|
import type { EventData } from '@xylabs/events'
|
|
3
|
-
import { Hash } from '@xylabs/hex'
|
|
4
3
|
import type { Promisable } from '@xylabs/promise'
|
|
5
4
|
import { spanRoot, spanRootAsync } from '@xylabs/telemetry'
|
|
6
|
-
import type { ServiceInterface } from '@xyo-network/xl1-protocol-sdk'
|
|
7
5
|
import { Mutex } from 'async-mutex'
|
|
8
6
|
|
|
9
7
|
import type { BaseAccountableServiceParams, BaseServiceParams } from './model/index.ts'
|
|
@@ -14,7 +12,7 @@ declare global {
|
|
|
14
12
|
|
|
15
13
|
@creatable()
|
|
16
14
|
export class BaseService<TParams extends BaseServiceParams = BaseServiceParams, TEventData extends EventData = EventData>
|
|
17
|
-
extends AbstractCreatable<TParams, TEventData>
|
|
15
|
+
extends AbstractCreatable<TParams, TEventData> {
|
|
18
16
|
private static singletonInitMutex = new Mutex()
|
|
19
17
|
|
|
20
18
|
static get singletons() {
|
|
@@ -39,10 +37,6 @@ export class BaseService<TParams extends BaseServiceParams = BaseServiceParams,
|
|
|
39
37
|
async spanAsync<T>(name: string, fn: () => Promise<T>): Promise<T> {
|
|
40
38
|
return await spanRootAsync(name, fn, this.tracer)
|
|
41
39
|
}
|
|
42
|
-
|
|
43
|
-
sync(_head: Hash): Promise<void> {
|
|
44
|
-
throw new Error('Method not implemented.')
|
|
45
|
-
}
|
|
46
40
|
}
|
|
47
41
|
|
|
48
42
|
export abstract class BaseAccountableService<
|
|
@@ -51,7 +45,7 @@ export abstract class BaseAccountableService<
|
|
|
51
45
|
// Base class for services that have an account
|
|
52
46
|
}
|
|
53
47
|
|
|
54
|
-
export interface CreatableService<T extends BaseService = BaseService>
|
|
48
|
+
export interface CreatableService<T extends BaseService = BaseService> {
|
|
55
49
|
new(params: T['params']): T
|
|
56
50
|
create<T extends BaseService>(this: CreatableService<T>, params?: Partial<T['params']>): Promisable<T>
|
|
57
51
|
}
|
|
@@ -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'
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
Transfer, XYO_STEP_REWARD_ADDRESS,
|
|
21
21
|
} from '@xyo-network/xl1-protocol'
|
|
22
22
|
import {
|
|
23
|
-
AccountBalanceService, BlockProducerService, PendingTransactionsService, StakeIntentService, TimeSyncViewer,
|
|
23
|
+
AccountBalanceService, BlockProducerService, Config, PendingTransactionsService, StakeIntentService, TimeSyncViewer,
|
|
24
24
|
} from '@xyo-network/xl1-protocol-sdk'
|
|
25
25
|
|
|
26
26
|
import { BaseService } from '../BaseService.ts'
|
|
@@ -43,7 +43,7 @@ export const XYO_PRODUCER_REDECLARATION_DURATION = 10_000
|
|
|
43
43
|
*/
|
|
44
44
|
export const XYO_PRODUCER_REDECLARATION_WINDOW = 500
|
|
45
45
|
|
|
46
|
-
export interface BaseBlockProducerServiceParams extends XyoValidatorParams {
|
|
46
|
+
export interface BaseBlockProducerServiceParams extends XyoValidatorParams<Pick<Config, 'producer'>> {
|
|
47
47
|
balanceService: AccountBalanceService
|
|
48
48
|
pendingTransactionsService: PendingTransactionsService
|
|
49
49
|
rejectedTransactionsArchivist: ArchivistInstance
|
|
@@ -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
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { creatable } from '@xylabs/creatable'
|
|
2
|
+
import { EmptyObject } from '@xylabs/object'
|
|
2
3
|
import { Promisable } from '@xylabs/promise'
|
|
3
4
|
import { BlockRewardService } from '@xyo-network/xl1-protocol-sdk'
|
|
4
5
|
|
|
5
6
|
import { BaseService } from '../BaseService.ts'
|
|
6
7
|
import { BaseServiceParams } from '../model/index.ts'
|
|
7
8
|
|
|
8
|
-
export interface BaseBlockRewardServiceParams extends BaseServiceParams {}
|
|
9
|
+
export interface BaseBlockRewardServiceParams<TConfig extends EmptyObject = EmptyObject> extends BaseServiceParams<TConfig> {}
|
|
9
10
|
|
|
10
11
|
@creatable()
|
|
11
12
|
export class BaseBlockRewardService<TParams extends BaseBlockRewardServiceParams = BaseBlockRewardServiceParams>
|
|
@@ -3,12 +3,14 @@ import { creatable } from '@xylabs/creatable'
|
|
|
3
3
|
import { toEthAddress } from '@xylabs/hex'
|
|
4
4
|
import { AccountInstance } from '@xyo-network/account-model'
|
|
5
5
|
import { XyoChainRewards__factory as XyoChainRewardsFactory } from '@xyo-network/typechain'
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
BlockRewardService, ChainService, Config,
|
|
8
|
+
} from '@xyo-network/xl1-protocol-sdk'
|
|
7
9
|
import { Provider } from 'ethers/providers'
|
|
8
10
|
|
|
9
11
|
import { BaseBlockRewardService, BaseBlockRewardServiceParams } from './BaseBlockRewardService.ts'
|
|
10
12
|
|
|
11
|
-
export interface EvmBlockRewardServiceParams extends BaseBlockRewardServiceParams {
|
|
13
|
+
export interface EvmBlockRewardServiceParams extends BaseBlockRewardServiceParams<Pick<Config, 'evm'>> {
|
|
12
14
|
account: AccountInstance
|
|
13
15
|
chainService?: ChainService
|
|
14
16
|
provider?: Provider
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { Address } from '@xylabs/hex'
|
|
2
2
|
import { ZERO_ADDRESS } from '@xylabs/hex'
|
|
3
|
-
import type { ChainService } from '@xyo-network/xl1-protocol-sdk'
|
|
3
|
+
import type { ChainService, Config } from '@xyo-network/xl1-protocol-sdk'
|
|
4
4
|
|
|
5
5
|
import { BaseService } from '../../BaseService.ts'
|
|
6
6
|
import type { BaseServiceParams } from '../../model/index.ts'
|
|
7
7
|
|
|
8
|
-
export interface MemoryChainServiceParams extends BaseServiceParams {}
|
|
8
|
+
export interface MemoryChainServiceParams extends BaseServiceParams<Pick<Config, 'producer'>> {}
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* A class that represents a chain stake as backed in memory
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { assertEx } from '@xylabs/assert'
|
|
2
2
|
import { creatable } from '@xylabs/creatable'
|
|
3
|
+
import { EmptyObject } from '@xylabs/object'
|
|
3
4
|
import { Promisable } from '@xylabs/promise'
|
|
4
5
|
import { AccountInstance } from '@xyo-network/account-model'
|
|
5
6
|
import { ArchivistInstance, ReadArchivist } from '@xyo-network/archivist-model'
|
|
@@ -16,7 +17,7 @@ import { BaseService } from '../BaseService.ts'
|
|
|
16
17
|
import { BaseServiceParams } from '../model/index.ts'
|
|
17
18
|
import { Validator } from './model/index.ts'
|
|
18
19
|
|
|
19
|
-
export interface XyoValidatorParams extends BaseServiceParams {
|
|
20
|
+
export interface XyoValidatorParams<TConfig extends EmptyObject = EmptyObject> extends BaseServiceParams<TConfig> {
|
|
20
21
|
account: AccountInstance
|
|
21
22
|
chainArchivist: ReadArchivist
|
|
22
23
|
chainId: ChainId
|
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
import {
|
|
24
24
|
asChainIndexingServiceStateWithStorageMeta,
|
|
25
25
|
ChainIndexingServiceState, ChainIndexingServiceStateSchema, ChainStakeViewer,
|
|
26
|
+
Config,
|
|
26
27
|
EventingChainBlockNumberIteratorService,
|
|
27
28
|
isChainIndexingServiceState,
|
|
28
29
|
readPayloadMapFromStore,
|
|
@@ -34,7 +35,7 @@ import { LRUCache } from 'lru-cache'
|
|
|
34
35
|
import { BaseService } from '../BaseService.ts'
|
|
35
36
|
import { BaseServiceParams } from '../model/index.ts'
|
|
36
37
|
|
|
37
|
-
export interface XyoStakeIntentServiceParams extends BaseServiceParams {
|
|
38
|
+
export interface XyoStakeIntentServiceParams extends BaseServiceParams<Pick<Config, 'producer'>> {
|
|
38
39
|
chainArchivist?: ArchivistInstance
|
|
39
40
|
chainIterator?: EventingChainBlockNumberIteratorService
|
|
40
41
|
chainStakeViewer?: ChainStakeViewer
|
|
@@ -93,14 +94,14 @@ export class XyoStakeIntentService extends BaseService<XyoStakeIntentServicePara
|
|
|
93
94
|
|
|
94
95
|
async getDeclaredCandidateRanges(address: Address, intent: Intent): Promise<Readonly<Readonly<[number, number]>[]>> {
|
|
95
96
|
await Promise.resolve()
|
|
96
|
-
assertEx(intent === 'producer', () => `
|
|
97
|
+
assertEx(intent === 'producer', () => `Support not yet added for intent ${intent}`)
|
|
97
98
|
const results = this._producers.get(address)
|
|
98
99
|
return results ?? []
|
|
99
100
|
}
|
|
100
101
|
|
|
101
102
|
async getDeclaredCandidatesForBlock(block: number, intent: Intent): Promise<Address[]> {
|
|
102
103
|
return await this.spanAsync('getDeclaredCandidatesForBlock', async () => {
|
|
103
|
-
assertEx(intent === 'producer', () => `
|
|
104
|
+
assertEx(intent === 'producer', () => `Support not yet added for intent ${intent}`)
|
|
104
105
|
const results = this._producers.findAllContaining(block)
|
|
105
106
|
const candidates = [...results]
|
|
106
107
|
const requiredMinimumStake = this.getRequiredMinimumStakeForIntent(intent)
|
|
@@ -3,7 +3,7 @@ import { Address } from '@xylabs/hex'
|
|
|
3
3
|
import { Promisable } from '@xylabs/promise'
|
|
4
4
|
import { ReadArchivist } from '@xyo-network/archivist-model'
|
|
5
5
|
import { StepIdentity } from '@xyo-network/xl1-protocol'
|
|
6
|
-
import {
|
|
6
|
+
import { StepStakeViewer } from '@xyo-network/xl1-protocol-sdk'
|
|
7
7
|
|
|
8
8
|
import { BaseService } from '../BaseService.ts'
|
|
9
9
|
import { BaseServiceParams } from '../model/index.ts'
|
|
@@ -13,7 +13,7 @@ export interface BaseStepStakeServiceParams extends BaseServiceParams {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
@creatable()
|
|
16
|
-
export class BaseStepStakeService extends BaseService<BaseStepStakeServiceParams> implements
|
|
16
|
+
export class BaseStepStakeService extends BaseService<BaseStepStakeServiceParams> implements StepStakeViewer {
|
|
17
17
|
stepStake(_step: StepIdentity): Promisable<Record<Address, bigint>> {
|
|
18
18
|
throw new Error('Method not implemented.')
|
|
19
19
|
}
|
|
@@ -1,113 +1,60 @@
|
|
|
1
|
-
import { assertEx } from '@xylabs/assert'
|
|
2
1
|
import { creatable } from '@xylabs/creatable'
|
|
3
|
-
import {
|
|
4
|
-
import { Promisable } from '@xylabs/promise'
|
|
2
|
+
import { EmptyObject } from '@xylabs/object'
|
|
5
3
|
import { ReadArchivist } from '@xyo-network/archivist-model'
|
|
6
|
-
import {
|
|
4
|
+
import { TimeDomain, TimePayload } from '@xyo-network/xl1-protocol'
|
|
7
5
|
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
} from '@xyo-network/xl1-protocol'
|
|
11
|
-
import { EventingChainBlockNumberIteratorService, TimeSyncService } from '@xyo-network/xl1-protocol-sdk'
|
|
6
|
+
EventingChainBlockNumberIteratorService, SimpleTimeSyncViewer, TimeSyncViewer,
|
|
7
|
+
} from '@xyo-network/xl1-protocol-sdk'
|
|
12
8
|
import { Provider } from 'ethers'
|
|
13
9
|
|
|
14
10
|
import { BaseService } from '../BaseService.ts'
|
|
11
|
+
import { blockViewerFromChainIteratorAndArchivist } from '../blockViewerFromChainIteratorAndArchivist.ts'
|
|
15
12
|
import { BaseServiceParams } from '../model/index.ts'
|
|
16
13
|
|
|
17
|
-
export interface
|
|
18
|
-
currentTime(): Promise<[string, number]>
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface BaseTimeServiceParams extends BaseServiceParams {
|
|
14
|
+
export interface BaseTimeServiceParams<TConfig extends EmptyObject = EmptyObject> extends BaseServiceParams<TConfig> {
|
|
22
15
|
chainArchivist: ReadArchivist
|
|
23
16
|
chainIterator: EventingChainBlockNumberIteratorService
|
|
24
17
|
ethProvider?: Provider
|
|
25
18
|
}
|
|
26
19
|
|
|
27
20
|
@creatable()
|
|
28
|
-
export class BaseTimeSyncService extends BaseService<BaseTimeServiceParams> implements
|
|
29
|
-
|
|
21
|
+
export class BaseTimeSyncService extends BaseService<BaseTimeServiceParams> implements TimeSyncViewer {
|
|
22
|
+
protected timeSyncViewer!: TimeSyncViewer
|
|
23
|
+
|
|
24
|
+
protected get chainArchivist() {
|
|
30
25
|
return this.params.chainArchivist
|
|
31
26
|
}
|
|
32
27
|
|
|
33
|
-
get chainIterator() {
|
|
28
|
+
protected get chainIterator() {
|
|
34
29
|
return this.params.chainIterator
|
|
35
30
|
}
|
|
36
31
|
|
|
37
|
-
get ethProvider() {
|
|
32
|
+
protected get ethProvider() {
|
|
38
33
|
return this.params.ethProvider
|
|
39
34
|
}
|
|
40
35
|
|
|
41
36
|
async convertTime(fromDomain: TimeDomain, toDomain: TimeDomain, from: number): Promise<number> {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return timePayload.xl1 ?? 0
|
|
53
|
-
}
|
|
54
|
-
case 'epoch': {
|
|
55
|
-
return timePayload.epoch ?? 0
|
|
56
|
-
}
|
|
57
|
-
case 'ethereum': {
|
|
58
|
-
return timePayload.ethereum ?? 0
|
|
59
|
-
}
|
|
60
|
-
default: {
|
|
61
|
-
throw new Error(`Unsupported to toDomain: ${toDomain}`)
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
default: {
|
|
66
|
-
throw new Error(`Unsupported from fromDomain: ${fromDomain}`)
|
|
67
|
-
}
|
|
68
|
-
}
|
|
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)
|
|
69
47
|
}
|
|
70
48
|
|
|
71
49
|
async currentTime(domain: TimeDomain): Promise<[string, number]> {
|
|
72
|
-
|
|
73
|
-
case 'xl1': {
|
|
74
|
-
return ['xl1', (await this.chainIterator.head()).block]
|
|
75
|
-
}
|
|
76
|
-
case 'epoch': {
|
|
77
|
-
return ['epoch', Date.now()]
|
|
78
|
-
}
|
|
79
|
-
case 'ethereum': {
|
|
80
|
-
return ['ethereum', (await this.ethProvider?.getBlockNumber()) ?? 0]
|
|
81
|
-
}
|
|
82
|
-
default: {
|
|
83
|
-
throw new Error(`Unknown time domain: ${domain}`)
|
|
84
|
-
}
|
|
85
|
-
}
|
|
50
|
+
return await this.timeSyncViewer.currentTime(domain)
|
|
86
51
|
}
|
|
87
52
|
|
|
88
|
-
async currentTimeAndHash(domain: TimeDomain): Promise<[number,
|
|
89
|
-
|
|
90
|
-
case 'xl1': {
|
|
91
|
-
const head = await this.chainIterator.head()
|
|
92
|
-
return [head.block, await PayloadBuilder.hash(head)]
|
|
93
|
-
}
|
|
94
|
-
case 'epoch': {
|
|
95
|
-
return [Date.now(), null]
|
|
96
|
-
}
|
|
97
|
-
case 'ethereum': {
|
|
98
|
-
const provider = assertEx(this.ethProvider, () => 'Ethereum provider not configured')
|
|
99
|
-
const blockNumber = (await provider.getBlockNumber()) ?? 0
|
|
100
|
-
const block = await provider.getBlock(blockNumber)
|
|
101
|
-
const blockHash = asHash(assertEx(block?.hash, () => 'Block hash not found'), true)
|
|
102
|
-
return [blockNumber, blockHash]
|
|
103
|
-
}
|
|
104
|
-
default: {
|
|
105
|
-
throw new Error(`Unknown time domain: ${domain}`)
|
|
106
|
-
}
|
|
107
|
-
}
|
|
53
|
+
async currentTimeAndHash(domain: TimeDomain): Promise<[number, string | null]> {
|
|
54
|
+
return await this.timeSyncViewer.currentTimeAndHash(domain)
|
|
108
55
|
}
|
|
109
56
|
|
|
110
|
-
currentTimePayload():
|
|
111
|
-
|
|
57
|
+
async currentTimePayload(): Promise<TimePayload> {
|
|
58
|
+
return await this.timeSyncViewer.currentTimePayload()
|
|
112
59
|
}
|
|
113
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
|
+
}
|
package/src/model/Params.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { CreatableParams } from '@xylabs/creatable'
|
|
2
|
+
import type { EmptyObject } from '@xylabs/object'
|
|
2
3
|
import type { AccountInstance } from '@xyo-network/account-model'
|
|
3
4
|
import type { OpenTelemetryProviders } from '@xyo-network/xl1-protocol'
|
|
4
|
-
import type { Config } from '@xyo-network/xl1-protocol-sdk'
|
|
5
5
|
|
|
6
|
-
export interface BaseServiceParams extends CreatableParams, OpenTelemetryProviders {
|
|
7
|
-
config:
|
|
6
|
+
export interface BaseServiceParams<TConfig extends EmptyObject = EmptyObject> extends CreatableParams, OpenTelemetryProviders {
|
|
7
|
+
config: TConfig
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
export interface BaseAccountableServiceParams extends BaseServiceParams {
|
|
10
|
+
export interface BaseAccountableServiceParams<TConfig extends EmptyObject = EmptyObject> extends BaseServiceParams<TConfig> {
|
|
11
11
|
account: AccountInstance
|
|
12
12
|
}
|
|
@@ -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"}
|