@xyo-network/chain-services 1.17.0 → 1.17.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/neutral/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 +4 -2
- package/dist/neutral/ChainBlockNumberIteration/ChainBlockNumberIterationService.d.ts.map +1 -1
- package/dist/neutral/ChainService/Evm/Evm.d.ts +2 -1
- package/dist/neutral/ChainService/Evm/Evm.d.ts.map +1 -1
- package/dist/neutral/ChainService/Memory/Memory.d.ts +2 -0
- package/dist/neutral/ChainService/Memory/Memory.d.ts.map +1 -1
- package/dist/neutral/ChainValidator/XyoValidator.d.ts +2 -16
- package/dist/neutral/ChainValidator/XyoValidator.d.ts.map +1 -1
- package/dist/neutral/PendingTransactions/BasePendingTransactions.d.ts +7 -6
- package/dist/neutral/PendingTransactions/BasePendingTransactions.d.ts.map +1 -1
- package/dist/neutral/StakeIntent/XyoStakeIntentService.d.ts +5 -4
- package/dist/neutral/StakeIntent/XyoStakeIntentService.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 +1565 -1140
- 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 +32 -29
- package/src/AccountBalance/accountBalanceServiceFromArchivist.ts +35 -8
- 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 +14 -2
- package/src/ChainService/Evm/Evm.ts +5 -4
- package/src/ChainService/Memory/Memory.ts +5 -0
- package/src/ChainValidator/XyoValidator.ts +25 -30
- package/src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts +18 -18
- package/src/PendingTransactions/BasePendingTransactions.ts +10 -5
- package/src/Schemas/BaseSchemasService.ts +1 -1
- package/src/StakeIntent/XyoStakeIntentService.ts +18 -8
- package/src/StepStake/BaseStepStakeService.ts +2 -2
- package/src/blockViewerFromChainIteratorAndArchivist.ts +8 -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 -35
- 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 -98
- 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,21 +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
|
|
5
|
+
import { assertEx } from "@xylabs/sdk-js";
|
|
6
6
|
import { StepSizes } from "@xyo-network/xl1-protocol";
|
|
7
|
-
import { findMostRecentBlock, LruCacheMap, readPayloadMapFromStore } from "@xyo-network/xl1-protocol-sdk";
|
|
7
|
+
import { findMostRecentBlock, LruCacheMap, readPayloadMapFromStore, SimpleAccountBalanceViewer, SimpleBlockViewer } from "@xyo-network/xl1-protocol-sdk";
|
|
8
8
|
import { Semaphore } from "async-mutex";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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");
|
|
16
62
|
|
|
17
63
|
// src/BaseService.ts
|
|
18
64
|
import { AbstractCreatable, creatable } from "@xylabs/sdk-js";
|
|
19
|
-
import { spanRoot, spanRootAsync } from "@xylabs/telemetry";
|
|
20
65
|
import { Mutex } from "async-mutex";
|
|
21
66
|
function _ts_decorate(decorators, target, key, desc) {
|
|
22
67
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -39,15 +84,6 @@ var BaseService = class extends AbstractCreatable {
|
|
|
39
84
|
return await this.create(params);
|
|
40
85
|
});
|
|
41
86
|
}
|
|
42
|
-
paramsHandler(params) {
|
|
43
|
-
return params;
|
|
44
|
-
}
|
|
45
|
-
span(name, fn) {
|
|
46
|
-
return spanRoot(name, fn, this.tracer);
|
|
47
|
-
}
|
|
48
|
-
async spanAsync(name, fn) {
|
|
49
|
-
return await spanRootAsync(name, fn, this.tracer);
|
|
50
|
-
}
|
|
51
87
|
};
|
|
52
88
|
BaseService = _ts_decorate([
|
|
53
89
|
creatable()
|
|
@@ -64,7 +100,10 @@ function creatableService() {
|
|
|
64
100
|
}
|
|
65
101
|
__name(creatableService, "creatableService");
|
|
66
102
|
|
|
67
|
-
// 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";
|
|
68
107
|
function _ts_decorate2(decorators, target, key, desc) {
|
|
69
108
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
70
109
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -72,801 +111,293 @@ function _ts_decorate2(decorators, target, key, desc) {
|
|
|
72
111
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
73
112
|
}
|
|
74
113
|
__name(_ts_decorate2, "_ts_decorate");
|
|
75
|
-
var
|
|
76
|
-
blockViewer: z.object().loose(),
|
|
77
|
-
chainArchivist: z.object().loose(),
|
|
78
|
-
chainIterator: z.object().loose(),
|
|
79
|
-
context: z.object().loose(),
|
|
80
|
-
transferContext: z.object().loose()
|
|
81
|
-
});
|
|
82
|
-
var BaseAccountBalanceService = class extends BaseService {
|
|
114
|
+
var EvmBlockRewardViewer = class extends AbstractCreatable2 {
|
|
83
115
|
static {
|
|
84
|
-
__name(this, "
|
|
85
|
-
}
|
|
86
|
-
accountBalanceViewer;
|
|
87
|
-
get blockViewer() {
|
|
88
|
-
return assertEx(this.params.blockViewer, () => "BlockViewer has not been initialized yet");
|
|
89
|
-
}
|
|
90
|
-
static async paramsHandler(params) {
|
|
91
|
-
BaseAccountBalanceServiceParamsZod.parse(params);
|
|
92
|
-
assertEx(params?.context?.head, () => "BalanceStepSummaryContext is required in BaseAccountBalanceServiceParams");
|
|
93
|
-
return {
|
|
94
|
-
...await super.paramsHandler(params),
|
|
95
|
-
...params
|
|
96
|
-
};
|
|
116
|
+
__name(this, "EvmBlockRewardViewer");
|
|
97
117
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
], headOrRange);
|
|
102
|
-
return balances[address] ?? AttoXL1(0n);
|
|
118
|
+
_contractAddress;
|
|
119
|
+
get chainContractViewer() {
|
|
120
|
+
return assertEx2(this.params.chainContractViewer, () => "chainContractViewer is required");
|
|
103
121
|
}
|
|
104
|
-
|
|
105
|
-
|
|
122
|
+
get contractAddress() {
|
|
123
|
+
return assertEx2(this._contractAddress, () => "contractAddress is required");
|
|
106
124
|
}
|
|
107
|
-
|
|
108
|
-
return
|
|
109
|
-
const context = {
|
|
110
|
-
head: this.params.context.head,
|
|
111
|
-
stepSemaphores: this.params.context.stepSemaphores,
|
|
112
|
-
store: this.params.context.store,
|
|
113
|
-
chainId: this.params.context.chainId,
|
|
114
|
-
summaryMap: this.params.context.summaryMap
|
|
115
|
-
};
|
|
116
|
-
const summary = await balancesSummary(context);
|
|
117
|
-
const result = {};
|
|
118
|
-
for (const addr of address) {
|
|
119
|
-
const summaryBalance = summary[addr] ?? 0n;
|
|
120
|
-
result[addr] = AttoXL1(summaryBalance < 0n ? 0n : summaryBalance);
|
|
121
|
-
}
|
|
122
|
-
return result;
|
|
123
|
-
});
|
|
125
|
+
get provider() {
|
|
126
|
+
return assertEx2(this.params.provider, () => "provider is required");
|
|
124
127
|
}
|
|
125
|
-
|
|
126
|
-
|
|
128
|
+
async allowedRewardForBlock(blockNumber) {
|
|
129
|
+
const contract = XyoChainRewardsFactory.connect(toEthAddress(this.contractAddress), this.provider);
|
|
130
|
+
return asAttoXL1(await contract.calcBlockReward(blockNumber));
|
|
127
131
|
}
|
|
128
132
|
async createHandler() {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
};
|
|
136
|
-
BaseAccountBalanceService = _ts_decorate2([
|
|
137
|
-
creatable2()
|
|
138
|
-
], BaseAccountBalanceService);
|
|
139
|
-
|
|
140
|
-
// src/AccountBalance/accountBalanceServiceFromArchivist.ts
|
|
141
|
-
var accountBalancesServiceFromArchivist = /* @__PURE__ */ __name(async (chainId, archivist) => {
|
|
142
|
-
const summaryMap = new LruCacheMap({
|
|
143
|
-
max: 1e5,
|
|
144
|
-
allowStale: true,
|
|
145
|
-
noDisposeOnSet: false,
|
|
146
|
-
updateAgeOnGet: true
|
|
147
|
-
});
|
|
148
|
-
const chainMap = readPayloadMapFromStore(archivist);
|
|
149
|
-
const headFunc = /* @__PURE__ */ __name(async () => {
|
|
150
|
-
const head = await findMostRecentBlock(archivist);
|
|
151
|
-
return [
|
|
152
|
-
assertEx2(head?._hash, () => "No head found in chainArchivist"),
|
|
153
|
-
assertEx2(head?.block, () => "No head found in chainArchivist")
|
|
154
|
-
];
|
|
155
|
-
}, "headFunc");
|
|
156
|
-
const service = await BaseAccountBalanceService.create({
|
|
157
|
-
context: {
|
|
158
|
-
chainId,
|
|
159
|
-
store: {
|
|
160
|
-
chainMap
|
|
161
|
-
},
|
|
162
|
-
stepSemaphores: StepSizes.map(() => new Semaphore(20)),
|
|
163
|
-
summaryMap,
|
|
164
|
-
head: headFunc
|
|
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}`);
|
|
165
139
|
}
|
|
166
|
-
});
|
|
167
|
-
return service;
|
|
168
|
-
}, "accountBalancesServiceFromArchivist");
|
|
169
|
-
|
|
170
|
-
// src/AccountTransfers/BaseAccountTransfersService.ts
|
|
171
|
-
import { creatable as creatable3 } from "@xylabs/sdk-js";
|
|
172
|
-
import { spanRootAsync as spanRootAsync3 } from "@xylabs/telemetry";
|
|
173
|
-
import { AttoXL1 as AttoXL12 } from "@xyo-network/xl1-protocol";
|
|
174
|
-
import { transfersSummary } from "@xyo-network/xl1-protocol-sdk";
|
|
175
|
-
function _ts_decorate3(decorators, target, key, desc) {
|
|
176
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
177
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
178
|
-
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;
|
|
179
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
180
|
-
}
|
|
181
|
-
__name(_ts_decorate3, "_ts_decorate");
|
|
182
|
-
var BaseAccountTransfersService = class extends BaseService {
|
|
183
|
-
static {
|
|
184
|
-
__name(this, "BaseAccountTransfersService");
|
|
185
|
-
}
|
|
186
|
-
async transfer(head, address) {
|
|
187
|
-
return (await this.transfers(head, [
|
|
188
|
-
address
|
|
189
|
-
]))[address] ?? AttoXL12(0n);
|
|
190
|
-
}
|
|
191
|
-
async transfers(head, addresses) {
|
|
192
|
-
return await spanRootAsync3("transfers", async () => {
|
|
193
|
-
const summary = await transfersSummary(this.params.context);
|
|
194
|
-
const result = {};
|
|
195
|
-
for (const addr of addresses) {
|
|
196
|
-
const summaryBalance = summary[addr] ?? 0n;
|
|
197
|
-
result[addr] = AttoXL12(summaryBalance);
|
|
198
|
-
}
|
|
199
|
-
return result;
|
|
200
|
-
});
|
|
201
140
|
}
|
|
202
141
|
};
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
],
|
|
206
|
-
|
|
207
|
-
// src/BlockProducer/BaseBlockProducerService.ts
|
|
208
|
-
import { AddressZod, asHash, assertEx as assertEx4, creatable as creatable4, exists, hexToBigInt, isDefined, toHex } from "@xylabs/sdk-js";
|
|
209
|
-
import { FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema } from "@xyo-network/chain-modules";
|
|
210
|
-
import { buildNextBlock, createDeclarationIntent } from "@xyo-network/chain-protocol";
|
|
211
|
-
import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
|
|
212
|
-
import { asBlockBoundWitness, AttoXL1 as AttoXL13, BlockNumberSchema, defaultRewardRatio, TimeSchema, XYO_STEP_REWARD_ADDRESS } from "@xyo-network/xl1-protocol";
|
|
213
|
-
import z2 from "zod";
|
|
142
|
+
EvmBlockRewardViewer = _ts_decorate2([
|
|
143
|
+
creatable2()
|
|
144
|
+
], EvmBlockRewardViewer);
|
|
214
145
|
|
|
215
|
-
// src/
|
|
216
|
-
import {
|
|
217
|
-
import { assertEx as assertEx3 } from "@xylabs/sdk-js";
|
|
146
|
+
// src/blockViewerFromChainIteratorAndArchivist.ts
|
|
147
|
+
import { isDefined } from "@xylabs/sdk-js";
|
|
218
148
|
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
219
|
-
import {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
async function
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
const txGasCosts = {};
|
|
234
|
-
for (const tx of txs) {
|
|
235
|
-
const requiredGas = transactionRequiredGas(tx.data);
|
|
236
|
-
const totalGasCost = requiredGas * tx.fees.gasPrice;
|
|
237
|
-
txGasCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n) + totalGasCost;
|
|
238
|
-
}
|
|
239
|
-
const payloads = Object.entries(txBaseFeeCosts).map(([from, amount]) => {
|
|
240
|
-
const payload = {
|
|
241
|
-
schema: TransferSchema,
|
|
242
|
-
epoch: Date.now(),
|
|
243
|
-
from,
|
|
244
|
-
transfers: {
|
|
245
|
-
// burn the base fee
|
|
246
|
-
[XYO_ZERO_ADDRESS]: hexFromBigInt(amount)
|
|
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
|
+
];
|
|
247
163
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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;
|
|
256
222
|
}
|
|
257
|
-
__name(
|
|
223
|
+
__name(blockViewerFromChainIteratorAndArchivist, "blockViewerFromChainIteratorAndArchivist");
|
|
258
224
|
|
|
259
|
-
// src/
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
__name(_ts_decorate4, "_ts_decorate");
|
|
267
|
-
var DEFAULT_BLOCK_SIZE = 10;
|
|
268
|
-
var XYO_PRODUCER_REDECLARATION_DURATION = 1e4;
|
|
269
|
-
var XYO_PRODUCER_REDECLARATION_WINDOW = 500;
|
|
270
|
-
var BaseBlockProducerServiceParamsZod = z2.object({
|
|
271
|
-
balanceService: z2.object().loose(),
|
|
272
|
-
pendingTransactionsService: z2.object().loose(),
|
|
273
|
-
rejectedTransactionsArchivist: z2.object().loose(),
|
|
274
|
-
rewardAddress: AddressZod,
|
|
275
|
-
time: z2.object().loose()
|
|
276
|
-
});
|
|
277
|
-
var BaseBlockProducerService = class _BaseBlockProducerService extends BaseService {
|
|
225
|
+
// src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts
|
|
226
|
+
import { assertEx as assertEx3, isDefined as isDefined2, isNull, isUndefined } from "@xylabs/sdk-js";
|
|
227
|
+
import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
|
|
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 {
|
|
278
232
|
static {
|
|
279
|
-
__name(this, "
|
|
280
|
-
}
|
|
281
|
-
_blockRewardDiviner;
|
|
282
|
-
/**
|
|
283
|
-
* The default block size for a block
|
|
284
|
-
*/
|
|
285
|
-
static get DefaultBlockSize() {
|
|
286
|
-
return DEFAULT_BLOCK_SIZE;
|
|
233
|
+
__name(this, "ChainBlockNumberIterationService");
|
|
287
234
|
}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
return
|
|
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");
|
|
294
241
|
}
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
* their intent to continue producing blocks
|
|
298
|
-
*/
|
|
299
|
-
static get RedeclarationWindow() {
|
|
300
|
-
return XYO_PRODUCER_REDECLARATION_WINDOW;
|
|
242
|
+
get chainMap() {
|
|
243
|
+
return assertEx3(this.params.chainMap);
|
|
301
244
|
}
|
|
302
|
-
get
|
|
303
|
-
return
|
|
245
|
+
get chainStoreRead() {
|
|
246
|
+
return {
|
|
247
|
+
chainMap: this.chainMap
|
|
248
|
+
};
|
|
304
249
|
}
|
|
305
|
-
|
|
306
|
-
return
|
|
307
|
-
}
|
|
308
|
-
get balanceService() {
|
|
309
|
-
return assertEx4(this.params.balanceService, () => "balanceService is required");
|
|
310
|
-
}
|
|
311
|
-
get blockViewer() {
|
|
312
|
-
return assertEx4(this.params.blockViewer, () => "blockViewer is required");
|
|
313
|
-
}
|
|
314
|
-
get chainId() {
|
|
315
|
-
return assertEx4(this.params.chainId, () => "chainId is required");
|
|
316
|
-
}
|
|
317
|
-
get electionService() {
|
|
318
|
-
return assertEx4(this.params.electionService, () => "electionService is required");
|
|
319
|
-
}
|
|
320
|
-
get pendingTransactionsService() {
|
|
321
|
-
return assertEx4(this.params.pendingTransactionsService, () => "Missing pendingTransactionsService");
|
|
322
|
-
}
|
|
323
|
-
get rejectedTransactionsArchivist() {
|
|
324
|
-
return assertEx4(this.params.rejectedTransactionsArchivist, () => "No rejected bundled transactions archivist");
|
|
250
|
+
async blockByHash(hash) {
|
|
251
|
+
return asSignedHydratedBlockWithHashMeta(await hydrateBlock(this.chainStoreRead, hash)) ?? null;
|
|
325
252
|
}
|
|
326
|
-
|
|
327
|
-
return
|
|
253
|
+
async blockByNumber(block) {
|
|
254
|
+
return asSignedHydratedBlockWithHashMeta(await this.get(block)) ?? null;
|
|
328
255
|
}
|
|
329
|
-
|
|
330
|
-
|
|
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;
|
|
331
266
|
}
|
|
332
|
-
|
|
333
|
-
|
|
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;
|
|
334
277
|
}
|
|
335
|
-
|
|
336
|
-
return
|
|
278
|
+
async currentBlock() {
|
|
279
|
+
return assertEx3(await this.blockByHash(await this.currentBlockHash()), () => "Current block not found");
|
|
337
280
|
}
|
|
338
|
-
|
|
339
|
-
|
|
281
|
+
async currentBlockHash() {
|
|
282
|
+
const head = assertEx3(await this.head(), () => "Head is not set");
|
|
283
|
+
return head._hash;
|
|
340
284
|
}
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
return
|
|
344
|
-
...await super.paramsHandler(params),
|
|
345
|
-
...params
|
|
346
|
-
};
|
|
285
|
+
async currentBlockNumber() {
|
|
286
|
+
const head = assertEx3(await this.head(), () => "Head is not set");
|
|
287
|
+
return head.block;
|
|
347
288
|
}
|
|
348
|
-
async
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
const
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
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
|
+
}
|
|
355
308
|
}
|
|
356
|
-
|
|
357
|
-
return this.proposeNextValidBlock(head);
|
|
309
|
+
throw new Error(`Block not found: ${block}`);
|
|
358
310
|
}
|
|
359
|
-
async
|
|
360
|
-
if (
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
rewardAddress: this.rewardAddress,
|
|
366
|
-
rewardPercentageRatio: defaultRewardRatio,
|
|
367
|
-
schema: FixedPercentageBlockRewardDivinerConfigSchema
|
|
368
|
-
}
|
|
369
|
-
});
|
|
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;
|
|
370
317
|
}
|
|
371
|
-
|
|
372
|
-
const blockId = new PayloadBuilder2({
|
|
373
|
-
schema: BlockNumberSchema
|
|
374
|
-
}).fields({
|
|
375
|
-
block: blockHex
|
|
376
|
-
}).build();
|
|
377
|
-
const rewards = await this._blockRewardDiviner.divine([
|
|
378
|
-
blockId
|
|
379
|
-
]);
|
|
380
|
-
return rewards;
|
|
318
|
+
throw new Error("Head is not set");
|
|
381
319
|
}
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
*/
|
|
387
|
-
async getProducerRedeclaration(head) {
|
|
388
|
-
if (this.params.config.producer.disableIntentRedeclaration) return;
|
|
389
|
-
const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.address, "producer");
|
|
390
|
-
const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1);
|
|
391
|
-
if (!lastRange) return;
|
|
392
|
-
const [, currentDeclarationEnd] = lastRange;
|
|
393
|
-
const currentBlock = head.block;
|
|
394
|
-
const timeToProducerExpiration = currentDeclarationEnd - currentBlock;
|
|
395
|
-
if (timeToProducerExpiration > _BaseBlockProducerService.RedeclarationWindow) return;
|
|
396
|
-
return createDeclarationIntent(this.address, "producer", currentBlock, currentBlock + _BaseBlockProducerService.RedeclarationDuration);
|
|
320
|
+
async next(block) {
|
|
321
|
+
const currentBlock = block;
|
|
322
|
+
const nextBlockNumber = currentBlock + 1;
|
|
323
|
+
return await this.get(nextBlockNumber);
|
|
397
324
|
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
const { block: previousBlock } = assertEx4(asBlockBoundWitness(head), () => "Invalid head block");
|
|
401
|
-
const nextBlock = previousBlock + 1;
|
|
402
|
-
const nextBlockTransactionsStart = Date.now();
|
|
403
|
-
const nextBlockTransactions = await this.pendingTransactionsService.pendingTransactions({
|
|
404
|
-
limit: _BaseBlockProducerService.DefaultBlockSize
|
|
405
|
-
});
|
|
406
|
-
const nextBlockTransactionsDuration = Date.now() - nextBlockTransactionsStart;
|
|
407
|
-
if (nextBlockTransactionsDuration > 200) {
|
|
408
|
-
this.logger?.warn(`[Slow] Fetched ${nextBlockTransactions.length} pending transactions in ${nextBlockTransactionsDuration}ms}`);
|
|
409
|
-
}
|
|
410
|
-
const blockPayloads = [];
|
|
411
|
-
const producerRedeclarationPayload = await this.getProducerRedeclaration(head);
|
|
412
|
-
if (producerRedeclarationPayload) blockPayloads.push(producerRedeclarationPayload);
|
|
413
|
-
if (blockPayloads.length === 0 && nextBlockTransactions.length === 0 && !this.heartbeatRequired(head)) return;
|
|
414
|
-
const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock);
|
|
415
|
-
blockPayloads.push(...rewardTransferPayloads);
|
|
416
|
-
const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions);
|
|
417
|
-
const timeStart = Date.now();
|
|
418
|
-
const timePayload = await this.generateTimePayload(head);
|
|
419
|
-
const timeDuration = Date.now() - timeStart;
|
|
420
|
-
if (timeDuration > 100) {
|
|
421
|
-
this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`);
|
|
422
|
-
}
|
|
423
|
-
const [fundedNextBlockTransactions, fundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances);
|
|
424
|
-
blockPayloads.push(...fundedTransfers, timePayload);
|
|
425
|
-
this.logger?.info(`Building block ${head.block + 1}`);
|
|
426
|
-
const startBuild = Date.now();
|
|
427
|
-
const stepRewardPoolBalance = (await this.balanceService.accountsBalances([
|
|
428
|
-
XYO_STEP_REWARD_ADDRESS
|
|
429
|
-
]))[XYO_STEP_REWARD_ADDRESS];
|
|
430
|
-
const block = await buildNextBlock(head, fundedNextBlockTransactions, blockPayloads, [
|
|
431
|
-
this.account
|
|
432
|
-
], XYO_STEP_REWARD_ADDRESS, stepRewardPoolBalance);
|
|
433
|
-
this.logger?.info(`Built block ${block[0].block} in ${Date.now() - startBuild}ms with ${block[1].length} payloads`);
|
|
434
|
-
this.logger?.info(`Validating block ${block[0].block} with ${block[1].length} payloads`);
|
|
435
|
-
const startValidate = Date.now();
|
|
436
|
-
const errors = await this.validateHydratedBlockState(block, this.chainId, {
|
|
437
|
-
accountBalance: this.balanceService
|
|
438
|
-
});
|
|
439
|
-
this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`);
|
|
440
|
-
if (errors.length > 0) {
|
|
441
|
-
this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`);
|
|
442
|
-
const rejectedTransactions = block[1];
|
|
443
|
-
await this.rejectedTransactionsArchivist.insert(rejectedTransactions);
|
|
444
|
-
} else {
|
|
445
|
-
return block;
|
|
446
|
-
}
|
|
447
|
-
});
|
|
325
|
+
payloadByHash(_hash) {
|
|
326
|
+
throw new Error("Method [payloadByHash] not implemented.");
|
|
448
327
|
}
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
328
|
+
payloadsByHash(_hashes) {
|
|
329
|
+
throw new Error("Method [payloadsByHash] not implemented.");
|
|
330
|
+
}
|
|
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);
|
|
464
343
|
} else {
|
|
465
|
-
|
|
466
|
-
|
|
344
|
+
const hash = PayloadBuilder2.hash(currentBlock);
|
|
345
|
+
assertEx3(asBlockBoundWitnessWithStorageMeta(currentBlock), () => `Expected hash to be a block bound witness [${hash}]`);
|
|
467
346
|
}
|
|
468
|
-
}
|
|
469
|
-
return
|
|
470
|
-
fundedTransactions,
|
|
471
|
-
fundedTransfers
|
|
472
|
-
];
|
|
347
|
+
}
|
|
348
|
+
return results;
|
|
473
349
|
}
|
|
474
|
-
async
|
|
475
|
-
const
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
xl1Hash: head._hash,
|
|
483
|
-
ethereum,
|
|
484
|
-
ethereumHash,
|
|
485
|
-
epoch: Date.now()
|
|
486
|
-
};
|
|
487
|
-
return timePayload;
|
|
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
|
+
});
|
|
488
358
|
}
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
const epoch = head.$epoch;
|
|
496
|
-
if (isDefined(epoch)) {
|
|
497
|
-
const { heartbeatInterval } = this.params.config.producer;
|
|
498
|
-
if (Date.now() - epoch > heartbeatInterval) {
|
|
499
|
-
return true;
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
return false;
|
|
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;
|
|
503
365
|
}
|
|
504
366
|
};
|
|
505
|
-
BaseBlockProducerService = _ts_decorate4([
|
|
506
|
-
creatable4()
|
|
507
|
-
], BaseBlockProducerService);
|
|
508
367
|
|
|
509
|
-
// src/
|
|
510
|
-
import {
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
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;
|
|
515
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
516
|
-
}
|
|
517
|
-
__name(_ts_decorate5, "_ts_decorate");
|
|
518
|
-
var BaseBlockRewardService = class extends BaseService {
|
|
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 {
|
|
519
373
|
static {
|
|
520
|
-
__name(this, "
|
|
374
|
+
__name(this, "EvmChainService");
|
|
521
375
|
}
|
|
522
|
-
|
|
523
|
-
|
|
376
|
+
async active() {
|
|
377
|
+
return await (await this.contract()).active();
|
|
524
378
|
}
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
creatable5()
|
|
528
|
-
], BaseBlockRewardService);
|
|
529
|
-
|
|
530
|
-
// src/BlockReward/EvmBlockRewardService.ts
|
|
531
|
-
import { assertEx as assertEx5, creatable as creatable6, toEthAddress } from "@xylabs/sdk-js";
|
|
532
|
-
import { XyoChainRewards__factory as XyoChainRewardsFactory } from "@xyo-network/typechain";
|
|
533
|
-
function _ts_decorate6(decorators, target, key, desc) {
|
|
534
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
535
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
536
|
-
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;
|
|
537
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
538
|
-
}
|
|
539
|
-
__name(_ts_decorate6, "_ts_decorate");
|
|
540
|
-
var EvmBlockRewardService = class extends BaseBlockRewardService {
|
|
541
|
-
static {
|
|
542
|
-
__name(this, "EvmBlockRewardService");
|
|
379
|
+
async activeByStaked(staked) {
|
|
380
|
+
return await (await this.contract()).activeByAddressStaked(getAddress(toEthAddress2(staked)));
|
|
543
381
|
}
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
return assertEx5(this.params.chainService, () => "chainService is required");
|
|
382
|
+
async activeByStaker(address) {
|
|
383
|
+
return await (await this.contract()).activeByStaker(getAddress(toEthAddress2(address)));
|
|
547
384
|
}
|
|
548
|
-
|
|
549
|
-
|
|
385
|
+
async addStake(staked, amount) {
|
|
386
|
+
const result = await (await this.contract()).addStake(getAddress(toEthAddress2(staked)), amount);
|
|
387
|
+
await result.wait();
|
|
388
|
+
return true;
|
|
550
389
|
}
|
|
551
|
-
|
|
552
|
-
return
|
|
390
|
+
chainId() {
|
|
391
|
+
return assertEx4(this.params.id);
|
|
553
392
|
}
|
|
554
|
-
async
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
this._contractAddress = await this.chainService.rewardsContract();
|
|
558
|
-
} catch (ex) {
|
|
559
|
-
const error = ex;
|
|
560
|
-
throw new Error(`Failed to get rewards contract address: ${error.message}`);
|
|
393
|
+
async contract() {
|
|
394
|
+
if (this.params.contract === void 0) {
|
|
395
|
+
this.params.contract = StakedXyoChainFactory.connect(toEthAddress2(await this.chainId()), this.params.runner);
|
|
561
396
|
}
|
|
397
|
+
return assertEx4(this.params.contract);
|
|
562
398
|
}
|
|
563
|
-
async
|
|
564
|
-
|
|
565
|
-
return await contract.calcBlockReward(blockNumber);
|
|
566
|
-
}
|
|
567
|
-
};
|
|
568
|
-
EvmBlockRewardService = _ts_decorate6([
|
|
569
|
-
creatable6()
|
|
570
|
-
], EvmBlockRewardService);
|
|
571
|
-
|
|
572
|
-
// src/BlockReward/MemoryBlockRewardService.ts
|
|
573
|
-
import { assertEx as assertEx6, creatable as creatable7, toFixedPoint } from "@xylabs/sdk-js";
|
|
574
|
-
import { rewardFromBlockNumber } from "@xyo-network/chain-protocol";
|
|
575
|
-
function _ts_decorate7(decorators, target, key, desc) {
|
|
576
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
577
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
578
|
-
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;
|
|
579
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
580
|
-
}
|
|
581
|
-
__name(_ts_decorate7, "_ts_decorate");
|
|
582
|
-
var MemoryBlockRewardService = class extends BaseBlockRewardService {
|
|
583
|
-
static {
|
|
584
|
-
__name(this, "MemoryBlockRewardService");
|
|
585
|
-
}
|
|
586
|
-
rewardFromBlockNumber = rewardFromBlockNumber(18);
|
|
587
|
-
get creatorReward() {
|
|
588
|
-
return assertEx6(this.params.creatorReward, () => "creatorReward is required");
|
|
589
|
-
}
|
|
590
|
-
get initialReward() {
|
|
591
|
-
return assertEx6(this.params.initialStepReward, () => "initialStepReward is required");
|
|
592
|
-
}
|
|
593
|
-
get minRewardPerBlock() {
|
|
594
|
-
return assertEx6(this.params.minRewardPerBlock, () => "minRewardPerBlock is required");
|
|
595
|
-
}
|
|
596
|
-
get stepFactorDenominator() {
|
|
597
|
-
return assertEx6(this.params.stepFactorDenominator, () => "stepFactorDenominator is required");
|
|
598
|
-
}
|
|
599
|
-
get stepFactorNumerator() {
|
|
600
|
-
return assertEx6(this.params.stepFactorNumerator, () => "stepFactorNumerator is required");
|
|
601
|
-
}
|
|
602
|
-
get stepSize() {
|
|
603
|
-
return assertEx6(this.params.stepSize, () => "stepSize is required");
|
|
604
|
-
}
|
|
605
|
-
static async paramsHandler(inParams) {
|
|
606
|
-
return {
|
|
607
|
-
...await super.paramsHandler(inParams),
|
|
608
|
-
creatorReward: inParams?.creatorReward ?? toFixedPoint(20000000000n),
|
|
609
|
-
initialStepReward: inParams?.initialStepReward ?? toFixedPoint(3000n),
|
|
610
|
-
minRewardPerBlock: inParams?.minRewardPerBlock ?? toFixedPoint(30n),
|
|
611
|
-
stepFactorDenominator: inParams?.stepFactorDenominator ?? 100n,
|
|
612
|
-
stepFactorNumerator: inParams?.stepFactorNumerator ?? 90n,
|
|
613
|
-
stepSize: inParams?.stepSize ?? 1000000n
|
|
614
|
-
};
|
|
615
|
-
}
|
|
616
|
-
getRewardForBlock(blockNumber) {
|
|
617
|
-
return this.rewardFromBlockNumber(blockNumber, this.initialReward, this.stepSize, this.stepFactorNumerator, this.stepFactorDenominator, this.minRewardPerBlock, this.creatorReward);
|
|
618
|
-
}
|
|
619
|
-
};
|
|
620
|
-
MemoryBlockRewardService = _ts_decorate7([
|
|
621
|
-
creatable7()
|
|
622
|
-
], MemoryBlockRewardService);
|
|
623
|
-
|
|
624
|
-
// src/blockViewerFromChainIteratorAndArchivist.ts
|
|
625
|
-
import { isDefined as isDefined2 } from "@xylabs/sdk-js";
|
|
626
|
-
import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
|
|
627
|
-
import { asSignedBlockBoundWitness, asSignedBlockBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
|
|
628
|
-
function blockViewerFromChainIteratorAndArchivist(chainIterator, chainArchivist) {
|
|
629
|
-
const result = {
|
|
630
|
-
blockByHash: /* @__PURE__ */ __name(async function(hash) {
|
|
631
|
-
const [payload] = await chainArchivist.get([
|
|
632
|
-
hash
|
|
633
|
-
]);
|
|
634
|
-
const block = asSignedBlockBoundWitnessWithStorageMeta(payload);
|
|
635
|
-
if (isDefined2(block)) {
|
|
636
|
-
const payloads = await chainArchivist.get(block.payload_hashes);
|
|
637
|
-
return [
|
|
638
|
-
block,
|
|
639
|
-
payloads
|
|
640
|
-
];
|
|
641
|
-
}
|
|
642
|
-
return null;
|
|
643
|
-
}, "blockByHash"),
|
|
644
|
-
blockByNumber: /* @__PURE__ */ __name(async function(blockNumber) {
|
|
645
|
-
const payload = asSignedBlockBoundWitness(await chainIterator.get(blockNumber));
|
|
646
|
-
const block = payload ? await PayloadBuilder3.addHashMeta(payload) : void 0;
|
|
647
|
-
if (isDefined2(block)) {
|
|
648
|
-
const payloads = await chainArchivist.get(block.payload_hashes);
|
|
649
|
-
return [
|
|
650
|
-
block,
|
|
651
|
-
payloads
|
|
652
|
-
];
|
|
653
|
-
}
|
|
654
|
-
return null;
|
|
655
|
-
}, "blockByNumber"),
|
|
656
|
-
blocksByHash: /* @__PURE__ */ __name(async function(hash, limit = 10) {
|
|
657
|
-
const results = [];
|
|
658
|
-
for (let i = 0; i < limit; i++) {
|
|
659
|
-
const block = await this.blockByHash(hash);
|
|
660
|
-
if (block) {
|
|
661
|
-
results.push(block);
|
|
662
|
-
} else {
|
|
663
|
-
break;
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
return results;
|
|
667
|
-
}, "blocksByHash"),
|
|
668
|
-
blocksByNumber: /* @__PURE__ */ __name(async function(number, limit = 10) {
|
|
669
|
-
const results = [];
|
|
670
|
-
for (let i = 0; i < limit; i++) {
|
|
671
|
-
const block = await this.blockByNumber(number);
|
|
672
|
-
if (block) {
|
|
673
|
-
results.push(block);
|
|
674
|
-
} else {
|
|
675
|
-
break;
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
return results;
|
|
679
|
-
}, "blocksByNumber"),
|
|
680
|
-
currentBlock: /* @__PURE__ */ __name(async function() {
|
|
681
|
-
const head = await chainIterator.head();
|
|
682
|
-
return this.blockByHash(head._hash);
|
|
683
|
-
}, "currentBlock"),
|
|
684
|
-
currentBlockHash: /* @__PURE__ */ __name(async function() {
|
|
685
|
-
const head = await chainIterator.head();
|
|
686
|
-
return head._hash;
|
|
687
|
-
}, "currentBlockHash"),
|
|
688
|
-
currentBlockNumber: /* @__PURE__ */ __name(async function() {
|
|
689
|
-
const head = await chainIterator.head();
|
|
690
|
-
return head.block;
|
|
691
|
-
}, "currentBlockNumber")
|
|
692
|
-
};
|
|
693
|
-
return result;
|
|
694
|
-
}
|
|
695
|
-
__name(blockViewerFromChainIteratorAndArchivist, "blockViewerFromChainIteratorAndArchivist");
|
|
696
|
-
|
|
697
|
-
// src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts
|
|
698
|
-
import { assertEx as assertEx7, isDefined as isDefined3, isNull, isUndefined } from "@xylabs/sdk-js";
|
|
699
|
-
import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
|
|
700
|
-
import { asBlockBoundWitness as asBlockBoundWitness2, asBlockBoundWitnessWithStorageMeta, asSignedHydratedBlockWithHashMeta, asXL1BlockNumber, isBlockBoundWitnessWithHashMeta } from "@xyo-network/xl1-protocol";
|
|
701
|
-
import { hydrateBlock } from "@xyo-network/xl1-protocol-sdk";
|
|
702
|
-
import { LRUCache } from "lru-cache";
|
|
703
|
-
var ChainBlockNumberIterationService = class extends BaseService {
|
|
704
|
-
static {
|
|
705
|
-
__name(this, "ChainBlockNumberIterationService");
|
|
706
|
-
}
|
|
707
|
-
_blocksByBlockNumber = new LRUCache({
|
|
708
|
-
max: 1e4
|
|
709
|
-
});
|
|
710
|
-
_currentHead;
|
|
711
|
-
get chainId() {
|
|
712
|
-
return assertEx7(this._currentHead?.chain ?? this.params?.head?.chain, () => "Current head is not set");
|
|
713
|
-
}
|
|
714
|
-
get chainMap() {
|
|
715
|
-
return assertEx7(this.params.chainMap);
|
|
716
|
-
}
|
|
717
|
-
get chainStoreRead() {
|
|
718
|
-
return {
|
|
719
|
-
chainMap: this.chainMap
|
|
720
|
-
};
|
|
721
|
-
}
|
|
722
|
-
async blockByHash(hash) {
|
|
723
|
-
return asSignedHydratedBlockWithHashMeta(await hydrateBlock(this.chainStoreRead, hash)) ?? null;
|
|
724
|
-
}
|
|
725
|
-
async blockByNumber(block) {
|
|
726
|
-
return asSignedHydratedBlockWithHashMeta(await this.get(block)) ?? null;
|
|
727
|
-
}
|
|
728
|
-
async blocksByHash(hash, limit = 100) {
|
|
729
|
-
const results = [];
|
|
730
|
-
let currentBlock = await this.blockByHash(hash);
|
|
731
|
-
while (currentBlock !== null && (isUndefined(limit) || results.length < limit)) {
|
|
732
|
-
results.push(currentBlock);
|
|
733
|
-
const previousHash = currentBlock[0].previous;
|
|
734
|
-
if (isNull(previousHash)) break;
|
|
735
|
-
currentBlock = await this.blockByHash(previousHash);
|
|
736
|
-
}
|
|
737
|
-
return results;
|
|
738
|
-
}
|
|
739
|
-
async blocksByNumber(blockNumber, limit = 100) {
|
|
740
|
-
const results = [];
|
|
741
|
-
let currentBlock = await this.blockByNumber(blockNumber);
|
|
742
|
-
while (currentBlock !== null && (isUndefined(limit) || results.length < limit)) {
|
|
743
|
-
results.push(currentBlock);
|
|
744
|
-
if (currentBlock[0].block === 0) break;
|
|
745
|
-
const previousNumber = asXL1BlockNumber(currentBlock[0].block - 1, true);
|
|
746
|
-
currentBlock = await this.blockByNumber(previousNumber);
|
|
747
|
-
}
|
|
748
|
-
return results;
|
|
749
|
-
}
|
|
750
|
-
async currentBlock() {
|
|
751
|
-
return assertEx7(await this.blockByHash(await this.currentBlockHash()), () => "Current block not found");
|
|
752
|
-
}
|
|
753
|
-
async currentBlockHash() {
|
|
754
|
-
const head = assertEx7(await this.head(), () => "Head is not set");
|
|
755
|
-
return head._hash;
|
|
756
|
-
}
|
|
757
|
-
async currentBlockNumber() {
|
|
758
|
-
const head = assertEx7(await this.head(), () => "Head is not set");
|
|
759
|
-
return head.block;
|
|
760
|
-
}
|
|
761
|
-
async get(block) {
|
|
762
|
-
const head = await this.head();
|
|
763
|
-
assertEx7(head.block >= block, () => `Block requested is newer than the current head [${block}]`);
|
|
764
|
-
const cached = this._blocksByBlockNumber.get(block);
|
|
765
|
-
if (cached) return cached;
|
|
766
|
-
const startingBlock = head;
|
|
767
|
-
const currentBlockHash = await PayloadBuilder4.hash(startingBlock);
|
|
768
|
-
let currentBlock = await this.chainMap.get(currentBlockHash);
|
|
769
|
-
while (isDefined3(currentBlock)) {
|
|
770
|
-
assertEx7(asBlockBoundWitness2(currentBlock), () => `Expected hash to be a block bound witness [${currentBlock?._hash}]`);
|
|
771
|
-
if (isBlockBoundWitnessWithHashMeta(currentBlock)) {
|
|
772
|
-
this._blocksByBlockNumber.set(currentBlock.block, currentBlock);
|
|
773
|
-
if (currentBlock.block === block) {
|
|
774
|
-
return currentBlock;
|
|
775
|
-
}
|
|
776
|
-
const { previous } = currentBlock;
|
|
777
|
-
if (isNull(previous)) break;
|
|
778
|
-
currentBlock = await this.chainMap.get(previous);
|
|
779
|
-
}
|
|
780
|
-
}
|
|
781
|
-
throw new Error(`Block not found: ${block}`);
|
|
782
|
-
}
|
|
783
|
-
async head() {
|
|
784
|
-
if (isDefined3(this._currentHead)) return this._currentHead;
|
|
785
|
-
if (isDefined3(this.params.head)) {
|
|
786
|
-
const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(this.params.head);
|
|
787
|
-
this._currentHead = newHead;
|
|
788
|
-
return newHead;
|
|
789
|
-
}
|
|
790
|
-
throw new Error("Head is not set");
|
|
791
|
-
}
|
|
792
|
-
async next(block) {
|
|
793
|
-
const currentBlock = block;
|
|
794
|
-
const nextBlockNumber = currentBlock + 1;
|
|
795
|
-
return await this.get(nextBlockNumber);
|
|
796
|
-
}
|
|
797
|
-
// TODO: Decide on inclusive/exclusive (probably need inclusive to account for chain head)
|
|
798
|
-
// and then communicate via method name and documentation
|
|
799
|
-
async previous(block = void 0, count = 1) {
|
|
800
|
-
const results = [];
|
|
801
|
-
let currentBlock = isDefined3(block) ? await this.get(block) : await this.head();
|
|
802
|
-
while (isDefined3(currentBlock) && results.length < count) {
|
|
803
|
-
if (isBlockBoundWitnessWithHashMeta(currentBlock)) {
|
|
804
|
-
results.push(currentBlock);
|
|
805
|
-
const { previous } = currentBlock;
|
|
806
|
-
if (isNull(previous)) break;
|
|
807
|
-
const nextBlock = await this.chainMap.get(previous);
|
|
808
|
-
currentBlock = asBlockBoundWitnessWithStorageMeta(nextBlock);
|
|
809
|
-
} else {
|
|
810
|
-
const hash = PayloadBuilder4.hash(currentBlock);
|
|
811
|
-
assertEx7(asBlockBoundWitnessWithStorageMeta(currentBlock), () => `Expected hash to be a block bound witness [${hash}]`);
|
|
812
|
-
}
|
|
813
|
-
}
|
|
814
|
-
return results;
|
|
815
|
-
}
|
|
816
|
-
async updateHead(head) {
|
|
817
|
-
const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head);
|
|
818
|
-
this._currentHead = newHead;
|
|
819
|
-
void this.emit("headUpdated", {
|
|
820
|
-
blocks: [
|
|
821
|
-
newHead
|
|
822
|
-
]
|
|
823
|
-
});
|
|
824
|
-
}
|
|
825
|
-
async getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head) {
|
|
826
|
-
const hash = await PayloadBuilder4.hash(head);
|
|
827
|
-
const stored = await this.chainMap.get(hash);
|
|
828
|
-
const newHead = asBlockBoundWitnessWithStorageMeta(stored);
|
|
829
|
-
if (isUndefined(newHead)) throw new Error(`Head block not found in archivist [${hash}]`);
|
|
830
|
-
return newHead;
|
|
831
|
-
}
|
|
832
|
-
};
|
|
833
|
-
|
|
834
|
-
// src/ChainService/Evm/Evm.ts
|
|
835
|
-
import { assertEx as assertEx8, toAddress, toEthAddress as toEthAddress2 } from "@xylabs/sdk-js";
|
|
836
|
-
import { StakedXyoChain__factory as StakedXyoChainFactory } from "@xyo-network/typechain";
|
|
837
|
-
import { getAddress } from "ethers/address";
|
|
838
|
-
var EvmChainService = class extends BaseService {
|
|
839
|
-
static {
|
|
840
|
-
__name(this, "EvmChainService");
|
|
841
|
-
}
|
|
842
|
-
get runner() {
|
|
843
|
-
return assertEx8(this.params.runner);
|
|
844
|
-
}
|
|
845
|
-
async active() {
|
|
846
|
-
return await (await this.contract()).active();
|
|
847
|
-
}
|
|
848
|
-
async activeByStaked(staked) {
|
|
849
|
-
return await (await this.contract()).activeByAddressStaked(getAddress(toEthAddress2(staked)));
|
|
850
|
-
}
|
|
851
|
-
async activeByStaker(address) {
|
|
852
|
-
return await (await this.contract()).activeByStaker(getAddress(toEthAddress2(address)));
|
|
853
|
-
}
|
|
854
|
-
async addStake(staked, amount) {
|
|
855
|
-
const result = await (await this.contract()).addStake(getAddress(toEthAddress2(staked)), amount);
|
|
856
|
-
await result.wait();
|
|
857
|
-
return true;
|
|
858
|
-
}
|
|
859
|
-
chainId() {
|
|
860
|
-
return assertEx8(this.params.id);
|
|
861
|
-
}
|
|
862
|
-
async contract() {
|
|
863
|
-
if (this.params.contract === void 0) {
|
|
864
|
-
this.params.contract = StakedXyoChainFactory.connect(toEthAddress2(await this.chainId()), this.params.runner);
|
|
865
|
-
}
|
|
866
|
-
return assertEx8(this.params.contract);
|
|
867
|
-
}
|
|
868
|
-
async forkedAtBlockNumber() {
|
|
869
|
-
return await (await this.contract()).forkedAtBlockNumber();
|
|
399
|
+
async forkedAtBlockNumber() {
|
|
400
|
+
return await (await this.contract()).forkedAtBlockNumber();
|
|
870
401
|
}
|
|
871
402
|
async forkedAtHash() {
|
|
872
403
|
return await (await this.contract()).forkedAtHash();
|
|
@@ -888,6 +419,9 @@ var EvmChainService = class extends BaseService {
|
|
|
888
419
|
await result.wait();
|
|
889
420
|
return true;
|
|
890
421
|
}
|
|
422
|
+
rewardForBlock(_block) {
|
|
423
|
+
throw new Error("Method not implemented.");
|
|
424
|
+
}
|
|
891
425
|
async rewardsContract() {
|
|
892
426
|
return await (await this.contract()).rewardsContract();
|
|
893
427
|
}
|
|
@@ -908,7 +442,7 @@ var EvmChainService = class extends BaseService {
|
|
|
908
442
|
};
|
|
909
443
|
|
|
910
444
|
// src/ChainService/Memory/Memory.ts
|
|
911
|
-
import { assertEx as
|
|
445
|
+
import { assertEx as assertEx5, toAddress as toAddress2, ZERO_ADDRESS } from "@xylabs/sdk-js";
|
|
912
446
|
var MemoryChainService = class extends BaseService {
|
|
913
447
|
static {
|
|
914
448
|
__name(this, "MemoryChainService");
|
|
@@ -928,7 +462,7 @@ var MemoryChainService = class extends BaseService {
|
|
|
928
462
|
return await Promise.resolve(true);
|
|
929
463
|
}
|
|
930
464
|
chainId() {
|
|
931
|
-
return
|
|
465
|
+
return assertEx5(this._chainId, () => "Chain ID not set");
|
|
932
466
|
}
|
|
933
467
|
createHandler() {
|
|
934
468
|
const { minStake = 1 } = this.params.config.producer ?? {};
|
|
@@ -955,6 +489,9 @@ var MemoryChainService = class extends BaseService {
|
|
|
955
489
|
async removeStake(_slot) {
|
|
956
490
|
return await Promise.resolve(true);
|
|
957
491
|
}
|
|
492
|
+
rewardForBlock(_block) {
|
|
493
|
+
throw new Error("Method not implemented.");
|
|
494
|
+
}
|
|
958
495
|
async rewardsContract() {
|
|
959
496
|
return await Promise.resolve("");
|
|
960
497
|
}
|
|
@@ -977,39 +514,39 @@ var MemoryChainService = class extends BaseService {
|
|
|
977
514
|
};
|
|
978
515
|
|
|
979
516
|
// src/ChainValidator/XyoValidator.ts
|
|
980
|
-
import { assertEx as
|
|
981
|
-
function
|
|
517
|
+
import { assertEx as assertEx6, creatable as creatable3 } from "@xylabs/sdk-js";
|
|
518
|
+
function _ts_decorate3(decorators, target, key, desc) {
|
|
982
519
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
983
520
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
984
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;
|
|
985
522
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
986
523
|
}
|
|
987
|
-
__name(
|
|
524
|
+
__name(_ts_decorate3, "_ts_decorate");
|
|
988
525
|
var XyoValidator = class extends BaseService {
|
|
989
526
|
static {
|
|
990
527
|
__name(this, "XyoValidator");
|
|
991
528
|
}
|
|
992
|
-
get address() {
|
|
993
|
-
|
|
994
|
-
}
|
|
995
|
-
get account() {
|
|
996
|
-
|
|
997
|
-
}
|
|
529
|
+
// get address() {
|
|
530
|
+
// return this.account.address
|
|
531
|
+
// }
|
|
532
|
+
// protected get account() {
|
|
533
|
+
// return assertEx(this.params.account, () => 'account is required')
|
|
534
|
+
// }
|
|
998
535
|
get blockViewer() {
|
|
999
|
-
return
|
|
1000
|
-
}
|
|
1001
|
-
get chainInfo() {
|
|
1002
|
-
|
|
1003
|
-
}
|
|
1004
|
-
get electionService() {
|
|
1005
|
-
|
|
1006
|
-
}
|
|
1007
|
-
get pendingBundledTransactionsArchivist() {
|
|
1008
|
-
|
|
1009
|
-
}
|
|
1010
|
-
get
|
|
1011
|
-
|
|
1012
|
-
}
|
|
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
|
+
// }
|
|
1013
550
|
validatePendingBlock(_block) {
|
|
1014
551
|
return [];
|
|
1015
552
|
}
|
|
@@ -1020,32 +557,32 @@ var XyoValidator = class extends BaseService {
|
|
|
1020
557
|
return await Promise.resolve(true);
|
|
1021
558
|
}
|
|
1022
559
|
};
|
|
1023
|
-
XyoValidator =
|
|
1024
|
-
|
|
560
|
+
XyoValidator = _ts_decorate3([
|
|
561
|
+
creatable3()
|
|
1025
562
|
], XyoValidator);
|
|
1026
563
|
|
|
1027
564
|
// src/Election/BaseElectionService.ts
|
|
1028
|
-
import { assertEx as
|
|
565
|
+
import { assertEx as assertEx7, creatable as creatable4 } from "@xylabs/sdk-js";
|
|
1029
566
|
import { hexToLast4BytesInt, shuffleWithSeed } from "@xyo-network/chain-utils";
|
|
1030
|
-
function
|
|
567
|
+
function _ts_decorate4(decorators, target, key, desc) {
|
|
1031
568
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1032
569
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1033
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;
|
|
1034
571
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1035
572
|
}
|
|
1036
|
-
__name(
|
|
573
|
+
__name(_ts_decorate4, "_ts_decorate");
|
|
1037
574
|
var BaseElectionService = class extends BaseService {
|
|
1038
575
|
static {
|
|
1039
576
|
__name(this, "BaseElectionService");
|
|
1040
577
|
}
|
|
1041
578
|
get blockViewer() {
|
|
1042
|
-
return
|
|
579
|
+
return assertEx7(this.params.blockViewer, () => "No block viewer");
|
|
1043
580
|
}
|
|
1044
581
|
get chainStakeViewer() {
|
|
1045
|
-
return
|
|
582
|
+
return assertEx7(this.params.chainStakeViewer, () => "No chain stake viewer");
|
|
1046
583
|
}
|
|
1047
584
|
get stakeIntentService() {
|
|
1048
|
-
return
|
|
585
|
+
return assertEx7(this.params.stakeIntentService, () => "No staked intent service");
|
|
1049
586
|
}
|
|
1050
587
|
async getCreatorCommitteeForNextBlock(current) {
|
|
1051
588
|
return await this.spanAsync("getCreatorCommitteeForNextBlock", async () => {
|
|
@@ -1062,96 +599,490 @@ var BaseElectionService = class extends BaseService {
|
|
|
1062
599
|
return creatorArray.slice(0, maxSize);
|
|
1063
600
|
}
|
|
1064
601
|
};
|
|
1065
|
-
BaseElectionService =
|
|
1066
|
-
|
|
602
|
+
BaseElectionService = _ts_decorate4([
|
|
603
|
+
creatable4()
|
|
1067
604
|
], BaseElectionService);
|
|
1068
605
|
|
|
1069
|
-
// src/
|
|
1070
|
-
import {
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
}
|
|
1085
|
-
|
|
1086
|
-
throw new Error("Method not implemented.");
|
|
1087
|
-
}
|
|
1088
|
-
networkStakeStepRewardAddressShare(_context, _address) {
|
|
1089
|
-
throw new Error("Method not implemented.");
|
|
1090
|
-
}
|
|
1091
|
-
networkStakeStepRewardClaimedByAddress(_address) {
|
|
1092
|
-
throw new Error("Method not implemented.");
|
|
1093
|
-
}
|
|
1094
|
-
networkStakeStepRewardForPosition(_position, _range) {
|
|
1095
|
-
throw new Error("Method not implemented.");
|
|
1096
|
-
}
|
|
1097
|
-
networkStakeStepRewardForStep(_context) {
|
|
1098
|
-
throw new Error("Method not implemented.");
|
|
1099
|
-
}
|
|
1100
|
-
networkStakeStepRewardForStepForPosition(_context, _position) {
|
|
1101
|
-
throw new Error("Method not implemented.");
|
|
1102
|
-
}
|
|
1103
|
-
networkStakeStepRewardPoolRewards(_context) {
|
|
1104
|
-
throw new Error("Method not implemented.");
|
|
1105
|
-
}
|
|
1106
|
-
networkStakeStepRewardPoolShares(_context) {
|
|
1107
|
-
throw new Error("Method not implemented.");
|
|
1108
|
-
}
|
|
1109
|
-
networkStakeStepRewardPositionWeight(_context, _position) {
|
|
1110
|
-
throw new Error("Method not implemented.");
|
|
1111
|
-
}
|
|
1112
|
-
networkStakeStepRewardPotentialPositionLoss(_context, _position) {
|
|
1113
|
-
throw new Error("Method not implemented.");
|
|
1114
|
-
}
|
|
1115
|
-
networkStakeStepRewardRandomizer(_context) {
|
|
1116
|
-
throw new Error("Method not implemented.");
|
|
1117
|
-
}
|
|
1118
|
-
networkStakeStepRewardStakerCount(_context) {
|
|
1119
|
-
throw new Error("Method not implemented.");
|
|
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");
|
|
1120
623
|
}
|
|
1121
|
-
|
|
1122
|
-
|
|
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");
|
|
1123
643
|
}
|
|
1124
|
-
|
|
1125
|
-
|
|
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
|
+
}
|
|
1126
983
|
}
|
|
1127
|
-
|
|
1128
|
-
|
|
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
|
+
}
|
|
1129
1000
|
}
|
|
1130
|
-
|
|
1131
|
-
|
|
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");
|
|
1132
1044
|
}
|
|
1133
|
-
|
|
1134
|
-
|
|
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");
|
|
1135
1064
|
}
|
|
1136
|
-
};
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
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";
|
|
1140
1071
|
|
|
1141
1072
|
// src/PendingTransactions/BasePendingTransactions.ts
|
|
1142
1073
|
import { ValueType } from "@opentelemetry/api";
|
|
1143
|
-
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";
|
|
1144
1075
|
import { MemoryArchivist } from "@xyo-network/archivist-memory";
|
|
1145
1076
|
import { asBlockBoundWitnessWithHashMeta, asXL1BlockNumber as asXL1BlockNumber2, isTransactionBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol";
|
|
1146
|
-
import { findMostRecentBlock as
|
|
1077
|
+
import { findMostRecentBlock as findMostRecentBlock3 } from "@xyo-network/xl1-protocol-sdk";
|
|
1147
1078
|
import { TransactionJsonSchemaValidator, validateTransaction } from "@xyo-network/xl1-validation";
|
|
1148
1079
|
import { Mutex as Mutex2 } from "async-mutex";
|
|
1149
1080
|
|
|
1150
1081
|
// src/PendingTransactions/bundledPayloadToHydratedTransaction.ts
|
|
1151
|
-
import { PayloadBuilder as
|
|
1082
|
+
import { PayloadBuilder as PayloadBuilder6 } from "@xyo-network/payload-builder";
|
|
1152
1083
|
import { asSignedTransactionBoundWitnessWithHashMeta } from "@xyo-network/xl1-protocol";
|
|
1153
1084
|
var bundledPayloadToHydratedTransaction = /* @__PURE__ */ __name(async (payload) => {
|
|
1154
|
-
const withHashMeta = await
|
|
1085
|
+
const withHashMeta = await PayloadBuilder6.addHashMeta(payload.payloads);
|
|
1155
1086
|
const tx = asSignedTransactionBoundWitnessWithHashMeta(withHashMeta.find((p) => p._hash === payload.root));
|
|
1156
1087
|
if (tx) {
|
|
1157
1088
|
return [
|
|
@@ -1162,7 +1093,7 @@ var bundledPayloadToHydratedTransaction = /* @__PURE__ */ __name(async (payload)
|
|
|
1162
1093
|
}, "bundledPayloadToHydratedTransaction");
|
|
1163
1094
|
|
|
1164
1095
|
// src/PendingTransactions/hydratedTransactionToPayloadBundle.ts
|
|
1165
|
-
import { PayloadBuilder as
|
|
1096
|
+
import { PayloadBuilder as PayloadBuilder7 } from "@xyo-network/payload-builder";
|
|
1166
1097
|
import { PayloadBundleSchema } from "@xyo-network/payload-model";
|
|
1167
1098
|
import { flattenHydratedTransaction } from "@xyo-network/xl1-protocol-sdk";
|
|
1168
1099
|
var hydratedTransactionToPayloadBundle = /* @__PURE__ */ __name((transaction) => {
|
|
@@ -1170,8 +1101,8 @@ var hydratedTransactionToPayloadBundle = /* @__PURE__ */ __name((transaction) =>
|
|
|
1170
1101
|
return bundle(root, transaction);
|
|
1171
1102
|
}, "hydratedTransactionToPayloadBundle");
|
|
1172
1103
|
var bundle = /* @__PURE__ */ __name((root, transaction) => {
|
|
1173
|
-
const payloads = flattenHydratedTransaction(transaction).flatMap((p) =>
|
|
1174
|
-
return new
|
|
1104
|
+
const payloads = flattenHydratedTransaction(transaction).flatMap((p) => PayloadBuilder7.omitStorageMeta(p));
|
|
1105
|
+
return new PayloadBuilder7({
|
|
1175
1106
|
schema: PayloadBundleSchema
|
|
1176
1107
|
}).fields({
|
|
1177
1108
|
payloads,
|
|
@@ -1180,13 +1111,13 @@ var bundle = /* @__PURE__ */ __name((root, transaction) => {
|
|
|
1180
1111
|
}, "bundle");
|
|
1181
1112
|
|
|
1182
1113
|
// src/PendingTransactions/BasePendingTransactions.ts
|
|
1183
|
-
function
|
|
1114
|
+
function _ts_decorate5(decorators, target, key, desc) {
|
|
1184
1115
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1185
1116
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1186
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;
|
|
1187
1118
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1188
1119
|
}
|
|
1189
|
-
__name(
|
|
1120
|
+
__name(_ts_decorate5, "_ts_decorate");
|
|
1190
1121
|
var BasePendingTransactionsService = class _BasePendingTransactionsService extends BaseService {
|
|
1191
1122
|
static {
|
|
1192
1123
|
__name(this, "BasePendingTransactionsService");
|
|
@@ -1233,213 +1164,729 @@ var BasePendingTransactionsService = class _BasePendingTransactionsService exten
|
|
|
1233
1164
|
get additionalPendingTransactionValidators() {
|
|
1234
1165
|
return this.params.additionalPendingTransactionValidators ?? [];
|
|
1235
1166
|
}
|
|
1236
|
-
get chainArchivist() {
|
|
1237
|
-
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.");
|
|
1238
1822
|
}
|
|
1239
|
-
|
|
1240
|
-
|
|
1823
|
+
networkStakeStepRewardAddressReward(_context, _address) {
|
|
1824
|
+
throw new Error("Method [networkStakeStepRewardAddressReward] not implemented.");
|
|
1241
1825
|
}
|
|
1242
|
-
|
|
1243
|
-
|
|
1826
|
+
networkStakeStepRewardAddressShare(_context, _address) {
|
|
1827
|
+
throw new Error("Method [networkStakeStepRewardAddressShare] not implemented.");
|
|
1244
1828
|
}
|
|
1245
|
-
|
|
1246
|
-
|
|
1829
|
+
networkStakeStepRewardClaimedByAddress(_address) {
|
|
1830
|
+
throw new Error("Method [networkStakeStepRewardClaimedByAddress] not implemented.");
|
|
1247
1831
|
}
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
return this._pendingTransactionsCount;
|
|
1832
|
+
networkStakeStepRewardForPosition(_position, _range) {
|
|
1833
|
+
throw new Error("Method [networkStakeStepRewardForPosition] not implemented.");
|
|
1251
1834
|
}
|
|
1252
|
-
|
|
1253
|
-
|
|
1835
|
+
networkStakeStepRewardForStep(_context) {
|
|
1836
|
+
throw new Error("Method [networkStakeStepRewardForStep] not implemented.");
|
|
1254
1837
|
}
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
this._curatedPendingBundledTransactionsArchivist = await MemoryArchivist.create({
|
|
1258
|
-
account: "random"
|
|
1259
|
-
});
|
|
1260
|
-
this.pendingBundledTransactionsArchivist.on("inserted", ({ payloads }) => {
|
|
1261
|
-
forget(this.insertNewTransactions(payloads));
|
|
1262
|
-
});
|
|
1263
|
-
this.chainArchivist.on("inserted", ({ payloads }) => {
|
|
1264
|
-
this.markAnyIncludedTransactionsForRemoval(payloads);
|
|
1265
|
-
forget(this.cleanupWorker());
|
|
1266
|
-
});
|
|
1267
|
-
this.rejectedTransactionsArchivist.on("inserted", ({ payloads }) => {
|
|
1268
|
-
this.markAnyIncludedTransactionsForRemoval(payloads);
|
|
1269
|
-
forget(this.cleanupWorker());
|
|
1270
|
-
});
|
|
1271
|
-
const pendingTransactionsCounter = this.meter?.createObservableUpDownCounter("xyo_pending_transactions_counter", {
|
|
1272
|
-
description: "The current number of pending transactions",
|
|
1273
|
-
valueType: ValueType.INT,
|
|
1274
|
-
unit: "1"
|
|
1275
|
-
});
|
|
1276
|
-
pendingTransactionsCounter?.addCallback((observer) => {
|
|
1277
|
-
observer.observe(this.pendingTransactionsCount);
|
|
1278
|
-
});
|
|
1838
|
+
networkStakeStepRewardForStepForPosition(_context, _position) {
|
|
1839
|
+
throw new Error("Method [networkStakeStepRewardForStepForPosition] not implemented.");
|
|
1279
1840
|
}
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
|
|
1283
|
-
let lastHead = filterAs(await this.chainArchivist.next({
|
|
1284
|
-
limit: 100
|
|
1285
|
-
}), (x) => asBlockBoundWitnessWithHashMeta(x)).at(-1);
|
|
1286
|
-
if (isUndefined2(lastHead)) return [];
|
|
1287
|
-
await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash);
|
|
1288
|
-
const foundPendingTransactions = [];
|
|
1289
|
-
let cursor;
|
|
1290
|
-
while (foundPendingTransactions.length < limit) {
|
|
1291
|
-
const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({
|
|
1292
|
-
limit: 100,
|
|
1293
|
-
order: "asc",
|
|
1294
|
-
cursor
|
|
1295
|
-
});
|
|
1296
|
-
if (pendingBundledTransactions.length === 0) break;
|
|
1297
|
-
cursor = pendingBundledTransactions.at(-1)?._sequence;
|
|
1298
|
-
const undeletedTransactionBundles = pendingBundledTransactions.filter((tx) => !this._removablePendingTransactionHashes.has(tx.root));
|
|
1299
|
-
const transactions = (await Promise.all(undeletedTransactionBundles.map((p) => bundledPayloadToHydratedTransaction(p)))).filter(exists2);
|
|
1300
|
-
const activeTransactions = transactions.filter(isTransactionActive(asXL1BlockNumber2(lastHead.block + 1, true)));
|
|
1301
|
-
const txValidationResults = await Promise.all(activeTransactions.map(async (tx) => [
|
|
1302
|
-
tx,
|
|
1303
|
-
await validateTransaction(tx, {
|
|
1304
|
-
chainId: this.chainId
|
|
1305
|
-
}, this.additionalPendingTransactionValidators)
|
|
1306
|
-
]));
|
|
1307
|
-
const validTransactions = txValidationResults.filter(([, errors]) => errors.length === 0).map(([tx]) => tx);
|
|
1308
|
-
const invalidTransactions = txValidationResults.filter(([, errors]) => errors.length > 0).map(([tx]) => tx);
|
|
1309
|
-
if (invalidTransactions.length > 0) {
|
|
1310
|
-
this.logger?.warn(`getPendingTransactions: Found ${invalidTransactions.length} invalid pending transactions`);
|
|
1311
|
-
for (const tx of invalidTransactions) {
|
|
1312
|
-
this.logger?.warn(tx[0]._hash);
|
|
1313
|
-
}
|
|
1314
|
-
}
|
|
1315
|
-
foundPendingTransactions.push(...validTransactions);
|
|
1316
|
-
}
|
|
1317
|
-
if (foundPendingTransactions.length > 0) {
|
|
1318
|
-
this.logger?.log(`getPendingTransactions: Found ${foundPendingTransactions.length} pending transactions`);
|
|
1319
|
-
for (const tx of foundPendingTransactions) {
|
|
1320
|
-
this.logger?.log(tx[0]._hash);
|
|
1321
|
-
}
|
|
1322
|
-
}
|
|
1323
|
-
return foundPendingTransactions;
|
|
1324
|
-
}, _BasePendingTransactionsService.MutexPriority.ReadTransactions);
|
|
1325
|
-
});
|
|
1841
|
+
networkStakeStepRewardPoolRewards(_context) {
|
|
1842
|
+
throw new Error("Method [networkStakeStepRewardPoolRewards] not implemented.");
|
|
1326
1843
|
}
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
const lastHead = await findMostRecentBlock2(this.chainArchivist);
|
|
1330
|
-
if (isDefined4(lastHead)) await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash);
|
|
1331
|
-
}, _BasePendingTransactionsService.MutexPriority.PurgeTransactions);
|
|
1844
|
+
networkStakeStepRewardPoolShares(_context) {
|
|
1845
|
+
throw new Error("Method [networkStakeStepRewardPoolShares] not implemented.");
|
|
1332
1846
|
}
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
await this._countPendingTransactionsMutex.runExclusive(async () => {
|
|
1336
|
-
const payloads = await this._curatedPendingBundledTransactionsArchivist?.all() ?? [];
|
|
1337
|
-
this._pendingTransactionsCount = payloads.length;
|
|
1338
|
-
});
|
|
1847
|
+
networkStakeStepRewardPositionWeight(_context, _position) {
|
|
1848
|
+
throw new Error("Method [networkStakeStepRewardPositionWeight] not implemented.");
|
|
1339
1849
|
}
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
const finalizedTransactions = await this.chainArchivist.get(incomingTransactionHashes);
|
|
1343
|
-
const finalizedTransactionHashes = new Set(finalizedTransactions.map((item) => item._hash));
|
|
1344
|
-
const nonFinalizedTransactions = incomingTransactions.filter((item) => !finalizedTransactionHashes.has(item._hash));
|
|
1345
|
-
return nonFinalizedTransactions;
|
|
1850
|
+
networkStakeStepRewardPotentialPositionLoss(_context, _position) {
|
|
1851
|
+
throw new Error("Method [networkStakeStepRewardPotentialPositionLoss] not implemented.");
|
|
1346
1852
|
}
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
return await this.spanAsync("InsertNewTransactions", async () => {
|
|
1350
|
-
return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {
|
|
1351
|
-
const unprocessedTransactions = await this.filterAlreadyFinalizedTransactions(payloads);
|
|
1352
|
-
const hydratedUnprocessedTransactions = (await Promise.all(unprocessedTransactions.map(async (tx) => {
|
|
1353
|
-
return await bundledPayloadToHydratedTransaction(tx);
|
|
1354
|
-
}))).filter(exists2);
|
|
1355
|
-
const validTransactions = await filterAsync(hydratedUnprocessedTransactions, async (tx) => {
|
|
1356
|
-
const errors = await validateTransaction(tx, {
|
|
1357
|
-
chainId: this.chainId
|
|
1358
|
-
}, [
|
|
1359
|
-
TransactionJsonSchemaValidator
|
|
1360
|
-
]);
|
|
1361
|
-
if (errors.length > 0) {
|
|
1362
|
-
this.logger?.warn("validateTransaction", errors);
|
|
1363
|
-
}
|
|
1364
|
-
return errors.length > 0 ? false : true;
|
|
1365
|
-
});
|
|
1366
|
-
if (validTransactions.length > 0) {
|
|
1367
|
-
const bundledTransactions = validTransactions.map((tx) => hydratedTransactionToPayloadBundle(tx));
|
|
1368
|
-
await this.pendingBundledTransactionsLocalArchivist.insert(bundledTransactions);
|
|
1369
|
-
}
|
|
1370
|
-
}, _BasePendingTransactionsService.MutexPriority.InsertNewTransactions);
|
|
1371
|
-
});
|
|
1853
|
+
networkStakeStepRewardRandomizer(_context) {
|
|
1854
|
+
throw new Error("Method [networkStakeStepRewardRandomizer] not implemented.");
|
|
1372
1855
|
}
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
* from being included in the curated pending transactions archivist and from being offered
|
|
1376
|
-
* during the next retrieval of pending transactions.
|
|
1377
|
-
* @param payloads An array of payloads that may contain transactions.
|
|
1378
|
-
*/
|
|
1379
|
-
markAnyIncludedTransactionsForRemoval(payloads) {
|
|
1380
|
-
const hashes = payloads.filter(isTransactionBoundWitnessWithStorageMeta).map((p) => p._hash);
|
|
1381
|
-
for (const hash of hashes) {
|
|
1382
|
-
this._removablePendingTransactionHashes.add(hash);
|
|
1383
|
-
}
|
|
1856
|
+
networkStakeStepRewardStakerCount(_context) {
|
|
1857
|
+
throw new Error("Method [networkStakeStepRewardStakerCount] not implemented.");
|
|
1384
1858
|
}
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
break;
|
|
1400
|
-
}
|
|
1401
|
-
cursor = pendingBundledTransactions.at(-1)?._sequence;
|
|
1402
|
-
const deletedTransactionBundles = pendingBundledTransactions.filter((tx) => this._removablePendingTransactionHashes.has(tx.root));
|
|
1403
|
-
foundPendingTransactionsToDeleteHashes.push(...deletedTransactionBundles.map((tx) => tx._hash).filter(exists2));
|
|
1404
|
-
const undeletedTransactionBundles = pendingBundledTransactions.filter((tx) => !this._removablePendingTransactionHashes.has(tx.root));
|
|
1405
|
-
const transactions = (await Promise.all(undeletedTransactionBundles.map((p) => bundledPayloadToHydratedTransaction(p)))).filter(exists2);
|
|
1406
|
-
const expiredTransactions = transactions.filter(isTransactionExpired(asXL1BlockNumber2(lastHead.block + 1, true)));
|
|
1407
|
-
const expiredBundleHashes = expiredTransactions.map((expiredHydratedTx) => (
|
|
1408
|
-
// Find the corresponding payload bundle hash for the expired transaction
|
|
1409
|
-
pendingBundledTransactions.find((bundledTx) => bundledTx.root === expiredHydratedTx[0]._hash)?._hash
|
|
1410
|
-
)).filter(exists2);
|
|
1411
|
-
foundPendingTransactionsToDeleteHashes.push(...expiredBundleHashes);
|
|
1412
|
-
}
|
|
1413
|
-
const deletedHashes = await this.pendingBundledTransactionsLocalArchivist.delete(foundPendingTransactionsToDeleteHashes);
|
|
1414
|
-
for (const payload of deletedHashes) {
|
|
1415
|
-
this._removablePendingTransactionHashes.delete(payload._hash);
|
|
1416
|
-
}
|
|
1417
|
-
if (deletedHashes.length > 0) {
|
|
1418
|
-
this.logger?.log(`foundPendingTransactionsToDeleteHashes: Found ${deletedHashes.length} deletable transactions`);
|
|
1419
|
-
for (const payload of deletedHashes) {
|
|
1420
|
-
this.logger?.log(payload._hash);
|
|
1421
|
-
}
|
|
1422
|
-
}
|
|
1423
|
-
});
|
|
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.");
|
|
1424
1873
|
}
|
|
1425
1874
|
};
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
],
|
|
1429
|
-
var isTransactionExpired = /* @__PURE__ */ __name((block) => ([txBw]) => txBw.exp < block, "isTransactionExpired");
|
|
1430
|
-
var isTransactionActive = /* @__PURE__ */ __name((block) => ([txBw]) => txBw.nbf <= block && txBw.exp >= block, "isTransactionActive");
|
|
1875
|
+
BaseNetworkStakeStepRewardService = _ts_decorate8([
|
|
1876
|
+
creatable8()
|
|
1877
|
+
], BaseNetworkStakeStepRewardService);
|
|
1431
1878
|
|
|
1432
1879
|
// src/Schemas/BaseSchemasService.ts
|
|
1433
|
-
import { creatable as
|
|
1434
|
-
import { spanRootAsync
|
|
1880
|
+
import { creatable as creatable9 } from "@xylabs/sdk-js";
|
|
1881
|
+
import { spanRootAsync } from "@xylabs/telemetry";
|
|
1435
1882
|
import { schemasSummary } from "@xyo-network/xl1-protocol-sdk";
|
|
1436
|
-
function
|
|
1883
|
+
function _ts_decorate9(decorators, target, key, desc) {
|
|
1437
1884
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1438
1885
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1439
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;
|
|
1440
1887
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1441
1888
|
}
|
|
1442
|
-
__name(
|
|
1889
|
+
__name(_ts_decorate9, "_ts_decorate");
|
|
1443
1890
|
var BaseSchemasService = class extends BaseService {
|
|
1444
1891
|
static {
|
|
1445
1892
|
__name(this, "BaseSchemasService");
|
|
@@ -1450,8 +1897,8 @@ var BaseSchemasService = class extends BaseService {
|
|
|
1450
1897
|
]))[schema] ?? 0;
|
|
1451
1898
|
}
|
|
1452
1899
|
async schemas(head, schemas) {
|
|
1453
|
-
return await
|
|
1454
|
-
const summary = await schemasSummary(this.params.context);
|
|
1900
|
+
return await spanRootAsync("transfers", async () => {
|
|
1901
|
+
const [summary] = await schemasSummary(this.params.context);
|
|
1455
1902
|
const result = {};
|
|
1456
1903
|
for (const schema of schemas) {
|
|
1457
1904
|
const count = summary[schema] ?? 0;
|
|
@@ -1461,8 +1908,8 @@ var BaseSchemasService = class extends BaseService {
|
|
|
1461
1908
|
});
|
|
1462
1909
|
}
|
|
1463
1910
|
};
|
|
1464
|
-
BaseSchemasService =
|
|
1465
|
-
|
|
1911
|
+
BaseSchemasService = _ts_decorate9([
|
|
1912
|
+
creatable9()
|
|
1466
1913
|
], BaseSchemasService);
|
|
1467
1914
|
|
|
1468
1915
|
// src/StakeIntent/lib/getBlockSignedStakeDeclarations.ts
|
|
@@ -1492,21 +1939,21 @@ var mapBoundWitnessToStakeIntentHashes = /* @__PURE__ */ __name((bw) => {
|
|
|
1492
1939
|
}, "mapBoundWitnessToStakeIntentHashes");
|
|
1493
1940
|
|
|
1494
1941
|
// src/StakeIntent/XyoStakeIntentService.ts
|
|
1495
|
-
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";
|
|
1496
1943
|
import { analyzeChain, ChainStakeIntentAnalyzer, isChainSummaryStakeIntent } from "@xyo-network/chain-analyze";
|
|
1497
1944
|
import { DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS, findFirstMatching, IntervalMap } from "@xyo-network/chain-utils";
|
|
1498
|
-
import { PayloadBuilder as
|
|
1945
|
+
import { PayloadBuilder as PayloadBuilder10 } from "@xyo-network/payload-builder";
|
|
1499
1946
|
import { asBlockBoundWitness as asBlockBoundWitness3, asBlockBoundWitnessWithStorageMeta as asBlockBoundWitnessWithStorageMeta2, asChainStakeIntent as asChainStakeIntent2 } from "@xyo-network/xl1-protocol";
|
|
1500
|
-
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";
|
|
1501
1948
|
import { Mutex as Mutex3 } from "async-mutex";
|
|
1502
1949
|
import { LRUCache as LRUCache2 } from "lru-cache";
|
|
1503
|
-
function
|
|
1950
|
+
function _ts_decorate10(decorators, target, key, desc) {
|
|
1504
1951
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1505
1952
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1506
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;
|
|
1507
1954
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1508
1955
|
}
|
|
1509
|
-
__name(
|
|
1956
|
+
__name(_ts_decorate10, "_ts_decorate");
|
|
1510
1957
|
var ACTIVE_STAKE_TTL = 1e3 * 60 * 60 * 2;
|
|
1511
1958
|
var NO_ACTIVE_STAKE_TTL = 1e3 * 2;
|
|
1512
1959
|
var STAKE_CACHE_MAX_ENTRIES = 1e4;
|
|
@@ -1529,16 +1976,25 @@ var XyoStakeIntentService = class extends BaseService {
|
|
|
1529
1976
|
});
|
|
1530
1977
|
_updateMutex = new Mutex3();
|
|
1531
1978
|
get blockViewer() {
|
|
1532
|
-
return
|
|
1979
|
+
return this.params.blockViewer;
|
|
1533
1980
|
}
|
|
1534
1981
|
get chainArchivist() {
|
|
1535
|
-
return
|
|
1982
|
+
return assertEx19(this.params.chainArchivist, () => "chainArchivist not set");
|
|
1536
1983
|
}
|
|
1537
1984
|
get chainStakeViewer() {
|
|
1538
|
-
return
|
|
1985
|
+
return assertEx19(this.params.chainStakeViewer, () => "chainStakeViewer not set");
|
|
1539
1986
|
}
|
|
1540
1987
|
get stakeIntentStateArchivist() {
|
|
1541
|
-
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
|
+
};
|
|
1542
1998
|
}
|
|
1543
1999
|
async createHandler() {
|
|
1544
2000
|
const head = await this.blockViewer.currentBlock();
|
|
@@ -1547,13 +2003,13 @@ var XyoStakeIntentService = class extends BaseService {
|
|
|
1547
2003
|
}
|
|
1548
2004
|
async getDeclaredCandidateRanges(address, intent) {
|
|
1549
2005
|
await Promise.resolve();
|
|
1550
|
-
|
|
2006
|
+
assertEx19(intent === "producer", () => `Support not yet added for intent ${intent}`);
|
|
1551
2007
|
const results = this._producers.get(address);
|
|
1552
2008
|
return results ?? [];
|
|
1553
2009
|
}
|
|
1554
2010
|
async getDeclaredCandidatesForBlock(block, intent) {
|
|
1555
2011
|
return await this.spanAsync("getDeclaredCandidatesForBlock", async () => {
|
|
1556
|
-
|
|
2012
|
+
assertEx19(intent === "producer", () => `Support not yet added for intent ${intent}`);
|
|
1557
2013
|
const results = this._producers.findAllContaining(block);
|
|
1558
2014
|
const candidates = [
|
|
1559
2015
|
...results
|
|
@@ -1607,7 +2063,7 @@ var XyoStakeIntentService = class extends BaseService {
|
|
|
1607
2063
|
}
|
|
1608
2064
|
async persistState(current) {
|
|
1609
2065
|
const state = this._producers.serialize();
|
|
1610
|
-
const payload = new
|
|
2066
|
+
const payload = new PayloadBuilder10({
|
|
1611
2067
|
schema: ChainIndexingServiceStateSchema
|
|
1612
2068
|
}).fields({
|
|
1613
2069
|
endBlockHash: current,
|
|
@@ -1618,8 +2074,8 @@ var XyoStakeIntentService = class extends BaseService {
|
|
|
1618
2074
|
]);
|
|
1619
2075
|
}
|
|
1620
2076
|
async recoverState(current) {
|
|
1621
|
-
return await
|
|
1622
|
-
const currentBlock =
|
|
2077
|
+
return await timeBudget5("XyoStakeIntentService.recoverState", console, async () => {
|
|
2078
|
+
const currentBlock = assertEx19(asBlockBoundWitness3((await this.chainArchivist.get([
|
|
1623
2079
|
current
|
|
1624
2080
|
]))?.[0]), () => `Block ${current} not found`);
|
|
1625
2081
|
const currentBlockNum = currentBlock.block;
|
|
@@ -1661,7 +2117,7 @@ var XyoStakeIntentService = class extends BaseService {
|
|
|
1661
2117
|
return await this.spanAsync("updateIndex", async () => {
|
|
1662
2118
|
const currentHead = (await this.blockViewer.currentBlock())[0];
|
|
1663
2119
|
if (isUndefined3(currentHead)) return;
|
|
1664
|
-
return await
|
|
2120
|
+
return await timeBudget5("XyoStakeIntentService.updateIndex", console, async () => {
|
|
1665
2121
|
const currentHeadHash = currentHead._hash;
|
|
1666
2122
|
const chainMap = readPayloadMapFromStore2(this.chainArchivist);
|
|
1667
2123
|
const result = await analyzeChain({
|
|
@@ -1677,7 +2133,7 @@ var XyoStakeIntentService = class extends BaseService {
|
|
|
1677
2133
|
const { exp, nbf } = signedDeclaration;
|
|
1678
2134
|
const start = nbf;
|
|
1679
2135
|
const stop = exp;
|
|
1680
|
-
const address =
|
|
2136
|
+
const address = asAddress2(signedDeclaration?.from);
|
|
1681
2137
|
if (start !== void 0 && stop !== void 0 && address !== void 0) {
|
|
1682
2138
|
this._producers.insert(address, start, stop);
|
|
1683
2139
|
}
|
|
@@ -1688,83 +2144,35 @@ var XyoStakeIntentService = class extends BaseService {
|
|
|
1688
2144
|
});
|
|
1689
2145
|
}
|
|
1690
2146
|
};
|
|
1691
|
-
XyoStakeIntentService =
|
|
1692
|
-
|
|
2147
|
+
XyoStakeIntentService = _ts_decorate10([
|
|
2148
|
+
creatable10()
|
|
1693
2149
|
], XyoStakeIntentService);
|
|
1694
2150
|
|
|
1695
2151
|
// src/StepStake/BaseStepStakeService.ts
|
|
1696
|
-
import { creatable as
|
|
1697
|
-
function
|
|
2152
|
+
import { creatable as creatable11 } from "@xylabs/sdk-js";
|
|
2153
|
+
function _ts_decorate11(decorators, target, key, desc) {
|
|
1698
2154
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1699
2155
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1700
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;
|
|
1701
2157
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1702
2158
|
}
|
|
1703
|
-
__name(
|
|
2159
|
+
__name(_ts_decorate11, "_ts_decorate");
|
|
1704
2160
|
var BaseStepStakeService = class extends BaseService {
|
|
1705
2161
|
static {
|
|
1706
2162
|
__name(this, "BaseStepStakeService");
|
|
1707
2163
|
}
|
|
1708
2164
|
stepStake(_step) {
|
|
1709
|
-
throw new Error("Method not implemented.");
|
|
2165
|
+
throw new Error("Method [stepStake] not implemented.");
|
|
1710
2166
|
}
|
|
1711
2167
|
stepStakeForAddress(_address, _step) {
|
|
1712
|
-
throw new Error("Method not implemented.");
|
|
2168
|
+
throw new Error("Method [stepStakeForAddress] not implemented.");
|
|
1713
2169
|
}
|
|
1714
2170
|
};
|
|
1715
|
-
BaseStepStakeService =
|
|
1716
|
-
|
|
2171
|
+
BaseStepStakeService = _ts_decorate11([
|
|
2172
|
+
creatable11()
|
|
1717
2173
|
], BaseStepStakeService);
|
|
1718
|
-
|
|
1719
|
-
// src/Time/BaseTimeSyncService.ts
|
|
1720
|
-
import { creatable as creatable15 } from "@xylabs/sdk-js";
|
|
1721
|
-
import { SimpleTimeSyncViewer } from "@xyo-network/xl1-protocol-sdk";
|
|
1722
|
-
function _ts_decorate15(decorators, target, key, desc) {
|
|
1723
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1724
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1725
|
-
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;
|
|
1726
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1727
|
-
}
|
|
1728
|
-
__name(_ts_decorate15, "_ts_decorate");
|
|
1729
|
-
var BaseTimeSyncService = class extends BaseService {
|
|
1730
|
-
static {
|
|
1731
|
-
__name(this, "BaseTimeSyncService");
|
|
1732
|
-
}
|
|
1733
|
-
timeSyncViewer;
|
|
1734
|
-
get blockViewer() {
|
|
1735
|
-
return this.params.blockViewer;
|
|
1736
|
-
}
|
|
1737
|
-
get ethProvider() {
|
|
1738
|
-
return this.params.ethProvider;
|
|
1739
|
-
}
|
|
1740
|
-
async convertTime(fromDomain, toDomain, from) {
|
|
1741
|
-
return await this.timeSyncViewer.convertTime(fromDomain, toDomain, from);
|
|
1742
|
-
}
|
|
1743
|
-
async createHandler() {
|
|
1744
|
-
await super.createHandler();
|
|
1745
|
-
this.timeSyncViewer = new SimpleTimeSyncViewer(this.blockViewer, this.ethProvider);
|
|
1746
|
-
}
|
|
1747
|
-
async currentTime(domain) {
|
|
1748
|
-
return await this.timeSyncViewer.currentTime(domain);
|
|
1749
|
-
}
|
|
1750
|
-
async currentTimeAndHash(domain) {
|
|
1751
|
-
return await this.timeSyncViewer.currentTimeAndHash(domain);
|
|
1752
|
-
}
|
|
1753
|
-
async currentTimePayload() {
|
|
1754
|
-
return await this.timeSyncViewer.currentTimePayload();
|
|
1755
|
-
}
|
|
1756
|
-
};
|
|
1757
|
-
BaseTimeSyncService = _ts_decorate15([
|
|
1758
|
-
creatable15()
|
|
1759
|
-
], BaseTimeSyncService);
|
|
1760
2174
|
export {
|
|
1761
|
-
BaseAccountBalanceService,
|
|
1762
|
-
BaseAccountBalanceServiceParamsZod,
|
|
1763
|
-
BaseAccountTransfersService,
|
|
1764
2175
|
BaseAccountableService,
|
|
1765
|
-
BaseBlockProducerService,
|
|
1766
|
-
BaseBlockProducerServiceParamsZod,
|
|
1767
|
-
BaseBlockRewardService,
|
|
1768
2176
|
BaseElectionService,
|
|
1769
2177
|
BaseNetworkStakeStepRewardService,
|
|
1770
2178
|
BasePendingTransactionsService,
|
|
@@ -1774,17 +2182,34 @@ export {
|
|
|
1774
2182
|
BaseTimeSyncService,
|
|
1775
2183
|
ChainBlockNumberIterationService,
|
|
1776
2184
|
DEFAULT_BLOCK_SIZE,
|
|
1777
|
-
|
|
2185
|
+
EvmBlockRewardViewer,
|
|
1778
2186
|
EvmChainService,
|
|
1779
|
-
MemoryBlockRewardService,
|
|
1780
2187
|
MemoryChainService,
|
|
2188
|
+
SimpleBlockRunner,
|
|
2189
|
+
SimpleBlockRunnerParamsZod,
|
|
1781
2190
|
XYO_PRODUCER_REDECLARATION_DURATION,
|
|
1782
2191
|
XYO_PRODUCER_REDECLARATION_WINDOW,
|
|
1783
2192
|
XyoStakeIntentService,
|
|
1784
2193
|
XyoValidator,
|
|
1785
|
-
|
|
2194
|
+
accountBalancesViewerFromArchivist,
|
|
1786
2195
|
blockViewerFromChainIteratorAndArchivist,
|
|
2196
|
+
canUseEvmProvider,
|
|
1787
2197
|
creatableService,
|
|
1788
|
-
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
|
|
1789
2214
|
};
|
|
1790
2215
|
//# sourceMappingURL=index.mjs.map
|