@xyo-network/chain-services 1.16.26 → 1.17.1
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/accountBalanceServiceFromArchivist.d.ts +1 -1
- package/dist/neutral/AccountBalance/accountBalanceServiceFromArchivist.d.ts.map +1 -1
- package/dist/neutral/AccountBalance/index.d.ts +0 -1
- package/dist/neutral/AccountBalance/index.d.ts.map +1 -1
- package/dist/neutral/BaseService.d.ts +0 -3
- package/dist/neutral/BaseService.d.ts.map +1 -1
- package/dist/neutral/BlockReward/EvmBlockRewardViewer.d.ts +17 -0
- package/dist/neutral/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -0
- package/dist/neutral/BlockReward/index.d.ts +1 -3
- package/dist/neutral/BlockReward/index.d.ts.map +1 -1
- package/dist/neutral/ChainBlockNumberIteration/ChainBlockNumberIterationService.d.ts +23 -11
- package/dist/neutral/ChainBlockNumberIteration/ChainBlockNumberIterationService.d.ts.map +1 -1
- package/dist/neutral/ChainService/Evm/Evm.d.ts +6 -5
- package/dist/neutral/ChainService/Evm/Evm.d.ts.map +1 -1
- package/dist/neutral/ChainService/Memory/Memory.d.ts +6 -4
- package/dist/neutral/ChainService/Memory/Memory.d.ts.map +1 -1
- package/dist/neutral/ChainValidator/XyoValidator.d.ts +4 -18
- package/dist/neutral/ChainValidator/XyoValidator.d.ts.map +1 -1
- package/dist/neutral/Election/BaseElectionService.d.ts +3 -3
- package/dist/neutral/Election/BaseElectionService.d.ts.map +1 -1
- package/dist/neutral/PendingTransactions/BasePendingTransactions.d.ts +9 -9
- package/dist/neutral/PendingTransactions/BasePendingTransactions.d.ts.map +1 -1
- package/dist/neutral/StakeIntent/XyoStakeIntentService.d.ts +7 -6
- package/dist/neutral/StakeIntent/XyoStakeIntentService.d.ts.map +1 -1
- package/dist/neutral/Time/BaseTimeSyncService.d.ts +3 -6
- package/dist/neutral/Time/BaseTimeSyncService.d.ts.map +1 -1
- package/dist/neutral/blockViewerFromChainIteratorAndArchivist.d.ts.map +1 -1
- package/dist/neutral/implementation/accountBalance.d.ts +7 -0
- package/dist/neutral/implementation/accountBalance.d.ts.map +1 -0
- package/dist/neutral/implementation/blockViewer.d.ts +7 -0
- package/dist/neutral/implementation/blockViewer.d.ts.map +1 -0
- package/dist/neutral/implementation/chain/evm.d.ts +7 -0
- package/dist/neutral/implementation/chain/evm.d.ts.map +1 -0
- package/dist/neutral/implementation/chain/index.d.ts +7 -0
- package/dist/neutral/implementation/chain/index.d.ts.map +1 -0
- package/dist/neutral/implementation/evm/index.d.ts +2 -0
- package/dist/neutral/implementation/evm/index.d.ts.map +1 -0
- package/dist/neutral/implementation/evm/initChainId.d.ts +4 -0
- package/dist/neutral/implementation/evm/initChainId.d.ts.map +1 -0
- package/dist/neutral/implementation/evm/initEvmProvider.d.ts +11 -0
- package/dist/neutral/implementation/evm/initEvmProvider.d.ts.map +1 -0
- package/dist/neutral/implementation/evm/initInfuraProvider.d.ts +6 -0
- package/dist/neutral/implementation/evm/initInfuraProvider.d.ts.map +1 -0
- package/dist/neutral/implementation/evm/initJsonRpcProvider.d.ts +6 -0
- package/dist/neutral/implementation/evm/initJsonRpcProvider.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createBootstrapHead.d.ts +5 -0
- package/dist/neutral/implementation/head/createBootstrapHead.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/config/getBridgeDestinationDetails.d.ts +8 -0
- package/dist/neutral/implementation/head/createForkedHead/config/getBridgeDestinationDetails.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts +9 -0
- package/dist/neutral/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/config/getForkDetails.d.ts +4 -0
- package/dist/neutral/implementation/head/createForkedHead/config/getForkDetails.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/config/index.d.ts +4 -0
- package/dist/neutral/implementation/head/createForkedHead/config/index.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/createForkedHead.d.ts +5 -0
- package/dist/neutral/implementation/head/createForkedHead/createForkedHead.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/getBridgeDestinationObservation.d.ts +11 -0
- package/dist/neutral/implementation/head/createForkedHead/getBridgeDestinationObservation.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/getBridgeIntent.d.ts +11 -0
- package/dist/neutral/implementation/head/createForkedHead/getBridgeIntent.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/getBridgeSourceObservation.d.ts +11 -0
- package/dist/neutral/implementation/head/createForkedHead/getBridgeSourceObservation.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/getFirstBlockForNewChain.d.ts +13 -0
- package/dist/neutral/implementation/head/createForkedHead/getFirstBlockForNewChain.d.ts.map +1 -0
- package/dist/neutral/implementation/head/createForkedHead/index.d.ts +2 -0
- package/dist/neutral/implementation/head/createForkedHead/index.d.ts.map +1 -0
- package/dist/neutral/implementation/head/getForkFromBlock.d.ts +12 -0
- package/dist/neutral/implementation/head/getForkFromBlock.d.ts.map +1 -0
- package/dist/neutral/implementation/head/head.d.ts +11 -0
- package/dist/neutral/implementation/head/head.d.ts.map +1 -0
- package/dist/neutral/implementation/head/index.d.ts +2 -0
- package/dist/neutral/implementation/head/index.d.ts.map +1 -0
- package/dist/neutral/implementation/head/submitNewChain.d.ts +10 -0
- package/dist/neutral/implementation/head/submitNewChain.d.ts.map +1 -0
- package/dist/neutral/implementation/index.d.ts +13 -0
- package/dist/neutral/implementation/index.d.ts.map +1 -0
- package/dist/neutral/implementation/mempoolRunner.d.ts +7 -0
- package/dist/neutral/implementation/mempoolRunner.d.ts.map +1 -0
- package/dist/neutral/implementation/mempoolViewer.d.ts +7 -0
- package/dist/neutral/implementation/mempoolViewer.d.ts.map +1 -0
- package/dist/neutral/implementation/pendingTransactions.d.ts +9 -0
- package/dist/neutral/implementation/pendingTransactions.d.ts.map +1 -0
- package/dist/neutral/implementation/producer.d.ts +5 -0
- package/dist/neutral/implementation/producer.d.ts.map +1 -0
- package/dist/neutral/implementation/reward.d.ts +14 -0
- package/dist/neutral/implementation/reward.d.ts.map +1 -0
- package/dist/neutral/implementation/time.d.ts +6 -0
- package/dist/neutral/implementation/time.d.ts.map +1 -0
- package/dist/neutral/implementation/validator.d.ts +5 -0
- package/dist/neutral/implementation/validator.d.ts.map +1 -0
- package/dist/neutral/index.d.ts +2 -2
- package/dist/neutral/index.d.ts.map +1 -1
- package/dist/neutral/index.mjs +1623 -1150
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/neutral/simple/block/index.d.ts +2 -0
- package/dist/neutral/simple/block/index.d.ts.map +1 -0
- package/dist/neutral/simple/block/runner/SimpleBlockRunner.d.ts +117 -0
- package/dist/neutral/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -0
- package/dist/neutral/simple/block/runner/generateTransactionFeeTransfers.d.ts.map +1 -0
- package/dist/neutral/simple/block/runner/index.d.ts +2 -0
- package/dist/neutral/simple/block/runner/index.d.ts.map +1 -0
- package/dist/neutral/simple/block/runner/spec/SimpleBlockRewardViewer.d.ts +2 -0
- package/dist/neutral/simple/block/runner/spec/SimpleBlockRewardViewer.d.ts.map +1 -0
- package/dist/neutral/simple/index.d.ts +2 -0
- package/dist/neutral/simple/index.d.ts.map +1 -0
- package/package.json +30 -27
- package/src/AccountBalance/accountBalanceServiceFromArchivist.ts +38 -10
- package/src/AccountBalance/index.ts +0 -1
- package/src/BaseService.ts +0 -13
- package/src/BlockReward/EvmBlockRewardViewer.ts +50 -0
- package/src/BlockReward/index.ts +1 -3
- package/src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts +74 -6
- package/src/ChainService/Evm/Evm.ts +39 -36
- package/src/ChainService/Memory/Memory.ts +14 -7
- package/src/ChainValidator/XyoValidator.ts +29 -34
- package/src/Election/BaseElectionService.ts +5 -4
- package/src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts +18 -18
- package/src/PendingTransactions/BasePendingTransactions.ts +15 -9
- package/src/Schemas/BaseSchemasService.ts +1 -1
- package/src/StakeIntent/XyoStakeIntentService.ts +24 -18
- package/src/StepStake/BaseStepStakeService.ts +2 -2
- package/src/Time/BaseTimeSyncService.ts +6 -16
- package/src/blockViewerFromChainIteratorAndArchivist.ts +20 -1
- package/src/implementation/accountBalance.ts +29 -0
- package/src/implementation/blockViewer.ts +29 -0
- package/src/implementation/chain/evm.ts +39 -0
- package/src/implementation/chain/index.ts +46 -0
- package/src/implementation/evm/index.ts +1 -0
- package/src/implementation/evm/initChainId.ts +20 -0
- package/src/implementation/evm/initEvmProvider.ts +24 -0
- package/src/implementation/evm/initInfuraProvider.ts +26 -0
- package/src/implementation/evm/initJsonRpcProvider.ts +20 -0
- package/src/implementation/head/createBootstrapHead.ts +31 -0
- package/src/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts +27 -0
- package/src/implementation/head/createForkedHead/config/getBridgeSourceDetails.ts +19 -0
- package/src/implementation/head/createForkedHead/config/getForkDetails.ts +10 -0
- package/src/implementation/head/createForkedHead/config/index.ts +3 -0
- package/src/implementation/head/createForkedHead/createForkedHead.ts +29 -0
- package/src/implementation/head/createForkedHead/getBridgeDestinationObservation.ts +42 -0
- package/src/implementation/head/createForkedHead/getBridgeIntent.ts +51 -0
- package/src/implementation/head/createForkedHead/getBridgeSourceObservation.ts +46 -0
- package/src/implementation/head/createForkedHead/getFirstBlockForNewChain.ts +41 -0
- package/src/implementation/head/createForkedHead/index.ts +1 -0
- package/src/implementation/head/getForkFromBlock.ts +43 -0
- package/src/implementation/head/head.ts +49 -0
- package/src/implementation/head/index.ts +1 -0
- package/src/implementation/head/submitNewChain.ts +27 -0
- package/src/implementation/index.ts +12 -0
- package/src/implementation/mempoolRunner.ts +29 -0
- package/src/implementation/mempoolViewer.ts +29 -0
- package/src/implementation/pendingTransactions.ts +36 -0
- package/src/implementation/producer.ts +16 -0
- package/src/implementation/reward.ts +53 -0
- package/src/implementation/time.ts +26 -0
- package/src/implementation/validator.ts +15 -0
- package/src/index.ts +2 -2
- package/src/simple/block/index.ts +1 -0
- package/src/{BlockProducer/BaseBlockProducerService.ts → simple/block/runner/SimpleBlockRunner.ts} +111 -74
- package/src/simple/block/runner/index.ts +1 -0
- package/src/simple/block/runner/spec/SimpleBlockRewardViewer.ts +413 -0
- package/src/simple/index.ts +1 -0
- package/dist/neutral/AccountBalance/BaseAccountBalanceService.d.ts +0 -36
- package/dist/neutral/AccountBalance/BaseAccountBalanceService.d.ts.map +0 -1
- package/dist/neutral/AccountTransfers/BaseAccountTransfersService.d.ts +0 -13
- package/dist/neutral/AccountTransfers/BaseAccountTransfersService.d.ts.map +0 -1
- package/dist/neutral/AccountTransfers/index.d.ts +0 -2
- package/dist/neutral/AccountTransfers/index.d.ts.map +0 -1
- package/dist/neutral/BlockProducer/BaseBlockProducerService.d.ts +0 -85
- package/dist/neutral/BlockProducer/BaseBlockProducerService.d.ts.map +0 -1
- package/dist/neutral/BlockProducer/generateTransactionFeeTransfers.d.ts.map +0 -1
- package/dist/neutral/BlockProducer/index.d.ts +0 -2
- package/dist/neutral/BlockProducer/index.d.ts.map +0 -1
- package/dist/neutral/BlockReward/BaseBlockRewardService.d.ts +0 -10
- package/dist/neutral/BlockReward/BaseBlockRewardService.d.ts.map +0 -1
- package/dist/neutral/BlockReward/EvmBlockRewardService.d.ts +0 -18
- package/dist/neutral/BlockReward/EvmBlockRewardService.d.ts.map +0 -1
- package/dist/neutral/BlockReward/MemoryBlockRewardService.d.ts +0 -23
- package/dist/neutral/BlockReward/MemoryBlockRewardService.d.ts.map +0 -1
- package/src/AccountBalance/BaseAccountBalanceService.ts +0 -100
- package/src/AccountTransfers/BaseAccountTransfersService.ts +0 -36
- package/src/AccountTransfers/index.ts +0 -1
- package/src/BlockProducer/index.ts +0 -1
- package/src/BlockReward/BaseBlockRewardService.ts +0 -17
- package/src/BlockReward/EvmBlockRewardService.ts +0 -49
- package/src/BlockReward/MemoryBlockRewardService.ts +0 -72
- /package/dist/neutral/{BlockProducer → simple/block/runner}/generateTransactionFeeTransfers.d.ts +0 -0
- /package/src/{BlockProducer → simple/block/runner}/generateTransactionFeeTransfers.ts +0 -0
package/dist/neutral/index.mjs
CHANGED
|
@@ -2,22 +2,66 @@ var __defProp = Object.defineProperty;
|
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
|
|
4
4
|
// src/AccountBalance/accountBalanceServiceFromArchivist.ts
|
|
5
|
-
import { assertEx
|
|
6
|
-
import { findMostRecentBlock } from "@xyo-network/chain-protocol";
|
|
5
|
+
import { assertEx } from "@xylabs/sdk-js";
|
|
7
6
|
import { StepSizes } from "@xyo-network/xl1-protocol";
|
|
8
|
-
import { LruCacheMap, readPayloadMapFromStore } from "@xyo-network/xl1-protocol-sdk";
|
|
7
|
+
import { findMostRecentBlock, LruCacheMap, readPayloadMapFromStore, SimpleAccountBalanceViewer, SimpleBlockViewer } from "@xyo-network/xl1-protocol-sdk";
|
|
9
8
|
import { Semaphore } from "async-mutex";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
9
|
+
var accountBalancesViewerFromArchivist = /* @__PURE__ */ __name(async (chainId, archivist) => {
|
|
10
|
+
const summaryMap = new LruCacheMap({
|
|
11
|
+
max: 1e5,
|
|
12
|
+
allowStale: true,
|
|
13
|
+
noDisposeOnSet: false,
|
|
14
|
+
updateAgeOnGet: true
|
|
15
|
+
});
|
|
16
|
+
const transferSummaryMap = new LruCacheMap({
|
|
17
|
+
max: 1e5,
|
|
18
|
+
allowStale: true,
|
|
19
|
+
noDisposeOnSet: false,
|
|
20
|
+
updateAgeOnGet: true
|
|
21
|
+
});
|
|
22
|
+
const chainMap = readPayloadMapFromStore(archivist);
|
|
23
|
+
const headFunc = /* @__PURE__ */ __name(async () => {
|
|
24
|
+
const head = assertEx(await findMostRecentBlock(archivist), () => "No blocks found in chainArchivist");
|
|
25
|
+
return [
|
|
26
|
+
head._hash,
|
|
27
|
+
head.block
|
|
28
|
+
];
|
|
29
|
+
}, "headFunc");
|
|
30
|
+
const service = await SimpleAccountBalanceViewer.create({
|
|
31
|
+
context: {
|
|
32
|
+
chainId,
|
|
33
|
+
store: {
|
|
34
|
+
chainMap
|
|
35
|
+
},
|
|
36
|
+
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
37
|
+
summaryMap,
|
|
38
|
+
head: headFunc
|
|
39
|
+
},
|
|
40
|
+
transfersSummaryContext: {
|
|
41
|
+
chainId,
|
|
42
|
+
store: {
|
|
43
|
+
chainMap
|
|
44
|
+
},
|
|
45
|
+
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
46
|
+
summaryMap: transferSummaryMap,
|
|
47
|
+
head: headFunc
|
|
48
|
+
},
|
|
49
|
+
blockViewer: await SimpleBlockViewer.create({
|
|
50
|
+
context: {
|
|
51
|
+
chainId,
|
|
52
|
+
head: headFunc,
|
|
53
|
+
store: {
|
|
54
|
+
chainMap
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
finalizedArchivist: archivist
|
|
58
|
+
})
|
|
59
|
+
});
|
|
60
|
+
return service;
|
|
61
|
+
}, "accountBalancesViewerFromArchivist");
|
|
17
62
|
|
|
18
63
|
// src/BaseService.ts
|
|
19
64
|
import { AbstractCreatable, creatable } from "@xylabs/sdk-js";
|
|
20
|
-
import { spanRoot, spanRootAsync } from "@xylabs/telemetry";
|
|
21
65
|
import { Mutex } from "async-mutex";
|
|
22
66
|
function _ts_decorate(decorators, target, key, desc) {
|
|
23
67
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -40,15 +84,6 @@ var BaseService = class extends AbstractCreatable {
|
|
|
40
84
|
return await this.create(params);
|
|
41
85
|
});
|
|
42
86
|
}
|
|
43
|
-
paramsHandler(params) {
|
|
44
|
-
return params;
|
|
45
|
-
}
|
|
46
|
-
span(name, fn) {
|
|
47
|
-
return spanRoot(name, fn, this.tracer);
|
|
48
|
-
}
|
|
49
|
-
async spanAsync(name, fn) {
|
|
50
|
-
return await spanRootAsync(name, fn, this.tracer);
|
|
51
|
-
}
|
|
52
87
|
};
|
|
53
88
|
BaseService = _ts_decorate([
|
|
54
89
|
creatable()
|
|
@@ -65,7 +100,10 @@ function creatableService() {
|
|
|
65
100
|
}
|
|
66
101
|
__name(creatableService, "creatableService");
|
|
67
102
|
|
|
68
|
-
// src/
|
|
103
|
+
// src/BlockReward/EvmBlockRewardViewer.ts
|
|
104
|
+
import { AbstractCreatable as AbstractCreatable2, assertEx as assertEx2, creatable as creatable2, toEthAddress } from "@xylabs/sdk-js";
|
|
105
|
+
import { XyoChainRewards__factory as XyoChainRewardsFactory } from "@xyo-network/typechain";
|
|
106
|
+
import { asAttoXL1 } from "@xyo-network/xl1-protocol";
|
|
69
107
|
function _ts_decorate2(decorators, target, key, desc) {
|
|
70
108
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
71
109
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -73,804 +111,358 @@ function _ts_decorate2(decorators, target, key, desc) {
|
|
|
73
111
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
74
112
|
}
|
|
75
113
|
__name(_ts_decorate2, "_ts_decorate");
|
|
76
|
-
var
|
|
77
|
-
blockViewer: z.object().loose(),
|
|
78
|
-
chainArchivist: z.object().loose(),
|
|
79
|
-
chainIterator: z.object().loose(),
|
|
80
|
-
context: z.object().loose(),
|
|
81
|
-
transferContext: z.object().loose()
|
|
82
|
-
});
|
|
83
|
-
var BaseAccountBalanceService = class extends BaseService {
|
|
114
|
+
var EvmBlockRewardViewer = class extends AbstractCreatable2 {
|
|
84
115
|
static {
|
|
85
|
-
__name(this, "
|
|
86
|
-
}
|
|
87
|
-
accountBalanceViewer;
|
|
88
|
-
get blockViewer() {
|
|
89
|
-
return assertEx(this.params.blockViewer, () => "BlockViewer has not been initialized yet");
|
|
90
|
-
}
|
|
91
|
-
static async paramsHandler(params) {
|
|
92
|
-
BaseAccountBalanceServiceParamsZod.parse(params);
|
|
93
|
-
assertEx(params?.context?.head, () => "BalanceStepSummaryContext is required in BaseAccountBalanceServiceParams");
|
|
94
|
-
return {
|
|
95
|
-
...await super.paramsHandler(params),
|
|
96
|
-
...params
|
|
97
|
-
};
|
|
116
|
+
__name(this, "EvmBlockRewardViewer");
|
|
98
117
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
], headOrRange);
|
|
103
|
-
return balances[address] ?? AttoXL1(0n);
|
|
118
|
+
_contractAddress;
|
|
119
|
+
get chainContractViewer() {
|
|
120
|
+
return assertEx2(this.params.chainContractViewer, () => "chainContractViewer is required");
|
|
104
121
|
}
|
|
105
|
-
|
|
106
|
-
|
|
122
|
+
get contractAddress() {
|
|
123
|
+
return assertEx2(this._contractAddress, () => "contractAddress is required");
|
|
107
124
|
}
|
|
108
|
-
|
|
109
|
-
return
|
|
110
|
-
const context = {
|
|
111
|
-
head: this.params.context.head,
|
|
112
|
-
stepSemaphores: this.params.context.stepSemaphores,
|
|
113
|
-
store: this.params.context.store,
|
|
114
|
-
chainId: this.params.context.chainId,
|
|
115
|
-
summaryMap: this.params.context.summaryMap
|
|
116
|
-
};
|
|
117
|
-
const summary = await balancesSummary(context);
|
|
118
|
-
const result = {};
|
|
119
|
-
for (const addr of address) {
|
|
120
|
-
const summaryBalance = summary[addr] ?? 0n;
|
|
121
|
-
result[addr] = AttoXL1(summaryBalance < 0n ? 0n : summaryBalance);
|
|
122
|
-
}
|
|
123
|
-
return result;
|
|
124
|
-
});
|
|
125
|
+
get provider() {
|
|
126
|
+
return assertEx2(this.params.provider, () => "provider is required");
|
|
125
127
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
+
async allowedRewardForBlock(blockNumber) {
|
|
129
|
+
const contract = XyoChainRewardsFactory.connect(toEthAddress(this.contractAddress), this.provider);
|
|
130
|
+
return asAttoXL1(await contract.calcBlockReward(blockNumber));
|
|
128
131
|
}
|
|
129
132
|
async createHandler() {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
await super.createHandler();
|
|
134
|
+
try {
|
|
135
|
+
this._contractAddress = await this.chainContractViewer.rewardsContract();
|
|
136
|
+
} catch (ex) {
|
|
137
|
+
const error = ex;
|
|
138
|
+
throw new Error(`Failed to get rewards contract address: ${error.message}`);
|
|
139
|
+
}
|
|
135
140
|
}
|
|
136
141
|
};
|
|
137
|
-
|
|
142
|
+
EvmBlockRewardViewer = _ts_decorate2([
|
|
138
143
|
creatable2()
|
|
139
|
-
],
|
|
140
|
-
|
|
141
|
-
// src/AccountBalance/accountBalanceServiceFromArchivist.ts
|
|
142
|
-
var accountBalancesServiceFromArchivist = /* @__PURE__ */ __name(async (chainId, archivist) => {
|
|
143
|
-
const summaryMap = new LruCacheMap({
|
|
144
|
-
max: 1e5,
|
|
145
|
-
allowStale: true,
|
|
146
|
-
noDisposeOnSet: false,
|
|
147
|
-
updateAgeOnGet: true
|
|
148
|
-
});
|
|
149
|
-
const chainMap = readPayloadMapFromStore(archivist);
|
|
150
|
-
const headFunc = /* @__PURE__ */ __name(async () => {
|
|
151
|
-
const head = await findMostRecentBlock(archivist);
|
|
152
|
-
return [
|
|
153
|
-
assertEx2(head?._hash, () => "No head found in chainArchivist"),
|
|
154
|
-
assertEx2(head?.block, () => "No head found in chainArchivist")
|
|
155
|
-
];
|
|
156
|
-
}, "headFunc");
|
|
157
|
-
const service = await BaseAccountBalanceService.create({
|
|
158
|
-
context: {
|
|
159
|
-
chainId,
|
|
160
|
-
store: {
|
|
161
|
-
chainMap
|
|
162
|
-
},
|
|
163
|
-
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
164
|
-
summaryMap,
|
|
165
|
-
head: headFunc
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
return service;
|
|
169
|
-
}, "accountBalancesServiceFromArchivist");
|
|
144
|
+
], EvmBlockRewardViewer);
|
|
170
145
|
|
|
171
|
-
// src/
|
|
172
|
-
import {
|
|
173
|
-
import {
|
|
174
|
-
import {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
return (await this.transfers(head, [
|
|
189
|
-
address
|
|
190
|
-
]))[address] ?? AttoXL12(0n);
|
|
191
|
-
}
|
|
192
|
-
async transfers(head, addresses) {
|
|
193
|
-
return await spanRootAsync3("transfers", async () => {
|
|
194
|
-
const summary = await transfersSummary(this.params.context);
|
|
195
|
-
const result = {};
|
|
196
|
-
for (const addr of addresses) {
|
|
197
|
-
const summaryBalance = summary[addr] ?? 0n;
|
|
198
|
-
result[addr] = AttoXL12(summaryBalance);
|
|
146
|
+
// src/blockViewerFromChainIteratorAndArchivist.ts
|
|
147
|
+
import { isDefined } from "@xylabs/sdk-js";
|
|
148
|
+
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
149
|
+
import { asSignedBlockBoundWitness, asSignedBlockBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
|
|
150
|
+
function blockViewerFromChainIteratorAndArchivist(chainIterator, chainArchivist) {
|
|
151
|
+
const result = {
|
|
152
|
+
blockByHash: /* @__PURE__ */ __name(async function(hash) {
|
|
153
|
+
const [payload] = await chainArchivist.get([
|
|
154
|
+
hash
|
|
155
|
+
]);
|
|
156
|
+
const block = asSignedBlockBoundWitnessWithStorageMeta(payload);
|
|
157
|
+
if (isDefined(block)) {
|
|
158
|
+
const payloads = await chainArchivist.get(block.payload_hashes);
|
|
159
|
+
return [
|
|
160
|
+
block,
|
|
161
|
+
payloads
|
|
162
|
+
];
|
|
199
163
|
}
|
|
200
|
-
return
|
|
201
|
-
})
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
164
|
+
return null;
|
|
165
|
+
}, "blockByHash"),
|
|
166
|
+
blockByNumber: /* @__PURE__ */ __name(async function(blockNumber) {
|
|
167
|
+
const payload = asSignedBlockBoundWitness(await chainIterator.get(blockNumber));
|
|
168
|
+
const block = payload ? await PayloadBuilder.addHashMeta(payload) : void 0;
|
|
169
|
+
if (isDefined(block)) {
|
|
170
|
+
const payloads = await chainArchivist.get(block.payload_hashes);
|
|
171
|
+
return [
|
|
172
|
+
block,
|
|
173
|
+
payloads
|
|
174
|
+
];
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}, "blockByNumber"),
|
|
178
|
+
blocksByHash: /* @__PURE__ */ __name(async function(hash, limit = 10) {
|
|
179
|
+
const results = [];
|
|
180
|
+
for (let i = 0; i < limit; i++) {
|
|
181
|
+
const block = await this.blockByHash(hash);
|
|
182
|
+
if (block) {
|
|
183
|
+
results.push(block);
|
|
184
|
+
} else {
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return results;
|
|
189
|
+
}, "blocksByHash"),
|
|
190
|
+
blocksByNumber: /* @__PURE__ */ __name(async function(number, limit = 10) {
|
|
191
|
+
const results = [];
|
|
192
|
+
for (let i = 0; i < limit; i++) {
|
|
193
|
+
const block = await this.blockByNumber(number);
|
|
194
|
+
if (block) {
|
|
195
|
+
results.push(block);
|
|
196
|
+
} else {
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return results;
|
|
201
|
+
}, "blocksByNumber"),
|
|
202
|
+
currentBlock: /* @__PURE__ */ __name(async function() {
|
|
203
|
+
const head = await chainIterator.head();
|
|
204
|
+
return this.blockByHash(head._hash);
|
|
205
|
+
}, "currentBlock"),
|
|
206
|
+
currentBlockHash: /* @__PURE__ */ __name(async function() {
|
|
207
|
+
const head = await chainIterator.head();
|
|
208
|
+
return head._hash;
|
|
209
|
+
}, "currentBlockHash"),
|
|
210
|
+
currentBlockNumber: /* @__PURE__ */ __name(async function() {
|
|
211
|
+
const head = await chainIterator.head();
|
|
212
|
+
return head.block;
|
|
213
|
+
}, "currentBlockNumber"),
|
|
214
|
+
payloadByHash: /* @__PURE__ */ __name(function(_hash) {
|
|
215
|
+
throw new Error("Function not implemented.");
|
|
216
|
+
}, "payloadByHash"),
|
|
217
|
+
payloadsByHash: /* @__PURE__ */ __name(function(_hashes) {
|
|
218
|
+
throw new Error("Function not implemented.");
|
|
219
|
+
}, "payloadsByHash")
|
|
220
|
+
};
|
|
221
|
+
return result;
|
|
222
|
+
}
|
|
223
|
+
__name(blockViewerFromChainIteratorAndArchivist, "blockViewerFromChainIteratorAndArchivist");
|
|
207
224
|
|
|
208
|
-
// src/
|
|
209
|
-
import {
|
|
210
|
-
import { FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema } from "@xyo-network/chain-modules";
|
|
211
|
-
import { buildNextBlock, createDeclarationIntent } from "@xyo-network/chain-protocol";
|
|
225
|
+
// src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts
|
|
226
|
+
import { assertEx as assertEx3, isDefined as isDefined2, isNull, isUndefined } from "@xylabs/sdk-js";
|
|
212
227
|
import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
|
|
213
|
-
import { asBlockBoundWitness,
|
|
214
|
-
import
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
220
|
-
import { TransferSchema, XYO_ZERO_ADDRESS } from "@xyo-network/xl1-protocol";
|
|
221
|
-
import { transactionRequiredGas } from "@xyo-network/xl1-protocol-sdk";
|
|
222
|
-
import { HydratedTransactionWrapper } from "@xyo-network/xl1-wrappers";
|
|
223
|
-
async function generateTransactionFeeTransfers(address, transactions) {
|
|
224
|
-
const txs = await Promise.all(transactions.map(async (tx) => {
|
|
225
|
-
return HydratedTransactionWrapper.parse([
|
|
226
|
-
await PayloadBuilder.addStorageMeta(tx[0]),
|
|
227
|
-
await PayloadBuilder.addStorageMeta(tx[1])
|
|
228
|
-
]);
|
|
229
|
-
}));
|
|
230
|
-
const txBaseFeeCosts = {};
|
|
231
|
-
for (const tx of txs) {
|
|
232
|
-
txBaseFeeCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n) + tx.fees.base;
|
|
228
|
+
import { asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta, asSignedHydratedBlockWithHashMeta, asXL1BlockNumber, isBlockBoundWitnessWithHashMeta } from "@xyo-network/xl1-protocol";
|
|
229
|
+
import { hydrateBlock } from "@xyo-network/xl1-protocol-sdk";
|
|
230
|
+
import { LRUCache } from "lru-cache";
|
|
231
|
+
var ChainBlockNumberIterationService = class extends BaseService {
|
|
232
|
+
static {
|
|
233
|
+
__name(this, "ChainBlockNumberIterationService");
|
|
233
234
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
235
|
+
_blocksByBlockNumber = new LRUCache({
|
|
236
|
+
max: 1e4
|
|
237
|
+
});
|
|
238
|
+
_currentHead;
|
|
239
|
+
get chainId() {
|
|
240
|
+
return assertEx3(this._currentHead?.chain ?? this.params?.head?.chain, () => "Current head is not set");
|
|
239
241
|
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
// burn the base fee
|
|
247
|
-
[XYO_ZERO_ADDRESS]: hexFromBigInt(amount)
|
|
248
|
-
}
|
|
242
|
+
get chainMap() {
|
|
243
|
+
return assertEx3(this.params.chainMap);
|
|
244
|
+
}
|
|
245
|
+
get chainStoreRead() {
|
|
246
|
+
return {
|
|
247
|
+
chainMap: this.chainMap
|
|
249
248
|
};
|
|
250
|
-
return payload;
|
|
251
|
-
});
|
|
252
|
-
for (const [from, amount] of Object.entries(txGasCosts)) {
|
|
253
|
-
const fromPayload = assertEx3(payloads.find((p) => p.from === from), () => "from payload not found");
|
|
254
|
-
fromPayload.transfers[address] = hexFromBigInt(amount);
|
|
255
249
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
__name(generateTransactionFeeTransfers, "generateTransactionFeeTransfers");
|
|
259
|
-
|
|
260
|
-
// src/BlockProducer/BaseBlockProducerService.ts
|
|
261
|
-
function _ts_decorate4(decorators, target, key, desc) {
|
|
262
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
263
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
264
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
265
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
266
|
-
}
|
|
267
|
-
__name(_ts_decorate4, "_ts_decorate");
|
|
268
|
-
var DEFAULT_BLOCK_SIZE = 10;
|
|
269
|
-
var XYO_PRODUCER_REDECLARATION_DURATION = 1e4;
|
|
270
|
-
var XYO_PRODUCER_REDECLARATION_WINDOW = 500;
|
|
271
|
-
var BaseBlockProducerServiceParamsZod = z2.object({
|
|
272
|
-
balanceService: z2.object().loose(),
|
|
273
|
-
pendingTransactionsService: z2.object().loose(),
|
|
274
|
-
rejectedTransactionsArchivist: z2.object().loose(),
|
|
275
|
-
rewardAddress: AddressZod,
|
|
276
|
-
time: z2.object().loose()
|
|
277
|
-
});
|
|
278
|
-
var BaseBlockProducerService = class _BaseBlockProducerService extends BaseService {
|
|
279
|
-
static {
|
|
280
|
-
__name(this, "BaseBlockProducerService");
|
|
250
|
+
async blockByHash(hash) {
|
|
251
|
+
return asSignedHydratedBlockWithHashMeta(await hydrateBlock(this.chainStoreRead, hash)) ?? null;
|
|
281
252
|
}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
* The default block size for a block
|
|
285
|
-
*/
|
|
286
|
-
static get DefaultBlockSize() {
|
|
287
|
-
return DEFAULT_BLOCK_SIZE;
|
|
253
|
+
async blockByNumber(block) {
|
|
254
|
+
return asSignedHydratedBlockWithHashMeta(await this.get(block)) ?? null;
|
|
288
255
|
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
256
|
+
async blocksByHash(hash, limit = 100) {
|
|
257
|
+
const results = [];
|
|
258
|
+
let currentBlock = await this.blockByHash(hash);
|
|
259
|
+
while (currentBlock !== null && (isUndefined(limit) || results.length < limit)) {
|
|
260
|
+
results.push(currentBlock);
|
|
261
|
+
const previousHash = currentBlock[0].previous;
|
|
262
|
+
if (isNull(previousHash)) break;
|
|
263
|
+
currentBlock = await this.blockByHash(previousHash);
|
|
264
|
+
}
|
|
265
|
+
return results;
|
|
295
266
|
}
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
267
|
+
async blocksByNumber(blockNumber, limit = 100) {
|
|
268
|
+
const results = [];
|
|
269
|
+
let currentBlock = await this.blockByNumber(blockNumber);
|
|
270
|
+
while (currentBlock !== null && (isUndefined(limit) || results.length < limit)) {
|
|
271
|
+
results.push(currentBlock);
|
|
272
|
+
if (currentBlock[0].block === 0) break;
|
|
273
|
+
const previousNumber = asXL1BlockNumber(currentBlock[0].block - 1, true);
|
|
274
|
+
currentBlock = await this.blockByNumber(previousNumber);
|
|
275
|
+
}
|
|
276
|
+
return results;
|
|
302
277
|
}
|
|
303
|
-
|
|
304
|
-
return this.
|
|
278
|
+
async currentBlock() {
|
|
279
|
+
return assertEx3(await this.blockByHash(await this.currentBlockHash()), () => "Current block not found");
|
|
305
280
|
}
|
|
306
|
-
|
|
307
|
-
|
|
281
|
+
async currentBlockHash() {
|
|
282
|
+
const head = assertEx3(await this.head(), () => "Head is not set");
|
|
283
|
+
return head._hash;
|
|
308
284
|
}
|
|
309
|
-
|
|
310
|
-
|
|
285
|
+
async currentBlockNumber() {
|
|
286
|
+
const head = assertEx3(await this.head(), () => "Head is not set");
|
|
287
|
+
return head.block;
|
|
311
288
|
}
|
|
312
|
-
get
|
|
313
|
-
|
|
289
|
+
async get(block) {
|
|
290
|
+
const head = await this.head();
|
|
291
|
+
assertEx3(head.block >= block, () => `Block requested is newer than the current head [${block}]`);
|
|
292
|
+
const cached = this._blocksByBlockNumber.get(block);
|
|
293
|
+
if (cached) return cached;
|
|
294
|
+
const startingBlock = head;
|
|
295
|
+
const currentBlockHash = await PayloadBuilder2.hash(startingBlock);
|
|
296
|
+
let currentBlock = await this.chainMap.get(currentBlockHash);
|
|
297
|
+
while (isDefined2(currentBlock)) {
|
|
298
|
+
assertEx3(asBlockBoundWitness(currentBlock), () => `Expected hash to be a block bound witness [${currentBlock?._hash}]`);
|
|
299
|
+
if (isBlockBoundWitnessWithHashMeta(currentBlock)) {
|
|
300
|
+
this._blocksByBlockNumber.set(currentBlock.block, currentBlock);
|
|
301
|
+
if (currentBlock.block === block) {
|
|
302
|
+
return currentBlock;
|
|
303
|
+
}
|
|
304
|
+
const { previous } = currentBlock;
|
|
305
|
+
if (isNull(previous)) break;
|
|
306
|
+
currentBlock = await this.chainMap.get(previous);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
throw new Error(`Block not found: ${block}`);
|
|
314
310
|
}
|
|
315
|
-
|
|
316
|
-
|
|
311
|
+
async head() {
|
|
312
|
+
if (isDefined2(this._currentHead)) return this._currentHead;
|
|
313
|
+
if (isDefined2(this.params.head)) {
|
|
314
|
+
const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(this.params.head);
|
|
315
|
+
this._currentHead = newHead;
|
|
316
|
+
return newHead;
|
|
317
|
+
}
|
|
318
|
+
throw new Error("Head is not set");
|
|
317
319
|
}
|
|
318
|
-
|
|
319
|
-
|
|
320
|
+
async next(block) {
|
|
321
|
+
const currentBlock = block;
|
|
322
|
+
const nextBlockNumber = currentBlock + 1;
|
|
323
|
+
return await this.get(nextBlockNumber);
|
|
320
324
|
}
|
|
321
|
-
|
|
322
|
-
|
|
325
|
+
payloadByHash(_hash) {
|
|
326
|
+
throw new Error("Method [payloadByHash] not implemented.");
|
|
323
327
|
}
|
|
324
|
-
|
|
325
|
-
|
|
328
|
+
payloadsByHash(_hashes) {
|
|
329
|
+
throw new Error("Method [payloadsByHash] not implemented.");
|
|
326
330
|
}
|
|
327
|
-
|
|
328
|
-
|
|
331
|
+
// TODO: Decide on inclusive/exclusive (probably need inclusive to account for chain head)
|
|
332
|
+
// and then communicate via method name and documentation
|
|
333
|
+
async previous(block = void 0, count = 1) {
|
|
334
|
+
const results = [];
|
|
335
|
+
let currentBlock = isDefined2(block) ? await this.get(block) : await this.head();
|
|
336
|
+
while (isDefined2(currentBlock) && results.length < count) {
|
|
337
|
+
if (isBlockBoundWitnessWithHashMeta(currentBlock)) {
|
|
338
|
+
results.push(currentBlock);
|
|
339
|
+
const { previous } = currentBlock;
|
|
340
|
+
if (isNull(previous)) break;
|
|
341
|
+
const nextBlock = await this.chainMap.get(previous);
|
|
342
|
+
currentBlock = asBlockBoundWitnessWithStorageMeta(nextBlock);
|
|
343
|
+
} else {
|
|
344
|
+
const hash = PayloadBuilder2.hash(currentBlock);
|
|
345
|
+
assertEx3(asBlockBoundWitnessWithStorageMeta(currentBlock), () => `Expected hash to be a block bound witness [${hash}]`);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return results;
|
|
329
349
|
}
|
|
330
|
-
|
|
331
|
-
|
|
350
|
+
async updateHead(head) {
|
|
351
|
+
const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head);
|
|
352
|
+
this._currentHead = newHead;
|
|
353
|
+
void this.emit("headUpdated", {
|
|
354
|
+
blocks: [
|
|
355
|
+
newHead
|
|
356
|
+
]
|
|
357
|
+
});
|
|
332
358
|
}
|
|
333
|
-
|
|
334
|
-
|
|
359
|
+
async getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head) {
|
|
360
|
+
const hash = await PayloadBuilder2.hash(head);
|
|
361
|
+
const stored = await this.chainMap.get(hash);
|
|
362
|
+
const newHead = asBlockBoundWitnessWithStorageMeta(stored);
|
|
363
|
+
if (isUndefined(newHead)) throw new Error(`Head block not found in archivist [${hash}]`);
|
|
364
|
+
return newHead;
|
|
335
365
|
}
|
|
336
|
-
|
|
337
|
-
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
// src/ChainService/Evm/Evm.ts
|
|
369
|
+
import { assertEx as assertEx4, toAddress, toEthAddress as toEthAddress2 } from "@xylabs/sdk-js";
|
|
370
|
+
import { StakedXyoChain__factory as StakedXyoChainFactory } from "@xyo-network/typechain";
|
|
371
|
+
import { getAddress } from "ethers/address";
|
|
372
|
+
var EvmChainService = class extends BaseService {
|
|
373
|
+
static {
|
|
374
|
+
__name(this, "EvmChainService");
|
|
338
375
|
}
|
|
339
|
-
|
|
340
|
-
return
|
|
376
|
+
async active() {
|
|
377
|
+
return await (await this.contract()).active();
|
|
341
378
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
return {
|
|
345
|
-
...await super.paramsHandler(params),
|
|
346
|
-
...params
|
|
347
|
-
};
|
|
379
|
+
async activeByStaked(staked) {
|
|
380
|
+
return await (await this.contract()).activeByAddressStaked(getAddress(toEthAddress2(staked)));
|
|
348
381
|
}
|
|
349
|
-
async
|
|
350
|
-
|
|
351
|
-
const leadersStart = Date.now();
|
|
352
|
-
const leaders = await this.electionService.getCreatorCommitteeForNextBlock(head);
|
|
353
|
-
const leadersDuration = Date.now() - leadersStart;
|
|
354
|
-
if (leadersDuration > 100) {
|
|
355
|
-
this.logger?.warn(`[Slow] Fetched leaders in ${leadersDuration}ms: ${leaders.map((l) => l.slice(0, 6)).join(", ")}`);
|
|
356
|
-
}
|
|
357
|
-
if (!leaders.includes(this.address)) return;
|
|
358
|
-
return this.proposeNextValidBlock(head);
|
|
382
|
+
async activeByStaker(address) {
|
|
383
|
+
return await (await this.contract()).activeByStaker(getAddress(toEthAddress2(address)));
|
|
359
384
|
}
|
|
360
|
-
async
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
385
|
+
async addStake(staked, amount) {
|
|
386
|
+
const result = await (await this.contract()).addStake(getAddress(toEthAddress2(staked)), amount);
|
|
387
|
+
await result.wait();
|
|
388
|
+
return true;
|
|
389
|
+
}
|
|
390
|
+
chainId() {
|
|
391
|
+
return assertEx4(this.params.id);
|
|
392
|
+
}
|
|
393
|
+
async contract() {
|
|
394
|
+
if (this.params.contract === void 0) {
|
|
395
|
+
this.params.contract = StakedXyoChainFactory.connect(toEthAddress2(await this.chainId()), this.params.runner);
|
|
371
396
|
}
|
|
372
|
-
|
|
373
|
-
const blockId = new PayloadBuilder2({
|
|
374
|
-
schema: BlockNumberSchema
|
|
375
|
-
}).fields({
|
|
376
|
-
block: blockHex
|
|
377
|
-
}).build();
|
|
378
|
-
const rewards = await this._blockRewardDiviner.divine([
|
|
379
|
-
blockId
|
|
380
|
-
]);
|
|
381
|
-
return rewards;
|
|
397
|
+
return assertEx4(this.params.contract);
|
|
382
398
|
}
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
* @param head The current head block
|
|
386
|
-
* @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed
|
|
387
|
-
*/
|
|
388
|
-
async getProducerRedeclaration(head) {
|
|
389
|
-
if (this.params.config.producer.disableIntentRedeclaration) return;
|
|
390
|
-
const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.address, "producer");
|
|
391
|
-
const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1);
|
|
392
|
-
if (!lastRange) return;
|
|
393
|
-
const [, currentDeclarationEnd] = lastRange;
|
|
394
|
-
const currentBlock = head.block;
|
|
395
|
-
const timeToProducerExpiration = currentDeclarationEnd - currentBlock;
|
|
396
|
-
if (timeToProducerExpiration > _BaseBlockProducerService.RedeclarationWindow) return;
|
|
397
|
-
return createDeclarationIntent(this.address, "producer", currentBlock, currentBlock + _BaseBlockProducerService.RedeclarationDuration);
|
|
399
|
+
async forkedAtBlockNumber() {
|
|
400
|
+
return await (await this.contract()).forkedAtBlockNumber();
|
|
398
401
|
}
|
|
399
|
-
async
|
|
400
|
-
return await this.
|
|
401
|
-
const { block: previousBlock } = assertEx4(asBlockBoundWitness(head), () => "Invalid head block");
|
|
402
|
-
const nextBlock = previousBlock + 1;
|
|
403
|
-
const nextBlockTransactionsStart = Date.now();
|
|
404
|
-
const nextBlockTransactions = await this.pendingTransactionsService.getPendingTransactions(head._hash, _BaseBlockProducerService.DefaultBlockSize);
|
|
405
|
-
const nextBlockTransactionsDuration = Date.now() - nextBlockTransactionsStart;
|
|
406
|
-
if (nextBlockTransactionsDuration > 200) {
|
|
407
|
-
this.logger?.warn(`[Slow] Fetched ${nextBlockTransactions.length} pending transactions in ${nextBlockTransactionsDuration}ms}`);
|
|
408
|
-
}
|
|
409
|
-
const blockPayloads = [];
|
|
410
|
-
const producerRedeclarationPayload = await this.getProducerRedeclaration(head);
|
|
411
|
-
if (producerRedeclarationPayload) blockPayloads.push(producerRedeclarationPayload);
|
|
412
|
-
if (blockPayloads.length === 0 && nextBlockTransactions.length === 0 && !this.heartbeatRequired(head)) return;
|
|
413
|
-
const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock);
|
|
414
|
-
blockPayloads.push(...rewardTransferPayloads);
|
|
415
|
-
const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions);
|
|
416
|
-
const timeStart = Date.now();
|
|
417
|
-
const timePayload = await this.generateTimePayload(head);
|
|
418
|
-
const timeDuration = Date.now() - timeStart;
|
|
419
|
-
if (timeDuration > 100) {
|
|
420
|
-
this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`);
|
|
421
|
-
}
|
|
422
|
-
const [fundedNextBlockTransactions, fundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances);
|
|
423
|
-
blockPayloads.push(...fundedTransfers, timePayload);
|
|
424
|
-
this.logger?.info(`Building block ${head.block + 1}`);
|
|
425
|
-
const startBuild = Date.now();
|
|
426
|
-
const stepRewardPoolBalance = (await this.balanceService.accountsBalances([
|
|
427
|
-
XYO_STEP_REWARD_ADDRESS
|
|
428
|
-
]))[XYO_STEP_REWARD_ADDRESS];
|
|
429
|
-
const block = await buildNextBlock(head, fundedNextBlockTransactions, blockPayloads, [
|
|
430
|
-
this.account
|
|
431
|
-
], XYO_STEP_REWARD_ADDRESS, stepRewardPoolBalance);
|
|
432
|
-
this.logger?.info(`Built block ${block[0].block} in ${Date.now() - startBuild}ms with ${block[1].length} payloads`);
|
|
433
|
-
this.logger?.info(`Validating block ${block[0].block} with ${block[1].length} payloads`);
|
|
434
|
-
const startValidate = Date.now();
|
|
435
|
-
const errors = await this.validateHydratedBlockState(block, this.chainId, {
|
|
436
|
-
accountBalance: this.balanceService
|
|
437
|
-
});
|
|
438
|
-
this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`);
|
|
439
|
-
if (errors.length > 0) {
|
|
440
|
-
this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`);
|
|
441
|
-
const rejectedTransactions = block[1];
|
|
442
|
-
await this.rejectedTransactionsArchivist.insert(rejectedTransactions);
|
|
443
|
-
} else {
|
|
444
|
-
return block;
|
|
445
|
-
}
|
|
446
|
-
});
|
|
402
|
+
async forkedAtHash() {
|
|
403
|
+
return await (await this.contract()).forkedAtHash();
|
|
447
404
|
}
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
const fundedTransfers = [];
|
|
451
|
-
const fundedTransactions = (await Promise.all(txs.map(async (tx) => {
|
|
452
|
-
const transfer = transfers.find((transfer2) => transfer2.from === tx[0].from);
|
|
453
|
-
if (!transfer) return;
|
|
454
|
-
const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? "00"), 0n);
|
|
455
|
-
if (validateBalances) {
|
|
456
|
-
const balance = (await this.balanceService.accountsBalances([
|
|
457
|
-
transfer.from
|
|
458
|
-
]))[transfer.from] ?? AttoXL13(0n);
|
|
459
|
-
if (balance >= totalTransferCost) {
|
|
460
|
-
fundedTransfers.push(transfer);
|
|
461
|
-
return tx;
|
|
462
|
-
}
|
|
463
|
-
} else {
|
|
464
|
-
fundedTransfers.push(transfer);
|
|
465
|
-
return tx;
|
|
466
|
-
}
|
|
467
|
-
}))).filter(exists);
|
|
468
|
-
return [
|
|
469
|
-
fundedTransactions,
|
|
470
|
-
fundedTransfers
|
|
471
|
-
];
|
|
405
|
+
async forkedChainId() {
|
|
406
|
+
return toAddress(await (await this.contract()).forkedChainId());
|
|
472
407
|
}
|
|
473
|
-
async
|
|
474
|
-
|
|
475
|
-
const ethereumHash = asHash(ethHashOrNull, () => "No ethereum hash available from time sync service");
|
|
476
|
-
const timePayload = {
|
|
477
|
-
schema: TimeSchema,
|
|
478
|
-
// this is for the previous block
|
|
479
|
-
xl1: head.block,
|
|
480
|
-
// this is for the previous block
|
|
481
|
-
xl1Hash: head._hash,
|
|
482
|
-
ethereum,
|
|
483
|
-
ethereumHash,
|
|
484
|
-
epoch: Date.now()
|
|
485
|
-
};
|
|
486
|
-
return timePayload;
|
|
408
|
+
async minWithdrawalBlocks() {
|
|
409
|
+
return await (await this.contract()).minWithdrawalBlocks();
|
|
487
410
|
}
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
* @param head The current head block
|
|
491
|
-
* @returns True if a heartbeat is required, false otherwise
|
|
492
|
-
*/
|
|
493
|
-
heartbeatRequired(head) {
|
|
494
|
-
const epoch = head.$epoch;
|
|
495
|
-
if (isDefined(epoch)) {
|
|
496
|
-
const { heartbeatInterval } = this.params.config.producer;
|
|
497
|
-
if (Date.now() - epoch > heartbeatInterval) {
|
|
498
|
-
return true;
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
return false;
|
|
411
|
+
async pending() {
|
|
412
|
+
return await (await this.contract()).pending();
|
|
502
413
|
}
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
creatable4()
|
|
506
|
-
], BaseBlockProducerService);
|
|
507
|
-
|
|
508
|
-
// src/BlockReward/BaseBlockRewardService.ts
|
|
509
|
-
import { creatable as creatable5 } from "@xylabs/sdk-js";
|
|
510
|
-
function _ts_decorate5(decorators, target, key, desc) {
|
|
511
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
512
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
513
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
514
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
515
|
-
}
|
|
516
|
-
__name(_ts_decorate5, "_ts_decorate");
|
|
517
|
-
var BaseBlockRewardService = class extends BaseService {
|
|
518
|
-
static {
|
|
519
|
-
__name(this, "BaseBlockRewardService");
|
|
414
|
+
async pendingByStaker(staker) {
|
|
415
|
+
return await (await this.contract()).pendingByStaker(getAddress(toEthAddress2(staker)));
|
|
520
416
|
}
|
|
521
|
-
|
|
522
|
-
|
|
417
|
+
async removeStake(slot) {
|
|
418
|
+
const result = await (await this.contract()).removeStake(slot);
|
|
419
|
+
await result.wait();
|
|
420
|
+
return true;
|
|
523
421
|
}
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
creatable5()
|
|
527
|
-
], BaseBlockRewardService);
|
|
528
|
-
|
|
529
|
-
// src/BlockReward/EvmBlockRewardService.ts
|
|
530
|
-
import { assertEx as assertEx5, creatable as creatable6, toEthAddress } from "@xylabs/sdk-js";
|
|
531
|
-
import { XyoChainRewards__factory as XyoChainRewardsFactory } from "@xyo-network/typechain";
|
|
532
|
-
function _ts_decorate6(decorators, target, key, desc) {
|
|
533
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
534
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
535
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
536
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
537
|
-
}
|
|
538
|
-
__name(_ts_decorate6, "_ts_decorate");
|
|
539
|
-
var EvmBlockRewardService = class extends BaseBlockRewardService {
|
|
540
|
-
static {
|
|
541
|
-
__name(this, "EvmBlockRewardService");
|
|
422
|
+
rewardForBlock(_block) {
|
|
423
|
+
throw new Error("Method not implemented.");
|
|
542
424
|
}
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
return assertEx5(this.params.chainService, () => "chainService is required");
|
|
425
|
+
async rewardsContract() {
|
|
426
|
+
return await (await this.contract()).rewardsContract();
|
|
546
427
|
}
|
|
547
|
-
|
|
548
|
-
return
|
|
428
|
+
async stakingTokenAddress() {
|
|
429
|
+
return await (await this.contract()).stakingTokenAddress();
|
|
549
430
|
}
|
|
550
|
-
|
|
551
|
-
|
|
431
|
+
async withdrawStake(slot) {
|
|
432
|
+
const result = await (await this.contract()).withdrawStake(slot);
|
|
433
|
+
await result.wait();
|
|
434
|
+
return true;
|
|
552
435
|
}
|
|
553
|
-
async
|
|
554
|
-
await
|
|
555
|
-
try {
|
|
556
|
-
this._contractAddress = await this.chainService.rewardsContract();
|
|
557
|
-
} catch (ex) {
|
|
558
|
-
const error = ex;
|
|
559
|
-
throw new Error(`Failed to get rewards contract address: ${error.message}`);
|
|
560
|
-
}
|
|
436
|
+
async withdrawn() {
|
|
437
|
+
return await (await this.contract()).withdrawn();
|
|
561
438
|
}
|
|
562
|
-
async
|
|
563
|
-
|
|
564
|
-
return await contract.calcBlockReward(blockNumber);
|
|
439
|
+
async withdrawnByStaker(staker) {
|
|
440
|
+
return await (await this.contract()).withdrawnByStaker(getAddress(staker));
|
|
565
441
|
}
|
|
566
442
|
};
|
|
567
|
-
EvmBlockRewardService = _ts_decorate6([
|
|
568
|
-
creatable6()
|
|
569
|
-
], EvmBlockRewardService);
|
|
570
443
|
|
|
571
|
-
// src/
|
|
572
|
-
import { assertEx as
|
|
573
|
-
|
|
574
|
-
function _ts_decorate7(decorators, target, key, desc) {
|
|
575
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
576
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
577
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
578
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
579
|
-
}
|
|
580
|
-
__name(_ts_decorate7, "_ts_decorate");
|
|
581
|
-
var MemoryBlockRewardService = class extends BaseBlockRewardService {
|
|
444
|
+
// src/ChainService/Memory/Memory.ts
|
|
445
|
+
import { assertEx as assertEx5, toAddress as toAddress2, ZERO_ADDRESS } from "@xylabs/sdk-js";
|
|
446
|
+
var MemoryChainService = class extends BaseService {
|
|
582
447
|
static {
|
|
583
|
-
__name(this, "
|
|
448
|
+
__name(this, "MemoryChainService");
|
|
584
449
|
}
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
450
|
+
_chainId;
|
|
451
|
+
_simulatedStake = 1n;
|
|
452
|
+
async active() {
|
|
453
|
+
return await Promise.resolve(this._simulatedStake);
|
|
588
454
|
}
|
|
589
|
-
|
|
590
|
-
return
|
|
455
|
+
async activeByStaked(_staked) {
|
|
456
|
+
return await Promise.resolve(this._simulatedStake);
|
|
591
457
|
}
|
|
592
|
-
|
|
593
|
-
return
|
|
458
|
+
async activeByStaker(_address) {
|
|
459
|
+
return await Promise.resolve(this._simulatedStake);
|
|
594
460
|
}
|
|
595
|
-
|
|
596
|
-
return
|
|
461
|
+
async addStake(_staked, _amount) {
|
|
462
|
+
return await Promise.resolve(true);
|
|
597
463
|
}
|
|
598
|
-
|
|
599
|
-
return
|
|
600
|
-
}
|
|
601
|
-
get stepSize() {
|
|
602
|
-
return assertEx6(this.params.stepSize, () => "stepSize is required");
|
|
603
|
-
}
|
|
604
|
-
static async paramsHandler(inParams) {
|
|
605
|
-
return {
|
|
606
|
-
...await super.paramsHandler(inParams),
|
|
607
|
-
creatorReward: inParams?.creatorReward ?? toFixedPoint(20000000000n),
|
|
608
|
-
initialStepReward: inParams?.initialStepReward ?? toFixedPoint(3000n),
|
|
609
|
-
minRewardPerBlock: inParams?.minRewardPerBlock ?? toFixedPoint(30n),
|
|
610
|
-
stepFactorDenominator: inParams?.stepFactorDenominator ?? 100n,
|
|
611
|
-
stepFactorNumerator: inParams?.stepFactorNumerator ?? 90n,
|
|
612
|
-
stepSize: inParams?.stepSize ?? 1000000n
|
|
613
|
-
};
|
|
614
|
-
}
|
|
615
|
-
getRewardForBlock(blockNumber) {
|
|
616
|
-
return this.rewardFromBlockNumber(blockNumber, this.initialReward, this.stepSize, this.stepFactorNumerator, this.stepFactorDenominator, this.minRewardPerBlock, this.creatorReward);
|
|
617
|
-
}
|
|
618
|
-
};
|
|
619
|
-
MemoryBlockRewardService = _ts_decorate7([
|
|
620
|
-
creatable7()
|
|
621
|
-
], MemoryBlockRewardService);
|
|
622
|
-
|
|
623
|
-
// src/blockViewerFromChainIteratorAndArchivist.ts
|
|
624
|
-
import { isDefined as isDefined2 } from "@xylabs/sdk-js";
|
|
625
|
-
import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
|
|
626
|
-
import { asSignedBlockBoundWitness, asSignedBlockBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
|
|
627
|
-
function blockViewerFromChainIteratorAndArchivist(chainIterator, chainArchivist) {
|
|
628
|
-
const result = {
|
|
629
|
-
blockByHash: /* @__PURE__ */ __name(async function(hash) {
|
|
630
|
-
const [payload] = await chainArchivist.get([
|
|
631
|
-
hash
|
|
632
|
-
]);
|
|
633
|
-
const block = asSignedBlockBoundWitnessWithStorageMeta(payload);
|
|
634
|
-
if (isDefined2(block)) {
|
|
635
|
-
const payloads = await chainArchivist.get(block.payload_hashes);
|
|
636
|
-
return [
|
|
637
|
-
block,
|
|
638
|
-
payloads
|
|
639
|
-
];
|
|
640
|
-
}
|
|
641
|
-
return null;
|
|
642
|
-
}, "blockByHash"),
|
|
643
|
-
blockByNumber: /* @__PURE__ */ __name(async function(blockNumber) {
|
|
644
|
-
const payload = asSignedBlockBoundWitness(await chainIterator.get(blockNumber));
|
|
645
|
-
const block = payload ? await PayloadBuilder3.addHashMeta(payload) : void 0;
|
|
646
|
-
if (isDefined2(block)) {
|
|
647
|
-
const payloads = await chainArchivist.get(block.payload_hashes);
|
|
648
|
-
return [
|
|
649
|
-
block,
|
|
650
|
-
payloads
|
|
651
|
-
];
|
|
652
|
-
}
|
|
653
|
-
return null;
|
|
654
|
-
}, "blockByNumber"),
|
|
655
|
-
blocksByHash: /* @__PURE__ */ __name(async function(hash, limit = 10) {
|
|
656
|
-
const results = [];
|
|
657
|
-
for (let i = 0; i < limit; i++) {
|
|
658
|
-
const block = await this.blockByHash(hash);
|
|
659
|
-
if (block) {
|
|
660
|
-
results.push(block);
|
|
661
|
-
} else {
|
|
662
|
-
break;
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
return results;
|
|
666
|
-
}, "blocksByHash"),
|
|
667
|
-
currentBlock: /* @__PURE__ */ __name(async function() {
|
|
668
|
-
const head = await chainIterator.head();
|
|
669
|
-
return this.blockByHash(head._hash);
|
|
670
|
-
}, "currentBlock"),
|
|
671
|
-
currentBlockHash: /* @__PURE__ */ __name(async function() {
|
|
672
|
-
const head = await chainIterator.head();
|
|
673
|
-
return head._hash;
|
|
674
|
-
}, "currentBlockHash"),
|
|
675
|
-
currentBlockNumber: /* @__PURE__ */ __name(async function() {
|
|
676
|
-
const head = await chainIterator.head();
|
|
677
|
-
return head.block;
|
|
678
|
-
}, "currentBlockNumber")
|
|
679
|
-
};
|
|
680
|
-
return result;
|
|
681
|
-
}
|
|
682
|
-
__name(blockViewerFromChainIteratorAndArchivist, "blockViewerFromChainIteratorAndArchivist");
|
|
683
|
-
|
|
684
|
-
// src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts
|
|
685
|
-
import { assertEx as assertEx7, isDefined as isDefined3, isNull, isUndefined } from "@xylabs/sdk-js";
|
|
686
|
-
import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
|
|
687
|
-
import { asBlockBoundWitness as asBlockBoundWitness2, asBlockBoundWitnessWithStorageMeta, isBlockBoundWitnessWithHashMeta } from "@xyo-network/xl1-protocol";
|
|
688
|
-
import { LRUCache } from "lru-cache";
|
|
689
|
-
var ChainBlockNumberIterationService = class extends BaseService {
|
|
690
|
-
static {
|
|
691
|
-
__name(this, "ChainBlockNumberIterationService");
|
|
692
|
-
}
|
|
693
|
-
_blocksByBlockNumber = new LRUCache({
|
|
694
|
-
max: 1e4
|
|
695
|
-
});
|
|
696
|
-
_currentHead;
|
|
697
|
-
get chainId() {
|
|
698
|
-
return assertEx7(this._currentHead?.chain ?? this.params?.head?.chain, () => "Current head is not set");
|
|
699
|
-
}
|
|
700
|
-
get chainMap() {
|
|
701
|
-
return assertEx7(this.params.chainMap);
|
|
702
|
-
}
|
|
703
|
-
async get(block) {
|
|
704
|
-
const head = await this.head();
|
|
705
|
-
assertEx7(head.block >= block, () => `Block requested is newer than the current head [${block}]`);
|
|
706
|
-
const cached = this._blocksByBlockNumber.get(block);
|
|
707
|
-
if (cached) return cached;
|
|
708
|
-
const startingBlock = head;
|
|
709
|
-
const currentBlockHash = await PayloadBuilder4.hash(startingBlock);
|
|
710
|
-
let currentBlock = await this.chainMap.get(currentBlockHash);
|
|
711
|
-
while (isDefined3(currentBlock)) {
|
|
712
|
-
assertEx7(asBlockBoundWitness2(currentBlock), () => `Expected hash to be a block bound witness [${currentBlock?._hash}]`);
|
|
713
|
-
if (isBlockBoundWitnessWithHashMeta(currentBlock)) {
|
|
714
|
-
this._blocksByBlockNumber.set(currentBlock.block, currentBlock);
|
|
715
|
-
if (currentBlock.block === block) {
|
|
716
|
-
return currentBlock;
|
|
717
|
-
}
|
|
718
|
-
const { previous } = currentBlock;
|
|
719
|
-
if (isNull(previous)) break;
|
|
720
|
-
currentBlock = await this.chainMap.get(previous);
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
throw new Error(`Block not found: ${block}`);
|
|
724
|
-
}
|
|
725
|
-
async head() {
|
|
726
|
-
if (isDefined3(this._currentHead)) return this._currentHead;
|
|
727
|
-
if (isDefined3(this.params.head)) {
|
|
728
|
-
const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(this.params.head);
|
|
729
|
-
this._currentHead = newHead;
|
|
730
|
-
return newHead;
|
|
731
|
-
}
|
|
732
|
-
throw new Error("Head is not set");
|
|
733
|
-
}
|
|
734
|
-
async next(block) {
|
|
735
|
-
const currentBlock = block;
|
|
736
|
-
const nextBlockNumber = currentBlock + 1;
|
|
737
|
-
return await this.get(nextBlockNumber);
|
|
738
|
-
}
|
|
739
|
-
// TODO: Decide on inclusive/exclusive (probably need inclusive to account for chain head)
|
|
740
|
-
// and then communicate via method name and documentation
|
|
741
|
-
async previous(block = void 0, count = 1) {
|
|
742
|
-
const results = [];
|
|
743
|
-
let currentBlock = isDefined3(block) ? await this.get(block) : await this.head();
|
|
744
|
-
while (isDefined3(currentBlock) && results.length < count) {
|
|
745
|
-
if (isBlockBoundWitnessWithHashMeta(currentBlock)) {
|
|
746
|
-
results.push(currentBlock);
|
|
747
|
-
const { previous } = currentBlock;
|
|
748
|
-
if (isNull(previous)) break;
|
|
749
|
-
const nextBlock = await this.chainMap.get(previous);
|
|
750
|
-
currentBlock = asBlockBoundWitnessWithStorageMeta(nextBlock);
|
|
751
|
-
} else {
|
|
752
|
-
const hash = PayloadBuilder4.hash(currentBlock);
|
|
753
|
-
assertEx7(asBlockBoundWitnessWithStorageMeta(currentBlock), () => `Expected hash to be a block bound witness [${hash}]`);
|
|
754
|
-
}
|
|
755
|
-
}
|
|
756
|
-
return results;
|
|
757
|
-
}
|
|
758
|
-
async updateHead(head) {
|
|
759
|
-
const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head);
|
|
760
|
-
this._currentHead = newHead;
|
|
761
|
-
void this.emit("headUpdated", {
|
|
762
|
-
blocks: [
|
|
763
|
-
newHead
|
|
764
|
-
]
|
|
765
|
-
});
|
|
766
|
-
}
|
|
767
|
-
async getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head) {
|
|
768
|
-
const hash = await PayloadBuilder4.hash(head);
|
|
769
|
-
const stored = await this.chainMap.get(hash);
|
|
770
|
-
const newHead = asBlockBoundWitnessWithStorageMeta(stored);
|
|
771
|
-
if (isUndefined(newHead)) throw new Error(`Head block not found in archivist [${hash}]`);
|
|
772
|
-
return newHead;
|
|
773
|
-
}
|
|
774
|
-
};
|
|
775
|
-
|
|
776
|
-
// src/ChainService/Evm/Evm.ts
|
|
777
|
-
import { assertEx as assertEx8, toAddress, toEthAddress as toEthAddress2 } from "@xylabs/sdk-js";
|
|
778
|
-
import { StakedXyoChain__factory as StakedXyoChainFactory } from "@xyo-network/typechain";
|
|
779
|
-
import { getAddress } from "ethers/address";
|
|
780
|
-
var EvmChainService = class extends BaseService {
|
|
781
|
-
static {
|
|
782
|
-
__name(this, "EvmChainService");
|
|
783
|
-
}
|
|
784
|
-
get chainId() {
|
|
785
|
-
return assertEx8(this.params.id);
|
|
786
|
-
}
|
|
787
|
-
get contract() {
|
|
788
|
-
if (this.params.contract === void 0) {
|
|
789
|
-
this.params.contract = StakedXyoChainFactory.connect(toEthAddress2(this.chainId), this.params.runner);
|
|
790
|
-
}
|
|
791
|
-
return assertEx8(this.params.contract);
|
|
792
|
-
}
|
|
793
|
-
get runner() {
|
|
794
|
-
return assertEx8(this.params.runner);
|
|
795
|
-
}
|
|
796
|
-
async active() {
|
|
797
|
-
return await this.contract.active();
|
|
798
|
-
}
|
|
799
|
-
async activeByStaked(staked) {
|
|
800
|
-
return await this.contract.activeByAddressStaked(getAddress(toEthAddress2(staked)));
|
|
801
|
-
}
|
|
802
|
-
async activeByStaker(address) {
|
|
803
|
-
return await this.contract.activeByStaker(getAddress(toEthAddress2(address)));
|
|
804
|
-
}
|
|
805
|
-
async addStake(staked, amount) {
|
|
806
|
-
const result = await this.contract.addStake(getAddress(toEthAddress2(staked)), amount);
|
|
807
|
-
await result.wait();
|
|
808
|
-
return true;
|
|
809
|
-
}
|
|
810
|
-
async forkedAtBlockNumber() {
|
|
811
|
-
return await this.contract.forkedAtBlockNumber();
|
|
812
|
-
}
|
|
813
|
-
async forkedAtHash() {
|
|
814
|
-
return await this.contract.forkedAtHash();
|
|
815
|
-
}
|
|
816
|
-
async forkedChainId() {
|
|
817
|
-
return toAddress(await this.contract.forkedChainId());
|
|
818
|
-
}
|
|
819
|
-
async minWithdrawalBlocks() {
|
|
820
|
-
return await this.contract.minWithdrawalBlocks();
|
|
821
|
-
}
|
|
822
|
-
async pending() {
|
|
823
|
-
return await this.contract.pending();
|
|
824
|
-
}
|
|
825
|
-
async pendingByStaker(staker) {
|
|
826
|
-
return await this.contract.pendingByStaker(getAddress(toEthAddress2(staker)));
|
|
827
|
-
}
|
|
828
|
-
async removeStake(slot) {
|
|
829
|
-
const result = await this.contract.removeStake(slot);
|
|
830
|
-
await result.wait();
|
|
831
|
-
return true;
|
|
832
|
-
}
|
|
833
|
-
async rewardsContract() {
|
|
834
|
-
return await this.contract.rewardsContract();
|
|
835
|
-
}
|
|
836
|
-
async stakingTokenAddress() {
|
|
837
|
-
return await this.contract.stakingTokenAddress();
|
|
838
|
-
}
|
|
839
|
-
async withdrawStake(slot) {
|
|
840
|
-
const result = await this.contract.withdrawStake(slot);
|
|
841
|
-
await result.wait();
|
|
842
|
-
return true;
|
|
843
|
-
}
|
|
844
|
-
async withdrawn() {
|
|
845
|
-
return await this.contract.withdrawn();
|
|
846
|
-
}
|
|
847
|
-
async withdrawnByStaker(staker) {
|
|
848
|
-
return await this.contract.withdrawnByStaker(getAddress(staker));
|
|
849
|
-
}
|
|
850
|
-
};
|
|
851
|
-
|
|
852
|
-
// src/ChainService/Memory/Memory.ts
|
|
853
|
-
import { assertEx as assertEx9, toAddress as toAddress2, ZERO_ADDRESS } from "@xylabs/sdk-js";
|
|
854
|
-
var MemoryChainService = class extends BaseService {
|
|
855
|
-
static {
|
|
856
|
-
__name(this, "MemoryChainService");
|
|
857
|
-
}
|
|
858
|
-
_chainId;
|
|
859
|
-
_simulatedStake = 1n;
|
|
860
|
-
get chainId() {
|
|
861
|
-
return assertEx9(this._chainId, () => "Chain ID not set");
|
|
862
|
-
}
|
|
863
|
-
async active() {
|
|
864
|
-
return await Promise.resolve(this._simulatedStake);
|
|
865
|
-
}
|
|
866
|
-
async activeByStaked(_staked) {
|
|
867
|
-
return await Promise.resolve(this._simulatedStake);
|
|
868
|
-
}
|
|
869
|
-
async activeByStaker(_address) {
|
|
870
|
-
return await Promise.resolve(this._simulatedStake);
|
|
871
|
-
}
|
|
872
|
-
async addStake(_staked, _amount) {
|
|
873
|
-
return await Promise.resolve(true);
|
|
464
|
+
chainId() {
|
|
465
|
+
return assertEx5(this._chainId, () => "Chain ID not set");
|
|
874
466
|
}
|
|
875
467
|
createHandler() {
|
|
876
468
|
const { minStake = 1 } = this.params.config.producer ?? {};
|
|
@@ -897,6 +489,9 @@ var MemoryChainService = class extends BaseService {
|
|
|
897
489
|
async removeStake(_slot) {
|
|
898
490
|
return await Promise.resolve(true);
|
|
899
491
|
}
|
|
492
|
+
rewardForBlock(_block) {
|
|
493
|
+
throw new Error("Method not implemented.");
|
|
494
|
+
}
|
|
900
495
|
async rewardsContract() {
|
|
901
496
|
return await Promise.resolve("");
|
|
902
497
|
}
|
|
@@ -919,77 +514,75 @@ var MemoryChainService = class extends BaseService {
|
|
|
919
514
|
};
|
|
920
515
|
|
|
921
516
|
// src/ChainValidator/XyoValidator.ts
|
|
922
|
-
import { assertEx as
|
|
923
|
-
function
|
|
517
|
+
import { assertEx as assertEx6, creatable as creatable3 } from "@xylabs/sdk-js";
|
|
518
|
+
function _ts_decorate3(decorators, target, key, desc) {
|
|
924
519
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
925
520
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
926
521
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
927
522
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
928
523
|
}
|
|
929
|
-
__name(
|
|
524
|
+
__name(_ts_decorate3, "_ts_decorate");
|
|
930
525
|
var XyoValidator = class extends BaseService {
|
|
931
526
|
static {
|
|
932
527
|
__name(this, "XyoValidator");
|
|
933
528
|
}
|
|
934
|
-
get address() {
|
|
935
|
-
|
|
936
|
-
}
|
|
937
|
-
get account() {
|
|
938
|
-
|
|
939
|
-
}
|
|
940
|
-
get
|
|
941
|
-
return
|
|
942
|
-
}
|
|
943
|
-
get chainInfo() {
|
|
944
|
-
|
|
945
|
-
}
|
|
946
|
-
get electionService() {
|
|
947
|
-
|
|
948
|
-
}
|
|
949
|
-
get pendingBundledTransactionsArchivist() {
|
|
950
|
-
|
|
951
|
-
}
|
|
952
|
-
get
|
|
953
|
-
|
|
954
|
-
}
|
|
529
|
+
// get address() {
|
|
530
|
+
// return this.account.address
|
|
531
|
+
// }
|
|
532
|
+
// protected get account() {
|
|
533
|
+
// return assertEx(this.params.account, () => 'account is required')
|
|
534
|
+
// }
|
|
535
|
+
get blockViewer() {
|
|
536
|
+
return assertEx6(this.params.blockViewer, () => "blockViewer is required");
|
|
537
|
+
}
|
|
538
|
+
// protected get chainInfo() {
|
|
539
|
+
// return assertEx(this.params.chainId, () => 'chainInfo is required')
|
|
540
|
+
// }
|
|
541
|
+
// protected get electionService() {
|
|
542
|
+
// return assertEx(this.params.electionService, () => 'electionService is required')
|
|
543
|
+
// }
|
|
544
|
+
// protected get pendingBundledTransactionsArchivist() {
|
|
545
|
+
// return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'pendingBundledTransactions is required')
|
|
546
|
+
// }
|
|
547
|
+
// protected get blockRewardService() {
|
|
548
|
+
// return assertEx(this.params.blockRewardService, () => 'blockRewardService is required')
|
|
549
|
+
// }
|
|
955
550
|
validatePendingBlock(_block) {
|
|
956
551
|
return [];
|
|
957
552
|
}
|
|
958
553
|
// TODO: Move to validator and inherit this class from validator
|
|
959
554
|
async validatePendingTransaction(hydratedTransaction) {
|
|
960
555
|
const [tx] = hydratedTransaction;
|
|
961
|
-
if (
|
|
962
|
-
tx._hash
|
|
963
|
-
])).length > 0) return false;
|
|
556
|
+
if (await this.blockViewer.blockByHash(tx._hash) !== void 0) return false;
|
|
964
557
|
return await Promise.resolve(true);
|
|
965
558
|
}
|
|
966
559
|
};
|
|
967
|
-
XyoValidator =
|
|
968
|
-
|
|
560
|
+
XyoValidator = _ts_decorate3([
|
|
561
|
+
creatable3()
|
|
969
562
|
], XyoValidator);
|
|
970
563
|
|
|
971
564
|
// src/Election/BaseElectionService.ts
|
|
972
|
-
import { assertEx as
|
|
565
|
+
import { assertEx as assertEx7, creatable as creatable4 } from "@xylabs/sdk-js";
|
|
973
566
|
import { hexToLast4BytesInt, shuffleWithSeed } from "@xyo-network/chain-utils";
|
|
974
|
-
function
|
|
567
|
+
function _ts_decorate4(decorators, target, key, desc) {
|
|
975
568
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
976
569
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
977
570
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
978
571
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
979
572
|
}
|
|
980
|
-
__name(
|
|
573
|
+
__name(_ts_decorate4, "_ts_decorate");
|
|
981
574
|
var BaseElectionService = class extends BaseService {
|
|
982
575
|
static {
|
|
983
576
|
__name(this, "BaseElectionService");
|
|
984
577
|
}
|
|
985
|
-
get
|
|
986
|
-
return
|
|
578
|
+
get blockViewer() {
|
|
579
|
+
return assertEx7(this.params.blockViewer, () => "No block viewer");
|
|
987
580
|
}
|
|
988
581
|
get chainStakeViewer() {
|
|
989
|
-
return
|
|
582
|
+
return assertEx7(this.params.chainStakeViewer, () => "No chain stake viewer");
|
|
990
583
|
}
|
|
991
584
|
get stakeIntentService() {
|
|
992
|
-
return
|
|
585
|
+
return assertEx7(this.params.stakeIntentService, () => "No staked intent service");
|
|
993
586
|
}
|
|
994
587
|
async getCreatorCommitteeForNextBlock(current) {
|
|
995
588
|
return await this.spanAsync("getCreatorCommitteeForNextBlock", async () => {
|
|
@@ -1006,96 +599,490 @@ var BaseElectionService = class extends BaseService {
|
|
|
1006
599
|
return creatorArray.slice(0, maxSize);
|
|
1007
600
|
}
|
|
1008
601
|
};
|
|
1009
|
-
BaseElectionService =
|
|
1010
|
-
|
|
602
|
+
BaseElectionService = _ts_decorate4([
|
|
603
|
+
creatable4()
|
|
1011
604
|
], BaseElectionService);
|
|
1012
605
|
|
|
1013
|
-
// src/
|
|
1014
|
-
import {
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
606
|
+
// src/implementation/accountBalance.ts
|
|
607
|
+
import { isDefined as isDefined3 } from "@xylabs/sdk-js";
|
|
608
|
+
import { AccountBalanceViewerRpcSchemas, HttpRpcTransport, JsonRpcAccountBalanceViewer } from "@xyo-network/xl1-rpc";
|
|
609
|
+
var balanceServiceSingleton;
|
|
610
|
+
var initAccountBalanceService = /* @__PURE__ */ __name((params) => {
|
|
611
|
+
const { config, logger } = params;
|
|
612
|
+
if (balanceServiceSingleton) return balanceServiceSingleton;
|
|
613
|
+
const endpoint = config.services?.accountBalanceViewerEndpoint ?? config.services?.apiEndpoint;
|
|
614
|
+
if (isDefined3(endpoint)) {
|
|
615
|
+
const transport = new HttpRpcTransport(endpoint, {
|
|
616
|
+
...AccountBalanceViewerRpcSchemas
|
|
617
|
+
});
|
|
618
|
+
const viewer = new JsonRpcAccountBalanceViewer(transport);
|
|
619
|
+
logger?.log("Using AccountBalanceViewer RPC service at", endpoint);
|
|
620
|
+
return viewer;
|
|
621
|
+
} else {
|
|
622
|
+
throw new Error("No AccountBalanceViewer endpoint configured");
|
|
1025
623
|
}
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
}
|
|
1044
|
-
|
|
1045
|
-
throw new Error("Method not implemented.");
|
|
1046
|
-
}
|
|
1047
|
-
networkStakeStepRewardPoolRewards(_context) {
|
|
1048
|
-
throw new Error("Method not implemented.");
|
|
1049
|
-
}
|
|
1050
|
-
networkStakeStepRewardPoolShares(_context) {
|
|
1051
|
-
throw new Error("Method not implemented.");
|
|
1052
|
-
}
|
|
1053
|
-
networkStakeStepRewardPositionWeight(_context, _position) {
|
|
1054
|
-
throw new Error("Method not implemented.");
|
|
1055
|
-
}
|
|
1056
|
-
networkStakeStepRewardPotentialPositionLoss(_context, _position) {
|
|
1057
|
-
throw new Error("Method not implemented.");
|
|
1058
|
-
}
|
|
1059
|
-
networkStakeStepRewardRandomizer(_context) {
|
|
1060
|
-
throw new Error("Method not implemented.");
|
|
1061
|
-
}
|
|
1062
|
-
networkStakeStepRewardStakerCount(_context) {
|
|
1063
|
-
throw new Error("Method not implemented.");
|
|
1064
|
-
}
|
|
1065
|
-
networkStakeStepRewardUnclaimedByAddress(_address) {
|
|
1066
|
-
throw new Error("Method not implemented.");
|
|
624
|
+
}, "initAccountBalanceService");
|
|
625
|
+
|
|
626
|
+
// src/implementation/blockViewer.ts
|
|
627
|
+
import { isDefined as isDefined4 } from "@xylabs/sdk-js";
|
|
628
|
+
import { BlockViewerRpcSchemas, HttpRpcTransport as HttpRpcTransport2, JsonRpcBlockViewer } from "@xyo-network/xl1-rpc";
|
|
629
|
+
var blockViewerSingleton;
|
|
630
|
+
var initBlockViewer = /* @__PURE__ */ __name((params) => {
|
|
631
|
+
const { config, logger } = params;
|
|
632
|
+
if (blockViewerSingleton) return blockViewerSingleton;
|
|
633
|
+
const endpoint = config.services?.apiEndpoint;
|
|
634
|
+
if (isDefined4(endpoint)) {
|
|
635
|
+
const transport = new HttpRpcTransport2(endpoint, {
|
|
636
|
+
...BlockViewerRpcSchemas
|
|
637
|
+
});
|
|
638
|
+
const viewer = new JsonRpcBlockViewer(transport);
|
|
639
|
+
logger?.log("Using BlockViewer RPC service at", endpoint);
|
|
640
|
+
return viewer;
|
|
641
|
+
} else {
|
|
642
|
+
throw new Error("No BlockViewer endpoint configured");
|
|
1067
643
|
}
|
|
1068
|
-
|
|
1069
|
-
|
|
644
|
+
}, "initBlockViewer");
|
|
645
|
+
|
|
646
|
+
// src/implementation/chain/index.ts
|
|
647
|
+
import { assertEx as assertEx13 } from "@xylabs/sdk-js";
|
|
648
|
+
|
|
649
|
+
// src/implementation/chain/evm.ts
|
|
650
|
+
import { asAddress, assertEx as assertEx12, isDefined as isDefined8, ZERO_ADDRESS as ZERO_ADDRESS2 } from "@xylabs/sdk-js";
|
|
651
|
+
import { Wallet } from "ethers/wallet";
|
|
652
|
+
|
|
653
|
+
// src/implementation/evm/initEvmProvider.ts
|
|
654
|
+
import { assertEx as assertEx11 } from "@xylabs/sdk-js";
|
|
655
|
+
|
|
656
|
+
// src/implementation/evm/initInfuraProvider.ts
|
|
657
|
+
import { assertEx as assertEx9, isDefined as isDefined6 } from "@xylabs/sdk-js";
|
|
658
|
+
import { InfuraProvider } from "ethers/providers";
|
|
659
|
+
|
|
660
|
+
// src/implementation/evm/initChainId.ts
|
|
661
|
+
import { assertEx as assertEx8, hexFrom, isDefined as isDefined5, isHex } from "@xylabs/sdk-js";
|
|
662
|
+
var canUseChainId = /* @__PURE__ */ __name((config) => {
|
|
663
|
+
return isDefined5(config.evm.chainId);
|
|
664
|
+
}, "canUseChainId");
|
|
665
|
+
var getChainId = /* @__PURE__ */ __name((config) => {
|
|
666
|
+
const chainId = assertEx8(config.evm.chainId, () => "Missing config.evm.chainId");
|
|
667
|
+
if (isHex(chainId, {
|
|
668
|
+
prefix: true
|
|
669
|
+
})) {
|
|
670
|
+
const hex = hexFrom(chainId);
|
|
671
|
+
const parsed = Number.parseInt(hex, 16);
|
|
672
|
+
return parsed;
|
|
673
|
+
} else {
|
|
674
|
+
const parsed = Number.parseInt(chainId, 10);
|
|
675
|
+
return parsed;
|
|
676
|
+
}
|
|
677
|
+
}, "getChainId");
|
|
678
|
+
|
|
679
|
+
// src/implementation/evm/initInfuraProvider.ts
|
|
680
|
+
var instance;
|
|
681
|
+
var initInfuraProvider = /* @__PURE__ */ __name((config) => {
|
|
682
|
+
if (instance) return instance;
|
|
683
|
+
const providerConfig = getInfuraProviderConfig(config);
|
|
684
|
+
instance = Promise.resolve(new InfuraProvider(...providerConfig));
|
|
685
|
+
return instance;
|
|
686
|
+
}, "initInfuraProvider");
|
|
687
|
+
var canUseInfuraProvider = /* @__PURE__ */ __name((config) => {
|
|
688
|
+
return canUseChainId(config) && isDefined6(config.evm?.infura?.projectId) && isDefined6(config.evm?.infura?.projectSecret);
|
|
689
|
+
}, "canUseInfuraProvider");
|
|
690
|
+
var getInfuraProviderConfig = /* @__PURE__ */ __name((config) => {
|
|
691
|
+
const projectId = assertEx9(config.evm?.infura?.projectId, () => "Missing config.evm.infura.projectId");
|
|
692
|
+
const projectSecret = assertEx9(config.evm?.infura?.projectSecret, () => "Missing config.evm.infura.projectSecret");
|
|
693
|
+
return [
|
|
694
|
+
getChainId(config),
|
|
695
|
+
projectId,
|
|
696
|
+
projectSecret
|
|
697
|
+
];
|
|
698
|
+
}, "getInfuraProviderConfig");
|
|
699
|
+
|
|
700
|
+
// src/implementation/evm/initJsonRpcProvider.ts
|
|
701
|
+
import { assertEx as assertEx10, isDefined as isDefined7 } from "@xylabs/sdk-js";
|
|
702
|
+
import { JsonRpcProvider } from "ethers/providers";
|
|
703
|
+
var initJsonRpcProvider = /* @__PURE__ */ __name((config) => {
|
|
704
|
+
const providerConfig = getJsonRpcProviderConfig(config);
|
|
705
|
+
return Promise.resolve(new JsonRpcProvider(...providerConfig));
|
|
706
|
+
}, "initJsonRpcProvider");
|
|
707
|
+
var canUseJsonRpcProvider = /* @__PURE__ */ __name((config) => {
|
|
708
|
+
return canUseChainId(config) && isDefined7(config.evm.jsonRpc?.url);
|
|
709
|
+
}, "canUseJsonRpcProvider");
|
|
710
|
+
var getJsonRpcProviderConfig = /* @__PURE__ */ __name((config) => {
|
|
711
|
+
const jsonRpcUrl = assertEx10(config.evm.jsonRpc?.url, () => "Missing config.evm.jsonRpc.url");
|
|
712
|
+
return [
|
|
713
|
+
jsonRpcUrl,
|
|
714
|
+
getChainId(config)
|
|
715
|
+
];
|
|
716
|
+
}, "getJsonRpcProviderConfig");
|
|
717
|
+
|
|
718
|
+
// src/implementation/evm/initEvmProvider.ts
|
|
719
|
+
var provider;
|
|
720
|
+
var initEvmProvider = /* @__PURE__ */ __name(async ({ config }) => {
|
|
721
|
+
if (provider) return provider;
|
|
722
|
+
if (canUseInfuraProvider(config)) {
|
|
723
|
+
provider = initInfuraProvider(config);
|
|
724
|
+
} else if (canUseJsonRpcProvider(config)) {
|
|
725
|
+
provider = initJsonRpcProvider(config);
|
|
726
|
+
}
|
|
727
|
+
return assertEx11(await provider, () => "No provider available");
|
|
728
|
+
}, "initEvmProvider");
|
|
729
|
+
var canUseEvmProvider = /* @__PURE__ */ __name(({ config }) => {
|
|
730
|
+
return canUseInfuraProvider(config) || canUseJsonRpcProvider(config);
|
|
731
|
+
}, "canUseEvmProvider");
|
|
732
|
+
|
|
733
|
+
// src/implementation/chain/evm.ts
|
|
734
|
+
var chainStakeServiceSingleton;
|
|
735
|
+
var canUseEvmContractChainService = /* @__PURE__ */ __name((config) => {
|
|
736
|
+
const { id } = config.chain;
|
|
737
|
+
return isDefined8(id) && id !== ZERO_ADDRESS2 && canUseEvmProvider({
|
|
738
|
+
config
|
|
739
|
+
});
|
|
740
|
+
}, "canUseEvmContractChainService");
|
|
741
|
+
var initEvmContractChainService = /* @__PURE__ */ __name(async ({ account, config, traceProvider, meterProvider, logger }) => {
|
|
742
|
+
if (chainStakeServiceSingleton) return chainStakeServiceSingleton;
|
|
743
|
+
const emvStakingContractAddress = assertEx12(config.chain.id, () => "config.chain.id is required");
|
|
744
|
+
const id = assertEx12(asAddress(emvStakingContractAddress), () => "config.chain.id is not a valid address");
|
|
745
|
+
const provider2 = assertEx12(await initEvmProvider({
|
|
746
|
+
config
|
|
747
|
+
}));
|
|
748
|
+
const privateKey = assertEx12(account.private?.hex, () => "Account does not have a private key");
|
|
749
|
+
const runner = new Wallet(privateKey, provider2);
|
|
750
|
+
chainStakeServiceSingleton = EvmChainService.create({
|
|
751
|
+
id,
|
|
752
|
+
runner,
|
|
753
|
+
traceProvider,
|
|
754
|
+
meterProvider,
|
|
755
|
+
logger
|
|
756
|
+
});
|
|
757
|
+
const result = await chainStakeServiceSingleton;
|
|
758
|
+
await result.start();
|
|
759
|
+
return result;
|
|
760
|
+
}, "initEvmContractChainService");
|
|
761
|
+
|
|
762
|
+
// src/implementation/chain/index.ts
|
|
763
|
+
var chainStakeServiceSingleton2;
|
|
764
|
+
var initChainService = /* @__PURE__ */ __name(({ account, config, logger }) => {
|
|
765
|
+
logger?.log("ChainService: Initializing...");
|
|
766
|
+
const result = init({
|
|
767
|
+
config,
|
|
768
|
+
name: "ChainService",
|
|
769
|
+
account
|
|
770
|
+
});
|
|
771
|
+
logger?.log("ChainService: Initialized");
|
|
772
|
+
return result;
|
|
773
|
+
}, "initChainService");
|
|
774
|
+
var initMemoryChainService = /* @__PURE__ */ __name(async ({ config }) => {
|
|
775
|
+
const result = await MemoryChainService.create({
|
|
776
|
+
config,
|
|
777
|
+
name: "MemoryChainService"
|
|
778
|
+
});
|
|
779
|
+
assertEx13(await result.start(), () => "Failed to start MemoryChainService");
|
|
780
|
+
return result;
|
|
781
|
+
}, "initMemoryChainService");
|
|
782
|
+
var init = /* @__PURE__ */ __name(async (params) => {
|
|
783
|
+
if (chainStakeServiceSingleton2) return chainStakeServiceSingleton2;
|
|
784
|
+
const { config } = params;
|
|
785
|
+
chainStakeServiceSingleton2 = canUseEvmContractChainService(config) ? await initEvmContractChainService({
|
|
786
|
+
...params,
|
|
787
|
+
name: "ChainStakeService"
|
|
788
|
+
}) : await initMemoryChainService(params);
|
|
789
|
+
return chainStakeServiceSingleton2;
|
|
790
|
+
}, "init");
|
|
791
|
+
|
|
792
|
+
// src/implementation/head/head.ts
|
|
793
|
+
import { assertEx as assertEx14, isDefined as isDefined10 } from "@xylabs/sdk-js";
|
|
794
|
+
import { findMostRecentBlock as findMostRecentBlock2 } from "@xyo-network/xl1-protocol-sdk";
|
|
795
|
+
|
|
796
|
+
// src/implementation/head/createBootstrapHead.ts
|
|
797
|
+
import { buildNextBlock, createDeclarationIntent, createGenesisBlock } from "@xyo-network/chain-protocol";
|
|
798
|
+
var createBootstrapHead = /* @__PURE__ */ __name(async (account, chainService) => {
|
|
799
|
+
const chainId = await chainService.chainId();
|
|
800
|
+
const chain = [];
|
|
801
|
+
const genesisBlock = await createGenesisBlock(account, chainId, 10000000n, account.address);
|
|
802
|
+
chain.push(genesisBlock);
|
|
803
|
+
const producerDeclarationPayload = createDeclarationIntent(account.address, "producer", genesisBlock[0].block, genesisBlock[0].block + 1e4);
|
|
804
|
+
const producerDeclarationBlock = await buildNextBlock(genesisBlock[0], [], [
|
|
805
|
+
producerDeclarationPayload
|
|
806
|
+
], [
|
|
807
|
+
account
|
|
808
|
+
]);
|
|
809
|
+
chain.push(producerDeclarationBlock);
|
|
810
|
+
return chain;
|
|
811
|
+
}, "createBootstrapHead");
|
|
812
|
+
|
|
813
|
+
// src/implementation/head/createForkedHead/getBridgeDestinationObservation.ts
|
|
814
|
+
import { buildNextBlock as buildNextBlock2 } from "@xyo-network/chain-protocol";
|
|
815
|
+
import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
|
|
816
|
+
import { BridgeDestinationObservationSchema } from "@xyo-network/xl1-protocol";
|
|
817
|
+
|
|
818
|
+
// src/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts
|
|
819
|
+
import { toHex as toHex2 } from "@xylabs/sdk-js";
|
|
820
|
+
|
|
821
|
+
// src/implementation/head/createForkedHead/config/getForkDetails.ts
|
|
822
|
+
import { toHex } from "@xylabs/sdk-js";
|
|
823
|
+
import { AttoXL1ConvertFactor } from "@xyo-network/xl1-protocol";
|
|
824
|
+
var getForkBlockReward = /* @__PURE__ */ __name(() => {
|
|
825
|
+
return 18000000000n * AttoXL1ConvertFactor.xl1;
|
|
826
|
+
}, "getForkBlockReward");
|
|
827
|
+
var getForkBlockRewardHex = /* @__PURE__ */ __name(() => {
|
|
828
|
+
return toHex(getForkBlockReward());
|
|
829
|
+
}, "getForkBlockRewardHex");
|
|
830
|
+
|
|
831
|
+
// src/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts
|
|
832
|
+
var ethChainId = toHex2("0x1");
|
|
833
|
+
var bridgeableTokenContract = toHex2("0xf72aE3E0DA743033AbD7A407557D684c1aE66aed");
|
|
834
|
+
var bridgeDestAddress = toHex2("0x0e65b65B10C791942665030402c35023d88B14dA");
|
|
835
|
+
var destConfirmation = toHex2("0x950861b10523b52cdbb4a9ee52ed26601db555d2652bfec21c709e5e70d5b7d3");
|
|
836
|
+
var getBridgeDestChainId = /* @__PURE__ */ __name(() => ethChainId, "getBridgeDestChainId");
|
|
837
|
+
var getBridgeDestToken = /* @__PURE__ */ __name(() => bridgeableTokenContract, "getBridgeDestToken");
|
|
838
|
+
var getBridgeDestAddress = /* @__PURE__ */ __name(() => bridgeDestAddress, "getBridgeDestAddress");
|
|
839
|
+
var getBridgeDestAmount = /* @__PURE__ */ __name(() => getForkBlockRewardHex(), "getBridgeDestAmount");
|
|
840
|
+
var getBridgeDestConfirmation = /* @__PURE__ */ __name(() => destConfirmation, "getBridgeDestConfirmation");
|
|
841
|
+
var getBridgeDestinationDetails = /* @__PURE__ */ __name(() => {
|
|
842
|
+
return {
|
|
843
|
+
dest: getBridgeDestChainId(),
|
|
844
|
+
destToken: getBridgeDestToken(),
|
|
845
|
+
destAddress: getBridgeDestAddress(),
|
|
846
|
+
destAmount: getBridgeDestAmount()
|
|
847
|
+
};
|
|
848
|
+
}, "getBridgeDestinationDetails");
|
|
849
|
+
|
|
850
|
+
// src/implementation/head/createForkedHead/config/getBridgeSourceDetails.ts
|
|
851
|
+
var getBridgeSrcChainId = /* @__PURE__ */ __name((chainService) => chainService.chainId(), "getBridgeSrcChainId");
|
|
852
|
+
var getBridgeSrcAddress = /* @__PURE__ */ __name((account) => account.address, "getBridgeSrcAddress");
|
|
853
|
+
var getBridgeSrcToken = /* @__PURE__ */ __name((chainService) => chainService.chainId(), "getBridgeSrcToken");
|
|
854
|
+
var getBridgeSrcAmount = /* @__PURE__ */ __name(() => getForkBlockRewardHex(), "getBridgeSrcAmount");
|
|
855
|
+
var getBridgeSourceDetails = /* @__PURE__ */ __name(async (account, chainService) => {
|
|
856
|
+
return {
|
|
857
|
+
src: await getBridgeSrcChainId(chainService),
|
|
858
|
+
srcAddress: getBridgeSrcAddress(account),
|
|
859
|
+
srcToken: await getBridgeSrcToken(chainService),
|
|
860
|
+
srcAmount: getBridgeSrcAmount()
|
|
861
|
+
};
|
|
862
|
+
}, "getBridgeSourceDetails");
|
|
863
|
+
|
|
864
|
+
// src/implementation/head/createForkedHead/getBridgeDestinationObservation.ts
|
|
865
|
+
var getBridgeDestinationObservation = /* @__PURE__ */ __name(async (previousBlock, account, chainService) => {
|
|
866
|
+
const bridgeDestinationObservationFields = {
|
|
867
|
+
...await getBridgeSourceDetails(account, chainService),
|
|
868
|
+
...getBridgeDestinationDetails(),
|
|
869
|
+
destConfirmation: getBridgeDestConfirmation()
|
|
870
|
+
};
|
|
871
|
+
const bridgeDestinationObservation = new PayloadBuilder3({
|
|
872
|
+
schema: BridgeDestinationObservationSchema
|
|
873
|
+
}).fields(bridgeDestinationObservationFields).build();
|
|
874
|
+
return await buildNextBlock2(previousBlock[0], [], [
|
|
875
|
+
bridgeDestinationObservation
|
|
876
|
+
], [
|
|
877
|
+
account
|
|
878
|
+
]);
|
|
879
|
+
}, "getBridgeDestinationObservation");
|
|
880
|
+
|
|
881
|
+
// src/implementation/head/createForkedHead/getBridgeIntent.ts
|
|
882
|
+
import { buildNextBlock as buildNextBlock3, createTransferPayload } from "@xyo-network/chain-protocol";
|
|
883
|
+
import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
|
|
884
|
+
import { BridgeIntentSchema, XYO_BRIDGE_ADDRESS } from "@xyo-network/xl1-protocol";
|
|
885
|
+
var getBridgeIntent = /* @__PURE__ */ __name(async (previousBlock, account, chainService) => {
|
|
886
|
+
const transferPayload = createTransferPayload(account.address, {
|
|
887
|
+
[XYO_BRIDGE_ADDRESS]: getForkBlockReward()
|
|
888
|
+
});
|
|
889
|
+
const nonce = `${Date.now()}`;
|
|
890
|
+
const bridgeIntentFields = {
|
|
891
|
+
...await getBridgeSourceDetails(account, chainService),
|
|
892
|
+
...getBridgeDestinationDetails(),
|
|
893
|
+
nonce
|
|
894
|
+
};
|
|
895
|
+
const bridgeIntent = new PayloadBuilder4({
|
|
896
|
+
schema: BridgeIntentSchema
|
|
897
|
+
}).fields(bridgeIntentFields).build();
|
|
898
|
+
return await buildNextBlock3(previousBlock[0], [], [
|
|
899
|
+
bridgeIntent,
|
|
900
|
+
transferPayload
|
|
901
|
+
], [
|
|
902
|
+
account
|
|
903
|
+
]);
|
|
904
|
+
}, "getBridgeIntent");
|
|
905
|
+
|
|
906
|
+
// src/implementation/head/createForkedHead/getBridgeSourceObservation.ts
|
|
907
|
+
import { buildNextBlock as buildNextBlock4 } from "@xyo-network/chain-protocol";
|
|
908
|
+
import { PayloadBuilder as PayloadBuilder5 } from "@xyo-network/payload-builder";
|
|
909
|
+
import { BridgeSourceObservationSchema } from "@xyo-network/xl1-protocol";
|
|
910
|
+
var getBridgeSourceObservation = /* @__PURE__ */ __name(async (previousBlock, account, chainService) => {
|
|
911
|
+
const srcTxHash = previousBlock[0]._hash;
|
|
912
|
+
const bridgeSourceObservationFields = {
|
|
913
|
+
...await getBridgeSourceDetails(account, chainService),
|
|
914
|
+
...getBridgeDestinationDetails(),
|
|
915
|
+
// Observation
|
|
916
|
+
srcConfirmation: srcTxHash
|
|
917
|
+
};
|
|
918
|
+
const bridgeSourceObservation = new PayloadBuilder5({
|
|
919
|
+
schema: BridgeSourceObservationSchema
|
|
920
|
+
}).fields(bridgeSourceObservationFields).build();
|
|
921
|
+
return await buildNextBlock4(previousBlock[0], [], [
|
|
922
|
+
bridgeSourceObservation
|
|
923
|
+
], [
|
|
924
|
+
account
|
|
925
|
+
]);
|
|
926
|
+
}, "getBridgeSourceObservation");
|
|
927
|
+
|
|
928
|
+
// src/implementation/head/createForkedHead/getFirstBlockForNewChain.ts
|
|
929
|
+
import { buildBlock } from "@xyo-network/chain-protocol";
|
|
930
|
+
import { AttoXL1, XYO_STEP_REWARD_ADDRESS } from "@xyo-network/xl1-protocol";
|
|
931
|
+
var getFirstBlockForNewChain = /* @__PURE__ */ __name(async (forkBlock, account, chainService) => {
|
|
932
|
+
const { _hash: previousBlockHash, block: previousBlockNumber, step_hashes: previousStepHashes = [], protocol } = forkBlock;
|
|
933
|
+
const chainId = await chainService.chainId();
|
|
934
|
+
const options = {
|
|
935
|
+
blockPayloads: [],
|
|
936
|
+
chainId,
|
|
937
|
+
previousBlockHash,
|
|
938
|
+
previousBlockNumber,
|
|
939
|
+
previousStepHashes,
|
|
940
|
+
signers: [
|
|
941
|
+
account
|
|
942
|
+
],
|
|
943
|
+
txs: [],
|
|
944
|
+
protocol,
|
|
945
|
+
chainStepRewardAddress: XYO_STEP_REWARD_ADDRESS,
|
|
946
|
+
stepRewardPoolBalance: AttoXL1(0n)
|
|
947
|
+
};
|
|
948
|
+
return await buildBlock(options);
|
|
949
|
+
}, "getFirstBlockForNewChain");
|
|
950
|
+
|
|
951
|
+
// src/implementation/head/createForkedHead/createForkedHead.ts
|
|
952
|
+
var createForkedHead = /* @__PURE__ */ __name(async (forkFromBlock, account, chainService) => {
|
|
953
|
+
const chain = [];
|
|
954
|
+
const firstBlockForNewChain = await getFirstBlockForNewChain(forkFromBlock, account, chainService);
|
|
955
|
+
chain.push(firstBlockForNewChain);
|
|
956
|
+
const bridgeIntent = await getBridgeIntent(firstBlockForNewChain, account, chainService);
|
|
957
|
+
chain.push(bridgeIntent);
|
|
958
|
+
const bridgeSourceObservation = await getBridgeSourceObservation(bridgeIntent, account, chainService);
|
|
959
|
+
chain.push(bridgeSourceObservation);
|
|
960
|
+
const bridgeDestinationObservation = await getBridgeDestinationObservation(bridgeSourceObservation, account, chainService);
|
|
961
|
+
chain.push(bridgeDestinationObservation);
|
|
962
|
+
return chain;
|
|
963
|
+
}, "createForkedHead");
|
|
964
|
+
|
|
965
|
+
// src/implementation/head/getForkFromBlock.ts
|
|
966
|
+
import { asHash, hexFromBigInt, isDefined as isDefined9 } from "@xylabs/sdk-js";
|
|
967
|
+
import { isSignedBlockBoundWitnessWithHashMeta } from "@xyo-network/xl1-protocol";
|
|
968
|
+
var getForkFromBlock = /* @__PURE__ */ __name(async (head, chainService, chainArchivist) => {
|
|
969
|
+
if (head.chain !== await chainService.chainId()) {
|
|
970
|
+
const forkedAtBigInt = await chainService.forkedAtHash();
|
|
971
|
+
const forkedAtHex = hexFromBigInt(forkedAtBigInt);
|
|
972
|
+
const forkedAtHash = asHash(forkedAtHex);
|
|
973
|
+
if (isDefined9(forkedAtHash)) {
|
|
974
|
+
const [forkedAtBlock] = await chainArchivist.get([
|
|
975
|
+
forkedAtHash
|
|
976
|
+
]);
|
|
977
|
+
const forkedChainId = await chainService.forkedChainId();
|
|
978
|
+
const forkedAtBlockNumber = Number(await chainService.forkedAtBlockNumber());
|
|
979
|
+
if (isSignedBlockBoundWitnessWithHashMeta(forkedAtBlock) && forkedAtBlock.chain === forkedChainId && forkedAtBlock.block === forkedAtBlockNumber) {
|
|
980
|
+
return forkedAtBlock;
|
|
981
|
+
}
|
|
982
|
+
}
|
|
1070
983
|
}
|
|
1071
|
-
|
|
1072
|
-
|
|
984
|
+
}, "getForkFromBlock");
|
|
985
|
+
|
|
986
|
+
// src/implementation/head/submitNewChain.ts
|
|
987
|
+
import { delay } from "@xylabs/sdk-js";
|
|
988
|
+
import { flattenHydratedBlock } from "@xyo-network/xl1-protocol-sdk";
|
|
989
|
+
var submitNewChain = /* @__PURE__ */ __name(async (chain, chainArchivist, chainSubmissionsArchivistWrite) => {
|
|
990
|
+
for (const block of chain) {
|
|
991
|
+
const [bw] = block;
|
|
992
|
+
await chainSubmissionsArchivistWrite.insert(flattenHydratedBlock(block));
|
|
993
|
+
while (true) {
|
|
994
|
+
const result = await chainArchivist.get([
|
|
995
|
+
bw._hash
|
|
996
|
+
]);
|
|
997
|
+
if (result.length > 0) break;
|
|
998
|
+
await delay(1e3);
|
|
999
|
+
}
|
|
1073
1000
|
}
|
|
1074
|
-
|
|
1075
|
-
|
|
1001
|
+
}, "submitNewChain");
|
|
1002
|
+
|
|
1003
|
+
// src/implementation/head/head.ts
|
|
1004
|
+
var headSingleton;
|
|
1005
|
+
var initHead = /* @__PURE__ */ __name(async (params) => {
|
|
1006
|
+
const { account, chainArchivist, chainSubmissionsArchivistWrite, chainService } = params;
|
|
1007
|
+
if (headSingleton) return headSingleton;
|
|
1008
|
+
let head = await findMostRecentBlock2(chainArchivist);
|
|
1009
|
+
if (head) {
|
|
1010
|
+
const forkFromBlock = await getForkFromBlock(head, chainService, chainArchivist);
|
|
1011
|
+
if (isDefined10(forkFromBlock)) {
|
|
1012
|
+
const chain = await createForkedHead(forkFromBlock, account, chainService);
|
|
1013
|
+
await submitNewChain(chain, chainArchivist, chainSubmissionsArchivistWrite);
|
|
1014
|
+
const newBlock = assertEx14(chain.at(-1), () => new Error("Failed to get new head after forking"));
|
|
1015
|
+
head = newBlock[0];
|
|
1016
|
+
}
|
|
1017
|
+
} else {
|
|
1018
|
+
const chain = await createBootstrapHead(account, chainService);
|
|
1019
|
+
await submitNewChain(chain, chainArchivist, chainSubmissionsArchivistWrite);
|
|
1020
|
+
const newBlock = assertEx14(chain.at(-1), () => new Error("Failed to get new head after genesis"));
|
|
1021
|
+
head = newBlock[0];
|
|
1022
|
+
}
|
|
1023
|
+
headSingleton = head;
|
|
1024
|
+
return headSingleton;
|
|
1025
|
+
}, "initHead");
|
|
1026
|
+
|
|
1027
|
+
// src/implementation/mempoolRunner.ts
|
|
1028
|
+
import { isDefined as isDefined11 } from "@xylabs/sdk-js";
|
|
1029
|
+
import { HttpRpcTransport as HttpRpcTransport3, JsonRpcMempoolRunner, MempoolRunnerRpcSchemas } from "@xyo-network/xl1-rpc";
|
|
1030
|
+
var mempoolRunnerSingleton;
|
|
1031
|
+
var initMempoolRunner = /* @__PURE__ */ __name((params) => {
|
|
1032
|
+
const { config, logger } = params;
|
|
1033
|
+
if (mempoolRunnerSingleton) return mempoolRunnerSingleton;
|
|
1034
|
+
const endpoint = config.services?.apiEndpoint;
|
|
1035
|
+
if (isDefined11(endpoint)) {
|
|
1036
|
+
const transport = new HttpRpcTransport3(endpoint, {
|
|
1037
|
+
...MempoolRunnerRpcSchemas
|
|
1038
|
+
});
|
|
1039
|
+
const runner = new JsonRpcMempoolRunner(transport);
|
|
1040
|
+
logger?.log("Using mempoolRunner RPC service at", endpoint);
|
|
1041
|
+
return runner;
|
|
1042
|
+
} else {
|
|
1043
|
+
throw new Error("No MempoolRunner endpoint configured");
|
|
1076
1044
|
}
|
|
1077
|
-
|
|
1078
|
-
|
|
1045
|
+
}, "initMempoolRunner");
|
|
1046
|
+
|
|
1047
|
+
// src/implementation/mempoolViewer.ts
|
|
1048
|
+
import { isDefined as isDefined12 } from "@xylabs/sdk-js";
|
|
1049
|
+
import { HttpRpcTransport as HttpRpcTransport4, JsonRpcMempoolViewer, MempoolViewerRpcSchemas } from "@xyo-network/xl1-rpc";
|
|
1050
|
+
var mempoolViewerSingleton;
|
|
1051
|
+
var initMempoolViewer = /* @__PURE__ */ __name((params) => {
|
|
1052
|
+
const { config, logger } = params;
|
|
1053
|
+
if (mempoolViewerSingleton) return mempoolViewerSingleton;
|
|
1054
|
+
const endpoint = config.services?.apiEndpoint;
|
|
1055
|
+
if (isDefined12(endpoint)) {
|
|
1056
|
+
const transport = new HttpRpcTransport4(endpoint, {
|
|
1057
|
+
...MempoolViewerRpcSchemas
|
|
1058
|
+
});
|
|
1059
|
+
const viewer = new JsonRpcMempoolViewer(transport);
|
|
1060
|
+
logger?.log("Using MempoolViewer RPC service at", endpoint);
|
|
1061
|
+
return viewer;
|
|
1062
|
+
} else {
|
|
1063
|
+
throw new Error("No MempoolViewer endpoint configured");
|
|
1079
1064
|
}
|
|
1080
|
-
};
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1065
|
+
}, "initMempoolViewer");
|
|
1066
|
+
|
|
1067
|
+
// src/implementation/pendingTransactions.ts
|
|
1068
|
+
import { isDefined as isDefined14 } from "@xylabs/sdk-js";
|
|
1069
|
+
import { timeBudget } from "@xyo-network/xl1-protocol-sdk";
|
|
1070
|
+
import { HttpRpcTransport as HttpRpcTransport5, JsonRpcMempoolViewer as JsonRpcMempoolViewer2, MempoolViewerRpcSchemas as MempoolViewerRpcSchemas2 } from "@xyo-network/xl1-rpc";
|
|
1084
1071
|
|
|
1085
1072
|
// src/PendingTransactions/BasePendingTransactions.ts
|
|
1086
1073
|
import { ValueType } from "@opentelemetry/api";
|
|
1087
|
-
import { assertEx as
|
|
1074
|
+
import { assertEx as assertEx15, creatable as creatable5, exists, filterAs, filterAsync, forget, isDefined as isDefined13, isUndefined as isUndefined2 } from "@xylabs/sdk-js";
|
|
1088
1075
|
import { MemoryArchivist } from "@xyo-network/archivist-memory";
|
|
1089
|
-
import {
|
|
1090
|
-
import {
|
|
1076
|
+
import { asBlockBoundWitnessWithHashMeta, asXL1BlockNumber as asXL1BlockNumber2, isTransactionBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
|
|
1077
|
+
import { findMostRecentBlock as findMostRecentBlock3 } from "@xyo-network/xl1-protocol-sdk";
|
|
1091
1078
|
import { TransactionJsonSchemaValidator, validateTransaction } from "@xyo-network/xl1-validation";
|
|
1092
1079
|
import { Mutex as Mutex2 } from "async-mutex";
|
|
1093
1080
|
|
|
1094
1081
|
// src/PendingTransactions/bundledPayloadToHydratedTransaction.ts
|
|
1095
|
-
import { PayloadBuilder as
|
|
1082
|
+
import { PayloadBuilder as PayloadBuilder6 } from "@xyo-network/payload-builder";
|
|
1096
1083
|
import { asSignedTransactionBoundWitnessWithHashMeta } from "@xyo-network/xl1-protocol";
|
|
1097
1084
|
var bundledPayloadToHydratedTransaction = /* @__PURE__ */ __name(async (payload) => {
|
|
1098
|
-
const withHashMeta = await
|
|
1085
|
+
const withHashMeta = await PayloadBuilder6.addHashMeta(payload.payloads);
|
|
1099
1086
|
const tx = asSignedTransactionBoundWitnessWithHashMeta(withHashMeta.find((p) => p._hash === payload.root));
|
|
1100
1087
|
if (tx) {
|
|
1101
1088
|
return [
|
|
@@ -1106,7 +1093,7 @@ var bundledPayloadToHydratedTransaction = /* @__PURE__ */ __name(async (payload)
|
|
|
1106
1093
|
}, "bundledPayloadToHydratedTransaction");
|
|
1107
1094
|
|
|
1108
1095
|
// src/PendingTransactions/hydratedTransactionToPayloadBundle.ts
|
|
1109
|
-
import { PayloadBuilder as
|
|
1096
|
+
import { PayloadBuilder as PayloadBuilder7 } from "@xyo-network/payload-builder";
|
|
1110
1097
|
import { PayloadBundleSchema } from "@xyo-network/payload-model";
|
|
1111
1098
|
import { flattenHydratedTransaction } from "@xyo-network/xl1-protocol-sdk";
|
|
1112
1099
|
var hydratedTransactionToPayloadBundle = /* @__PURE__ */ __name((transaction) => {
|
|
@@ -1114,8 +1101,8 @@ var hydratedTransactionToPayloadBundle = /* @__PURE__ */ __name((transaction) =>
|
|
|
1114
1101
|
return bundle(root, transaction);
|
|
1115
1102
|
}, "hydratedTransactionToPayloadBundle");
|
|
1116
1103
|
var bundle = /* @__PURE__ */ __name((root, transaction) => {
|
|
1117
|
-
const payloads = flattenHydratedTransaction(transaction).flatMap((p) =>
|
|
1118
|
-
return new
|
|
1104
|
+
const payloads = flattenHydratedTransaction(transaction).flatMap((p) => PayloadBuilder7.omitStorageMeta(p));
|
|
1105
|
+
return new PayloadBuilder7({
|
|
1119
1106
|
schema: PayloadBundleSchema
|
|
1120
1107
|
}).fields({
|
|
1121
1108
|
payloads,
|
|
@@ -1124,13 +1111,13 @@ var bundle = /* @__PURE__ */ __name((root, transaction) => {
|
|
|
1124
1111
|
}, "bundle");
|
|
1125
1112
|
|
|
1126
1113
|
// src/PendingTransactions/BasePendingTransactions.ts
|
|
1127
|
-
function
|
|
1114
|
+
function _ts_decorate5(decorators, target, key, desc) {
|
|
1128
1115
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1129
1116
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1130
1117
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1131
1118
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1132
1119
|
}
|
|
1133
|
-
__name(
|
|
1120
|
+
__name(_ts_decorate5, "_ts_decorate");
|
|
1134
1121
|
var BasePendingTransactionsService = class _BasePendingTransactionsService extends BaseService {
|
|
1135
1122
|
static {
|
|
1136
1123
|
__name(this, "BasePendingTransactionsService");
|
|
@@ -1177,213 +1164,729 @@ var BasePendingTransactionsService = class _BasePendingTransactionsService exten
|
|
|
1177
1164
|
get additionalPendingTransactionValidators() {
|
|
1178
1165
|
return this.params.additionalPendingTransactionValidators ?? [];
|
|
1179
1166
|
}
|
|
1180
|
-
get chainArchivist() {
|
|
1181
|
-
return
|
|
1167
|
+
get chainArchivist() {
|
|
1168
|
+
return assertEx15(this.params.chainArchivist, () => "No completed blocks with data archivist");
|
|
1169
|
+
}
|
|
1170
|
+
get chainId() {
|
|
1171
|
+
return assertEx15(this.params.chainId, () => "No chain id");
|
|
1172
|
+
}
|
|
1173
|
+
get pendingBundledTransactionsArchivist() {
|
|
1174
|
+
return assertEx15(this.params.pendingBundledTransactionsArchivist, () => "No pending bundled transactions archivist");
|
|
1175
|
+
}
|
|
1176
|
+
get pendingBundledTransactionsLocalArchivist() {
|
|
1177
|
+
return assertEx15(this._curatedPendingBundledTransactionsArchivist, () => "No pending bundled transactions curated archivist");
|
|
1178
|
+
}
|
|
1179
|
+
get pendingTransactionsCount() {
|
|
1180
|
+
forget(this.countPendingTransactions());
|
|
1181
|
+
return this._pendingTransactionsCount;
|
|
1182
|
+
}
|
|
1183
|
+
get rejectedTransactionsArchivist() {
|
|
1184
|
+
return assertEx15(this.params.rejectedTransactionsArchivist, () => "No rejected transactions archivist");
|
|
1185
|
+
}
|
|
1186
|
+
async createHandler() {
|
|
1187
|
+
await super.createHandler();
|
|
1188
|
+
this._curatedPendingBundledTransactionsArchivist = await MemoryArchivist.create({
|
|
1189
|
+
account: "random"
|
|
1190
|
+
});
|
|
1191
|
+
this.pendingBundledTransactionsArchivist.on("inserted", ({ payloads }) => {
|
|
1192
|
+
forget(this.insertNewTransactions(payloads));
|
|
1193
|
+
});
|
|
1194
|
+
this.chainArchivist.on("inserted", ({ payloads }) => {
|
|
1195
|
+
this.markAnyIncludedTransactionsForRemoval(payloads);
|
|
1196
|
+
forget(this.cleanupWorker());
|
|
1197
|
+
});
|
|
1198
|
+
this.rejectedTransactionsArchivist.on("inserted", ({ payloads }) => {
|
|
1199
|
+
this.markAnyIncludedTransactionsForRemoval(payloads);
|
|
1200
|
+
forget(this.cleanupWorker());
|
|
1201
|
+
});
|
|
1202
|
+
const pendingTransactionsCounter = this.meter?.createObservableUpDownCounter("xyo_pending_transactions_counter", {
|
|
1203
|
+
description: "The current number of pending transactions",
|
|
1204
|
+
valueType: ValueType.INT,
|
|
1205
|
+
unit: "1"
|
|
1206
|
+
});
|
|
1207
|
+
pendingTransactionsCounter?.addCallback((observer) => {
|
|
1208
|
+
observer.observe(this.pendingTransactionsCount);
|
|
1209
|
+
});
|
|
1210
|
+
}
|
|
1211
|
+
pendingBlocks(_options) {
|
|
1212
|
+
throw new Error("Method [pendingBlocks] not implemented.");
|
|
1213
|
+
}
|
|
1214
|
+
async pendingTransactions({ limit = 100 } = {}) {
|
|
1215
|
+
return await this.spanAsync("getPendingTransactions", async () => {
|
|
1216
|
+
return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
|
|
1217
|
+
let lastHead = filterAs(await this.chainArchivist.next({
|
|
1218
|
+
limit: 100
|
|
1219
|
+
}), (x) => asBlockBoundWitnessWithHashMeta(x)).at(-1);
|
|
1220
|
+
if (isUndefined2(lastHead)) return [];
|
|
1221
|
+
await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash);
|
|
1222
|
+
const foundPendingTransactions = [];
|
|
1223
|
+
let cursor;
|
|
1224
|
+
while (foundPendingTransactions.length < limit) {
|
|
1225
|
+
const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({
|
|
1226
|
+
limit: 100,
|
|
1227
|
+
order: "asc",
|
|
1228
|
+
cursor
|
|
1229
|
+
});
|
|
1230
|
+
if (pendingBundledTransactions.length === 0) break;
|
|
1231
|
+
cursor = pendingBundledTransactions.at(-1)?._sequence;
|
|
1232
|
+
const undeletedTransactionBundles = pendingBundledTransactions.filter((tx) => !this._removablePendingTransactionHashes.has(tx.root));
|
|
1233
|
+
const transactions = (await Promise.all(undeletedTransactionBundles.map((p) => bundledPayloadToHydratedTransaction(p)))).filter(exists);
|
|
1234
|
+
const activeTransactions = transactions.filter(isTransactionActive(asXL1BlockNumber2(lastHead.block + 1, true)));
|
|
1235
|
+
const txValidationResults = await Promise.all(activeTransactions.map(async (tx) => [
|
|
1236
|
+
tx,
|
|
1237
|
+
await validateTransaction(tx, {
|
|
1238
|
+
chainId: this.chainId
|
|
1239
|
+
}, this.additionalPendingTransactionValidators)
|
|
1240
|
+
]));
|
|
1241
|
+
const validTransactions = txValidationResults.filter(([, errors]) => errors.length === 0).map(([tx]) => tx);
|
|
1242
|
+
const invalidTransactions = txValidationResults.filter(([, errors]) => errors.length > 0).map(([tx]) => tx);
|
|
1243
|
+
if (invalidTransactions.length > 0) {
|
|
1244
|
+
this.logger?.warn(`getPendingTransactions: Found ${invalidTransactions.length} invalid pending transactions`);
|
|
1245
|
+
for (const tx of invalidTransactions) {
|
|
1246
|
+
this.logger?.warn(tx[0]._hash);
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1249
|
+
foundPendingTransactions.push(...validTransactions);
|
|
1250
|
+
}
|
|
1251
|
+
if (foundPendingTransactions.length > 0) {
|
|
1252
|
+
this.logger?.log(`getPendingTransactions: Found ${foundPendingTransactions.length} pending transactions`);
|
|
1253
|
+
for (const tx of foundPendingTransactions) {
|
|
1254
|
+
this.logger?.log(tx[0]._hash);
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1257
|
+
return foundPendingTransactions;
|
|
1258
|
+
}, _BasePendingTransactionsService.MutexPriority.ReadTransactions);
|
|
1259
|
+
});
|
|
1260
|
+
}
|
|
1261
|
+
async cleanupWorker() {
|
|
1262
|
+
return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
|
|
1263
|
+
const lastHead = await findMostRecentBlock3(this.chainArchivist);
|
|
1264
|
+
if (isDefined13(lastHead)) await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash);
|
|
1265
|
+
}, _BasePendingTransactionsService.MutexPriority.PurgeTransactions);
|
|
1266
|
+
}
|
|
1267
|
+
async countPendingTransactions() {
|
|
1268
|
+
if (this._countPendingTransactionsMutex.isLocked()) return;
|
|
1269
|
+
await this._countPendingTransactionsMutex.runExclusive(async () => {
|
|
1270
|
+
const payloads = await this._curatedPendingBundledTransactionsArchivist?.all() ?? [];
|
|
1271
|
+
this._pendingTransactionsCount = payloads.length;
|
|
1272
|
+
});
|
|
1273
|
+
}
|
|
1274
|
+
async filterAlreadyFinalizedTransactions(incomingTransactions) {
|
|
1275
|
+
const incomingTransactionHashes = incomingTransactions.map((payload) => payload.root);
|
|
1276
|
+
const finalizedTransactions = await this.chainArchivist.get(incomingTransactionHashes);
|
|
1277
|
+
const finalizedTransactionHashes = new Set(finalizedTransactions.map((item) => item._hash));
|
|
1278
|
+
const nonFinalizedTransactions = incomingTransactions.filter((item) => !finalizedTransactionHashes.has(item._hash));
|
|
1279
|
+
return nonFinalizedTransactions;
|
|
1280
|
+
}
|
|
1281
|
+
async insertNewTransactions(payloads) {
|
|
1282
|
+
if (payloads.length === 0) return;
|
|
1283
|
+
return await this.spanAsync("InsertNewTransactions", async () => {
|
|
1284
|
+
return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
|
|
1285
|
+
const unprocessedTransactions = await this.filterAlreadyFinalizedTransactions(payloads);
|
|
1286
|
+
const hydratedUnprocessedTransactions = (await Promise.all(unprocessedTransactions.map(async (tx) => {
|
|
1287
|
+
return await bundledPayloadToHydratedTransaction(tx);
|
|
1288
|
+
}))).filter(exists);
|
|
1289
|
+
const validTransactions = await filterAsync(hydratedUnprocessedTransactions, async (tx) => {
|
|
1290
|
+
const errors = await validateTransaction(tx, {
|
|
1291
|
+
chainId: this.chainId
|
|
1292
|
+
}, [
|
|
1293
|
+
TransactionJsonSchemaValidator
|
|
1294
|
+
]);
|
|
1295
|
+
if (errors.length > 0) {
|
|
1296
|
+
this.logger?.warn("validateTransaction", errors);
|
|
1297
|
+
}
|
|
1298
|
+
return errors.length > 0 ? false : true;
|
|
1299
|
+
});
|
|
1300
|
+
if (validTransactions.length > 0) {
|
|
1301
|
+
const bundledTransactions = validTransactions.map((tx) => hydratedTransactionToPayloadBundle(tx));
|
|
1302
|
+
await this.pendingBundledTransactionsLocalArchivist.insert(bundledTransactions);
|
|
1303
|
+
}
|
|
1304
|
+
}, _BasePendingTransactionsService.MutexPriority.InsertNewTransactions);
|
|
1305
|
+
});
|
|
1306
|
+
}
|
|
1307
|
+
/**
|
|
1308
|
+
* Marks any included transactions in the provided payloads for removal preventing them
|
|
1309
|
+
* from being included in the curated pending transactions archivist and from being offered
|
|
1310
|
+
* during the next retrieval of pending transactions.
|
|
1311
|
+
* @param payloads An array of payloads that may contain transactions.
|
|
1312
|
+
*/
|
|
1313
|
+
markAnyIncludedTransactionsForRemoval(payloads) {
|
|
1314
|
+
const hashes = payloads.filter(isTransactionBoundWitnessWithStorageMeta).map((p) => p._hash);
|
|
1315
|
+
for (const hash of hashes) {
|
|
1316
|
+
this._removablePendingTransactionHashes.add(hash);
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1319
|
+
async pruneCuratedPendingTransactionsArchivist(head) {
|
|
1320
|
+
return await this.spanAsync("pruneCuratedPendingTransactionsArchivist", async () => {
|
|
1321
|
+
const foundPendingTransactionsToDeleteHashes = [];
|
|
1322
|
+
let cursor;
|
|
1323
|
+
let [lastHead] = filterAs(await this.chainArchivist.get([
|
|
1324
|
+
head
|
|
1325
|
+
]), (x) => asBlockBoundWitnessWithHashMeta(x));
|
|
1326
|
+
while (isDefined13(lastHead)) {
|
|
1327
|
+
const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({
|
|
1328
|
+
limit: 100,
|
|
1329
|
+
order: "asc",
|
|
1330
|
+
cursor
|
|
1331
|
+
});
|
|
1332
|
+
if (pendingBundledTransactions.length === 0) {
|
|
1333
|
+
break;
|
|
1334
|
+
}
|
|
1335
|
+
cursor = pendingBundledTransactions.at(-1)?._sequence;
|
|
1336
|
+
const deletedTransactionBundles = pendingBundledTransactions.filter((tx) => this._removablePendingTransactionHashes.has(tx.root));
|
|
1337
|
+
foundPendingTransactionsToDeleteHashes.push(...deletedTransactionBundles.map((tx) => tx._hash).filter(exists));
|
|
1338
|
+
const undeletedTransactionBundles = pendingBundledTransactions.filter((tx) => !this._removablePendingTransactionHashes.has(tx.root));
|
|
1339
|
+
const transactions = (await Promise.all(undeletedTransactionBundles.map((p) => bundledPayloadToHydratedTransaction(p)))).filter(exists);
|
|
1340
|
+
const expiredTransactions = transactions.filter(isTransactionExpired(asXL1BlockNumber2(lastHead.block + 1, true)));
|
|
1341
|
+
const expiredBundleHashes = expiredTransactions.map((expiredHydratedTx) => (
|
|
1342
|
+
// Find the corresponding payload bundle hash for the expired transaction
|
|
1343
|
+
pendingBundledTransactions.find((bundledTx) => bundledTx.root === expiredHydratedTx[0]._hash)?._hash
|
|
1344
|
+
)).filter(exists);
|
|
1345
|
+
foundPendingTransactionsToDeleteHashes.push(...expiredBundleHashes);
|
|
1346
|
+
}
|
|
1347
|
+
const deletedHashes = await this.pendingBundledTransactionsLocalArchivist.delete(foundPendingTransactionsToDeleteHashes);
|
|
1348
|
+
for (const payload of deletedHashes) {
|
|
1349
|
+
this._removablePendingTransactionHashes.delete(payload._hash);
|
|
1350
|
+
}
|
|
1351
|
+
if (deletedHashes.length > 0) {
|
|
1352
|
+
this.logger?.log(`foundPendingTransactionsToDeleteHashes: Found ${deletedHashes.length} deletable transactions`);
|
|
1353
|
+
for (const payload of deletedHashes) {
|
|
1354
|
+
this.logger?.log(payload._hash);
|
|
1355
|
+
}
|
|
1356
|
+
}
|
|
1357
|
+
});
|
|
1358
|
+
}
|
|
1359
|
+
};
|
|
1360
|
+
BasePendingTransactionsService = _ts_decorate5([
|
|
1361
|
+
creatable5()
|
|
1362
|
+
], BasePendingTransactionsService);
|
|
1363
|
+
var isTransactionExpired = /* @__PURE__ */ __name((block) => ([txBw]) => txBw.exp < block, "isTransactionExpired");
|
|
1364
|
+
var isTransactionActive = /* @__PURE__ */ __name((block) => ([txBw]) => txBw.nbf <= block && txBw.exp >= block, "isTransactionActive");
|
|
1365
|
+
|
|
1366
|
+
// src/implementation/pendingTransactions.ts
|
|
1367
|
+
var serviceSingleton;
|
|
1368
|
+
var initPendingTransactions = /* @__PURE__ */ __name(async ({ config, params, logger }) => {
|
|
1369
|
+
if (serviceSingleton) return serviceSingleton;
|
|
1370
|
+
return await timeBudget("initPendingTransactions", logger, async () => {
|
|
1371
|
+
const endpoint = config.services?.apiEndpoint;
|
|
1372
|
+
if (isDefined14(endpoint)) {
|
|
1373
|
+
const transport = new HttpRpcTransport5(endpoint, {
|
|
1374
|
+
...MempoolViewerRpcSchemas2
|
|
1375
|
+
});
|
|
1376
|
+
const viewer = new JsonRpcMempoolViewer2(transport);
|
|
1377
|
+
logger?.log("Using MempoolViewer RPC service at", endpoint);
|
|
1378
|
+
return viewer;
|
|
1379
|
+
} else {
|
|
1380
|
+
serviceSingleton = await BasePendingTransactionsService.create(params);
|
|
1381
|
+
}
|
|
1382
|
+
return serviceSingleton;
|
|
1383
|
+
}, 2e3, true);
|
|
1384
|
+
}, "initPendingTransactions");
|
|
1385
|
+
|
|
1386
|
+
// src/implementation/producer.ts
|
|
1387
|
+
import { timeBudget as timeBudget2 } from "@xyo-network/xl1-protocol-sdk";
|
|
1388
|
+
|
|
1389
|
+
// src/simple/block/runner/SimpleBlockRunner.ts
|
|
1390
|
+
import { AbstractCreatable as AbstractCreatable3, AddressZod, asHash as asHash2, assertEx as assertEx17, creatable as creatable6, exists as exists2, hexToBigInt, isDefined as isDefined15 } from "@xylabs/sdk-js";
|
|
1391
|
+
import { MemoryArchivist as MemoryArchivist2 } from "@xyo-network/archivist-memory";
|
|
1392
|
+
import { FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema } from "@xyo-network/chain-modules";
|
|
1393
|
+
import { buildNextBlock as buildNextBlock5, createDeclarationIntent as createDeclarationIntent2 } from "@xyo-network/chain-protocol";
|
|
1394
|
+
import { PayloadBuilder as PayloadBuilder9 } from "@xyo-network/payload-builder";
|
|
1395
|
+
import { asBlockBoundWitness as asBlockBoundWitness2, AttoXL1 as AttoXL12, BlockNumberSchema, defaultRewardRatio, TimeSchema, XYO_STEP_REWARD_ADDRESS as XYO_STEP_REWARD_ADDRESS2 } from "@xyo-network/xl1-protocol";
|
|
1396
|
+
import z from "zod";
|
|
1397
|
+
|
|
1398
|
+
// src/simple/block/runner/generateTransactionFeeTransfers.ts
|
|
1399
|
+
import { hexFromBigInt as hexFromBigInt2 } from "@xylabs/sdk-js";
|
|
1400
|
+
import { assertEx as assertEx16 } from "@xylabs/sdk-js";
|
|
1401
|
+
import { PayloadBuilder as PayloadBuilder8 } from "@xyo-network/payload-builder";
|
|
1402
|
+
import { TransferSchema, XYO_ZERO_ADDRESS } from "@xyo-network/xl1-protocol";
|
|
1403
|
+
import { transactionRequiredGas } from "@xyo-network/xl1-protocol-sdk";
|
|
1404
|
+
import { HydratedTransactionWrapper } from "@xyo-network/xl1-wrappers";
|
|
1405
|
+
async function generateTransactionFeeTransfers(address, transactions) {
|
|
1406
|
+
const txs = await Promise.all(transactions.map(async (tx) => {
|
|
1407
|
+
return HydratedTransactionWrapper.parse([
|
|
1408
|
+
await PayloadBuilder8.addStorageMeta(tx[0]),
|
|
1409
|
+
await PayloadBuilder8.addStorageMeta(tx[1])
|
|
1410
|
+
]);
|
|
1411
|
+
}));
|
|
1412
|
+
const txBaseFeeCosts = {};
|
|
1413
|
+
for (const tx of txs) {
|
|
1414
|
+
txBaseFeeCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n) + tx.fees.base;
|
|
1415
|
+
}
|
|
1416
|
+
const txGasCosts = {};
|
|
1417
|
+
for (const tx of txs) {
|
|
1418
|
+
const requiredGas = transactionRequiredGas(tx.data);
|
|
1419
|
+
const totalGasCost = requiredGas * tx.fees.gasPrice;
|
|
1420
|
+
txGasCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n) + totalGasCost;
|
|
1421
|
+
}
|
|
1422
|
+
const payloads = Object.entries(txBaseFeeCosts).map(([from, amount]) => {
|
|
1423
|
+
const payload = {
|
|
1424
|
+
schema: TransferSchema,
|
|
1425
|
+
epoch: Date.now(),
|
|
1426
|
+
from,
|
|
1427
|
+
transfers: {
|
|
1428
|
+
// burn the base fee
|
|
1429
|
+
[XYO_ZERO_ADDRESS]: hexFromBigInt2(amount)
|
|
1430
|
+
}
|
|
1431
|
+
};
|
|
1432
|
+
return payload;
|
|
1433
|
+
});
|
|
1434
|
+
for (const [from, amount] of Object.entries(txGasCosts)) {
|
|
1435
|
+
const fromPayload = assertEx16(payloads.find((p) => p.from === from), () => "from payload not found");
|
|
1436
|
+
fromPayload.transfers[address] = hexFromBigInt2(amount);
|
|
1437
|
+
}
|
|
1438
|
+
return payloads;
|
|
1439
|
+
}
|
|
1440
|
+
__name(generateTransactionFeeTransfers, "generateTransactionFeeTransfers");
|
|
1441
|
+
|
|
1442
|
+
// src/simple/block/runner/SimpleBlockRunner.ts
|
|
1443
|
+
function _ts_decorate6(decorators, target, key, desc) {
|
|
1444
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1445
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1446
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1447
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1448
|
+
}
|
|
1449
|
+
__name(_ts_decorate6, "_ts_decorate");
|
|
1450
|
+
var DEFAULT_BLOCK_SIZE = 10;
|
|
1451
|
+
var XYO_PRODUCER_REDECLARATION_DURATION = 1e4;
|
|
1452
|
+
var XYO_PRODUCER_REDECLARATION_WINDOW = 500;
|
|
1453
|
+
var SimpleBlockRunnerParamsZod = z.object({
|
|
1454
|
+
balanceViewer: z.object().loose(),
|
|
1455
|
+
blockRewardViewer: z.object().loose(),
|
|
1456
|
+
chainId: z.string(),
|
|
1457
|
+
config: z.object().loose(),
|
|
1458
|
+
mempoolViewer: z.object().loose(),
|
|
1459
|
+
mempoolRunner: z.object().loose(),
|
|
1460
|
+
rejectedTransactionsArchivist: z.object().loose().optional(),
|
|
1461
|
+
rewardAddress: AddressZod,
|
|
1462
|
+
time: z.object().loose(),
|
|
1463
|
+
validateHydratedBlockState: z.function().optional()
|
|
1464
|
+
});
|
|
1465
|
+
var SimpleBlockRunner = class _SimpleBlockRunner extends AbstractCreatable3 {
|
|
1466
|
+
static {
|
|
1467
|
+
__name(this, "SimpleBlockRunner");
|
|
1468
|
+
}
|
|
1469
|
+
_blockRewardDiviner;
|
|
1470
|
+
_lastRedeclarationBlock;
|
|
1471
|
+
_rejectedTransactionsArchivist;
|
|
1472
|
+
/**
|
|
1473
|
+
* The default block size for a block
|
|
1474
|
+
*/
|
|
1475
|
+
static get DefaultBlockSize() {
|
|
1476
|
+
return DEFAULT_BLOCK_SIZE;
|
|
1477
|
+
}
|
|
1478
|
+
/**
|
|
1479
|
+
* The amount of time for which the producer will redeclare
|
|
1480
|
+
* their intent to continue producing blocks
|
|
1481
|
+
*/
|
|
1482
|
+
static get RedeclarationDuration() {
|
|
1483
|
+
return XYO_PRODUCER_REDECLARATION_DURATION;
|
|
1484
|
+
}
|
|
1485
|
+
/**
|
|
1486
|
+
* The number of blocks within which the producer will redeclare
|
|
1487
|
+
* their intent to continue producing blocks
|
|
1488
|
+
*/
|
|
1489
|
+
static get RedeclarationWindow() {
|
|
1490
|
+
return XYO_PRODUCER_REDECLARATION_WINDOW;
|
|
1491
|
+
}
|
|
1492
|
+
get address() {
|
|
1493
|
+
return this.account.address;
|
|
1494
|
+
}
|
|
1495
|
+
get account() {
|
|
1496
|
+
return assertEx17(this.params.account, () => "account is required");
|
|
1497
|
+
}
|
|
1498
|
+
get balanceViewer() {
|
|
1499
|
+
return assertEx17(this.params.balanceViewer, () => "balanceViewer is required");
|
|
1500
|
+
}
|
|
1501
|
+
get blockRewardViewer() {
|
|
1502
|
+
return assertEx17(this.params.blockRewardViewer, () => "blockRewardViewer is required");
|
|
1503
|
+
}
|
|
1504
|
+
get chainId() {
|
|
1505
|
+
return assertEx17(this.params.chainId, () => "chainId is required");
|
|
1506
|
+
}
|
|
1507
|
+
// protected get electionService() {
|
|
1508
|
+
// return assertEx(this.params.electionService, () => 'electionService is required')
|
|
1509
|
+
// }
|
|
1510
|
+
get mempoolRunner() {
|
|
1511
|
+
return assertEx17(this.params.mempoolRunner, () => "mempoolRunner is required");
|
|
1512
|
+
}
|
|
1513
|
+
get mempoolViewer() {
|
|
1514
|
+
return assertEx17(this.params.mempoolViewer, () => "mempoolViewer is required");
|
|
1515
|
+
}
|
|
1516
|
+
// protected get pendingTransactionsService() {
|
|
1517
|
+
// return assertEx(this.params.pendingTransactionsService, () => 'Missing pendingTransactionsService')
|
|
1518
|
+
// }
|
|
1519
|
+
get rejectedTransactionsArchivist() {
|
|
1520
|
+
return this._rejectedTransactionsArchivist;
|
|
1521
|
+
}
|
|
1522
|
+
get rewardAddress() {
|
|
1523
|
+
return assertEx17(this.params.rewardAddress, () => "No reward address provided");
|
|
1524
|
+
}
|
|
1525
|
+
// protected get stakeIntentService(): StakeIntentService {
|
|
1526
|
+
// return assertEx(this.params.stakeIntentService, () => 'No StakeIntentService provided')
|
|
1527
|
+
// }
|
|
1528
|
+
get time() {
|
|
1529
|
+
return assertEx17(this.params.time, () => "No TimeSyncViewer provided");
|
|
1530
|
+
}
|
|
1531
|
+
// protected get validateHydratedBlockState() {
|
|
1532
|
+
// return assertEx(this.params.validateHydratedBlockState, () => 'validateHydratedBlockState is required')
|
|
1533
|
+
// }
|
|
1534
|
+
static async paramsHandler(params) {
|
|
1535
|
+
SimpleBlockRunnerParamsZod.parse(params);
|
|
1536
|
+
const rejectedTransactionsArchivist = params?.rejectedTransactionsArchivist ?? await MemoryArchivist2.create();
|
|
1537
|
+
return {
|
|
1538
|
+
...await super.paramsHandler(params),
|
|
1539
|
+
...params,
|
|
1540
|
+
rejectedTransactionsArchivist
|
|
1541
|
+
};
|
|
1542
|
+
}
|
|
1543
|
+
async next(head) {
|
|
1544
|
+
if (head.chain !== this.chainId) return;
|
|
1545
|
+
return await this.proposeNextValidBlock(head);
|
|
1546
|
+
}
|
|
1547
|
+
async produceNextBlock(head, force) {
|
|
1548
|
+
assertEx17(head.chain === this.chainId, () => "Block chain ID does not match");
|
|
1549
|
+
const result = await this.proposeNextValidBlock(head);
|
|
1550
|
+
return force ? assertEx17(result, () => "Failed to produce next block") : result;
|
|
1551
|
+
}
|
|
1552
|
+
async getBlockRewardTransfers(block) {
|
|
1553
|
+
if (!this._blockRewardDiviner) {
|
|
1554
|
+
this._blockRewardDiviner = await FixedPercentageBlockRewardDiviner.create({
|
|
1555
|
+
account: "random",
|
|
1556
|
+
blockRewardViewer: this.blockRewardViewer,
|
|
1557
|
+
config: {
|
|
1558
|
+
rewardAddress: this.rewardAddress,
|
|
1559
|
+
rewardPercentageRatio: defaultRewardRatio,
|
|
1560
|
+
schema: FixedPercentageBlockRewardDivinerConfigSchema
|
|
1561
|
+
}
|
|
1562
|
+
});
|
|
1563
|
+
}
|
|
1564
|
+
const blockId = new PayloadBuilder9({
|
|
1565
|
+
schema: BlockNumberSchema
|
|
1566
|
+
}).fields({
|
|
1567
|
+
block
|
|
1568
|
+
}).build();
|
|
1569
|
+
const rewards = await this._blockRewardDiviner.divine([
|
|
1570
|
+
blockId
|
|
1571
|
+
]);
|
|
1572
|
+
return rewards;
|
|
1573
|
+
}
|
|
1574
|
+
/**
|
|
1575
|
+
* Handles the producer redeclaration logic
|
|
1576
|
+
* @param head The current head block
|
|
1577
|
+
* @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed
|
|
1578
|
+
*/
|
|
1579
|
+
getProducerRedeclaration(head) {
|
|
1580
|
+
if (this.params.config.producer.disableIntentRedeclaration) return;
|
|
1581
|
+
const currentBlock = head.block;
|
|
1582
|
+
return createDeclarationIntent2(this.address, "producer", currentBlock, currentBlock + _SimpleBlockRunner.RedeclarationDuration);
|
|
1583
|
+
}
|
|
1584
|
+
async proposeNextValidBlock(head, validateBalances = false, force = false) {
|
|
1585
|
+
return await this.spanAsync("proposeNextValidBlock", async () => {
|
|
1586
|
+
const { block: previousBlock } = assertEx17(asBlockBoundWitness2(head), () => "Invalid head block");
|
|
1587
|
+
const nextBlock = previousBlock + 1;
|
|
1588
|
+
const nextBlockTransactionsStart = Date.now();
|
|
1589
|
+
const nextBlockTransactions = await this.mempoolViewer.pendingTransactions({
|
|
1590
|
+
limit: _SimpleBlockRunner.DefaultBlockSize
|
|
1591
|
+
});
|
|
1592
|
+
const nextBlockTransactionsDuration = Date.now() - nextBlockTransactionsStart;
|
|
1593
|
+
if (nextBlockTransactionsDuration > 200) {
|
|
1594
|
+
this.logger?.warn(`[Slow] Fetched ${nextBlockTransactions.length} pending transactions in ${nextBlockTransactionsDuration}ms}`);
|
|
1595
|
+
}
|
|
1596
|
+
const blockPayloads = [];
|
|
1597
|
+
const producerRedeclarationPayload = await this.getProducerRedeclaration(head);
|
|
1598
|
+
if (producerRedeclarationPayload) blockPayloads.push(producerRedeclarationPayload);
|
|
1599
|
+
if (blockPayloads.length === 0 && nextBlockTransactions.length === 0 && !this.heartbeatRequired(head) && !force) return;
|
|
1600
|
+
const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock);
|
|
1601
|
+
blockPayloads.push(...rewardTransferPayloads);
|
|
1602
|
+
const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions);
|
|
1603
|
+
const timeStart = Date.now();
|
|
1604
|
+
const timePayload = await this.generateTimePayload(head);
|
|
1605
|
+
const timeDuration = Date.now() - timeStart;
|
|
1606
|
+
if (timeDuration > 100) {
|
|
1607
|
+
this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`);
|
|
1608
|
+
}
|
|
1609
|
+
const [fundedNextBlockTransactions, fundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances);
|
|
1610
|
+
blockPayloads.push(...fundedTransfers, timePayload);
|
|
1611
|
+
this.logger?.info(`Building block ${head.block + 1}`);
|
|
1612
|
+
const startBuild = Date.now();
|
|
1613
|
+
const stepRewardPoolBalance = (await this.balanceViewer.accountBalances([
|
|
1614
|
+
XYO_STEP_REWARD_ADDRESS2
|
|
1615
|
+
]))[XYO_STEP_REWARD_ADDRESS2];
|
|
1616
|
+
const block = await buildNextBlock5(head, fundedNextBlockTransactions, blockPayloads, [
|
|
1617
|
+
this.account
|
|
1618
|
+
], XYO_STEP_REWARD_ADDRESS2, stepRewardPoolBalance);
|
|
1619
|
+
this.logger?.info(`Built block ${block[0].block} in ${Date.now() - startBuild}ms with ${block[1].length} payloads`);
|
|
1620
|
+
await this.mempoolRunner.submitBlocks([
|
|
1621
|
+
block
|
|
1622
|
+
]);
|
|
1623
|
+
return block;
|
|
1624
|
+
});
|
|
1625
|
+
}
|
|
1626
|
+
// remove unfunded transactions and block transfers
|
|
1627
|
+
async filterByFunded(head, txs, transfers, validateBalances = false) {
|
|
1628
|
+
const fundedTransfers = [];
|
|
1629
|
+
const fundedTransactions = (await Promise.all(txs.map(async (tx) => {
|
|
1630
|
+
const transfer = transfers.find((transfer2) => transfer2.from === tx[0].from);
|
|
1631
|
+
if (!transfer) return;
|
|
1632
|
+
const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? "00"), 0n);
|
|
1633
|
+
if (validateBalances) {
|
|
1634
|
+
const balance = (await this.balanceViewer.accountBalances([
|
|
1635
|
+
transfer.from
|
|
1636
|
+
]))[transfer.from] ?? AttoXL12(0n);
|
|
1637
|
+
if (balance >= totalTransferCost) {
|
|
1638
|
+
fundedTransfers.push(transfer);
|
|
1639
|
+
return tx;
|
|
1640
|
+
}
|
|
1641
|
+
} else {
|
|
1642
|
+
fundedTransfers.push(transfer);
|
|
1643
|
+
return tx;
|
|
1644
|
+
}
|
|
1645
|
+
}))).filter(exists2);
|
|
1646
|
+
return [
|
|
1647
|
+
fundedTransactions,
|
|
1648
|
+
fundedTransfers
|
|
1649
|
+
];
|
|
1650
|
+
}
|
|
1651
|
+
async generateTimePayload(head) {
|
|
1652
|
+
const [ethereum, ethHashOrNull] = await this.time.currentTimeAndHash("ethereum");
|
|
1653
|
+
const ethereumHash = asHash2(ethHashOrNull, () => "No ethereum hash available from time sync service");
|
|
1654
|
+
const timePayload = {
|
|
1655
|
+
schema: TimeSchema,
|
|
1656
|
+
// this is for the previous block
|
|
1657
|
+
xl1: head.block,
|
|
1658
|
+
// this is for the previous block
|
|
1659
|
+
xl1Hash: head._hash,
|
|
1660
|
+
ethereum,
|
|
1661
|
+
ethereumHash,
|
|
1662
|
+
epoch: Date.now()
|
|
1663
|
+
};
|
|
1664
|
+
return timePayload;
|
|
1665
|
+
}
|
|
1666
|
+
/**
|
|
1667
|
+
* Check if a heartbeat block is required based on network activity.
|
|
1668
|
+
* @param head The current head block
|
|
1669
|
+
* @returns True if a heartbeat is required, false otherwise
|
|
1670
|
+
*/
|
|
1671
|
+
heartbeatRequired(head) {
|
|
1672
|
+
const epoch = head.$epoch;
|
|
1673
|
+
if (isDefined15(epoch)) {
|
|
1674
|
+
const { heartbeatInterval } = this.params.config.producer;
|
|
1675
|
+
if (Date.now() - epoch > heartbeatInterval) {
|
|
1676
|
+
return true;
|
|
1677
|
+
}
|
|
1678
|
+
}
|
|
1679
|
+
return false;
|
|
1680
|
+
}
|
|
1681
|
+
};
|
|
1682
|
+
SimpleBlockRunner = _ts_decorate6([
|
|
1683
|
+
creatable6()
|
|
1684
|
+
], SimpleBlockRunner);
|
|
1685
|
+
|
|
1686
|
+
// src/implementation/producer.ts
|
|
1687
|
+
var serviceSingleton2;
|
|
1688
|
+
var initBlockProducer = /* @__PURE__ */ __name(async (params) => {
|
|
1689
|
+
if (serviceSingleton2) return serviceSingleton2;
|
|
1690
|
+
return await timeBudget2("initBlockProducer", params.logger, async () => {
|
|
1691
|
+
serviceSingleton2 = await SimpleBlockRunner.create(params);
|
|
1692
|
+
return serviceSingleton2;
|
|
1693
|
+
}, 2e3, true);
|
|
1694
|
+
}, "initBlockProducer");
|
|
1695
|
+
|
|
1696
|
+
// src/implementation/reward.ts
|
|
1697
|
+
import { assertEx as assertEx18 } from "@xylabs/sdk-js";
|
|
1698
|
+
import { SimpleBlockRewardViewer, timeBudget as timeBudget3 } from "@xyo-network/xl1-protocol-sdk";
|
|
1699
|
+
var rewardServiceSingleton;
|
|
1700
|
+
var initBlockRewardViewer = /* @__PURE__ */ __name((params) => {
|
|
1701
|
+
if (rewardServiceSingleton) return rewardServiceSingleton;
|
|
1702
|
+
return timeBudget3("initBlockRewardViewer", params.logger, () => {
|
|
1703
|
+
const { config } = params;
|
|
1704
|
+
rewardServiceSingleton = canUseEvmBlockRewardViewer({
|
|
1705
|
+
config
|
|
1706
|
+
}) ? initEvmBlockRewardViewer(params) : initXyoBlockRewardViewer(params);
|
|
1707
|
+
return rewardServiceSingleton;
|
|
1708
|
+
}, 2e3, true);
|
|
1709
|
+
}, "initBlockRewardViewer");
|
|
1710
|
+
var initXyoBlockRewardViewer = /* @__PURE__ */ __name((params) => {
|
|
1711
|
+
if (rewardServiceSingleton) return rewardServiceSingleton;
|
|
1712
|
+
return timeBudget3("initXyoBlockRewardViewer", params.logger, () => {
|
|
1713
|
+
rewardServiceSingleton = SimpleBlockRewardViewer.create(params);
|
|
1714
|
+
return rewardServiceSingleton;
|
|
1715
|
+
}, 2e3, true);
|
|
1716
|
+
}, "initXyoBlockRewardViewer");
|
|
1717
|
+
var canUseEvmBlockRewardViewer = /* @__PURE__ */ __name((params) => canUseEvmProvider({
|
|
1718
|
+
config: params.config
|
|
1719
|
+
}), "canUseEvmBlockRewardViewer");
|
|
1720
|
+
var initEvmBlockRewardViewer = /* @__PURE__ */ __name(async (params) => {
|
|
1721
|
+
if (rewardServiceSingleton) return rewardServiceSingleton;
|
|
1722
|
+
return await timeBudget3("initEvmBlockRewardViewer", params.logger, async () => {
|
|
1723
|
+
const provider2 = assertEx18(await initEvmProvider(params));
|
|
1724
|
+
const evmBlockRewardViewerParams = {
|
|
1725
|
+
...params,
|
|
1726
|
+
provider: provider2
|
|
1727
|
+
};
|
|
1728
|
+
rewardServiceSingleton = EvmBlockRewardViewer.create(evmBlockRewardViewerParams);
|
|
1729
|
+
return rewardServiceSingleton;
|
|
1730
|
+
}, 2e3, true);
|
|
1731
|
+
}, "initEvmBlockRewardViewer");
|
|
1732
|
+
|
|
1733
|
+
// src/implementation/time.ts
|
|
1734
|
+
import { timeBudget as timeBudget4 } from "@xyo-network/xl1-protocol-sdk";
|
|
1735
|
+
|
|
1736
|
+
// src/Time/BaseTimeSyncService.ts
|
|
1737
|
+
import { creatable as creatable7 } from "@xylabs/sdk-js";
|
|
1738
|
+
import { SimpleTimeSyncViewer } from "@xyo-network/xl1-protocol-sdk";
|
|
1739
|
+
function _ts_decorate7(decorators, target, key, desc) {
|
|
1740
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1741
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1742
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1743
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1744
|
+
}
|
|
1745
|
+
__name(_ts_decorate7, "_ts_decorate");
|
|
1746
|
+
var BaseTimeSyncService = class extends BaseService {
|
|
1747
|
+
static {
|
|
1748
|
+
__name(this, "BaseTimeSyncService");
|
|
1749
|
+
}
|
|
1750
|
+
timeSyncViewer;
|
|
1751
|
+
get blockViewer() {
|
|
1752
|
+
return this.params.blockViewer;
|
|
1753
|
+
}
|
|
1754
|
+
get ethProvider() {
|
|
1755
|
+
return this.params.ethProvider;
|
|
1756
|
+
}
|
|
1757
|
+
async convertTime(fromDomain, toDomain, from) {
|
|
1758
|
+
return await this.timeSyncViewer.convertTime(fromDomain, toDomain, from);
|
|
1759
|
+
}
|
|
1760
|
+
async createHandler() {
|
|
1761
|
+
await super.createHandler();
|
|
1762
|
+
this.timeSyncViewer = new SimpleTimeSyncViewer(this.blockViewer, this.ethProvider);
|
|
1763
|
+
}
|
|
1764
|
+
async currentTime(domain) {
|
|
1765
|
+
return await this.timeSyncViewer.currentTime(domain);
|
|
1766
|
+
}
|
|
1767
|
+
async currentTimeAndHash(domain) {
|
|
1768
|
+
return await this.timeSyncViewer.currentTimeAndHash(domain);
|
|
1769
|
+
}
|
|
1770
|
+
async currentTimePayload() {
|
|
1771
|
+
return await this.timeSyncViewer.currentTimePayload();
|
|
1772
|
+
}
|
|
1773
|
+
};
|
|
1774
|
+
BaseTimeSyncService = _ts_decorate7([
|
|
1775
|
+
creatable7()
|
|
1776
|
+
], BaseTimeSyncService);
|
|
1777
|
+
|
|
1778
|
+
// src/implementation/time.ts
|
|
1779
|
+
var timeSyncServiceSingleton;
|
|
1780
|
+
var initTimeService = /* @__PURE__ */ __name(async ({ blockViewer, config, logger, meterProvider, traceProvider }) => {
|
|
1781
|
+
if (timeSyncServiceSingleton) return timeSyncServiceSingleton;
|
|
1782
|
+
return await timeBudget4("initTimeService", logger, async () => {
|
|
1783
|
+
const ethProvider = canUseEvmProvider({
|
|
1784
|
+
config
|
|
1785
|
+
}) ? await initEvmProvider({
|
|
1786
|
+
config
|
|
1787
|
+
}) : void 0;
|
|
1788
|
+
timeSyncServiceSingleton = BaseTimeSyncService.create({
|
|
1789
|
+
blockViewer,
|
|
1790
|
+
ethProvider,
|
|
1791
|
+
logger,
|
|
1792
|
+
meterProvider,
|
|
1793
|
+
traceProvider
|
|
1794
|
+
});
|
|
1795
|
+
return await timeSyncServiceSingleton;
|
|
1796
|
+
}, 2e3, true);
|
|
1797
|
+
}, "initTimeService");
|
|
1798
|
+
|
|
1799
|
+
// src/implementation/validator.ts
|
|
1800
|
+
var serviceSingleton3;
|
|
1801
|
+
var initValidator = /* @__PURE__ */ __name((params) => {
|
|
1802
|
+
if (serviceSingleton3) return serviceSingleton3;
|
|
1803
|
+
serviceSingleton3 = initBlockProducer(params);
|
|
1804
|
+
return serviceSingleton3;
|
|
1805
|
+
}, "initValidator");
|
|
1806
|
+
|
|
1807
|
+
// src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts
|
|
1808
|
+
import { creatable as creatable8 } from "@xylabs/sdk-js";
|
|
1809
|
+
function _ts_decorate8(decorators, target, key, desc) {
|
|
1810
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1811
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1812
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1813
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1814
|
+
}
|
|
1815
|
+
__name(_ts_decorate8, "_ts_decorate");
|
|
1816
|
+
var BaseNetworkStakeStepRewardService = class extends BaseService {
|
|
1817
|
+
static {
|
|
1818
|
+
__name(this, "BaseNetworkStakeStepRewardService");
|
|
1819
|
+
}
|
|
1820
|
+
networkStakeStepRewardAddressHistory(_address) {
|
|
1821
|
+
throw new Error("Method [networkStakeStepRewardAddressHistory] not implemented.");
|
|
1182
1822
|
}
|
|
1183
|
-
|
|
1184
|
-
|
|
1823
|
+
networkStakeStepRewardAddressReward(_context, _address) {
|
|
1824
|
+
throw new Error("Method [networkStakeStepRewardAddressReward] not implemented.");
|
|
1185
1825
|
}
|
|
1186
|
-
|
|
1187
|
-
|
|
1826
|
+
networkStakeStepRewardAddressShare(_context, _address) {
|
|
1827
|
+
throw new Error("Method [networkStakeStepRewardAddressShare] not implemented.");
|
|
1188
1828
|
}
|
|
1189
|
-
|
|
1190
|
-
|
|
1829
|
+
networkStakeStepRewardClaimedByAddress(_address) {
|
|
1830
|
+
throw new Error("Method [networkStakeStepRewardClaimedByAddress] not implemented.");
|
|
1191
1831
|
}
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
return this._pendingTransactionsCount;
|
|
1832
|
+
networkStakeStepRewardForPosition(_position, _range) {
|
|
1833
|
+
throw new Error("Method [networkStakeStepRewardForPosition] not implemented.");
|
|
1195
1834
|
}
|
|
1196
|
-
|
|
1197
|
-
|
|
1835
|
+
networkStakeStepRewardForStep(_context) {
|
|
1836
|
+
throw new Error("Method [networkStakeStepRewardForStep] not implemented.");
|
|
1198
1837
|
}
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
this._curatedPendingBundledTransactionsArchivist = await MemoryArchivist.create({
|
|
1202
|
-
account: "random"
|
|
1203
|
-
});
|
|
1204
|
-
this.pendingBundledTransactionsArchivist.on("inserted", ({ payloads }) => {
|
|
1205
|
-
forget(this.insertNewTransactions(payloads));
|
|
1206
|
-
});
|
|
1207
|
-
this.chainArchivist.on("inserted", ({ payloads }) => {
|
|
1208
|
-
this.markAnyIncludedTransactionsForRemoval(payloads);
|
|
1209
|
-
forget(this.cleanupWorker());
|
|
1210
|
-
});
|
|
1211
|
-
this.rejectedTransactionsArchivist.on("inserted", ({ payloads }) => {
|
|
1212
|
-
this.markAnyIncludedTransactionsForRemoval(payloads);
|
|
1213
|
-
forget(this.cleanupWorker());
|
|
1214
|
-
});
|
|
1215
|
-
const pendingTransactionsCounter = this.meter?.createObservableUpDownCounter("xyo_pending_transactions_counter", {
|
|
1216
|
-
description: "The current number of pending transactions",
|
|
1217
|
-
valueType: ValueType.INT,
|
|
1218
|
-
unit: "1"
|
|
1219
|
-
});
|
|
1220
|
-
pendingTransactionsCounter?.addCallback((observer) => {
|
|
1221
|
-
observer.observe(this.pendingTransactionsCount);
|
|
1222
|
-
});
|
|
1838
|
+
networkStakeStepRewardForStepForPosition(_context, _position) {
|
|
1839
|
+
throw new Error("Method [networkStakeStepRewardForStepForPosition] not implemented.");
|
|
1223
1840
|
}
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
|
|
1227
|
-
let [lastHead] = filterAs(await this.chainArchivist.get([
|
|
1228
|
-
head
|
|
1229
|
-
]), (x) => asBlockBoundWitnessWithHashMeta(x));
|
|
1230
|
-
if (isUndefined2(lastHead)) return [];
|
|
1231
|
-
await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash);
|
|
1232
|
-
const foundPendingTransactions = [];
|
|
1233
|
-
let cursor;
|
|
1234
|
-
while (foundPendingTransactions.length < limit) {
|
|
1235
|
-
const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({
|
|
1236
|
-
limit: 100,
|
|
1237
|
-
order: "asc",
|
|
1238
|
-
cursor
|
|
1239
|
-
});
|
|
1240
|
-
if (pendingBundledTransactions.length === 0) break;
|
|
1241
|
-
cursor = pendingBundledTransactions.at(-1)?._sequence;
|
|
1242
|
-
const undeletedTransactionBundles = pendingBundledTransactions.filter((tx) => !this._removablePendingTransactionHashes.has(tx.root));
|
|
1243
|
-
const transactions = (await Promise.all(undeletedTransactionBundles.map((p) => bundledPayloadToHydratedTransaction(p)))).filter(exists2);
|
|
1244
|
-
const activeTransactions = transactions.filter(isTransactionActive(asXL1BlockNumber(lastHead.block + 1, true)));
|
|
1245
|
-
const txValidationResults = await Promise.all(activeTransactions.map(async (tx) => [
|
|
1246
|
-
tx,
|
|
1247
|
-
await validateTransaction(tx, {
|
|
1248
|
-
chainId: this.chainId
|
|
1249
|
-
}, this.additionalPendingTransactionValidators)
|
|
1250
|
-
]));
|
|
1251
|
-
const validTransactions = txValidationResults.filter(([, errors]) => errors.length === 0).map(([tx]) => tx);
|
|
1252
|
-
const invalidTransactions = txValidationResults.filter(([, errors]) => errors.length > 0).map(([tx]) => tx);
|
|
1253
|
-
if (invalidTransactions.length > 0) {
|
|
1254
|
-
this.logger?.warn(`getPendingTransactions: Found ${invalidTransactions.length} invalid pending transactions`);
|
|
1255
|
-
for (const tx of invalidTransactions) {
|
|
1256
|
-
this.logger?.warn(tx[0]._hash);
|
|
1257
|
-
}
|
|
1258
|
-
}
|
|
1259
|
-
foundPendingTransactions.push(...validTransactions);
|
|
1260
|
-
}
|
|
1261
|
-
if (foundPendingTransactions.length > 0) {
|
|
1262
|
-
this.logger?.log(`getPendingTransactions: Found ${foundPendingTransactions.length} pending transactions`);
|
|
1263
|
-
for (const tx of foundPendingTransactions) {
|
|
1264
|
-
this.logger?.log(tx[0]._hash);
|
|
1265
|
-
}
|
|
1266
|
-
}
|
|
1267
|
-
return foundPendingTransactions;
|
|
1268
|
-
}, _BasePendingTransactionsService.MutexPriority.ReadTransactions);
|
|
1269
|
-
});
|
|
1841
|
+
networkStakeStepRewardPoolRewards(_context) {
|
|
1842
|
+
throw new Error("Method [networkStakeStepRewardPoolRewards] not implemented.");
|
|
1270
1843
|
}
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
const lastHead = await findMostRecentBlock2(this.chainArchivist);
|
|
1274
|
-
if (isDefined4(lastHead)) await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash);
|
|
1275
|
-
}, _BasePendingTransactionsService.MutexPriority.PurgeTransactions);
|
|
1844
|
+
networkStakeStepRewardPoolShares(_context) {
|
|
1845
|
+
throw new Error("Method [networkStakeStepRewardPoolShares] not implemented.");
|
|
1276
1846
|
}
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
await this._countPendingTransactionsMutex.runExclusive(async () => {
|
|
1280
|
-
const payloads = await this._curatedPendingBundledTransactionsArchivist?.all() ?? [];
|
|
1281
|
-
this._pendingTransactionsCount = payloads.length;
|
|
1282
|
-
});
|
|
1847
|
+
networkStakeStepRewardPositionWeight(_context, _position) {
|
|
1848
|
+
throw new Error("Method [networkStakeStepRewardPositionWeight] not implemented.");
|
|
1283
1849
|
}
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
const finalizedTransactions = await this.chainArchivist.get(incomingTransactionHashes);
|
|
1287
|
-
const finalizedTransactionHashes = new Set(finalizedTransactions.map((item) => item._hash));
|
|
1288
|
-
const nonFinalizedTransactions = incomingTransactions.filter((item) => !finalizedTransactionHashes.has(item._hash));
|
|
1289
|
-
return nonFinalizedTransactions;
|
|
1850
|
+
networkStakeStepRewardPotentialPositionLoss(_context, _position) {
|
|
1851
|
+
throw new Error("Method [networkStakeStepRewardPotentialPositionLoss] not implemented.");
|
|
1290
1852
|
}
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
return await this.spanAsync("InsertNewTransactions", async () => {
|
|
1294
|
-
return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
|
|
1295
|
-
const unprocessedTransactions = await this.filterAlreadyFinalizedTransactions(payloads);
|
|
1296
|
-
const hydratedUnprocessedTransactions = (await Promise.all(unprocessedTransactions.map(async (tx) => {
|
|
1297
|
-
return await bundledPayloadToHydratedTransaction(tx);
|
|
1298
|
-
}))).filter(exists2);
|
|
1299
|
-
const validTransactions = await filterAsync(hydratedUnprocessedTransactions, async (tx) => {
|
|
1300
|
-
const errors = await validateTransaction(tx, {
|
|
1301
|
-
chainId: this.chainId
|
|
1302
|
-
}, [
|
|
1303
|
-
TransactionJsonSchemaValidator
|
|
1304
|
-
]);
|
|
1305
|
-
if (errors.length > 0) {
|
|
1306
|
-
this.logger?.warn("validateTransaction", errors);
|
|
1307
|
-
}
|
|
1308
|
-
return errors.length > 0 ? false : true;
|
|
1309
|
-
});
|
|
1310
|
-
if (validTransactions.length > 0) {
|
|
1311
|
-
const bundledTransactions = validTransactions.map((tx) => hydratedTransactionToPayloadBundle(tx));
|
|
1312
|
-
await this.pendingBundledTransactionsLocalArchivist.insert(bundledTransactions);
|
|
1313
|
-
}
|
|
1314
|
-
}, _BasePendingTransactionsService.MutexPriority.InsertNewTransactions);
|
|
1315
|
-
});
|
|
1853
|
+
networkStakeStepRewardRandomizer(_context) {
|
|
1854
|
+
throw new Error("Method [networkStakeStepRewardRandomizer] not implemented.");
|
|
1316
1855
|
}
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
* from being included in the curated pending transactions archivist and from being offered
|
|
1320
|
-
* during the next retrieval of pending transactions.
|
|
1321
|
-
* @param payloads An array of payloads that may contain transactions.
|
|
1322
|
-
*/
|
|
1323
|
-
markAnyIncludedTransactionsForRemoval(payloads) {
|
|
1324
|
-
const hashes = payloads.filter(isTransactionBoundWitnessWithStorageMeta).map((p) => p._hash);
|
|
1325
|
-
for (const hash of hashes) {
|
|
1326
|
-
this._removablePendingTransactionHashes.add(hash);
|
|
1327
|
-
}
|
|
1856
|
+
networkStakeStepRewardStakerCount(_context) {
|
|
1857
|
+
throw new Error("Method [networkStakeStepRewardStakerCount] not implemented.");
|
|
1328
1858
|
}
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
break;
|
|
1344
|
-
}
|
|
1345
|
-
cursor = pendingBundledTransactions.at(-1)?._sequence;
|
|
1346
|
-
const deletedTransactionBundles = pendingBundledTransactions.filter((tx) => this._removablePendingTransactionHashes.has(tx.root));
|
|
1347
|
-
foundPendingTransactionsToDeleteHashes.push(...deletedTransactionBundles.map((tx) => tx._hash).filter(exists2));
|
|
1348
|
-
const undeletedTransactionBundles = pendingBundledTransactions.filter((tx) => !this._removablePendingTransactionHashes.has(tx.root));
|
|
1349
|
-
const transactions = (await Promise.all(undeletedTransactionBundles.map((p) => bundledPayloadToHydratedTransaction(p)))).filter(exists2);
|
|
1350
|
-
const expiredTransactions = transactions.filter(isTransactionExpired(asXL1BlockNumber(lastHead.block + 1, true)));
|
|
1351
|
-
const expiredBundleHashes = expiredTransactions.map((expiredHydratedTx) => (
|
|
1352
|
-
// Find the corresponding payload bundle hash for the expired transaction
|
|
1353
|
-
pendingBundledTransactions.find((bundledTx) => bundledTx.root === expiredHydratedTx[0]._hash)?._hash
|
|
1354
|
-
)).filter(exists2);
|
|
1355
|
-
foundPendingTransactionsToDeleteHashes.push(...expiredBundleHashes);
|
|
1356
|
-
}
|
|
1357
|
-
const deletedHashes = await this.pendingBundledTransactionsLocalArchivist.delete(foundPendingTransactionsToDeleteHashes);
|
|
1358
|
-
for (const payload of deletedHashes) {
|
|
1359
|
-
this._removablePendingTransactionHashes.delete(payload._hash);
|
|
1360
|
-
}
|
|
1361
|
-
if (deletedHashes.length > 0) {
|
|
1362
|
-
this.logger?.log(`foundPendingTransactionsToDeleteHashes: Found ${deletedHashes.length} deletable transactions`);
|
|
1363
|
-
for (const payload of deletedHashes) {
|
|
1364
|
-
this.logger?.log(payload._hash);
|
|
1365
|
-
}
|
|
1366
|
-
}
|
|
1367
|
-
});
|
|
1859
|
+
networkStakeStepRewardUnclaimedByAddress(_address) {
|
|
1860
|
+
throw new Error("Method [networkStakeStepRewardUnclaimedByAddress] not implemented.");
|
|
1861
|
+
}
|
|
1862
|
+
networkStakeStepRewardWeightForAddress(_context, _address) {
|
|
1863
|
+
throw new Error("Method [networkStakeStepRewardWeightForAddress] not implemented.");
|
|
1864
|
+
}
|
|
1865
|
+
networkStakeStepRewardsForPosition(_position, _range) {
|
|
1866
|
+
throw new Error("Method [networkStakeStepRewardsForPosition] not implemented.");
|
|
1867
|
+
}
|
|
1868
|
+
networkStakeStepRewardsForRange(_range) {
|
|
1869
|
+
throw new Error("Method [networkStakeStepRewardsForRange] not implemented.");
|
|
1870
|
+
}
|
|
1871
|
+
networkStakeStepRewardsForStepLevel(_stepLevel, _range) {
|
|
1872
|
+
throw new Error("Method [networkStakeStepRewardsForStepLevel] not implemented.");
|
|
1368
1873
|
}
|
|
1369
1874
|
};
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
],
|
|
1373
|
-
var isTransactionExpired = /* @__PURE__ */ __name((block) => ([txBw]) => txBw.exp < block, "isTransactionExpired");
|
|
1374
|
-
var isTransactionActive = /* @__PURE__ */ __name((block) => ([txBw]) => txBw.nbf <= block && txBw.exp >= block, "isTransactionActive");
|
|
1875
|
+
BaseNetworkStakeStepRewardService = _ts_decorate8([
|
|
1876
|
+
creatable8()
|
|
1877
|
+
], BaseNetworkStakeStepRewardService);
|
|
1375
1878
|
|
|
1376
1879
|
// src/Schemas/BaseSchemasService.ts
|
|
1377
|
-
import { creatable as
|
|
1378
|
-
import { spanRootAsync
|
|
1880
|
+
import { creatable as creatable9 } from "@xylabs/sdk-js";
|
|
1881
|
+
import { spanRootAsync } from "@xylabs/telemetry";
|
|
1379
1882
|
import { schemasSummary } from "@xyo-network/xl1-protocol-sdk";
|
|
1380
|
-
function
|
|
1883
|
+
function _ts_decorate9(decorators, target, key, desc) {
|
|
1381
1884
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1382
1885
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1383
1886
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1384
1887
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1385
1888
|
}
|
|
1386
|
-
__name(
|
|
1889
|
+
__name(_ts_decorate9, "_ts_decorate");
|
|
1387
1890
|
var BaseSchemasService = class extends BaseService {
|
|
1388
1891
|
static {
|
|
1389
1892
|
__name(this, "BaseSchemasService");
|
|
@@ -1394,8 +1897,8 @@ var BaseSchemasService = class extends BaseService {
|
|
|
1394
1897
|
]))[schema] ?? 0;
|
|
1395
1898
|
}
|
|
1396
1899
|
async schemas(head, schemas) {
|
|
1397
|
-
return await
|
|
1398
|
-
const summary = await schemasSummary(this.params.context);
|
|
1900
|
+
return await spanRootAsync("transfers", async () => {
|
|
1901
|
+
const [summary] = await schemasSummary(this.params.context);
|
|
1399
1902
|
const result = {};
|
|
1400
1903
|
for (const schema of schemas) {
|
|
1401
1904
|
const count = summary[schema] ?? 0;
|
|
@@ -1405,8 +1908,8 @@ var BaseSchemasService = class extends BaseService {
|
|
|
1405
1908
|
});
|
|
1406
1909
|
}
|
|
1407
1910
|
};
|
|
1408
|
-
BaseSchemasService =
|
|
1409
|
-
|
|
1911
|
+
BaseSchemasService = _ts_decorate9([
|
|
1912
|
+
creatable9()
|
|
1410
1913
|
], BaseSchemasService);
|
|
1411
1914
|
|
|
1412
1915
|
// src/StakeIntent/lib/getBlockSignedStakeDeclarations.ts
|
|
@@ -1436,21 +1939,21 @@ var mapBoundWitnessToStakeIntentHashes = /* @__PURE__ */ __name((bw) => {
|
|
|
1436
1939
|
}, "mapBoundWitnessToStakeIntentHashes");
|
|
1437
1940
|
|
|
1438
1941
|
// src/StakeIntent/XyoStakeIntentService.ts
|
|
1439
|
-
import { asAddress, assertEx as
|
|
1942
|
+
import { asAddress as asAddress2, assertEx as assertEx19, creatable as creatable10, filterAs as filterAs3, isUndefined as isUndefined3 } from "@xylabs/sdk-js";
|
|
1440
1943
|
import { analyzeChain, ChainStakeIntentAnalyzer, isChainSummaryStakeIntent } from "@xyo-network/chain-analyze";
|
|
1441
1944
|
import { DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS, findFirstMatching, IntervalMap } from "@xyo-network/chain-utils";
|
|
1442
|
-
import { PayloadBuilder as
|
|
1945
|
+
import { PayloadBuilder as PayloadBuilder10 } from "@xyo-network/payload-builder";
|
|
1443
1946
|
import { asBlockBoundWitness as asBlockBoundWitness3, asBlockBoundWitnessWithStorageMeta as asBlockBoundWitnessWithStorageMeta2, asChainStakeIntent as asChainStakeIntent2 } from "@xyo-network/xl1-protocol";
|
|
1444
|
-
import { asChainIndexingServiceStateWithStorageMeta, ChainIndexingServiceStateSchema, isChainIndexingServiceState, readPayloadMapFromStore as readPayloadMapFromStore2, timeBudget } from "@xyo-network/xl1-protocol-sdk";
|
|
1947
|
+
import { asChainIndexingServiceStateWithStorageMeta, ChainIndexingServiceStateSchema, isChainIndexingServiceState, readPayloadMapFromStore as readPayloadMapFromStore2, timeBudget as timeBudget5 } from "@xyo-network/xl1-protocol-sdk";
|
|
1445
1948
|
import { Mutex as Mutex3 } from "async-mutex";
|
|
1446
1949
|
import { LRUCache as LRUCache2 } from "lru-cache";
|
|
1447
|
-
function
|
|
1950
|
+
function _ts_decorate10(decorators, target, key, desc) {
|
|
1448
1951
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1449
1952
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1450
1953
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1451
1954
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1452
1955
|
}
|
|
1453
|
-
__name(
|
|
1956
|
+
__name(_ts_decorate10, "_ts_decorate");
|
|
1454
1957
|
var ACTIVE_STAKE_TTL = 1e3 * 60 * 60 * 2;
|
|
1455
1958
|
var NO_ACTIVE_STAKE_TTL = 1e3 * 2;
|
|
1456
1959
|
var STAKE_CACHE_MAX_ENTRIES = 1e4;
|
|
@@ -1472,36 +1975,41 @@ var XyoStakeIntentService = class extends BaseService {
|
|
|
1472
1975
|
max: STAKE_CACHE_MAX_ENTRIES
|
|
1473
1976
|
});
|
|
1474
1977
|
_updateMutex = new Mutex3();
|
|
1475
|
-
get
|
|
1476
|
-
return
|
|
1978
|
+
get blockViewer() {
|
|
1979
|
+
return this.params.blockViewer;
|
|
1477
1980
|
}
|
|
1478
|
-
get
|
|
1479
|
-
return
|
|
1981
|
+
get chainArchivist() {
|
|
1982
|
+
return assertEx19(this.params.chainArchivist, () => "chainArchivist not set");
|
|
1480
1983
|
}
|
|
1481
1984
|
get chainStakeViewer() {
|
|
1482
|
-
return
|
|
1985
|
+
return assertEx19(this.params.chainStakeViewer, () => "chainStakeViewer not set");
|
|
1483
1986
|
}
|
|
1484
1987
|
get stakeIntentStateArchivist() {
|
|
1485
|
-
return
|
|
1988
|
+
return assertEx19(this.params.stakeIntentStateArchivist, () => "stakeIntentStateArchivist not set");
|
|
1989
|
+
}
|
|
1990
|
+
static async paramsHandler(params) {
|
|
1991
|
+
return {
|
|
1992
|
+
...await super.paramsHandler(params),
|
|
1993
|
+
blockViewer: assertEx19(params?.blockViewer, () => "blockViewer is required"),
|
|
1994
|
+
chainArchivist: assertEx19(params?.chainArchivist, () => "chainArchivist is required"),
|
|
1995
|
+
chainStakeViewer: assertEx19(params?.chainStakeViewer, () => "chainStakeViewer is required"),
|
|
1996
|
+
stakeIntentStateArchivist: assertEx19(params?.stakeIntentStateArchivist, () => "stakeIntentStateArchivist is required")
|
|
1997
|
+
};
|
|
1486
1998
|
}
|
|
1487
1999
|
async createHandler() {
|
|
1488
|
-
this.
|
|
1489
|
-
await this.updateIndex();
|
|
1490
|
-
});
|
|
1491
|
-
const head = await this.chainIterator.head();
|
|
2000
|
+
const head = await this.blockViewer.currentBlock();
|
|
1492
2001
|
if (isUndefined3(head)) return;
|
|
1493
|
-
|
|
1494
|
-
await this.recoverState(headHash);
|
|
2002
|
+
await this.recoverState(head[0]._hash);
|
|
1495
2003
|
}
|
|
1496
2004
|
async getDeclaredCandidateRanges(address, intent) {
|
|
1497
2005
|
await Promise.resolve();
|
|
1498
|
-
|
|
2006
|
+
assertEx19(intent === "producer", () => `Support not yet added for intent ${intent}`);
|
|
1499
2007
|
const results = this._producers.get(address);
|
|
1500
2008
|
return results ?? [];
|
|
1501
2009
|
}
|
|
1502
2010
|
async getDeclaredCandidatesForBlock(block, intent) {
|
|
1503
2011
|
return await this.spanAsync("getDeclaredCandidatesForBlock", async () => {
|
|
1504
|
-
|
|
2012
|
+
assertEx19(intent === "producer", () => `Support not yet added for intent ${intent}`);
|
|
1505
2013
|
const results = this._producers.findAllContaining(block);
|
|
1506
2014
|
const candidates = [
|
|
1507
2015
|
...results
|
|
@@ -1555,7 +2063,7 @@ var XyoStakeIntentService = class extends BaseService {
|
|
|
1555
2063
|
}
|
|
1556
2064
|
async persistState(current) {
|
|
1557
2065
|
const state = this._producers.serialize();
|
|
1558
|
-
const payload = new
|
|
2066
|
+
const payload = new PayloadBuilder10({
|
|
1559
2067
|
schema: ChainIndexingServiceStateSchema
|
|
1560
2068
|
}).fields({
|
|
1561
2069
|
endBlockHash: current,
|
|
@@ -1566,8 +2074,8 @@ var XyoStakeIntentService = class extends BaseService {
|
|
|
1566
2074
|
]);
|
|
1567
2075
|
}
|
|
1568
2076
|
async recoverState(current) {
|
|
1569
|
-
return await
|
|
1570
|
-
const currentBlock =
|
|
2077
|
+
return await timeBudget5("XyoStakeIntentService.recoverState", console, async () => {
|
|
2078
|
+
const currentBlock = assertEx19(asBlockBoundWitness3((await this.chainArchivist.get([
|
|
1571
2079
|
current
|
|
1572
2080
|
]))?.[0]), () => `Block ${current} not found`);
|
|
1573
2081
|
const currentBlockNum = currentBlock.block;
|
|
@@ -1607,9 +2115,9 @@ var XyoStakeIntentService = class extends BaseService {
|
|
|
1607
2115
|
}
|
|
1608
2116
|
await this._updateMutex.runExclusive(async () => {
|
|
1609
2117
|
return await this.spanAsync("updateIndex", async () => {
|
|
1610
|
-
const currentHead = await this.
|
|
2118
|
+
const currentHead = (await this.blockViewer.currentBlock())[0];
|
|
1611
2119
|
if (isUndefined3(currentHead)) return;
|
|
1612
|
-
return await
|
|
2120
|
+
return await timeBudget5("XyoStakeIntentService.updateIndex", console, async () => {
|
|
1613
2121
|
const currentHeadHash = currentHead._hash;
|
|
1614
2122
|
const chainMap = readPayloadMapFromStore2(this.chainArchivist);
|
|
1615
2123
|
const result = await analyzeChain({
|
|
@@ -1625,7 +2133,7 @@ var XyoStakeIntentService = class extends BaseService {
|
|
|
1625
2133
|
const { exp, nbf } = signedDeclaration;
|
|
1626
2134
|
const start = nbf;
|
|
1627
2135
|
const stop = exp;
|
|
1628
|
-
const address =
|
|
2136
|
+
const address = asAddress2(signedDeclaration?.from);
|
|
1629
2137
|
if (start !== void 0 && stop !== void 0 && address !== void 0) {
|
|
1630
2138
|
this._producers.insert(address, start, stop);
|
|
1631
2139
|
}
|
|
@@ -1636,87 +2144,35 @@ var XyoStakeIntentService = class extends BaseService {
|
|
|
1636
2144
|
});
|
|
1637
2145
|
}
|
|
1638
2146
|
};
|
|
1639
|
-
XyoStakeIntentService =
|
|
1640
|
-
|
|
2147
|
+
XyoStakeIntentService = _ts_decorate10([
|
|
2148
|
+
creatable10()
|
|
1641
2149
|
], XyoStakeIntentService);
|
|
1642
2150
|
|
|
1643
2151
|
// src/StepStake/BaseStepStakeService.ts
|
|
1644
|
-
import { creatable as
|
|
1645
|
-
function
|
|
2152
|
+
import { creatable as creatable11 } from "@xylabs/sdk-js";
|
|
2153
|
+
function _ts_decorate11(decorators, target, key, desc) {
|
|
1646
2154
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1647
2155
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1648
2156
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1649
2157
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1650
2158
|
}
|
|
1651
|
-
__name(
|
|
2159
|
+
__name(_ts_decorate11, "_ts_decorate");
|
|
1652
2160
|
var BaseStepStakeService = class extends BaseService {
|
|
1653
2161
|
static {
|
|
1654
2162
|
__name(this, "BaseStepStakeService");
|
|
1655
2163
|
}
|
|
1656
2164
|
stepStake(_step) {
|
|
1657
|
-
throw new Error("Method not implemented.");
|
|
2165
|
+
throw new Error("Method [stepStake] not implemented.");
|
|
1658
2166
|
}
|
|
1659
2167
|
stepStakeForAddress(_address, _step) {
|
|
1660
|
-
throw new Error("Method not implemented.");
|
|
2168
|
+
throw new Error("Method [stepStakeForAddress] not implemented.");
|
|
1661
2169
|
}
|
|
1662
2170
|
};
|
|
1663
|
-
BaseStepStakeService =
|
|
1664
|
-
|
|
2171
|
+
BaseStepStakeService = _ts_decorate11([
|
|
2172
|
+
creatable11()
|
|
1665
2173
|
], BaseStepStakeService);
|
|
1666
|
-
|
|
1667
|
-
// src/Time/BaseTimeSyncService.ts
|
|
1668
|
-
import { creatable as creatable15 } from "@xylabs/sdk-js";
|
|
1669
|
-
import { SimpleTimeSyncViewer } from "@xyo-network/xl1-protocol-sdk";
|
|
1670
|
-
function _ts_decorate15(decorators, target, key, desc) {
|
|
1671
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1672
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1673
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1674
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1675
|
-
}
|
|
1676
|
-
__name(_ts_decorate15, "_ts_decorate");
|
|
1677
|
-
var BaseTimeSyncService = class extends BaseService {
|
|
1678
|
-
static {
|
|
1679
|
-
__name(this, "BaseTimeSyncService");
|
|
1680
|
-
}
|
|
1681
|
-
timeSyncViewer;
|
|
1682
|
-
get chainArchivist() {
|
|
1683
|
-
return this.params.chainArchivist;
|
|
1684
|
-
}
|
|
1685
|
-
get chainIterator() {
|
|
1686
|
-
return this.params.chainIterator;
|
|
1687
|
-
}
|
|
1688
|
-
get ethProvider() {
|
|
1689
|
-
return this.params.ethProvider;
|
|
1690
|
-
}
|
|
1691
|
-
async convertTime(fromDomain, toDomain, from) {
|
|
1692
|
-
return await this.timeSyncViewer.convertTime(fromDomain, toDomain, from);
|
|
1693
|
-
}
|
|
1694
|
-
async createHandler() {
|
|
1695
|
-
await super.createHandler();
|
|
1696
|
-
const blockViewer = blockViewerFromChainIteratorAndArchivist(this.chainIterator, this.chainArchivist);
|
|
1697
|
-
this.timeSyncViewer = new SimpleTimeSyncViewer(blockViewer, this.ethProvider);
|
|
1698
|
-
}
|
|
1699
|
-
async currentTime(domain) {
|
|
1700
|
-
return await this.timeSyncViewer.currentTime(domain);
|
|
1701
|
-
}
|
|
1702
|
-
async currentTimeAndHash(domain) {
|
|
1703
|
-
return await this.timeSyncViewer.currentTimeAndHash(domain);
|
|
1704
|
-
}
|
|
1705
|
-
async currentTimePayload() {
|
|
1706
|
-
return await this.timeSyncViewer.currentTimePayload();
|
|
1707
|
-
}
|
|
1708
|
-
};
|
|
1709
|
-
BaseTimeSyncService = _ts_decorate15([
|
|
1710
|
-
creatable15()
|
|
1711
|
-
], BaseTimeSyncService);
|
|
1712
2174
|
export {
|
|
1713
|
-
BaseAccountBalanceService,
|
|
1714
|
-
BaseAccountBalanceServiceParamsZod,
|
|
1715
|
-
BaseAccountTransfersService,
|
|
1716
2175
|
BaseAccountableService,
|
|
1717
|
-
BaseBlockProducerService,
|
|
1718
|
-
BaseBlockProducerServiceParamsZod,
|
|
1719
|
-
BaseBlockRewardService,
|
|
1720
2176
|
BaseElectionService,
|
|
1721
2177
|
BaseNetworkStakeStepRewardService,
|
|
1722
2178
|
BasePendingTransactionsService,
|
|
@@ -1726,17 +2182,34 @@ export {
|
|
|
1726
2182
|
BaseTimeSyncService,
|
|
1727
2183
|
ChainBlockNumberIterationService,
|
|
1728
2184
|
DEFAULT_BLOCK_SIZE,
|
|
1729
|
-
|
|
2185
|
+
EvmBlockRewardViewer,
|
|
1730
2186
|
EvmChainService,
|
|
1731
|
-
MemoryBlockRewardService,
|
|
1732
2187
|
MemoryChainService,
|
|
2188
|
+
SimpleBlockRunner,
|
|
2189
|
+
SimpleBlockRunnerParamsZod,
|
|
1733
2190
|
XYO_PRODUCER_REDECLARATION_DURATION,
|
|
1734
2191
|
XYO_PRODUCER_REDECLARATION_WINDOW,
|
|
1735
2192
|
XyoStakeIntentService,
|
|
1736
2193
|
XyoValidator,
|
|
1737
|
-
|
|
2194
|
+
accountBalancesViewerFromArchivist,
|
|
1738
2195
|
blockViewerFromChainIteratorAndArchivist,
|
|
2196
|
+
canUseEvmProvider,
|
|
1739
2197
|
creatableService,
|
|
1740
|
-
getBlockSignedStakeDeclarations
|
|
2198
|
+
getBlockSignedStakeDeclarations,
|
|
2199
|
+
initAccountBalanceService,
|
|
2200
|
+
initBlockProducer,
|
|
2201
|
+
initBlockRewardViewer,
|
|
2202
|
+
initBlockViewer,
|
|
2203
|
+
initChainService,
|
|
2204
|
+
initEvmBlockRewardViewer,
|
|
2205
|
+
initEvmProvider,
|
|
2206
|
+
initHead,
|
|
2207
|
+
initMemoryChainService,
|
|
2208
|
+
initMempoolRunner,
|
|
2209
|
+
initMempoolViewer,
|
|
2210
|
+
initPendingTransactions,
|
|
2211
|
+
initTimeService,
|
|
2212
|
+
initValidator,
|
|
2213
|
+
initXyoBlockRewardViewer
|
|
1741
2214
|
};
|
|
1742
2215
|
//# sourceMappingURL=index.mjs.map
|