@xyo-network/xl1-protocol-sdk 1.18.0 → 1.18.2
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/CreatableProvider/AbstractCreatableProvider.d.ts +52 -21
- package/dist/neutral/CreatableProvider/AbstractCreatableProvider.d.ts.map +1 -1
- package/dist/neutral/CreatableProvider/CreatableProvider.d.ts +13 -8
- package/dist/neutral/CreatableProvider/CreatableProvider.d.ts.map +1 -1
- package/dist/neutral/CreatableProvider/CreatableProviderRegistry.d.ts +2 -4
- package/dist/neutral/CreatableProvider/CreatableProviderRegistry.d.ts.map +1 -1
- package/dist/neutral/CreatableProvider/ProviderFactory.d.ts +6 -4
- package/dist/neutral/CreatableProvider/ProviderFactory.d.ts.map +1 -1
- package/dist/neutral/CreatableProvider/ProviderFactoryLocator.d.ts +7 -7
- package/dist/neutral/CreatableProvider/ProviderFactoryLocator.d.ts.map +1 -1
- package/dist/neutral/CreatableProvider/ProviderFactoryLocatorInstance.d.ts +3 -2
- package/dist/neutral/CreatableProvider/ProviderFactoryLocatorInstance.d.ts.map +1 -1
- package/dist/neutral/actor/Actor.d.ts +176 -0
- package/dist/neutral/actor/Actor.d.ts.map +1 -0
- package/dist/neutral/actor/index.d.ts +2 -0
- package/dist/neutral/actor/index.d.ts.map +1 -0
- package/dist/neutral/block/hydrate/allHashesPresent.d.ts +2 -2
- package/dist/neutral/block/hydrate/allHashesPresent.d.ts.map +1 -1
- package/dist/neutral/block/hydrate/hydrateBlock.d.ts +2 -2
- package/dist/neutral/block/hydrate/hydrateBlock.d.ts.map +1 -1
- package/dist/neutral/config/Api.d.ts +1 -1
- package/dist/neutral/config/Api.d.ts.map +1 -1
- package/dist/neutral/config/Bridge.d.ts +41 -21
- package/dist/neutral/config/Bridge.d.ts.map +1 -1
- package/dist/neutral/config/Chain.d.ts +7 -3
- package/dist/neutral/config/Chain.d.ts.map +1 -1
- package/dist/neutral/config/Config.d.ts +48 -20
- package/dist/neutral/config/Config.d.ts.map +1 -1
- package/dist/neutral/config/Evm.d.ts +1 -1
- package/dist/neutral/config/Evm.d.ts.map +1 -1
- package/dist/neutral/config/Log.d.ts +2 -2
- package/dist/neutral/config/Log.d.ts.map +1 -1
- package/dist/neutral/config/Mempool.d.ts +1 -1
- package/dist/neutral/config/Mempool.d.ts.map +1 -1
- package/dist/neutral/config/Producer.d.ts +6 -2
- package/dist/neutral/config/Producer.d.ts.map +1 -1
- package/dist/neutral/config/RewardRedemptionApi.d.ts +1 -1
- package/dist/neutral/config/RewardRedemptionApi.d.ts.map +1 -1
- package/dist/neutral/config/Services.d.ts +1 -1
- package/dist/neutral/config/Services.d.ts.map +1 -1
- package/dist/neutral/config/Telemetry.d.ts +11 -4
- package/dist/neutral/config/Telemetry.d.ts.map +1 -1
- package/dist/neutral/config/UsageMeta.d.ts +1 -1
- package/dist/neutral/config/UsageMeta.d.ts.map +1 -1
- package/dist/neutral/config/Validation.d.ts +11 -3
- package/dist/neutral/config/Validation.d.ts.map +1 -1
- package/dist/neutral/config/index.d.ts +1 -0
- package/dist/neutral/config/index.d.ts.map +1 -1
- package/dist/neutral/config/storage/Storage.d.ts +1 -1
- package/dist/neutral/config/storage/Storage.d.ts.map +1 -1
- package/dist/neutral/config/storage/driver/Mongo.d.ts +1 -1
- package/dist/neutral/config/storage/driver/Mongo.d.ts.map +1 -1
- package/dist/neutral/eip-712/Payloads/EIP712Data.d.ts +4 -4
- package/dist/neutral/eip-712/Payloads/EIP712Data.d.ts.map +1 -1
- package/dist/neutral/eip-712/Payloads/EIP712Signature.d.ts +3 -3
- package/dist/neutral/eip-712/Payloads/EIP712Signature.d.ts.map +1 -1
- package/dist/neutral/eip-712/Types.d.ts +4 -4
- package/dist/neutral/eip-712/Types.d.ts.map +1 -1
- package/dist/neutral/index.d.ts +1 -0
- package/dist/neutral/index.d.ts.map +1 -1
- package/dist/neutral/index.mjs +3271 -3246
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/neutral/model/ChainQualification.d.ts +15 -15
- package/dist/neutral/model/ChainQualification.d.ts.map +1 -1
- package/dist/neutral/payloads/netBalancesForPayloads.d.ts +5 -2
- package/dist/neutral/payloads/netBalancesForPayloads.d.ts.map +1 -1
- package/dist/neutral/payloads/netSchemasForPayloads.d.ts +5 -2
- package/dist/neutral/payloads/netSchemasForPayloads.d.ts.map +1 -1
- package/dist/neutral/primitives/chain/getWindowedChain.d.ts +8 -23
- package/dist/neutral/primitives/chain/getWindowedChain.d.ts.map +1 -1
- package/dist/neutral/primitives/rewards/networkStakeStepRewardPositionWeight.d.ts.map +1 -1
- package/dist/neutral/primitives/stake/weightedStakeForRangeByPosition.d.ts +2 -1
- package/dist/neutral/primitives/stake/weightedStakeForRangeByPosition.d.ts.map +1 -1
- package/dist/neutral/primitives/uncle/findBestUncle.d.ts +21 -13
- package/dist/neutral/primitives/uncle/findBestUncle.d.ts.map +1 -1
- package/dist/neutral/primitives/uncle/findUncles.d.ts +21 -14
- package/dist/neutral/primitives/uncle/findUncles.d.ts.map +1 -1
- package/dist/neutral/provider/signer/XyoSigner.d.ts +2 -0
- package/dist/neutral/provider/signer/XyoSigner.d.ts.map +1 -1
- package/dist/neutral/runners/Finalization.d.ts +12 -0
- package/dist/neutral/runners/Finalization.d.ts.map +1 -0
- package/dist/neutral/runners/index.d.ts +1 -0
- package/dist/neutral/runners/index.d.ts.map +1 -1
- package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts +66 -33
- package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts.map +1 -1
- package/dist/neutral/simple/block/SimpleBlockViewer.d.ts +9 -25
- package/dist/neutral/simple/block/SimpleBlockViewer.d.ts.map +1 -1
- package/dist/neutral/simple/blockReward/SimpleBlockRewardViewer.d.ts +1 -0
- package/dist/neutral/simple/blockReward/SimpleBlockRewardViewer.d.ts.map +1 -1
- package/dist/neutral/simple/blockValidation/SimpleBlockValidationViewer.d.ts +4 -3
- package/dist/neutral/simple/blockValidation/SimpleBlockValidationViewer.d.ts.map +1 -1
- package/dist/neutral/simple/chainStake/SimpleStakeViewer.d.ts +1 -0
- package/dist/neutral/simple/chainStake/SimpleStakeViewer.d.ts.map +1 -1
- package/dist/neutral/simple/datalake/SimpleDataLakeRunner.d.ts +1 -0
- package/dist/neutral/simple/datalake/SimpleDataLakeRunner.d.ts.map +1 -1
- package/dist/neutral/simple/datalake/SimpleDataLakeViewer.d.ts +1 -0
- package/dist/neutral/simple/datalake/SimpleDataLakeViewer.d.ts.map +1 -1
- package/dist/neutral/simple/finalization/SimpleFinalizationRunner.d.ts +21 -0
- package/dist/neutral/simple/finalization/SimpleFinalizationRunner.d.ts.map +1 -0
- package/dist/neutral/simple/finalization/SimpleFinalizationViewer.d.ts +61 -0
- package/dist/neutral/simple/finalization/SimpleFinalizationViewer.d.ts.map +1 -0
- package/dist/neutral/simple/finalization/index.d.ts +3 -0
- package/dist/neutral/simple/finalization/index.d.ts.map +1 -0
- package/dist/neutral/simple/index.d.ts +2 -0
- package/dist/neutral/simple/index.d.ts.map +1 -1
- package/dist/neutral/simple/mempool/SimpleMempoolRunner.d.ts +2 -0
- package/dist/neutral/simple/mempool/SimpleMempoolRunner.d.ts.map +1 -1
- package/dist/neutral/simple/mempool/SimpleMempoolViewer.d.ts +7 -2
- package/dist/neutral/simple/mempool/SimpleMempoolViewer.d.ts.map +1 -1
- package/dist/neutral/simple/runner/SimpleXyoRunner.d.ts +1 -0
- package/dist/neutral/simple/runner/SimpleXyoRunner.d.ts.map +1 -1
- package/dist/neutral/simple/signer/SimpleXyoSigner.d.ts +19 -3
- package/dist/neutral/simple/signer/SimpleXyoSigner.d.ts.map +1 -1
- package/dist/neutral/simple/stakeEvents/SimpleStakeEventsViewer.d.ts +1 -0
- package/dist/neutral/simple/stakeEvents/SimpleStakeEventsViewer.d.ts.map +1 -1
- package/dist/neutral/simple/timesync/SimpleTimeSyncViewer.d.ts +2 -1
- package/dist/neutral/simple/timesync/SimpleTimeSyncViewer.d.ts.map +1 -1
- package/dist/neutral/simple/windowedBlock/SimpleWindowedBlockViewer.d.ts +191 -0
- package/dist/neutral/simple/windowedBlock/SimpleWindowedBlockViewer.d.ts.map +1 -0
- package/dist/neutral/simple/windowedBlock/index.d.ts +2 -0
- package/dist/neutral/simple/windowedBlock/index.d.ts.map +1 -0
- package/dist/neutral/summary/model/summary.d.ts +3 -1
- package/dist/neutral/summary/model/summary.d.ts.map +1 -1
- package/dist/neutral/summary/primitives/transfers/transfersSummary.d.ts +1 -1
- package/dist/neutral/summary/primitives/transfers/transfersSummary.d.ts.map +1 -1
- package/dist/neutral/transaction/TransactionBuilder.d.ts +56 -33
- package/dist/neutral/transaction/TransactionBuilder.d.ts.map +1 -1
- package/dist/neutral/transaction/signTransaction.d.ts +24 -12
- package/dist/neutral/transaction/signTransaction.d.ts.map +1 -1
- package/dist/neutral/utils/isZodError.d.ts +1 -1
- package/dist/neutral/utils/isZodError.d.ts.map +1 -1
- package/dist/neutral/validation/schema/Mnemonic.d.ts +1 -1
- package/dist/neutral/validation/schema/Mnemonic.d.ts.map +1 -1
- package/dist/neutral/viewers/AccountBalance.d.ts +70 -42
- package/dist/neutral/viewers/AccountBalance.d.ts.map +1 -1
- package/dist/neutral/viewers/Block.d.ts +2 -2
- package/dist/neutral/viewers/Block.d.ts.map +1 -1
- package/dist/neutral/viewers/BlockValidation.d.ts +10 -10
- package/dist/neutral/viewers/BlockValidation.d.ts.map +1 -1
- package/dist/neutral/viewers/Finalization.d.ts +14 -0
- package/dist/neutral/viewers/Finalization.d.ts.map +1 -0
- package/dist/neutral/viewers/Mempool.d.ts +5 -5
- package/dist/neutral/viewers/Mempool.d.ts.map +1 -1
- package/dist/neutral/viewers/TransactionValidation.d.ts +8 -8
- package/dist/neutral/viewers/TransactionValidation.d.ts.map +1 -1
- package/dist/neutral/viewers/WindowedBlock.d.ts +14 -0
- package/dist/neutral/viewers/WindowedBlock.d.ts.map +1 -0
- package/dist/neutral/viewers/index.d.ts +2 -0
- package/dist/neutral/viewers/index.d.ts.map +1 -1
- package/package.json +24 -22
- package/src/CreatableProvider/AbstractCreatableProvider.ts +12 -6
- package/src/CreatableProvider/CreatableProvider.ts +21 -9
- package/src/CreatableProvider/CreatableProviderRegistry.ts +3 -3
- package/src/CreatableProvider/ProviderFactory.ts +18 -10
- package/src/CreatableProvider/ProviderFactoryLocator.ts +6 -5
- package/src/CreatableProvider/ProviderFactoryLocatorInstance.ts +6 -2
- package/src/actor/Actor.ts +209 -0
- package/src/actor/index.ts +1 -0
- package/src/block/hydrate/allHashesPresent.ts +2 -2
- package/src/block/hydrate/hydrateBlock.ts +2 -2
- package/src/config/Api.ts +1 -2
- package/src/config/Bridge.ts +1 -2
- package/src/config/Chain.ts +1 -2
- package/src/config/Config.ts +1 -1
- package/src/config/Evm.ts +1 -2
- package/src/config/Log.ts +1 -2
- package/src/config/Mempool.ts +1 -2
- package/src/config/Producer.ts +1 -2
- package/src/config/RewardRedemptionApi.ts +1 -2
- package/src/config/Services.ts +1 -2
- package/src/config/Telemetry.ts +10 -4
- package/src/config/UsageMeta.ts +1 -1
- package/src/config/Validation.ts +1 -2
- package/src/config/index.ts +1 -0
- package/src/config/storage/Storage.ts +1 -2
- package/src/config/storage/driver/Mongo.ts +1 -2
- package/src/eip-712/Payloads/EIP712Data.ts +1 -1
- package/src/eip-712/Payloads/EIP712Signature.ts +1 -1
- package/src/eip-712/Types.ts +1 -1
- package/src/index.ts +1 -0
- package/src/model/ChainQualification.ts +1 -1
- package/src/primitives/chain/getWindowedChain.ts +33 -14
- package/src/primitives/rewards/networkStakeStepRewardPositionWeight.ts +3 -2
- package/src/primitives/stake/allStakersForStep.ts +1 -1
- package/src/primitives/stake/weightedStakeForRangeByPosition.ts +10 -2
- package/src/provider/signer/XyoSigner.ts +3 -0
- package/src/runners/Finalization.ts +15 -0
- package/src/runners/index.ts +1 -0
- package/src/simple/accountBalance/SimpleAccountBalanceViewer.ts +1 -0
- package/src/simple/block/SimpleBlockViewer.ts +23 -37
- package/src/simple/blockReward/SimpleBlockRewardViewer.ts +1 -0
- package/src/simple/blockValidation/SimpleBlockValidationViewer.ts +16 -13
- package/src/simple/chainStake/SimpleStakeViewer.ts +1 -0
- package/src/simple/datalake/SimpleDataLakeRunner.ts +1 -0
- package/src/simple/datalake/SimpleDataLakeViewer.ts +1 -0
- package/src/simple/finalization/SimpleFinalizationRunner.ts +45 -0
- package/src/simple/finalization/SimpleFinalizationViewer.ts +101 -0
- package/src/simple/finalization/index.ts +2 -0
- package/src/simple/index.ts +2 -0
- package/src/simple/mempool/SimpleMempoolRunner.ts +11 -1
- package/src/simple/mempool/SimpleMempoolViewer.ts +41 -8
- package/src/simple/runner/SimpleXyoRunner.ts +3 -1
- package/src/simple/signer/SimpleXyoSigner.ts +26 -5
- package/src/simple/stakeEvents/SimpleStakeEventsViewer.ts +1 -0
- package/src/simple/timesync/SimpleTimeSyncViewer.ts +3 -1
- package/src/simple/windowedBlock/SimpleWindowedBlockViewer.ts +208 -0
- package/src/simple/windowedBlock/index.ts +1 -0
- package/src/summary/model/summary.ts +3 -3
- package/src/summary/primitives/transfers/transfersSummary.ts +1 -1
- package/src/utils/isZodError.ts +1 -1
- package/src/validation/schema/Mnemonic.ts +1 -1
- package/src/viewers/AccountBalance.ts +1 -1
- package/src/viewers/Block.ts +2 -2
- package/src/viewers/BlockValidation.ts +1 -1
- package/src/viewers/Finalization.ts +19 -0
- package/src/viewers/Mempool.ts +1 -1
- package/src/viewers/TransactionValidation.ts +1 -1
- package/src/viewers/WindowedBlock.ts +17 -0
- package/src/viewers/index.ts +2 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import {
|
|
2
|
+
assertEx,
|
|
3
|
+
Hash,
|
|
4
|
+
spanRootAsync,
|
|
5
|
+
} from '@xylabs/sdk-js'
|
|
6
|
+
import type { ReadArchivist } from '@xyo-network/archivist-model'
|
|
7
|
+
import {
|
|
8
|
+
asSignedHydratedBlockWithStorageMeta, type SignedBlockBoundWitnessWithHashMeta, type SignedHydratedBlockWithHashMeta,
|
|
9
|
+
SignedHydratedBlockWithStorageMeta,
|
|
10
|
+
XL1BlockNumber,
|
|
11
|
+
} from '@xyo-network/xl1-protocol'
|
|
12
|
+
|
|
13
|
+
import { hydrateBlock } from '../../block/index.ts'
|
|
14
|
+
import {
|
|
15
|
+
AbstractCreatableProvider, creatableProvider, CreatableProviderParams,
|
|
16
|
+
} from '../../CreatableProvider/index.ts'
|
|
17
|
+
import { ChainStoreRead } from '../../model/index.ts'
|
|
18
|
+
import { findMostRecentBlock, readPayloadMapFromStore } from '../../primitives/index.ts'
|
|
19
|
+
import { HydratedCache } from '../../utils/index.ts'
|
|
20
|
+
import {
|
|
21
|
+
type FinalizationViewer,
|
|
22
|
+
FinalizationViewerMoniker,
|
|
23
|
+
} from '../../viewers/index.ts'
|
|
24
|
+
|
|
25
|
+
export interface SimpleFinalizationViewerParams extends CreatableProviderParams {
|
|
26
|
+
finalizedArchivist: ReadArchivist
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@creatableProvider()
|
|
30
|
+
export class SimpleFinalizationViewer extends AbstractCreatableProvider<SimpleFinalizationViewerParams> implements FinalizationViewer {
|
|
31
|
+
static readonly defaultMoniker = FinalizationViewerMoniker
|
|
32
|
+
static readonly dependencies = []
|
|
33
|
+
static readonly monikers = [FinalizationViewerMoniker]
|
|
34
|
+
moniker = SimpleFinalizationViewer.defaultMoniker
|
|
35
|
+
|
|
36
|
+
protected _store: ChainStoreRead | undefined
|
|
37
|
+
|
|
38
|
+
private _signedHydratedBlockCache: HydratedCache<SignedHydratedBlockWithStorageMeta> | undefined
|
|
39
|
+
|
|
40
|
+
protected get finalizedArchivist() {
|
|
41
|
+
return this.params.finalizedArchivist
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
protected get hydratedBlockCache(): HydratedCache<SignedHydratedBlockWithStorageMeta> {
|
|
45
|
+
if (this._signedHydratedBlockCache) return this._signedHydratedBlockCache
|
|
46
|
+
const chainMap = this.store.chainMap
|
|
47
|
+
this._signedHydratedBlockCache = new HydratedCache<SignedHydratedBlockWithStorageMeta>(chainMap, async (
|
|
48
|
+
store: ChainStoreRead,
|
|
49
|
+
hash: Hash,
|
|
50
|
+
maxDepth?: number,
|
|
51
|
+
minDepth?: number,
|
|
52
|
+
) => {
|
|
53
|
+
const result = await hydrateBlock(store, hash, maxDepth, minDepth)
|
|
54
|
+
return asSignedHydratedBlockWithStorageMeta(result, true)
|
|
55
|
+
}, 200)
|
|
56
|
+
return this._signedHydratedBlockCache
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
protected get store() {
|
|
60
|
+
return this._store!
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
static override async paramsHandler(params: Partial<SimpleFinalizationViewerParams>) {
|
|
64
|
+
assertEx(params.finalizedArchivist, () => 'finalizedArchivist is required')
|
|
65
|
+
return { ...await super.paramsHandler(params) }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
override async createHandler() {
|
|
69
|
+
await super.createHandler()
|
|
70
|
+
this._store = { chainMap: readPayloadMapFromStore(this.params.finalizedArchivist) }
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async head(): Promise<SignedHydratedBlockWithHashMeta> {
|
|
74
|
+
return await spanRootAsync('head', async () => {
|
|
75
|
+
const currentHead = assertEx(await this.getCurrentHead(), () => 'Could not find most recent block [currentBlock]')
|
|
76
|
+
const cache = this.hydratedBlockCache
|
|
77
|
+
const block = await cache.get(currentHead._hash)
|
|
78
|
+
if (!block) {
|
|
79
|
+
console.log(`Could not find current block with hash ${currentHead!._hash}`)
|
|
80
|
+
}
|
|
81
|
+
return assertEx(block, () => 'Could not find current block')
|
|
82
|
+
}, this.tracer)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async headBlock(): Promise<SignedBlockBoundWitnessWithHashMeta> {
|
|
86
|
+
return (await this.head())[0]
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async headHash(): Promise<Hash> {
|
|
90
|
+
return (await this.headBlock())._hash
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async headNumber(): Promise<XL1BlockNumber> {
|
|
94
|
+
return (await this.headBlock()).block
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
protected async getCurrentHead() {
|
|
98
|
+
const chainArchivist = this.finalizedArchivist
|
|
99
|
+
return await findMostRecentBlock(chainArchivist)
|
|
100
|
+
}
|
|
101
|
+
}
|
package/src/simple/index.ts
CHANGED
|
@@ -5,6 +5,7 @@ export * from './blockValidation/index.ts'
|
|
|
5
5
|
export * from './chainStake/index.ts'
|
|
6
6
|
export * from './client/index.ts'
|
|
7
7
|
export * from './datalake/index.ts'
|
|
8
|
+
export * from './finalization/index.ts'
|
|
8
9
|
export * from './gateway/index.ts'
|
|
9
10
|
export * from './mempool/index.ts'
|
|
10
11
|
export * from './network/index.ts'
|
|
@@ -13,3 +14,4 @@ export * from './runner/index.ts'
|
|
|
13
14
|
export * from './signer/index.ts'
|
|
14
15
|
export * from './stakeEvents/index.ts'
|
|
15
16
|
export * from './timesync/index.ts'
|
|
17
|
+
export * from './windowedBlock/index.ts'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Hash } from '@xylabs/sdk-js'
|
|
1
|
+
import { assertEx, type Hash } from '@xylabs/sdk-js'
|
|
2
2
|
import type { ArchivistInstance } from '@xyo-network/archivist-model'
|
|
3
3
|
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
4
4
|
import { type SignedHydratedBlock, type SignedHydratedTransaction } from '@xyo-network/xl1-protocol'
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
} from '../../CreatableProvider/index.ts'
|
|
9
9
|
import { hydratedBlockToPayloadBundle, hydratedTransactionToPayloadBundle } from '../../model/index.ts'
|
|
10
10
|
import { type MempoolRunner, MempoolRunnerMoniker } from '../../runners/index.ts'
|
|
11
|
+
import { WindowedBlockViewerMoniker } from '../../viewers/index.ts'
|
|
11
12
|
|
|
12
13
|
export interface SimpleMempoolRunnerParams extends CreatableProviderParams {
|
|
13
14
|
pendingBlocksArchivist: ArchivistInstance
|
|
@@ -17,6 +18,7 @@ export interface SimpleMempoolRunnerParams extends CreatableProviderParams {
|
|
|
17
18
|
@creatableProvider()
|
|
18
19
|
export class SimpleMempoolRunner extends AbstractCreatableProvider<SimpleMempoolRunnerParams> implements MempoolRunner {
|
|
19
20
|
static readonly defaultMoniker = MempoolRunnerMoniker
|
|
21
|
+
static readonly dependencies = [WindowedBlockViewerMoniker]
|
|
20
22
|
static readonly monikers = [MempoolRunnerMoniker]
|
|
21
23
|
moniker = SimpleMempoolRunner.defaultMoniker
|
|
22
24
|
|
|
@@ -28,6 +30,14 @@ export class SimpleMempoolRunner extends AbstractCreatableProvider<SimpleMempool
|
|
|
28
30
|
return this.params.pendingTransactionsArchivist
|
|
29
31
|
}
|
|
30
32
|
|
|
33
|
+
static override async paramsHandler(params?: Partial<SimpleMempoolRunnerParams>): Promise<SimpleMempoolRunnerParams> {
|
|
34
|
+
return {
|
|
35
|
+
...await super.paramsHandler(params),
|
|
36
|
+
pendingBlocksArchivist: assertEx(params?.pendingBlocksArchivist, () => 'pendingBlocksArchivist is required'),
|
|
37
|
+
pendingTransactionsArchivist: assertEx(params?.pendingTransactionsArchivist, () => 'pendingTransactionsArchivist is required'),
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
31
41
|
async submitBlocks(blocks: SignedHydratedBlock[]): Promise<Hash[]> {
|
|
32
42
|
const bundles = await Promise.all(blocks.map(async ([bw, payloads]) => {
|
|
33
43
|
return hydratedBlockToPayloadBundle([
|
|
@@ -1,19 +1,24 @@
|
|
|
1
1
|
import {
|
|
2
|
-
creatable,
|
|
3
2
|
exists, isDefined, isHash,
|
|
4
3
|
} from '@xylabs/sdk-js'
|
|
5
4
|
import type { ArchivistInstance } from '@xyo-network/archivist-model'
|
|
6
5
|
import {
|
|
7
6
|
isHashMeta, isPayloadBundle, type Sequence,
|
|
8
7
|
} from '@xyo-network/payload-model'
|
|
9
|
-
import type {
|
|
8
|
+
import type {
|
|
9
|
+
HydratedTransactionWithHashMeta, SignedHydratedBlockWithHashMeta, SignedHydratedTransactionWithHashMeta,
|
|
10
|
+
} from '@xyo-network/xl1-protocol'
|
|
10
11
|
|
|
11
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
AbstractCreatableProvider, creatableProvider, CreatableProviderParams,
|
|
14
|
+
} from '../../CreatableProvider/index.ts'
|
|
12
15
|
import { bundledPayloadToHydratedBlock, bundledPayloadToHydratedTransaction } from '../../model/index.ts'
|
|
13
16
|
import {
|
|
14
17
|
type MempoolViewer,
|
|
15
18
|
MempoolViewerMoniker,
|
|
16
19
|
type PendingTransactionsOptions,
|
|
20
|
+
WindowedBlockViewer,
|
|
21
|
+
WindowedBlockViewerMoniker,
|
|
17
22
|
} from '../../viewers/index.ts'
|
|
18
23
|
|
|
19
24
|
export interface SimpleMempoolViewerParams extends CreatableProviderParams {
|
|
@@ -21,12 +26,15 @@ export interface SimpleMempoolViewerParams extends CreatableProviderParams {
|
|
|
21
26
|
pendingTransactionsArchivist: ArchivistInstance
|
|
22
27
|
}
|
|
23
28
|
|
|
24
|
-
@
|
|
29
|
+
@creatableProvider()
|
|
25
30
|
export class SimpleMempoolViewer extends AbstractCreatableProvider<SimpleMempoolViewerParams> implements MempoolViewer {
|
|
26
31
|
static readonly defaultMoniker = MempoolViewerMoniker
|
|
32
|
+
static readonly dependencies = [WindowedBlockViewerMoniker]
|
|
27
33
|
static readonly monikers = [MempoolViewerMoniker]
|
|
28
34
|
moniker = SimpleMempoolViewer.defaultMoniker
|
|
29
35
|
|
|
36
|
+
private _windowedBlockViewer?: WindowedBlockViewer
|
|
37
|
+
|
|
30
38
|
protected get pendingBlocksArchivist() {
|
|
31
39
|
return this.params.pendingBlocksArchivist
|
|
32
40
|
}
|
|
@@ -35,6 +43,15 @@ export class SimpleMempoolViewer extends AbstractCreatableProvider<SimpleMempool
|
|
|
35
43
|
return this.params.pendingTransactionsArchivist
|
|
36
44
|
}
|
|
37
45
|
|
|
46
|
+
protected get windowedBlockViewer() {
|
|
47
|
+
return this._windowedBlockViewer!
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
override async createHandler() {
|
|
51
|
+
await super.createHandler()
|
|
52
|
+
this._windowedBlockViewer = await this.locator.getInstance<WindowedBlockViewer>(WindowedBlockViewerMoniker)
|
|
53
|
+
}
|
|
54
|
+
|
|
38
55
|
async pendingBlocks({ cursor: providedCursor }: PendingTransactionsOptions = {}): Promise<SignedHydratedBlockWithHashMeta[]> {
|
|
39
56
|
let cursor: Sequence | undefined = undefined
|
|
40
57
|
if (isHash(providedCursor)) {
|
|
@@ -44,13 +61,13 @@ export class SimpleMempoolViewer extends AbstractCreatableProvider<SimpleMempool
|
|
|
44
61
|
}
|
|
45
62
|
}
|
|
46
63
|
const bundles = await this.pendingBlocksArchivist.next({
|
|
47
|
-
order: '
|
|
64
|
+
order: 'desc', limit: 100, cursor,
|
|
48
65
|
})
|
|
49
66
|
const filteredBundles = bundles.filter(isPayloadBundle).filter(isHashMeta)
|
|
50
67
|
return (await Promise.all(filteredBundles.map(async bundle => await bundledPayloadToHydratedBlock(bundle)))).filter(exists)
|
|
51
68
|
}
|
|
52
69
|
|
|
53
|
-
async pendingTransactions({ cursor: providedCursor }: PendingTransactionsOptions = {}): Promise<SignedHydratedTransactionWithHashMeta[]> {
|
|
70
|
+
async pendingTransactions({ cursor: providedCursor, limit = 100 }: PendingTransactionsOptions = {}): Promise<SignedHydratedTransactionWithHashMeta[]> {
|
|
54
71
|
let cursor: Sequence | undefined = undefined
|
|
55
72
|
if (isHash(providedCursor)) {
|
|
56
73
|
const [p] = await this.pendingTransactionsArchivist.get([providedCursor])
|
|
@@ -60,13 +77,29 @@ export class SimpleMempoolViewer extends AbstractCreatableProvider<SimpleMempool
|
|
|
60
77
|
}
|
|
61
78
|
this.logger?.info(`Fetching pending transactions from cursor: ${cursor}`)
|
|
62
79
|
const bundles = await this.pendingTransactionsArchivist.next({
|
|
63
|
-
order: 'asc', limit
|
|
80
|
+
order: 'asc', limit, cursor,
|
|
64
81
|
})
|
|
65
82
|
this.logger?.info(`Fetched pending transactions: ${bundles.length} bundles`)
|
|
66
83
|
const filteredBundles = bundles.filter(isPayloadBundle).filter(isHashMeta)
|
|
67
84
|
this.logger?.info(`Filtered pending transactions: ${JSON.stringify(bundles, null, 2)} filteredBundles`)
|
|
68
85
|
const result = (await Promise.all(filteredBundles.map(async bundle => await bundledPayloadToHydratedTransaction(bundle)))).filter(exists)
|
|
69
86
|
this.logger?.info(`Converted pending transactions: ${JSON.stringify(result, null, 2)} results`)
|
|
70
|
-
return result
|
|
87
|
+
return (await Promise.all(result.map(async (tx) => {
|
|
88
|
+
const purged = await this.purgeIfInvalid(tx)
|
|
89
|
+
if (purged) {
|
|
90
|
+
this.logger?.info(`Purged completed/invalid transaction: ${tx[0]._hash}`)
|
|
91
|
+
} else {
|
|
92
|
+
return tx
|
|
93
|
+
}
|
|
94
|
+
}))).filter(exists)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private async purgeIfInvalid(tx: HydratedTransactionWithHashMeta) {
|
|
98
|
+
const existingBlock = await this.windowedBlockViewer.blockByTransactionHash(tx[0]._hash)
|
|
99
|
+
if (existingBlock) {
|
|
100
|
+
await this.pendingTransactionsArchivist.delete([tx[0]._hash])
|
|
101
|
+
return true
|
|
102
|
+
}
|
|
103
|
+
return false
|
|
71
104
|
}
|
|
72
105
|
}
|
|
@@ -7,7 +7,7 @@ import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
|
7
7
|
import type { SignedHydratedTransactionWithStorageMeta } from '@xyo-network/xl1-protocol'
|
|
8
8
|
|
|
9
9
|
import type { CreatableProviderParams } from '../../CreatableProvider/index.ts'
|
|
10
|
-
import { AbstractCreatableProvider } from '../../CreatableProvider/index.ts'
|
|
10
|
+
import { AbstractCreatableProvider, creatableProvider } from '../../CreatableProvider/index.ts'
|
|
11
11
|
import { hydratedTransactionToPayloadBundle } from '../../model/index.ts'
|
|
12
12
|
import { type XyoRunner, XyoRunnerMoniker } from '../../provider/index.ts'
|
|
13
13
|
import { type MempoolRunner, MempoolRunnerMoniker } from '../../runners/index.ts'
|
|
@@ -16,8 +16,10 @@ export interface SimpleXyoRunnerParams extends CreatableProviderParams {
|
|
|
16
16
|
pendingTransactionsArchivist: ArchivistInstance
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
@creatableProvider()
|
|
19
20
|
export class SimpleXyoRunner extends AbstractCreatableProvider<SimpleXyoRunnerParams> implements XyoRunner {
|
|
20
21
|
static readonly defaultMoniker = XyoRunnerMoniker
|
|
22
|
+
static readonly dependencies = [MempoolRunnerMoniker]
|
|
21
23
|
static readonly monikers = [XyoRunnerMoniker]
|
|
22
24
|
moniker = SimpleXyoRunner.defaultMoniker
|
|
23
25
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Address, Promisable } from '@xylabs/sdk-js'
|
|
2
|
+
import { Account } from '@xyo-network/account'
|
|
2
3
|
import type { AccountInstance } from '@xyo-network/account-model'
|
|
3
4
|
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
4
5
|
import { type Payload } from '@xyo-network/payload-model'
|
|
@@ -10,14 +11,34 @@ import type {
|
|
|
10
11
|
} from '@xyo-network/xl1-protocol'
|
|
11
12
|
import { SignedHydratedTransactionWithHashMetaZod } from '@xyo-network/xl1-protocol'
|
|
12
13
|
|
|
13
|
-
import type {
|
|
14
|
+
import type { CreatableProviderParams } from '../../CreatableProvider/index.ts'
|
|
15
|
+
import { AbstractCreatableProvider } from '../../CreatableProvider/index.ts'
|
|
16
|
+
import { type XyoSigner, XyoSignerMoniker } from '../../provider/index.ts'
|
|
14
17
|
import { buildTransaction, signTransaction } from '../../transaction/index.ts'
|
|
15
18
|
|
|
16
|
-
export
|
|
17
|
-
|
|
19
|
+
export interface SimpleXyoSignerParams extends CreatableProviderParams {
|
|
20
|
+
account: AccountInstance
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class SimpleXyoSigner extends AbstractCreatableProvider<SimpleXyoSignerParams> implements XyoSigner {
|
|
24
|
+
static readonly defaultMoniker = XyoSignerMoniker
|
|
25
|
+
static readonly monikers = [XyoSignerMoniker]
|
|
26
|
+
moniker = SimpleXyoSigner.defaultMoniker
|
|
27
|
+
protected readonly _account!: AccountInstance
|
|
28
|
+
|
|
29
|
+
static override async paramsHandler(params?: Partial<SimpleXyoSignerParams>) {
|
|
30
|
+
let account: AccountInstance
|
|
31
|
+
if (params?.account) {
|
|
32
|
+
account = params.account
|
|
33
|
+
} else {
|
|
34
|
+
const localLogger = params?.logger ?? params?.context?.logger
|
|
35
|
+
localLogger?.warn(`No account provided to SimpleXyoSigner, generating a random account.
|
|
36
|
+
This account will not be persisted and any transactions signed with it may be lost.
|
|
37
|
+
`)
|
|
18
38
|
|
|
19
|
-
|
|
20
|
-
|
|
39
|
+
account = await Account.random()
|
|
40
|
+
}
|
|
41
|
+
return { ...await super.paramsHandler(params), account }
|
|
21
42
|
}
|
|
22
43
|
|
|
23
44
|
address(): Promisable<Address> {
|
|
@@ -16,6 +16,7 @@ export interface SimpleStakeEventsParams extends CreatableProviderParams {
|
|
|
16
16
|
@creatableProvider()
|
|
17
17
|
export class SimpleStakeEventsViewer extends AbstractCreatableProvider<SimpleStakeEventsParams> implements StakeEventsViewer {
|
|
18
18
|
static readonly defaultMoniker = StakeEventsViewerMoniker
|
|
19
|
+
static readonly dependencies = []
|
|
19
20
|
static readonly monikers = [StakeEventsViewerMoniker]
|
|
20
21
|
moniker = SimpleStakeEventsViewer.defaultMoniker
|
|
21
22
|
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import type { Provider } from 'ethers'
|
|
10
10
|
|
|
11
11
|
import type { CreatableProviderParams } from '../../CreatableProvider/index.ts'
|
|
12
|
-
import { AbstractCreatableProvider } from '../../CreatableProvider/index.ts'
|
|
12
|
+
import { AbstractCreatableProvider, creatableProvider } from '../../CreatableProvider/index.ts'
|
|
13
13
|
import {
|
|
14
14
|
type BlockViewer, BlockViewerMoniker, type TimeSyncViewer, TimeSyncViewerMoniker,
|
|
15
15
|
} from '../../viewers/index.ts'
|
|
@@ -18,8 +18,10 @@ export interface SimpleTimeSyncViewerParams extends CreatableProviderParams {
|
|
|
18
18
|
ethProvider?: Provider
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
@creatableProvider()
|
|
21
22
|
export class SimpleTimeSyncViewer extends AbstractCreatableProvider<SimpleTimeSyncViewerParams> implements TimeSyncViewer {
|
|
22
23
|
static readonly defaultMoniker = TimeSyncViewerMoniker
|
|
24
|
+
static readonly dependencies = [BlockViewerMoniker]
|
|
23
25
|
static readonly monikers = [TimeSyncViewerMoniker]
|
|
24
26
|
moniker = SimpleTimeSyncViewer.defaultMoniker
|
|
25
27
|
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import {
|
|
2
|
+
assertEx,
|
|
3
|
+
exists,
|
|
4
|
+
type Hash,
|
|
5
|
+
isNull,
|
|
6
|
+
type Promisable,
|
|
7
|
+
} from '@xylabs/sdk-js'
|
|
8
|
+
import type { Payload, WithHashMeta } from '@xyo-network/payload-model'
|
|
9
|
+
import type {
|
|
10
|
+
ChainId,
|
|
11
|
+
HydratedBlockWithHashMeta,
|
|
12
|
+
SignedHydratedBlockWithHashMeta, XL1BlockNumber,
|
|
13
|
+
} from '@xyo-network/xl1-protocol'
|
|
14
|
+
import { asXL1BlockNumber } from '@xyo-network/xl1-protocol'
|
|
15
|
+
import { Mutex } from 'async-mutex'
|
|
16
|
+
|
|
17
|
+
import { transactionsFromHydratedBlock } from '../../block/index.ts'
|
|
18
|
+
import {
|
|
19
|
+
AbstractCreatableProvider, creatableProvider, type CreatableProviderParams,
|
|
20
|
+
} from '../../CreatableProvider/index.ts'
|
|
21
|
+
import { MemoryMap } from '../../driver/index.ts'
|
|
22
|
+
import type { SyncMap } from '../../map/index.ts'
|
|
23
|
+
import type {
|
|
24
|
+
BlockViewer,
|
|
25
|
+
WindowedBlockViewer,
|
|
26
|
+
} from '../../viewers/index.ts'
|
|
27
|
+
import {
|
|
28
|
+
BlockViewerMoniker,
|
|
29
|
+
WindowedBlockViewerMoniker,
|
|
30
|
+
} from '../../viewers/index.ts'
|
|
31
|
+
|
|
32
|
+
export interface SimpleWindowedBlockViewerParams extends CreatableProviderParams {
|
|
33
|
+
blockViewer?: BlockViewer
|
|
34
|
+
maxWindowSize: number
|
|
35
|
+
syncInterval: number
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@creatableProvider()
|
|
39
|
+
export class SimpleWindowedBlockViewer extends AbstractCreatableProvider<SimpleWindowedBlockViewerParams> implements WindowedBlockViewer {
|
|
40
|
+
static readonly defaultMoniker = WindowedBlockViewerMoniker
|
|
41
|
+
static readonly dependencies = [BlockViewerMoniker]
|
|
42
|
+
static readonly monikers = [WindowedBlockViewerMoniker]
|
|
43
|
+
moniker = WindowedBlockViewerMoniker
|
|
44
|
+
|
|
45
|
+
private _blockHashMap!: SyncMap<Hash, SignedHydratedBlockWithHashMeta>
|
|
46
|
+
private _blockNumberMap!: SyncMap<XL1BlockNumber, SignedHydratedBlockWithHashMeta>
|
|
47
|
+
// the external BlockViewer
|
|
48
|
+
private _blockViewer!: BlockViewer
|
|
49
|
+
private _chain: SignedHydratedBlockWithHashMeta[] = []
|
|
50
|
+
private _syncMutex = new Mutex()
|
|
51
|
+
private _timerId: ReturnType<typeof setInterval> | null = null
|
|
52
|
+
private _transactionHashMap!: SyncMap<Hash, SignedHydratedBlockWithHashMeta>
|
|
53
|
+
|
|
54
|
+
protected get maxWindowSize() {
|
|
55
|
+
return this.params.maxWindowSize
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
protected get syncInterval() {
|
|
59
|
+
return this.params.syncInterval
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
static override async paramsHandler(params?: Partial<SimpleWindowedBlockViewerParams>): Promise<SimpleWindowedBlockViewerParams> {
|
|
63
|
+
return {
|
|
64
|
+
...await super.paramsHandler(params),
|
|
65
|
+
maxWindowSize: params?.maxWindowSize ?? 1000,
|
|
66
|
+
syncInterval: params?.syncInterval ?? 10_000,
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
blockByHash(hash: Hash) {
|
|
71
|
+
return this._blockHashMap.get(hash) ?? null
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
blockByNumber(blockNumber: XL1BlockNumber) {
|
|
75
|
+
return this._blockNumberMap.get(blockNumber) ?? null
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async blockByTransactionHash(hash: Hash) {
|
|
79
|
+
const [block = null] = await this.blocksByTransactionHashes([hash])
|
|
80
|
+
return block
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
blocksByHash(hash: Hash, limit?: number) {
|
|
84
|
+
const result: SignedHydratedBlockWithHashMeta[] = []
|
|
85
|
+
let block = this._blockHashMap.get(hash)
|
|
86
|
+
while (block && (limit === undefined || result.length < limit)) {
|
|
87
|
+
result.unshift(block)
|
|
88
|
+
const previousHash = block[0].previous
|
|
89
|
+
block = previousHash ? this._blockHashMap.get(previousHash) : undefined
|
|
90
|
+
}
|
|
91
|
+
return result
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
blocksByNumber(blockNumber: XL1BlockNumber, limit?: number) {
|
|
95
|
+
const result: SignedHydratedBlockWithHashMeta[] = []
|
|
96
|
+
let block = this._blockNumberMap.get(blockNumber)
|
|
97
|
+
while (block && (limit === undefined || result.length < limit)) {
|
|
98
|
+
result.unshift(block)
|
|
99
|
+
const previousBlockNumber = asXL1BlockNumber(block[0].block - 1, true)
|
|
100
|
+
block = (previousBlockNumber >= 0) ? this._blockNumberMap.get(previousBlockNumber) : undefined
|
|
101
|
+
}
|
|
102
|
+
return result
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
blocksByTransactionHashes(hashes: Hash[]): Promisable<HydratedBlockWithHashMeta[]> {
|
|
106
|
+
return hashes.map(hash => this._transactionHashMap.get(hash)).filter(exists)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
chainId(_blockNumber?: unknown): Promisable<ChainId> {
|
|
110
|
+
throw new Error('Method not implemented.')
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
override async createHandler() {
|
|
114
|
+
await super.createHandler()
|
|
115
|
+
|
|
116
|
+
this._blockViewer = assertEx(
|
|
117
|
+
this.params.blockViewer ?? await this.locator.getInstance<BlockViewer>(BlockViewerMoniker),
|
|
118
|
+
() => 'BlockViewer instance is required',
|
|
119
|
+
)
|
|
120
|
+
this._blockHashMap = new MemoryMap<Hash, SignedHydratedBlockWithHashMeta>()
|
|
121
|
+
this._blockNumberMap = new MemoryMap<XL1BlockNumber, SignedHydratedBlockWithHashMeta>()
|
|
122
|
+
this._transactionHashMap = new MemoryMap<Hash, SignedHydratedBlockWithHashMeta>()
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
currentBlock(): Promisable<SignedHydratedBlockWithHashMeta> {
|
|
126
|
+
return assertEx(this._chain.at(-1))
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
currentBlockHash(): Promisable<Hash> {
|
|
130
|
+
return assertEx(this._chain.at(-1)?.[0]._hash)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
currentBlockNumber(): Promisable<XL1BlockNumber> {
|
|
134
|
+
return assertEx(this._chain.at(-1)?.[0].block)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
payloadByHash(_hash: Hash): Promisable<WithHashMeta<Payload> | null> {
|
|
138
|
+
throw new Error('Method not implemented.')
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
payloadsByHash(_hashes: Hash[]): Promisable<WithHashMeta<Payload>[]> {
|
|
142
|
+
throw new Error('Method not implemented.')
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
override async startHandler() {
|
|
146
|
+
await super.startHandler()
|
|
147
|
+
await this.sync()
|
|
148
|
+
this.stopPoll()
|
|
149
|
+
this.startPoll()
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
override async stopHandler() {
|
|
153
|
+
await super.stopHandler()
|
|
154
|
+
this.stopPoll()
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
private addBlock(block: SignedHydratedBlockWithHashMeta) {
|
|
158
|
+
const removedBlock = this._chain.shift()
|
|
159
|
+
if (removedBlock) {
|
|
160
|
+
this._blockHashMap.delete(removedBlock[0]._hash)
|
|
161
|
+
this._blockNumberMap.delete(removedBlock[0].block)
|
|
162
|
+
for (const tx of transactionsFromHydratedBlock(removedBlock)) {
|
|
163
|
+
this._transactionHashMap.delete(tx._hash)
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
this._chain.push(block)
|
|
167
|
+
this._blockHashMap.set(block[0]._hash, block)
|
|
168
|
+
for (const tx of transactionsFromHydratedBlock(block)) {
|
|
169
|
+
this._transactionHashMap.set(tx._hash, block)
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
private startPoll() {
|
|
174
|
+
this._timerId = setInterval(() => {
|
|
175
|
+
void this.sync()
|
|
176
|
+
}, this.syncInterval)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
private stopPoll() {
|
|
180
|
+
if (this._timerId) {
|
|
181
|
+
clearInterval(this._timerId)
|
|
182
|
+
}
|
|
183
|
+
this._timerId = null
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
private async sync() {
|
|
187
|
+
if (this._syncMutex.isLocked()) {
|
|
188
|
+
return
|
|
189
|
+
}
|
|
190
|
+
return await this._syncMutex.runExclusive(async () => {
|
|
191
|
+
try {
|
|
192
|
+
let cursor: SignedHydratedBlockWithHashMeta | null = await this._blockViewer.currentBlock()
|
|
193
|
+
const previousHead = this._chain.length > 0 ? await this.currentBlockHash() : null
|
|
194
|
+
const newBlocks: SignedHydratedBlockWithHashMeta[] = []
|
|
195
|
+
while (!isNull(cursor) && cursor[0]._hash !== previousHead && newBlocks.length < this.maxWindowSize) {
|
|
196
|
+
newBlocks.unshift(cursor)
|
|
197
|
+
const previousHash = newBlocks[0][0].previous
|
|
198
|
+
cursor = isNull(previousHash) ? null : await this._blockViewer.blockByHash(previousHash)
|
|
199
|
+
}
|
|
200
|
+
for (const block of newBlocks) {
|
|
201
|
+
this.addBlock(block)
|
|
202
|
+
}
|
|
203
|
+
} catch (ex) {
|
|
204
|
+
console.error('Error during sync:', ex)
|
|
205
|
+
}
|
|
206
|
+
})
|
|
207
|
+
}
|
|
208
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SimpleWindowedBlockViewer.ts'
|
|
@@ -5,9 +5,9 @@ import type { MapType, MapTypeRead } from '../../map/index.ts'
|
|
|
5
5
|
import type {
|
|
6
6
|
BaseContext, ChainContext, ChainContextRead,
|
|
7
7
|
} from '../../model/index.ts'
|
|
8
|
-
import type {
|
|
9
|
-
|
|
10
|
-
} from './
|
|
8
|
+
import type { BalancesStepSummary } from './BalancesStepSummary.ts'
|
|
9
|
+
import type { SchemasStepSummary } from './SchemasStepSummary.ts'
|
|
10
|
+
import type { TransfersStepSummary } from './TransfersSummary.ts'
|
|
11
11
|
|
|
12
12
|
export interface ChainSummaryContextBase<TPayload extends Payload,
|
|
13
13
|
T extends (MapTypeRead<string, TPayload>)> extends BaseContext {
|
|
@@ -6,7 +6,7 @@ import { deepCalculateFramesFromRange } from '../../../block/index.ts'
|
|
|
6
6
|
import type { ChainQualified, ChainQualifiedConfig } from '../../../model/index.ts'
|
|
7
7
|
import { isChainQualifiedHeadConfig, isChainQualifiedRangeConfig } from '../../../model/index.ts'
|
|
8
8
|
import { parseSignedBigInt } from '../../../SignedBigInt.ts'
|
|
9
|
-
import type { TransfersStepSummaryContext } from '../../index.ts'
|
|
9
|
+
import type { TransfersStepSummaryContext } from '../../model/index.ts'
|
|
10
10
|
import { transfersStepSummaryFromRange } from './transfersStepSummaryFromRange.ts'
|
|
11
11
|
|
|
12
12
|
// the summary of amount of rewards claimed from the step reward pool by addresses
|
package/src/utils/isZodError.ts
CHANGED
package/src/viewers/Block.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type {
|
|
|
4
4
|
ChainId, SignedHydratedBlockWithHashMeta, XL1BlockNumber,
|
|
5
5
|
} from '@xyo-network/xl1-protocol'
|
|
6
6
|
|
|
7
|
-
import type { Provider } from '../model/index.ts'
|
|
7
|
+
import type { Provider, ProviderMoniker } from '../model/index.ts'
|
|
8
8
|
|
|
9
9
|
export interface BlockViewerMethods {
|
|
10
10
|
blocksByHash(hash: Hash, limit?: number): Promisable<SignedHydratedBlockWithHashMeta[]>
|
|
@@ -16,7 +16,7 @@ export interface BlockViewerMethods {
|
|
|
16
16
|
export const BlockViewerMoniker = 'BlockViewer' as const
|
|
17
17
|
export type BlockViewerMoniker = typeof BlockViewerMoniker
|
|
18
18
|
|
|
19
|
-
export interface BlockViewer extends BlockViewerMethods, Provider<
|
|
19
|
+
export interface BlockViewer<TMoniker extends ProviderMoniker = BlockViewerMoniker> extends BlockViewerMethods, Provider<TMoniker> {
|
|
20
20
|
blockByHash(hash: Hash): Promisable<SignedHydratedBlockWithHashMeta | null>
|
|
21
21
|
blockByNumber(block: XL1BlockNumber): Promisable<SignedHydratedBlockWithHashMeta | null>
|
|
22
22
|
chainId(): Promisable<ChainId>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type Promisable } from '@xylabs/sdk-js'
|
|
2
2
|
import { zodIsFactory } from '@xylabs/zod'
|
|
3
3
|
import type { HydratedBlock, SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-protocol'
|
|
4
|
-
import z from 'zod'
|
|
4
|
+
import { z } from 'zod'
|
|
5
5
|
|
|
6
6
|
import {
|
|
7
7
|
ChainQualificationZod, ChainQualifiedHeadConfigZod, ChainQualifiedRangeConfigZod, type Provider,
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Hash } from '@xylabs/hex'
|
|
2
|
+
import type {
|
|
3
|
+
SignedBlockBoundWitnessWithHashMeta, SignedHydratedBlockWithHashMeta, XL1BlockNumber,
|
|
4
|
+
} from '@xyo-network/xl1-protocol'
|
|
5
|
+
|
|
6
|
+
import type { Provider } from '../model/index.ts'
|
|
7
|
+
|
|
8
|
+
export interface FinalizationViewerMethods {
|
|
9
|
+
head(): Promise<SignedHydratedBlockWithHashMeta>
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const FinalizationViewerMoniker = 'FinalizationViewer' as const
|
|
13
|
+
export type FinalizationViewerMoniker = typeof FinalizationViewerMoniker
|
|
14
|
+
|
|
15
|
+
export interface FinalizationViewer extends FinalizationViewerMethods, Provider<FinalizationViewerMoniker> {
|
|
16
|
+
headBlock(): Promise<SignedBlockBoundWitnessWithHashMeta>
|
|
17
|
+
headHash(): Promise<Hash>
|
|
18
|
+
headNumber(): Promise<XL1BlockNumber>
|
|
19
|
+
}
|