@xyo-network/xl1-cli 1.19.4 → 1.19.6
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/cli-min.mjs +260 -209
- package/package.json +5 -6
package/dist/cli-min.mjs
CHANGED
|
@@ -20795,23 +20795,29 @@ var uniq = (arr) => {
|
|
|
20795
20795
|
};
|
|
20796
20796
|
|
|
20797
20797
|
// src/assertDefinedEx.ts
|
|
20798
|
-
function assertDefinedEx(expr,
|
|
20798
|
+
function assertDefinedEx(expr, func) {
|
|
20799
20799
|
if (expr !== void 0) return expr;
|
|
20800
|
-
if (typeof
|
|
20801
|
-
const errorOrMessage =
|
|
20800
|
+
if (typeof func === "function") {
|
|
20801
|
+
const errorOrMessage = func(expr);
|
|
20802
20802
|
throw typeof errorOrMessage === "string" ? new Error(errorOrMessage) : errorOrMessage;
|
|
20803
20803
|
}
|
|
20804
|
-
|
|
20804
|
+
if (func !== void 0) {
|
|
20805
|
+
throw new Error("Invalid assertEx usage: second argument must be a function or undefined");
|
|
20806
|
+
}
|
|
20807
|
+
throw new Error("Assertion failed: value is undefined");
|
|
20805
20808
|
}
|
|
20806
20809
|
|
|
20807
20810
|
// src/assertEx.ts
|
|
20808
|
-
function assertEx(expr,
|
|
20811
|
+
function assertEx(expr, func) {
|
|
20809
20812
|
if (expr) return expr;
|
|
20810
|
-
if (typeof
|
|
20811
|
-
const errorOrMessage =
|
|
20813
|
+
if (typeof func === "function") {
|
|
20814
|
+
const errorOrMessage = func(expr);
|
|
20812
20815
|
throw typeof errorOrMessage === "string" ? new Error(errorOrMessage) : errorOrMessage;
|
|
20813
20816
|
}
|
|
20814
|
-
|
|
20817
|
+
if (func !== void 0) {
|
|
20818
|
+
throw new Error("Invalid assertEx usage: second argument must be a function or undefined");
|
|
20819
|
+
}
|
|
20820
|
+
throw new Error("Assertion failed");
|
|
20815
20821
|
}
|
|
20816
20822
|
|
|
20817
20823
|
/** A special constant with type `never` */
|
|
@@ -35312,6 +35318,8 @@ var toHex = (value, config = {}) => {
|
|
|
35312
35318
|
const { prefix = false } = config;
|
|
35313
35319
|
return hexFrom(value, { prefix, ...config });
|
|
35314
35320
|
};
|
|
35321
|
+
|
|
35322
|
+
// src/address/AddressValidationZod.ts
|
|
35315
35323
|
var AddressValidationZod = string$2().refine((x) => HexZod.safeParse(x)).refine((x) => x.length === ADDRESS_LENGTH, { error: (e) => new Error(`Address must have 40 characters [${e.input}]`) }).transform((v) => v);
|
|
35316
35324
|
|
|
35317
35325
|
// src/address/AddressTransformZod.ts
|
|
@@ -35332,20 +35340,6 @@ union$1([string$2(), bigint$1(), number$3()]).transform((value) => {
|
|
|
35332
35340
|
}
|
|
35333
35341
|
}).refine((x) => AddressValidationZod.safeParse(x).data).transform((x) => x);
|
|
35334
35342
|
|
|
35335
|
-
// src/address/to.ts
|
|
35336
|
-
var toAddress = (value, config = {}) => {
|
|
35337
|
-
const { bitLength = 160, prefix = false } = config;
|
|
35338
|
-
return hexFrom(value, {
|
|
35339
|
-
bitLength,
|
|
35340
|
-
prefix,
|
|
35341
|
-
...config
|
|
35342
|
-
});
|
|
35343
|
-
};
|
|
35344
|
-
|
|
35345
|
-
// src/address/addressDeprecated.ts
|
|
35346
|
-
string$2().regex(AddressRegEx);
|
|
35347
|
-
string$2().toLowerCase().regex(AddressRegEx).transform((v) => toAddress(v));
|
|
35348
|
-
|
|
35349
35343
|
// src/address/is.ts
|
|
35350
35344
|
var isAddress = (value, config = {}) => {
|
|
35351
35345
|
const { bitLength = 160, prefix = false } = config;
|
|
@@ -35371,6 +35365,16 @@ function asAddress(value, assert) {
|
|
|
35371
35365
|
return assertError(void 0, assert, error.message);
|
|
35372
35366
|
}
|
|
35373
35367
|
}
|
|
35368
|
+
|
|
35369
|
+
// src/address/to.ts
|
|
35370
|
+
var toAddress = (value, config = {}) => {
|
|
35371
|
+
const { bitLength = 160, prefix = false } = config;
|
|
35372
|
+
return hexFrom(value, {
|
|
35373
|
+
bitLength,
|
|
35374
|
+
prefix,
|
|
35375
|
+
...config
|
|
35376
|
+
});
|
|
35377
|
+
};
|
|
35374
35378
|
var EthAddressRegEx = HexRegExMinMaxMixedCaseWithPrefix(20, 20);
|
|
35375
35379
|
string$2().regex(EthAddressRegEx);
|
|
35376
35380
|
string$2().regex(EthAddressRegEx).transform((v) => toEthAddress(v));
|
|
@@ -89239,15 +89243,20 @@ var SimpleMempoolRunner = class extends AbstractCreatableProvider {
|
|
|
89239
89243
|
return [isPayloadBundle(p) ? await bundledPayloadToHydratedBlock(p) : void 0, p];
|
|
89240
89244
|
}));
|
|
89241
89245
|
return blockBundles.map(([block, bundle3]) => {
|
|
89242
|
-
const
|
|
89243
|
-
|
|
89246
|
+
const blockCheckPassed = !!block;
|
|
89247
|
+
const chainIdPassed = blockCheckPassed ? block[0].chain === chainId : false;
|
|
89248
|
+
const blockNumberPassed = blockCheckPassed ? block[0].block > headNumber : false;
|
|
89249
|
+
const typeCheckPassed = blockCheckPassed ? isSignedHydratedBlockWithHashMeta(block) : false;
|
|
89250
|
+
const validationPassed = blockCheckPassed && chainIdPassed && blockNumberPassed && typeCheckPassed;
|
|
89251
|
+
const validatedBlock = validationPassed ? block : void 0;
|
|
89252
|
+
if (!validationPassed) {
|
|
89244
89253
|
this.logger?.info(`Pruning block bundle ${bundle3._hash} during simpleValidationCheck`);
|
|
89245
|
-
this.logger?.info(` - chainId match: ${
|
|
89246
|
-
this.logger?.info(` -
|
|
89247
|
-
this.logger?.info(` -
|
|
89248
|
-
this.logger?.info(` -
|
|
89254
|
+
this.logger?.info(` - chainId match: ${chainIdPassed}`);
|
|
89255
|
+
this.logger?.info(` - blockNumber check: ${blockNumberPassed}`);
|
|
89256
|
+
this.logger?.info(` - typeCheck: ${typeCheckPassed}`);
|
|
89257
|
+
this.logger?.info(` - bundle hash: ${bundle3._hash}`);
|
|
89249
89258
|
}
|
|
89250
|
-
return
|
|
89259
|
+
return [validatedBlock, bundle3];
|
|
89251
89260
|
});
|
|
89252
89261
|
}
|
|
89253
89262
|
};
|
|
@@ -201982,6 +201991,44 @@ async function createChain(signer, stakingTokenAddress, initialBlockProducer, re
|
|
|
201982
201991
|
];
|
|
201983
201992
|
}
|
|
201984
201993
|
__name$e(createChain, "createChain");
|
|
201994
|
+
var EthHashRegEx = HexRegExMinMaxMixedCaseWithPrefix(32, 32);
|
|
201995
|
+
var EthHashZod = string$2().regex(EthHashRegEx, {
|
|
201996
|
+
message: "Invalid address format"
|
|
201997
|
+
});
|
|
201998
|
+
var EvmStakeAddedEventNameZod = literal$2("StakeAdded");
|
|
201999
|
+
var EvmStakeRemovedEventNameZod = literal$2("StakeRemoved");
|
|
202000
|
+
var EvmStakeWithdrawnEventNameZod = literal$2("StakeWithdrawn");
|
|
202001
|
+
var EvmStakeEventNameZod = union$1([
|
|
202002
|
+
EvmStakeAddedEventNameZod,
|
|
202003
|
+
EvmStakeRemovedEventNameZod,
|
|
202004
|
+
EvmStakeWithdrawnEventNameZod
|
|
202005
|
+
]);
|
|
202006
|
+
var EvmStakeEventArgsZod = tuple([
|
|
202007
|
+
EthAddressZod,
|
|
202008
|
+
EthAddressZod,
|
|
202009
|
+
bigint$1(),
|
|
202010
|
+
bigint$1()
|
|
202011
|
+
]);
|
|
202012
|
+
var EvmStakeEventZod = object$4({
|
|
202013
|
+
address: EthAddressZod,
|
|
202014
|
+
args: EvmStakeEventArgsZod,
|
|
202015
|
+
blockHash: EthHashZod,
|
|
202016
|
+
blockNumber: number$3(),
|
|
202017
|
+
eventName: EvmStakeEventNameZod,
|
|
202018
|
+
transactionHash: EthHashZod,
|
|
202019
|
+
transactionIndex: number$3()
|
|
202020
|
+
});
|
|
202021
|
+
EvmStakeEventZod.extend({
|
|
202022
|
+
eventName: EvmStakeAddedEventNameZod
|
|
202023
|
+
});
|
|
202024
|
+
EvmStakeEventZod.extend({
|
|
202025
|
+
eventName: EvmStakeRemovedEventNameZod
|
|
202026
|
+
});
|
|
202027
|
+
EvmStakeEventZod.extend({
|
|
202028
|
+
eventName: EvmStakeWithdrawnEventNameZod
|
|
202029
|
+
});
|
|
202030
|
+
|
|
202031
|
+
// src/drivers/EvmStakeEventsViewer.ts
|
|
201985
202032
|
function _ts_decorate$5(decorators, target, key, desc) {
|
|
201986
202033
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
201987
202034
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -201989,6 +202036,170 @@ function _ts_decorate$5(decorators, target, key, desc) {
|
|
|
201989
202036
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
201990
202037
|
}
|
|
201991
202038
|
__name$e(_ts_decorate$5, "_ts_decorate");
|
|
202039
|
+
var EvmStakeEventsViewer = class _EvmStakeEventsViewer extends AbstractCreatableProvider {
|
|
202040
|
+
static {
|
|
202041
|
+
__name$e(this, "EvmStakeEventsViewer");
|
|
202042
|
+
}
|
|
202043
|
+
static defaultMoniker = StakeEventsViewerMoniker;
|
|
202044
|
+
static dependencies = [];
|
|
202045
|
+
static monikers = [
|
|
202046
|
+
StakeEventsViewerMoniker
|
|
202047
|
+
];
|
|
202048
|
+
moniker = _EvmStakeEventsViewer.defaultMoniker;
|
|
202049
|
+
eventCache = /* @__PURE__ */ new Map();
|
|
202050
|
+
get contract() {
|
|
202051
|
+
return assertEx(this.params.contract, () => new Error("Contract not defined"));
|
|
202052
|
+
}
|
|
202053
|
+
get deploymentBlock() {
|
|
202054
|
+
return this.params.deploymentBlock ?? 0;
|
|
202055
|
+
}
|
|
202056
|
+
async positionCount(range) {
|
|
202057
|
+
const events = await this.stakeEvents(range);
|
|
202058
|
+
const positionIds = events.map((e) => e.args.id);
|
|
202059
|
+
return Math.max(-1, ...positionIds) + 1;
|
|
202060
|
+
}
|
|
202061
|
+
stakeEvents(range = [
|
|
202062
|
+
0,
|
|
202063
|
+
"latest"
|
|
202064
|
+
], filter) {
|
|
202065
|
+
const allEvents = [
|
|
202066
|
+
...this.eventCache.values()
|
|
202067
|
+
];
|
|
202068
|
+
const result = allEvents.filter((e) => {
|
|
202069
|
+
if (range[1] !== "latest" && e.time > range[1]) {
|
|
202070
|
+
return false;
|
|
202071
|
+
}
|
|
202072
|
+
if (e.time < range[0]) {
|
|
202073
|
+
return false;
|
|
202074
|
+
}
|
|
202075
|
+
if (isDefined(filter?.name) && e.name !== filter.name) {
|
|
202076
|
+
return false;
|
|
202077
|
+
}
|
|
202078
|
+
if (isDefined(filter?.args?.id) && e.args.id !== filter.args.id) {
|
|
202079
|
+
return false;
|
|
202080
|
+
}
|
|
202081
|
+
if (isDefined(filter?.args?.staked) && e.args.staked !== filter.args.staked) {
|
|
202082
|
+
return false;
|
|
202083
|
+
}
|
|
202084
|
+
if (isDefined(filter?.args?.staker) && e.args.staker !== filter.args.staker) {
|
|
202085
|
+
return false;
|
|
202086
|
+
}
|
|
202087
|
+
return true;
|
|
202088
|
+
});
|
|
202089
|
+
return result;
|
|
202090
|
+
}
|
|
202091
|
+
onEventHandler(staked, staker, id, amount, event, throwOnInvalid = false) {
|
|
202092
|
+
const validatedEventResult = EvmStakeEventZod.safeParse(event);
|
|
202093
|
+
if (validatedEventResult.error) {
|
|
202094
|
+
this.logger?.warn(`Received invalid stake event [${event.eventName}/${event.blockNumber}], ignoring...`);
|
|
202095
|
+
this.logger?.warn(` - ${validatedEventResult.error.message}`);
|
|
202096
|
+
if (throwOnInvalid) {
|
|
202097
|
+
throw new Error(`Invalid stake event: ${validatedEventResult.error.message}`);
|
|
202098
|
+
}
|
|
202099
|
+
return;
|
|
202100
|
+
}
|
|
202101
|
+
const validatedEvent = validatedEventResult.data;
|
|
202102
|
+
const { eventName, blockNumber } = validatedEvent;
|
|
202103
|
+
this.logger?.log(`Processing ${eventName} event for stake ID ${id} at block ${blockNumber}`);
|
|
202104
|
+
const cacheKey = `${Number(id)}|${eventName}|${staker}`;
|
|
202105
|
+
const existingStakeEvent = this.eventCache.get(cacheKey);
|
|
202106
|
+
const stakeEvent = {
|
|
202107
|
+
name: eventName,
|
|
202108
|
+
args: {
|
|
202109
|
+
id: Number(id),
|
|
202110
|
+
staked: toAddress(staked),
|
|
202111
|
+
staker: toAddress(staker),
|
|
202112
|
+
amount: asAttoXL1(amount)
|
|
202113
|
+
},
|
|
202114
|
+
time: blockNumber
|
|
202115
|
+
};
|
|
202116
|
+
if (isDefined(existingStakeEvent)) {
|
|
202117
|
+
this.logger?.warn(`Received ${eventName} event for stake ID ${id} that is already cached, updating cache...`);
|
|
202118
|
+
this.logger?.warn("1");
|
|
202119
|
+
this.logger?.warn("Previous event", existingStakeEvent);
|
|
202120
|
+
this.logger?.warn("2");
|
|
202121
|
+
this.logger?.warn("New event", stakeEvent);
|
|
202122
|
+
this.logger?.warn("3");
|
|
202123
|
+
}
|
|
202124
|
+
this.eventCache.set(cacheKey, stakeEvent);
|
|
202125
|
+
return stakeEvent;
|
|
202126
|
+
}
|
|
202127
|
+
async startHandler() {
|
|
202128
|
+
try {
|
|
202129
|
+
const currentEthBlock = assertEx(await this.contract.runner?.provider?.getBlockNumber(), () => new Error("Failed to egt currentEthBlock"));
|
|
202130
|
+
await this.contract.on(this.contract.getEvent("StakeAdded"), (staked, staker, id, amount, event) => {
|
|
202131
|
+
this.onEventHandler(staked, staker, id, amount, event);
|
|
202132
|
+
});
|
|
202133
|
+
await this.contract.on(this.contract.getEvent("StakeRemoved"), (staked, staker, id, amount, event) => {
|
|
202134
|
+
this.onEventHandler(staked, staker, id, amount, event);
|
|
202135
|
+
});
|
|
202136
|
+
await this.contract.on(this.contract.getEvent("StakeWithdrawn"), (staked, staker, id, amount, event) => {
|
|
202137
|
+
this.onEventHandler(staked, staker, id, amount, event);
|
|
202138
|
+
});
|
|
202139
|
+
await this.loadHistoricalEvents(currentEthBlock);
|
|
202140
|
+
} catch (error) {
|
|
202141
|
+
this.logger?.error("EthereumChainStakeEvents failed to start:", error);
|
|
202142
|
+
throw error;
|
|
202143
|
+
}
|
|
202144
|
+
}
|
|
202145
|
+
async loadHistoricalEvents(currentEthBlock) {
|
|
202146
|
+
const allStakeEvents = (await Promise.all([
|
|
202147
|
+
this.stakeEventsNative([
|
|
202148
|
+
this.deploymentBlock,
|
|
202149
|
+
currentEthBlock
|
|
202150
|
+
], {
|
|
202151
|
+
name: "StakeAdded"
|
|
202152
|
+
}),
|
|
202153
|
+
this.stakeEventsNative([
|
|
202154
|
+
this.deploymentBlock,
|
|
202155
|
+
currentEthBlock
|
|
202156
|
+
], {
|
|
202157
|
+
name: "StakeRemoved"
|
|
202158
|
+
}),
|
|
202159
|
+
this.stakeEventsNative([
|
|
202160
|
+
this.deploymentBlock,
|
|
202161
|
+
currentEthBlock
|
|
202162
|
+
], {
|
|
202163
|
+
name: "StakeWithdrawn"
|
|
202164
|
+
})
|
|
202165
|
+
])).flat().toSorted((a, b) => a.time - b.time);
|
|
202166
|
+
console.warn(`Caching ${allStakeEvents.length} stake events from chain starting at block ${this.deploymentBlock}`);
|
|
202167
|
+
for (const event of allStakeEvents) {
|
|
202168
|
+
this.eventCache.set(`${Number(event.args.id)}|${event.name}|${event.args.staker}`, event);
|
|
202169
|
+
}
|
|
202170
|
+
}
|
|
202171
|
+
async stakeEventsNative(range = [
|
|
202172
|
+
0,
|
|
202173
|
+
"latest"
|
|
202174
|
+
], filter) {
|
|
202175
|
+
const name = filter?.name;
|
|
202176
|
+
if (isDefined(name)) {
|
|
202177
|
+
const stakedFilter = filter?.args?.staked;
|
|
202178
|
+
const stakerFilter = filter?.args?.staker;
|
|
202179
|
+
const stakedFilterEth = isDefined(stakedFilter) ? toEthAddress(stakedFilter) : void 0;
|
|
202180
|
+
const stakerFilterEth = isDefined(stakerFilter) ? toEthAddress(stakerFilter) : void 0;
|
|
202181
|
+
let ethEvents = [];
|
|
202182
|
+
const ethFilter = this.contract.filters[name](stakedFilterEth, stakerFilterEth);
|
|
202183
|
+
ethEvents = await this.contract.queryFilter(ethFilter, range[0], range[1]);
|
|
202184
|
+
return ethEvents.map((e) => {
|
|
202185
|
+
assertEx(e.eventName === name, () => `Event name mismatch expected '${name}' but got '${e.eventName}'`);
|
|
202186
|
+
return this.onEventHandler(e.args.staked, e.args.by, e.args.id, e.args.amount, e, true);
|
|
202187
|
+
}).filter(exists$2);
|
|
202188
|
+
} else {
|
|
202189
|
+
throw new Error("Only filtered stake events (by name) are supported");
|
|
202190
|
+
}
|
|
202191
|
+
}
|
|
202192
|
+
};
|
|
202193
|
+
EvmStakeEventsViewer = _ts_decorate$5([
|
|
202194
|
+
creatableProvider()
|
|
202195
|
+
], EvmStakeEventsViewer);
|
|
202196
|
+
function _ts_decorate2$3(decorators, target, key, desc) {
|
|
202197
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
202198
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
202199
|
+
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;
|
|
202200
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
202201
|
+
}
|
|
202202
|
+
__name$e(_ts_decorate2$3, "_ts_decorate");
|
|
201992
202203
|
var ethStakeToStake = /* @__PURE__ */ __name$e((ethStake) => {
|
|
201993
202204
|
const stake = {
|
|
201994
202205
|
id: Number(ethStake.id),
|
|
@@ -202001,16 +202212,16 @@ var ethStakeToStake = /* @__PURE__ */ __name$e((ethStake) => {
|
|
|
202001
202212
|
};
|
|
202002
202213
|
return stake;
|
|
202003
202214
|
}, "ethStakeToStake");
|
|
202004
|
-
var
|
|
202215
|
+
var EvmStakeViewer = class _EvmStakeViewer extends AbstractCreatableProvider {
|
|
202005
202216
|
static {
|
|
202006
|
-
__name$e(this, "
|
|
202217
|
+
__name$e(this, "EvmStakeViewer");
|
|
202007
202218
|
}
|
|
202008
202219
|
static defaultMoniker = StakeViewerMoniker;
|
|
202009
202220
|
static dependencies = [];
|
|
202010
202221
|
static monikers = [
|
|
202011
202222
|
StakeViewerMoniker
|
|
202012
202223
|
];
|
|
202013
|
-
moniker =
|
|
202224
|
+
moniker = _EvmStakeViewer.defaultMoniker;
|
|
202014
202225
|
_callMutex = new Mutex$1();
|
|
202015
202226
|
_deploymentBlock = 0;
|
|
202016
202227
|
_stakeCache = /* @__PURE__ */ new Map();
|
|
@@ -202211,174 +202422,9 @@ var EthereumChainStakeViewer = class _EthereumChainStakeViewer extends AbstractC
|
|
|
202211
202422
|
}
|
|
202212
202423
|
}
|
|
202213
202424
|
};
|
|
202214
|
-
|
|
202215
|
-
creatableProvider()
|
|
202216
|
-
], EthereumChainStakeViewer);
|
|
202217
|
-
function _ts_decorate2$3(decorators, target, key, desc) {
|
|
202218
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
202219
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
202220
|
-
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;
|
|
202221
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
202222
|
-
}
|
|
202223
|
-
__name$e(_ts_decorate2$3, "_ts_decorate");
|
|
202224
|
-
var isStakeLogEventName = /* @__PURE__ */ __name$e((name) => {
|
|
202225
|
-
return isString$1(name) && [
|
|
202226
|
-
"StakeAdded",
|
|
202227
|
-
"StakeRemoved",
|
|
202228
|
-
"StakeWithdrawn"
|
|
202229
|
-
].includes(name);
|
|
202230
|
-
}, "isStakeLogEventName");
|
|
202231
|
-
var EthereumChainStakeEventsViewer = class _EthereumChainStakeEventsViewer extends AbstractCreatableProvider {
|
|
202232
|
-
static {
|
|
202233
|
-
__name$e(this, "EthereumChainStakeEventsViewer");
|
|
202234
|
-
}
|
|
202235
|
-
static defaultMoniker = StakeEventsViewerMoniker;
|
|
202236
|
-
static dependencies = [];
|
|
202237
|
-
static monikers = [
|
|
202238
|
-
StakeEventsViewerMoniker
|
|
202239
|
-
];
|
|
202240
|
-
moniker = _EthereumChainStakeEventsViewer.defaultMoniker;
|
|
202241
|
-
eventCache = /* @__PURE__ */ new Map();
|
|
202242
|
-
get contract() {
|
|
202243
|
-
return assertEx(this.params.contract, () => new Error("Contract not defined"));
|
|
202244
|
-
}
|
|
202245
|
-
get deploymentBlock() {
|
|
202246
|
-
return this.params.deploymentBlock ?? 0;
|
|
202247
|
-
}
|
|
202248
|
-
async positionCount(range) {
|
|
202249
|
-
const events = await this.stakeEvents(range);
|
|
202250
|
-
const positionIds = events.map((e) => e.args.id);
|
|
202251
|
-
return Math.max(-1, ...positionIds) + 1;
|
|
202252
|
-
}
|
|
202253
|
-
stakeEvents(range = [
|
|
202254
|
-
0,
|
|
202255
|
-
"latest"
|
|
202256
|
-
], filter) {
|
|
202257
|
-
const allEvents = [
|
|
202258
|
-
...this.eventCache.values()
|
|
202259
|
-
];
|
|
202260
|
-
const result = allEvents.filter((e) => {
|
|
202261
|
-
if (range[1] !== "latest" && e.time > range[1]) {
|
|
202262
|
-
return false;
|
|
202263
|
-
}
|
|
202264
|
-
if (e.time < range[0]) {
|
|
202265
|
-
return false;
|
|
202266
|
-
}
|
|
202267
|
-
if (isDefined(filter?.name) && e.name !== filter.name) {
|
|
202268
|
-
return false;
|
|
202269
|
-
}
|
|
202270
|
-
if (isDefined(filter?.args?.id) && e.args.id !== filter.args.id) {
|
|
202271
|
-
return false;
|
|
202272
|
-
}
|
|
202273
|
-
if (isDefined(filter?.args?.staked) && e.args.staked !== filter.args.staked) {
|
|
202274
|
-
return false;
|
|
202275
|
-
}
|
|
202276
|
-
if (isDefined(filter?.args?.staker) && e.args.staker !== filter.args.staker) {
|
|
202277
|
-
return false;
|
|
202278
|
-
}
|
|
202279
|
-
return true;
|
|
202280
|
-
});
|
|
202281
|
-
return result;
|
|
202282
|
-
}
|
|
202283
|
-
onEventHandler(staked, staker, id, amount, { eventName, blockNumber }) {
|
|
202284
|
-
if (blockNumber === void 0) {
|
|
202285
|
-
this.logger?.warn(`Received ${eventName} event with ${blockNumber} blockNumber, ignoring...`);
|
|
202286
|
-
return;
|
|
202287
|
-
}
|
|
202288
|
-
if (!isStakeLogEventName(eventName)) {
|
|
202289
|
-
this.logger?.warn(`Received event with unsupported name '${eventName}'`);
|
|
202290
|
-
return;
|
|
202291
|
-
}
|
|
202292
|
-
this.logger?.log(`Processing ${eventName} event for stake ID ${id} at block ${blockNumber}`);
|
|
202293
|
-
const cacheKey = `${Number(id)}|${eventName}|${staker}`;
|
|
202294
|
-
const existingStakeEvent = this.eventCache.get(cacheKey);
|
|
202295
|
-
const stakeEvent = {
|
|
202296
|
-
name: eventName,
|
|
202297
|
-
args: {
|
|
202298
|
-
id: Number(id),
|
|
202299
|
-
staked: toAddress(staked),
|
|
202300
|
-
staker: toAddress(staker),
|
|
202301
|
-
amount: asAttoXL1(amount)
|
|
202302
|
-
},
|
|
202303
|
-
time: blockNumber
|
|
202304
|
-
};
|
|
202305
|
-
if (isDefined(existingStakeEvent)) {
|
|
202306
|
-
this.logger?.warn(`Received ${eventName} event for stake ID ${id} that is already cached, updating cache...`);
|
|
202307
|
-
this.logger?.warn("1");
|
|
202308
|
-
this.logger?.warn("Previous event", existingStakeEvent);
|
|
202309
|
-
this.logger?.warn("2");
|
|
202310
|
-
this.logger?.warn("New event", stakeEvent);
|
|
202311
|
-
this.logger?.warn("3");
|
|
202312
|
-
}
|
|
202313
|
-
this.eventCache.set(cacheKey, stakeEvent);
|
|
202314
|
-
return stakeEvent;
|
|
202315
|
-
}
|
|
202316
|
-
async startHandler() {
|
|
202317
|
-
try {
|
|
202318
|
-
const currentEthBlock = assertEx(await this.contract.runner?.provider?.getBlockNumber(), () => new Error("Failed to egt currentEthBlock"));
|
|
202319
|
-
await this.contract.on(this.contract.getEvent("StakeAdded"), (staked, staker, id, amount, event) => {
|
|
202320
|
-
this.onEventHandler(staked, staker, id, amount, event);
|
|
202321
|
-
});
|
|
202322
|
-
await this.contract.on(this.contract.getEvent("StakeRemoved"), (staked, staker, id, amount, event) => {
|
|
202323
|
-
this.onEventHandler(staked, staker, id, amount, event);
|
|
202324
|
-
});
|
|
202325
|
-
await this.contract.on(this.contract.getEvent("StakeWithdrawn"), (staked, staker, id, amount, event) => {
|
|
202326
|
-
this.onEventHandler(staked, staker, id, amount, event);
|
|
202327
|
-
});
|
|
202328
|
-
const allStakeEvents = (await Promise.all([
|
|
202329
|
-
this.stakeEventsNative([
|
|
202330
|
-
this.deploymentBlock,
|
|
202331
|
-
currentEthBlock
|
|
202332
|
-
], {
|
|
202333
|
-
name: "StakeAdded"
|
|
202334
|
-
}),
|
|
202335
|
-
this.stakeEventsNative([
|
|
202336
|
-
this.deploymentBlock,
|
|
202337
|
-
currentEthBlock
|
|
202338
|
-
], {
|
|
202339
|
-
name: "StakeRemoved"
|
|
202340
|
-
}),
|
|
202341
|
-
this.stakeEventsNative([
|
|
202342
|
-
this.deploymentBlock,
|
|
202343
|
-
currentEthBlock
|
|
202344
|
-
], {
|
|
202345
|
-
name: "StakeWithdrawn"
|
|
202346
|
-
})
|
|
202347
|
-
])).flat().toSorted((a, b) => a.time - b.time);
|
|
202348
|
-
console.warn(`Caching ${allStakeEvents.length} stake events from chain starting at block ${this.deploymentBlock}`);
|
|
202349
|
-
for (const event of allStakeEvents) {
|
|
202350
|
-
this.eventCache.set(`${Number(event.args.id)}|${event.name}|${event.args.staker}`, event);
|
|
202351
|
-
}
|
|
202352
|
-
} catch (error) {
|
|
202353
|
-
this.logger?.error("EthereumChainStakeEvents failed to start:", error);
|
|
202354
|
-
throw error;
|
|
202355
|
-
}
|
|
202356
|
-
}
|
|
202357
|
-
async stakeEventsNative(range = [
|
|
202358
|
-
0,
|
|
202359
|
-
"latest"
|
|
202360
|
-
], filter) {
|
|
202361
|
-
const name = filter?.name;
|
|
202362
|
-
if (isDefined(name)) {
|
|
202363
|
-
const stakedFilter = filter?.args?.staked;
|
|
202364
|
-
const stakerFilter = filter?.args?.staker;
|
|
202365
|
-
const stakedFilterEth = isDefined(stakedFilter) ? toEthAddress(stakedFilter) : void 0;
|
|
202366
|
-
const stakerFilterEth = isDefined(stakerFilter) ? toEthAddress(stakerFilter) : void 0;
|
|
202367
|
-
let ethEvents = [];
|
|
202368
|
-
const ethFilter = this.contract.filters[name](stakedFilterEth, stakerFilterEth);
|
|
202369
|
-
ethEvents = await this.contract.queryFilter(ethFilter, range[0], range[1]);
|
|
202370
|
-
return ethEvents.map((e) => {
|
|
202371
|
-
assertEx(e.eventName === name, () => `Event name mismatch expected '${name}' but got '${e.eventName}'`);
|
|
202372
|
-
return this.onEventHandler(e.args.staked, e.args.by, e.args.id, e.args.amount, e);
|
|
202373
|
-
}).filter(exists$2);
|
|
202374
|
-
} else {
|
|
202375
|
-
throw new Error("Only filtered stake events (by name) are supported");
|
|
202376
|
-
}
|
|
202377
|
-
}
|
|
202378
|
-
};
|
|
202379
|
-
EthereumChainStakeEventsViewer = _ts_decorate2$3([
|
|
202425
|
+
EvmStakeViewer = _ts_decorate2$3([
|
|
202380
202426
|
creatableProvider()
|
|
202381
|
-
],
|
|
202427
|
+
], EvmStakeViewer);
|
|
202382
202428
|
var AbstractEvmProvider = class extends AbstractCreatableProvider {
|
|
202383
202429
|
static {
|
|
202384
202430
|
__name$e(this, "AbstractEvmProvider");
|
|
@@ -297899,19 +297945,19 @@ async function initEvmChainStakeViewer(context, config, logger) {
|
|
|
297899
297945
|
});
|
|
297900
297946
|
const contractAddress = assertEx(config.chain.id, () => "Missing config.evm.chainId");
|
|
297901
297947
|
const contract = IStakedXyoChain__factory.connect(toEthAddress(contractAddress), provider2);
|
|
297902
|
-
const stakeEventsViewer = await
|
|
297948
|
+
const stakeEventsViewer = await EvmStakeEventsViewer.create({
|
|
297903
297949
|
contract,
|
|
297904
297950
|
logger,
|
|
297905
297951
|
context
|
|
297906
297952
|
});
|
|
297907
|
-
assertEx(await stakeEventsViewer.start(), () => "Failed to start
|
|
297908
|
-
const stakeChainViewer = await
|
|
297953
|
+
assertEx(await stakeEventsViewer.start(), () => "Failed to start EvmStakeEvents reader");
|
|
297954
|
+
const stakeChainViewer = await EvmStakeViewer.create({
|
|
297909
297955
|
contract,
|
|
297910
297956
|
stakeEventsViewer,
|
|
297911
297957
|
logger,
|
|
297912
297958
|
context
|
|
297913
297959
|
});
|
|
297914
|
-
assertEx(await stakeChainViewer.start(), () => "Failed to start
|
|
297960
|
+
assertEx(await stakeChainViewer.start(), () => "Failed to start EvmStake viewer");
|
|
297915
297961
|
return stakeChainViewer;
|
|
297916
297962
|
}
|
|
297917
297963
|
__name$6(initEvmChainStakeViewer, "initEvmChainStakeViewer");
|
|
@@ -298770,12 +298816,12 @@ async function getServer$3(params) {
|
|
|
298770
298816
|
});
|
|
298771
298817
|
const contractAddress = assertEx(config.chain.id, () => "Missing config.chain.chainId");
|
|
298772
298818
|
const contract = IStakedXyoChain__factory.connect(toEthAddress(contractAddress), provider);
|
|
298773
|
-
locator.register(
|
|
298819
|
+
locator.register(EvmStakeEventsViewer.factory(EvmStakeEventsViewer.dependencies, {
|
|
298774
298820
|
contract
|
|
298775
298821
|
}));
|
|
298776
|
-
const stakeEventsViewer = await locator.getInstance(
|
|
298777
|
-
assertEx(await stakeEventsViewer.start(), () => "Failed to start
|
|
298778
|
-
locator.register(
|
|
298822
|
+
const stakeEventsViewer = await locator.getInstance(EvmStakeEventsViewer.defaultMoniker);
|
|
298823
|
+
assertEx(await stakeEventsViewer.start(), () => "Failed to start EvmStakeEventsViewer");
|
|
298824
|
+
locator.register(EvmStakeViewer.factory(EvmStakeViewer.dependencies, {
|
|
298779
298825
|
contract,
|
|
298780
298826
|
stakeEventsViewer
|
|
298781
298827
|
}));
|
|
@@ -343133,10 +343179,15 @@ var ChainStepRewardsClaimSentinel = class extends AbstractSentinel {
|
|
|
343133
343179
|
this._claimCheckCounter?.add(1, claimCounterAttributes);
|
|
343134
343180
|
const stepRewardAddress = completedStepRewardAddress(stepIdentity);
|
|
343135
343181
|
const balance = await this.viewer.account.balance.accountBalance(stepRewardAddress);
|
|
343182
|
+
this.logger?.info(`Found balance of ${balance} to claim for step ${stepIdentity.step} at block ${stepIdentity.block} in step reward address ${stepRewardAddress}`);
|
|
343136
343183
|
if (balance > 0n) {
|
|
343137
|
-
this.logger?.info(`Found balance of ${balance} to claim for step ${stepIdentity.step} at block ${stepIdentity.block}`);
|
|
343138
343184
|
this._claimAttemptsCounter?.add(1, claimCounterAttributes);
|
|
343139
343185
|
const rewardsByStaker = await this.viewer.networkStakeStepRewardPoolRewards(stepIdentity);
|
|
343186
|
+
const rewardRecipients = Object.keys(rewardsByStaker).length;
|
|
343187
|
+
this.logger?.info(`Found ${rewardRecipients} reward recipients for step ${stepIdentity.step} at block ${stepIdentity.block}`);
|
|
343188
|
+
if (!this.config.claimEmptySteps) {
|
|
343189
|
+
assertEx(rewardRecipients > 0, () => "No reward recipients for step");
|
|
343190
|
+
}
|
|
343140
343191
|
const addressDistributions = this.calculateAddressDistributions(rewardsByStaker, balance);
|
|
343141
343192
|
this.logger?.info(`Calculated address distributions for step ${stepIdentity.step} at block ${stepIdentity.block} with ${Object.keys(addressDistributions).length} addresses`);
|
|
343142
343193
|
const tx = await this.submitRewardDistributionTransaction(stepRewardAddress, addressDistributions, stepIdentity, this.gateway);
|
|
@@ -350450,7 +350501,7 @@ var waitForHostPort = /* @__PURE__ */ __name((host, port) => {
|
|
|
350450
350501
|
|
|
350451
350502
|
// src/runCLI.ts
|
|
350452
350503
|
var configuration;
|
|
350453
|
-
var version = isDefined("1.19.
|
|
350504
|
+
var version = isDefined("1.19.5") ? "1.19.5" : "unknown";
|
|
350454
350505
|
var getContextFromConfig = /* @__PURE__ */ __name(async (configuration2) => {
|
|
350455
350506
|
const logger = initLogger(configuration2);
|
|
350456
350507
|
const orchestrator = await Orchestrator.create({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/xl1-cli",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.6",
|
|
4
4
|
"description": "XYO Layer One CLI",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -62,11 +62,10 @@
|
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
64
64
|
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
65
|
-
"@xylabs/sdk-js": "~5.0.
|
|
66
|
-
"@xylabs/telemetry": "~5.0.64",
|
|
65
|
+
"@xylabs/sdk-js": "~5.0.65",
|
|
67
66
|
"@xylabs/ts-scripts-yarn3": "~7.3.2",
|
|
68
67
|
"@xylabs/tsconfig": "~7.3.2",
|
|
69
|
-
"@xylabs/vitest-extended": "~5.0.
|
|
68
|
+
"@xylabs/vitest-extended": "~5.0.65",
|
|
70
69
|
"@xyo-network/account-model": "~5.3.2",
|
|
71
70
|
"@xyo-network/archivist-lmdb": "~5.3.2",
|
|
72
71
|
"@xyo-network/archivist-memory": "~5.3.2",
|
|
@@ -75,8 +74,8 @@
|
|
|
75
74
|
"@xyo-network/payload-model": "~5.3.2",
|
|
76
75
|
"@xyo-network/wallet": "~5.3.2",
|
|
77
76
|
"@xyo-network/wallet-model": "~5.3.2",
|
|
78
|
-
"@xyo-network/xl1-cli-lib": "~1.19.
|
|
79
|
-
"@xyo-network/xl1-sdk": "~1.21.
|
|
77
|
+
"@xyo-network/xl1-cli-lib": "~1.19.6",
|
|
78
|
+
"@xyo-network/xl1-sdk": "~1.21.10",
|
|
80
79
|
"async-mutex": "~0.5.0",
|
|
81
80
|
"dotenv": "~17.2.3",
|
|
82
81
|
"eslint": "^9.39.2",
|