@lodestar/builder 1.50.0-dev.b4eaa62b30 → 1.50.0-dev.be50566b7e

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.
Files changed (40) hide show
  1. package/lib/builder.d.ts +2 -0
  2. package/lib/builder.d.ts.map +1 -1
  3. package/lib/builder.js +56 -4
  4. package/lib/builder.js.map +1 -1
  5. package/lib/services/bidLedger.d.ts +7 -0
  6. package/lib/services/bidLedger.d.ts.map +1 -1
  7. package/lib/services/bidLedger.js +15 -10
  8. package/lib/services/bidLedger.js.map +1 -1
  9. package/lib/services/bidPublisher.d.ts +43 -0
  10. package/lib/services/bidPublisher.d.ts.map +1 -0
  11. package/lib/services/bidPublisher.js +50 -0
  12. package/lib/services/bidPublisher.js.map +1 -0
  13. package/lib/services/bidSelector.d.ts +67 -0
  14. package/lib/services/bidSelector.d.ts.map +1 -0
  15. package/lib/services/bidSelector.js +59 -0
  16. package/lib/services/bidSelector.js.map +1 -0
  17. package/lib/services/blockObserver.d.ts +1 -2
  18. package/lib/services/blockObserver.d.ts.map +1 -1
  19. package/lib/services/blockObserver.js +3 -35
  20. package/lib/services/blockObserver.js.map +1 -1
  21. package/lib/services/builderSigner.d.ts +2 -1
  22. package/lib/services/builderSigner.d.ts.map +1 -1
  23. package/lib/services/builderSigner.js.map +1 -1
  24. package/lib/services/executionPayloadBid.d.ts +57 -0
  25. package/lib/services/executionPayloadBid.d.ts.map +1 -0
  26. package/lib/services/executionPayloadBid.js +69 -0
  27. package/lib/services/executionPayloadBid.js.map +1 -0
  28. package/lib/services/proposerPreferencesTracker.d.ts +0 -6
  29. package/lib/services/proposerPreferencesTracker.d.ts.map +1 -1
  30. package/lib/services/proposerPreferencesTracker.js +0 -38
  31. package/lib/services/proposerPreferencesTracker.js.map +1 -1
  32. package/package.json +10 -10
  33. package/src/builder.ts +63 -5
  34. package/src/services/bidLedger.ts +28 -14
  35. package/src/services/bidPublisher.ts +95 -0
  36. package/src/services/bidSelector.ts +138 -0
  37. package/src/services/blockObserver.ts +3 -41
  38. package/src/services/builderSigner.ts +3 -1
  39. package/src/services/executionPayloadBid.ts +125 -0
  40. package/src/services/proposerPreferencesTracker.ts +1 -36
@@ -1 +1 @@
1
- {"version":3,"file":"blockObserver.js","sourceRoot":"","sources":["../../src/services/blockObserver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blockObserver.js","sourceRoot":"","sources":["../../src/services/blockObserver.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { PublicKey, SecretKey } from "@chainsafe/lodestar-z/blst";
2
2
  import { BeaconConfig } from "@lodestar/config";
3
- import { gloas } from "@lodestar/types";
3
+ import { gloas, heze } from "@lodestar/types";
4
4
  export type Keypair = {
5
5
  publicKey: PublicKey;
6
6
  secretKey: SecretKey;
@@ -10,6 +10,7 @@ export declare class BuilderSigner {
10
10
  private readonly keypair;
11
11
  constructor(config: BeaconConfig, keypair: Keypair);
12
12
  signExecutionPayloadEnvelope(envelope: gloas.ExecutionPayloadEnvelope): gloas.SignedExecutionPayloadEnvelope;
13
+ signExecutionPayloadBid(bid: heze.ExecutionPayloadBid): heze.SignedExecutionPayloadBid;
13
14
  signExecutionPayloadBid(bid: gloas.ExecutionPayloadBid): gloas.SignedExecutionPayloadBid;
14
15
  getPubkeyHex(): string;
15
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"builderSigner.d.ts","sourceRoot":"","sources":["../../src/services/builderSigner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,SAAS,EAAC,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAC,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAEtC,MAAM,MAAM,OAAO,GAAG;IAAC,SAAS,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAC,CAAC;AAEnE,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC,YAAY,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAGjD;IAED,4BAA4B,CAAC,QAAQ,EAAE,KAAK,CAAC,wBAAwB,GAAG,KAAK,CAAC,8BAA8B,CAO3G;IAED,uBAAuB,CAAC,GAAG,EAAE,KAAK,CAAC,mBAAmB,GAAG,KAAK,CAAC,yBAAyB,CAOvF;IAED,YAAY,IAAI,MAAM,CAErB;CACF"}
1
+ {"version":3,"file":"builderSigner.d.ts","sourceRoot":"","sources":["../../src/services/builderSigner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,SAAS,EAAC,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAC,KAAK,EAAE,IAAI,EAAC,MAAM,iBAAiB,CAAC;AAE5C,MAAM,MAAM,OAAO,GAAG;IAAC,SAAS,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAC,CAAC;AAEnE,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC,YAAY,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAGjD;IAED,4BAA4B,CAAC,QAAQ,EAAE,KAAK,CAAC,wBAAwB,GAAG,KAAK,CAAC,8BAA8B,CAO3G;IAED,uBAAuB,CAAC,GAAG,EAAE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,yBAAyB,CAAC;IACvF,uBAAuB,CAAC,GAAG,EAAE,KAAK,CAAC,mBAAmB,GAAG,KAAK,CAAC,yBAAyB,CAAC;IAUzF,YAAY,IAAI,MAAM,CAErB;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"builderSigner.js","sourceRoot":"","sources":["../../src/services/builderSigner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,iCAAiC,EAAE,sCAAsC,EAAC,MAAM,4BAA4B,CAAC;AAKrH,MAAM,OAAO,aAAa;IACP,MAAM,CAAe;IACrB,OAAO,CAAU;IAElC,YAAY,MAAoB,EAAE,OAAgB;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,4BAA4B,CAAC,QAAwC;QACnE,MAAM,WAAW,GAAG,sCAAsC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAElF,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;SAC9D,CAAC;IACJ,CAAC;IAED,uBAAuB,CAAC,GAA8B;QACpD,MAAM,WAAW,GAAG,iCAAiC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAExE,OAAO;YACL,OAAO,EAAE,GAAG;YACZ,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;SAC9D,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACxC,CAAC;CACF"}
1
+ {"version":3,"file":"builderSigner.js","sourceRoot":"","sources":["../../src/services/builderSigner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,iCAAiC,EAAE,sCAAsC,EAAC,MAAM,4BAA4B,CAAC;AAKrH,MAAM,OAAO,aAAa;IACP,MAAM,CAAe;IACrB,OAAO,CAAU;IAElC,YAAY,MAAoB,EAAE,OAAgB;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,4BAA4B,CAAC,QAAwC;QACnE,MAAM,WAAW,GAAG,sCAAsC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAElF,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;SAC9D,CAAC;IACJ,CAAC;IAID,uBAAuB,CAAC,GAA8B;QACpD,MAAM,WAAW,GAAG,iCAAiC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAExE,OAAO;YACL,OAAO,EAAE,GAAG;YACZ,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;SAC9D,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,57 @@
1
+ import { ForkName, type ForkPostGloas } from "@lodestar/params";
2
+ import type { BuilderIndex, Bytes32, ExecutionAddress, ExecutionPayloadBid, Root, RootHex, Slot, gloas, heze } from "@lodestar/types";
3
+ import { LodestarError } from "@lodestar/utils";
4
+ import type { BuiltPayload } from "./payloadSource.js";
5
+ type CommonBidInput<F extends ForkPostGloas> = {
6
+ slot: Slot;
7
+ parentBlockRoot: Root;
8
+ /** Expected value from the BN payload attributes used for this build. */
9
+ prevRandao: Bytes32;
10
+ builderIndex: BuilderIndex;
11
+ feeRecipient: ExecutionAddress;
12
+ /** Bid value in gwei */
13
+ value: number;
14
+ payload: BuiltPayload & {
15
+ fork: F;
16
+ };
17
+ };
18
+ export type GloasBidInput = CommonBidInput<ForkName.gloas>;
19
+ export type HezeBidInput = CommonBidInput<ForkName.heze> & {
20
+ inclusionListBits: heze.ExecutionPayloadBid["inclusionListBits"];
21
+ };
22
+ export type ExecutionPayloadBidInput = GloasBidInput | HezeBidInput;
23
+ export declare enum ExecutionPayloadBidErrorCode {
24
+ INVALID_VALUE = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_VALUE",
25
+ INVALID_GAS_LIMIT = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_GAS_LIMIT",
26
+ SLOT_MISMATCH = "EXECUTION_PAYLOAD_BID_ERROR_SLOT_MISMATCH",
27
+ BLOCK_HASH_EQUALS_PARENT = "EXECUTION_PAYLOAD_BID_ERROR_BLOCK_HASH_EQUALS_PARENT",
28
+ INVALID_INCLUSION_LIST_BITS = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_INCLUSION_LIST_BITS",
29
+ PREV_RANDAO_MISMATCH = "EXECUTION_PAYLOAD_BID_ERROR_PREV_RANDAO_MISMATCH"
30
+ }
31
+ export type ExecutionPayloadBidErrorType = {
32
+ code: ExecutionPayloadBidErrorCode.INVALID_GAS_LIMIT;
33
+ gasLimit: number;
34
+ } | {
35
+ code: ExecutionPayloadBidErrorCode.SLOT_MISMATCH;
36
+ slot: Slot;
37
+ payloadSlot: Slot;
38
+ } | {
39
+ code: ExecutionPayloadBidErrorCode.BLOCK_HASH_EQUALS_PARENT;
40
+ } | {
41
+ code: ExecutionPayloadBidErrorCode.INVALID_INCLUSION_LIST_BITS;
42
+ bitLen: number | undefined;
43
+ } | {
44
+ code: ExecutionPayloadBidErrorCode.PREV_RANDAO_MISMATCH;
45
+ expectedPrevRandao: RootHex;
46
+ payloadPrevRandao: RootHex;
47
+ } | {
48
+ code: ExecutionPayloadBidErrorCode.INVALID_VALUE;
49
+ value: number;
50
+ };
51
+ export declare class ExecutionPayloadBidError extends LodestarError<ExecutionPayloadBidErrorType> {
52
+ }
53
+ export declare function createExecutionPayloadBid(input: GloasBidInput): gloas.ExecutionPayloadBid;
54
+ export declare function createExecutionPayloadBid(input: HezeBidInput): heze.ExecutionPayloadBid;
55
+ export declare function createExecutionPayloadBid(input: ExecutionPayloadBidInput): ExecutionPayloadBid;
56
+ export {};
57
+ //# sourceMappingURL=executionPayloadBid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionPayloadBid.d.ts","sourceRoot":"","sources":["../../src/services/executionPayloadBid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,KAAK,aAAa,EAAgD,MAAM,kBAAkB,CAAC;AAC7G,OAAO,KAAK,EACV,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,mBAAmB,EACnB,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,KAAK,EACL,IAAI,EACL,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAC,aAAa,EAA6B,MAAM,iBAAiB,CAAC;AAC1E,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAErD,KAAK,cAAc,CAAC,CAAC,SAAS,aAAa,IAAI;IAC7C,IAAI,EAAE,IAAI,CAAC;IACX,eAAe,EAAE,IAAI,CAAC;IACtB,yEAAyE;IACzE,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,GAAG;QAAC,IAAI,EAAE,CAAC,CAAA;KAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAE3D,MAAM,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG;IACzD,iBAAiB,EAAE,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;CAClE,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,aAAa,GAAG,YAAY,CAAC;AAEpE,oBAAY,4BAA4B;IACtC,aAAa,8CAA8C;IAC3D,iBAAiB,kDAAkD;IACnE,aAAa,8CAA8C;IAC3D,wBAAwB,yDAAyD;IACjF,2BAA2B,4DAA4D;IACvF,oBAAoB,qDAAqD;CAC1E;AAED,MAAM,MAAM,4BAA4B,GACpC;IAAC,IAAI,EAAE,4BAA4B,CAAC,iBAAiB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,GACxE;IAAC,IAAI,EAAE,4BAA4B,CAAC,aAAa,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,WAAW,EAAE,IAAI,CAAA;CAAC,GACjF;IAAC,IAAI,EAAE,4BAA4B,CAAC,wBAAwB,CAAA;CAAC,GAC7D;IAAC,IAAI,EAAE,4BAA4B,CAAC,2BAA2B,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAC,GAC5F;IACE,IAAI,EAAE,4BAA4B,CAAC,oBAAoB,CAAC;IACxD,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;CAC5B,GACD;IACE,IAAI,EAAE,4BAA4B,CAAC,aAAa,CAAC;IACjD,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEN,qBAAa,wBAAyB,SAAQ,aAAa,CAAC,4BAA4B,CAAC;CAAG;AAE5F,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,CAAC,mBAAmB,CAAC;AAC3F,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC;AACzF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,wBAAwB,GAAG,mBAAmB,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { INCLUSION_LIST_COMMITTEE_SIZE, isForkPostHeze } from "@lodestar/params";
2
+ import { sszTypesFor } from "@lodestar/types";
3
+ import { LodestarError, byteArrayEquals, toRootHex } from "@lodestar/utils";
4
+ export var ExecutionPayloadBidErrorCode;
5
+ (function (ExecutionPayloadBidErrorCode) {
6
+ ExecutionPayloadBidErrorCode["INVALID_VALUE"] = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_VALUE";
7
+ ExecutionPayloadBidErrorCode["INVALID_GAS_LIMIT"] = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_GAS_LIMIT";
8
+ ExecutionPayloadBidErrorCode["SLOT_MISMATCH"] = "EXECUTION_PAYLOAD_BID_ERROR_SLOT_MISMATCH";
9
+ ExecutionPayloadBidErrorCode["BLOCK_HASH_EQUALS_PARENT"] = "EXECUTION_PAYLOAD_BID_ERROR_BLOCK_HASH_EQUALS_PARENT";
10
+ ExecutionPayloadBidErrorCode["INVALID_INCLUSION_LIST_BITS"] = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_INCLUSION_LIST_BITS";
11
+ ExecutionPayloadBidErrorCode["PREV_RANDAO_MISMATCH"] = "EXECUTION_PAYLOAD_BID_ERROR_PREV_RANDAO_MISMATCH";
12
+ })(ExecutionPayloadBidErrorCode || (ExecutionPayloadBidErrorCode = {}));
13
+ export class ExecutionPayloadBidError extends LodestarError {
14
+ }
15
+ export function createExecutionPayloadBid(input) {
16
+ if (!Number.isSafeInteger(input.value) || input.value < 0) {
17
+ throw new ExecutionPayloadBidError({ code: ExecutionPayloadBidErrorCode.INVALID_VALUE, value: input.value }, `Invalid bid value value=${input.value}`);
18
+ }
19
+ const { fork, executionPayload, executionRequests, blobsBundle } = input.payload;
20
+ if (executionPayload.gasLimit > Number.MAX_SAFE_INTEGER) {
21
+ throw new ExecutionPayloadBidError({
22
+ code: ExecutionPayloadBidErrorCode.INVALID_GAS_LIMIT,
23
+ gasLimit: executionPayload.gasLimit,
24
+ });
25
+ }
26
+ if (executionPayload.slotNumber !== input.slot) {
27
+ throw new ExecutionPayloadBidError({
28
+ code: ExecutionPayloadBidErrorCode.SLOT_MISMATCH,
29
+ slot: input.slot,
30
+ payloadSlot: executionPayload.slotNumber,
31
+ });
32
+ }
33
+ if (byteArrayEquals(executionPayload.blockHash, executionPayload.parentHash)) {
34
+ throw new ExecutionPayloadBidError({ code: ExecutionPayloadBidErrorCode.BLOCK_HASH_EQUALS_PARENT });
35
+ }
36
+ if (!byteArrayEquals(executionPayload.prevRandao, input.prevRandao)) {
37
+ throw new ExecutionPayloadBidError({
38
+ code: ExecutionPayloadBidErrorCode.PREV_RANDAO_MISMATCH,
39
+ expectedPrevRandao: toRootHex(input.prevRandao),
40
+ payloadPrevRandao: toRootHex(executionPayload.prevRandao),
41
+ });
42
+ }
43
+ const bid = {
44
+ parentBlockHash: executionPayload.parentHash,
45
+ parentBlockRoot: input.parentBlockRoot,
46
+ blockHash: executionPayload.blockHash,
47
+ prevRandao: input.prevRandao,
48
+ feeRecipient: input.feeRecipient,
49
+ gasLimit: BigInt(executionPayload.gasLimit),
50
+ builderIndex: input.builderIndex,
51
+ slot: input.slot,
52
+ value: input.value,
53
+ executionPayment: 0n,
54
+ blobKzgCommitments: blobsBundle.commitments,
55
+ executionRequestsRoot: sszTypesFor(fork).ExecutionRequests.hashTreeRoot(executionRequests),
56
+ };
57
+ if (isForkPostHeze(fork)) {
58
+ const inclusionListBits = "inclusionListBits" in input ? input.inclusionListBits : undefined;
59
+ if (inclusionListBits?.bitLen !== INCLUSION_LIST_COMMITTEE_SIZE) {
60
+ throw new ExecutionPayloadBidError({
61
+ code: ExecutionPayloadBidErrorCode.INVALID_INCLUSION_LIST_BITS,
62
+ bitLen: inclusionListBits?.bitLen,
63
+ });
64
+ }
65
+ return { ...bid, inclusionListBits };
66
+ }
67
+ return bid;
68
+ }
69
+ //# sourceMappingURL=executionPayloadBid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionPayloadBid.js","sourceRoot":"","sources":["../../src/services/executionPayloadBid.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,7 @@
1
- import { ApiClient } from "@lodestar/api";
2
1
  import type { RootHex, Slot, gloas } from "@lodestar/types";
3
- import { Logger } from "@lodestar/utils";
4
2
  /** Retains validated proposer preferences by the branch-specific identity used for bid validation. */
5
3
  export declare class ProposerPreferencesTracker {
6
- private readonly api;
7
- private readonly logger;
8
4
  private readonly byDependentRootBySlot;
9
- constructor(api: ApiClient, logger: Logger);
10
- start(signal: AbortSignal): void;
11
5
  onProposerPreferences(signedProposerPreferences: gloas.SignedProposerPreferences): boolean;
12
6
  get(slot: Slot, dependentRoot: RootHex): gloas.SignedProposerPreferences | null;
13
7
  prune(currentSlot: Slot): number;
@@ -1 +1 @@
1
- {"version":3,"file":"proposerPreferencesTracker.d.ts","sourceRoot":"","sources":["../../src/services/proposerPreferencesTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAS,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAC,MAAM,EAAoB,MAAM,iBAAiB,CAAC;AAE1D,sGAAsG;AACtG,qBAAa,0BAA0B;IAMnC,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAEpC;IAEF,YACmB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,MAAM,EAC7B;IAEJ,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CA2B/B;IAED,qBAAqB,CAAC,yBAAyB,EAAE,KAAK,CAAC,yBAAyB,GAAG,OAAO,CAWzF;IAED,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,GAAG,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAE9E;IAED,KAAK,CAAC,WAAW,EAAE,IAAI,GAAG,MAAM,CAW/B;CACF"}
1
+ {"version":3,"file":"proposerPreferencesTracker.d.ts","sourceRoot":"","sources":["../../src/services/proposerPreferencesTracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAG1D,sGAAsG;AACtG,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAEpC;IAEF,qBAAqB,CAAC,yBAAyB,EAAE,KAAK,CAAC,yBAAyB,GAAG,OAAO,CAWzF;IAED,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,GAAG,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAE9E;IAED,KAAK,CAAC,WAAW,EAAE,IAAI,GAAG,MAAM,CAW/B;CACF"}
@@ -1,45 +1,7 @@
1
- import { routes } from "@lodestar/api";
2
1
  import { MapDef, toRootHex } from "@lodestar/utils";
3
2
  /** Retains validated proposer preferences by the branch-specific identity used for bid validation. */
4
3
  export class ProposerPreferencesTracker {
5
- api;
6
- logger;
7
4
  byDependentRootBySlot = new MapDef(() => new Map());
8
- constructor(api, logger) {
9
- this.api = api;
10
- this.logger = logger;
11
- }
12
- start(signal) {
13
- if (signal.aborted)
14
- return;
15
- this.logger.verbose("Subscribing to proposer preferences");
16
- this.api.events
17
- .eventstream({
18
- topics: [routes.events.EventType.proposerPreferences],
19
- signal,
20
- onEvent: (event) => {
21
- if (!signal.aborted && event.type === routes.events.EventType.proposerPreferences) {
22
- this.onProposerPreferences(event.message.data);
23
- }
24
- },
25
- onError: (error) => {
26
- if (!signal.aborted)
27
- this.logger.error("Failed to receive proposer preferences", {}, error);
28
- },
29
- onClose: () => {
30
- if (signal.aborted) {
31
- this.logger.verbose("Closed proposer preferences stream");
32
- }
33
- else {
34
- this.logger.error("Proposer preferences stream closed unexpectedly", {});
35
- }
36
- },
37
- })
38
- .catch((error) => {
39
- if (!signal.aborted)
40
- this.logger.error("Failed to subscribe to proposer preferences", {}, error);
41
- });
42
- }
43
5
  onProposerPreferences(signedProposerPreferences) {
44
6
  const { proposalSlot, dependentRoot } = signedProposerPreferences.message;
45
7
  const dependentRootHex = toRootHex(dependentRoot);
@@ -1 +1 @@
1
- {"version":3,"file":"proposerPreferencesTracker.js","sourceRoot":"","sources":["../../src/services/proposerPreferencesTracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proposerPreferencesTracker.js","sourceRoot":"","sources":["../../src/services/proposerPreferencesTracker.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAElD,sGAAsG;AACtG,MAAM,OAAO,0BAA0B;IACpB,qBAAqB,GAAG,IAAI,MAAM,CACjD,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAChB,CAAC;IAEF,qBAAqB,CAAC,yBAA0D;QAC9E,MAAM,EAAC,YAAY,EAAE,aAAa,EAAC,GAAG,yBAAyB,CAAC,OAAO,CAAC;QACxE,MAAM,gBAAgB,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAE9E,IAAI,eAAe,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,eAAe,CAAC,GAAG,CAAC,gBAAgB,EAAE,yBAAyB,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,IAAU,EAAE,aAAsB;QACpC,OAAO,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,WAAiB;QACrB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACjE,IAAI,IAAI,IAAI,WAAW,EAAE,CAAC;gBACxB,SAAS;YACX,CAAC;YAED,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC;YAChC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lodestar/builder",
3
- "version": "1.50.0-dev.b4eaa62b30",
3
+ "version": "1.50.0-dev.be50566b7e",
4
4
  "description": "A Typescript implementation of the builder client",
5
5
  "author": "ChainSafe Systems",
6
6
  "license": "Apache-2.0",
@@ -48,16 +48,16 @@
48
48
  "dependencies": {
49
49
  "@chainsafe/lodestar-z": "catalog:",
50
50
  "@chainsafe/ssz": "^1.8.0",
51
- "@lodestar/api": "^1.50.0-dev.b4eaa62b30",
52
- "@lodestar/config": "^1.50.0-dev.b4eaa62b30",
53
- "@lodestar/params": "^1.50.0-dev.b4eaa62b30",
54
- "@lodestar/state-transition": "^1.50.0-dev.b4eaa62b30",
55
- "@lodestar/types": "^1.50.0-dev.b4eaa62b30",
56
- "@lodestar/utils": "^1.50.0-dev.b4eaa62b30"
51
+ "@lodestar/api": "^1.50.0-dev.be50566b7e",
52
+ "@lodestar/config": "^1.50.0-dev.be50566b7e",
53
+ "@lodestar/params": "^1.50.0-dev.be50566b7e",
54
+ "@lodestar/state-transition": "^1.50.0-dev.be50566b7e",
55
+ "@lodestar/types": "^1.50.0-dev.be50566b7e",
56
+ "@lodestar/utils": "^1.50.0-dev.be50566b7e"
57
57
  },
58
58
  "devDependencies": {
59
- "@lodestar/logger": "^1.50.0-dev.b4eaa62b30",
60
- "@lodestar/test-utils": "^1.50.0-dev.b4eaa62b30"
59
+ "@lodestar/logger": "^1.50.0-dev.be50566b7e",
60
+ "@lodestar/test-utils": "^1.50.0-dev.be50566b7e"
61
61
  },
62
- "gitHead": "22ece361e9acb523d697615f10be75e7d8bfb5cb"
62
+ "gitHead": "b3a06e92493998a129ab959e8b221cd1f4cf47dc"
63
63
  }
package/src/builder.ts CHANGED
@@ -1,8 +1,8 @@
1
- import {ApiClient} from "@lodestar/api";
1
+ import {ApiClient, routes} from "@lodestar/api";
2
2
  import {ChainForkConfig, assertEqualParams, createBeaconConfig} from "@lodestar/config";
3
3
  import {Clock, ClockOptions, IClock} from "@lodestar/state-transition";
4
4
  import {BuilderIndex, ExecutionAddress} from "@lodestar/types";
5
- import {Logger, toHex, toRootHex} from "@lodestar/utils";
5
+ import {Logger, isErrorAborted, toHex, toRootHex} from "@lodestar/utils";
6
6
  import {waitForGenesis} from "./genesis.js";
7
7
  import {resolveBuilderIdentity} from "./identity.js";
8
8
  import {Metrics} from "./metrics.js";
@@ -75,8 +75,7 @@ export class Builder {
75
75
  this.clock.runEverySlot(async (slot) => this.onSlot(slot));
76
76
  this.clock.runEveryEpoch((epoch) => this.builderStatusTracker.poll(epoch));
77
77
  this.clock.start(this.controller.signal);
78
- this.blockObserver.start(this.controller.signal);
79
- this.proposerPreferencesTracker.start(this.controller.signal);
78
+ this.subscribeToEvents(opts.api);
80
79
 
81
80
  this.logger.info("Builder client initialized", {
82
81
  index: this.index,
@@ -114,7 +113,7 @@ export class Builder {
114
113
 
115
114
  const builderStatusTracker = new BuilderStatusTracker(api, logger, index, opts.metrics);
116
115
  const blockObserver = new BlockObserver(config, logger, api);
117
- const proposerPreferencesTracker = new ProposerPreferencesTracker(api, logger);
116
+ const proposerPreferencesTracker = new ProposerPreferencesTracker();
118
117
 
119
118
  const payloadStore = new PayloadStore();
120
119
 
@@ -135,6 +134,65 @@ export class Builder {
135
134
  this.proposerPreferencesTracker.prune(slot);
136
135
  }
137
136
 
137
+ private subscribeToEvents(api: ApiClient): void {
138
+ const signal = this.controller.signal;
139
+ if (signal.aborted) return;
140
+
141
+ const topics = [routes.events.EventType.block, routes.events.EventType.proposerPreferences];
142
+ this.logger.verbose("Subscribing to builder events", {topics: topics.join(",")});
143
+ api.events
144
+ .eventstream({
145
+ topics,
146
+ signal,
147
+ onEvent: (event) => {
148
+ void this.onEvent(event);
149
+ },
150
+ onError: (error) => {
151
+ if (!signal.aborted) this.logger.error("Failed to receive builder event", {topics: topics.join(",")}, error);
152
+ },
153
+ onClose: () => {
154
+ if (signal.aborted) {
155
+ this.logger.verbose("Closed builder event stream", {topics: topics.join(",")});
156
+ } else {
157
+ this.logger.error("Builder event stream closed unexpectedly", {topics: topics.join(",")});
158
+ }
159
+ },
160
+ })
161
+ .catch((error: unknown) => {
162
+ if (!signal.aborted && !isErrorAborted(error)) {
163
+ this.logger.error(
164
+ "Failed to subscribe to builder events",
165
+ {topics: topics.join(",")},
166
+ error instanceof Error ? error : Error(String(error))
167
+ );
168
+ }
169
+ });
170
+ }
171
+
172
+ private async onEvent(event: routes.events.BeaconEvent): Promise<void> {
173
+ const signal = this.controller.signal;
174
+ if (signal.aborted) return;
175
+
176
+ try {
177
+ switch (event.type) {
178
+ case routes.events.EventType.block:
179
+ await this.blockObserver.processBlockEvent(event.message, signal);
180
+ break;
181
+ case routes.events.EventType.proposerPreferences:
182
+ this.proposerPreferencesTracker.onProposerPreferences(event.message.data);
183
+ break;
184
+ }
185
+ } catch (error) {
186
+ if (!signal.aborted && !isErrorAborted(error)) {
187
+ this.logger.warn(
188
+ "Failed to process builder event",
189
+ {eventType: event.type},
190
+ error instanceof Error ? error : Error(String(error))
191
+ );
192
+ }
193
+ }
194
+ }
195
+
138
196
  async close(): Promise<void> {
139
197
  this.controller.abort();
140
198
  }
@@ -32,6 +32,7 @@ type MutableBidLedgerRecord = SubmittedBid & {
32
32
  export enum BidLedgerErrorCode {
33
33
  INVALID_BID_VALUE = "BID_LEDGER_ERROR_INVALID_BID_VALUE",
34
34
  DUPLICATE_BID = "BID_LEDGER_ERROR_DUPLICATE_BID",
35
+ BID_TOO_OLD = "BID_LEDGER_ERROR_BID_TOO_OLD",
35
36
  REVEAL_CONFLICT = "BID_LEDGER_ERROR_REVEAL_CONFLICT",
36
37
  UNSETTLED_VALUE_OVERFLOW = "BID_LEDGER_ERROR_UNSETTLED_VALUE_OVERFLOW",
37
38
  }
@@ -47,6 +48,11 @@ export type BidLedgerErrorType =
47
48
  parentBlockHash: RootHex;
48
49
  parentBlockRoot: RootHex;
49
50
  }
51
+ | {
52
+ code: BidLedgerErrorCode.BID_TOO_OLD;
53
+ slot: Slot;
54
+ pruneCutoffSlot: Slot;
55
+ }
50
56
  | {
51
57
  code: BidLedgerErrorCode.REVEAL_CONFLICT;
52
58
  blockRoot: RootHex;
@@ -69,11 +75,28 @@ const KEEP_SLOTS = RECORD_RETENTION_EPOCHS * SLOTS_PER_EPOCH;
69
75
  export class BidLedger {
70
76
  private readonly bidsBySlot = new Map<Slot, Map<string, MutableBidLedgerRecord>>();
71
77
  private readonly revealedPayloadByBlockRoot = new Map<RootHex, RevealedPayload>();
78
+ private pruneCutoffSlot = 0;
72
79
 
73
80
  hasSubmitted(slot: Slot, parentBlockHash: RootHex, parentBlockRoot: RootHex): boolean {
74
81
  return this.bidsBySlot.get(slot)?.has(tupleKey(parentBlockHash, parentBlockRoot)) ?? false;
75
82
  }
76
83
 
84
+ assertCanRecordBid({
85
+ slot,
86
+ parentBlockHash,
87
+ parentBlockRoot,
88
+ }: Pick<SubmittedBid, "slot" | "parentBlockHash" | "parentBlockRoot">): void {
89
+ if (slot < this.pruneCutoffSlot) {
90
+ throw new BidLedgerError({code: BidLedgerErrorCode.BID_TOO_OLD, slot, pruneCutoffSlot: this.pruneCutoffSlot});
91
+ }
92
+ if (this.hasSubmitted(slot, parentBlockHash, parentBlockRoot)) {
93
+ throw new BidLedgerError(
94
+ {code: BidLedgerErrorCode.DUPLICATE_BID, slot, parentBlockHash, parentBlockRoot},
95
+ `Bid already recorded slot=${slot} parentBlockHash=${parentBlockHash} parentBlockRoot=${parentBlockRoot}`
96
+ );
97
+ }
98
+ }
99
+
77
100
  recordBid(bid: SubmittedBid): BidLedgerRecord {
78
101
  if (!Number.isSafeInteger(bid.valueGwei) || bid.valueGwei < 0) {
79
102
  throw new BidLedgerError(
@@ -82,6 +105,7 @@ export class BidLedger {
82
105
  );
83
106
  }
84
107
 
108
+ this.assertCanRecordBid(bid);
85
109
  let bidsForSlot = this.bidsBySlot.get(bid.slot);
86
110
  if (bidsForSlot === undefined) {
87
111
  bidsForSlot = new Map();
@@ -89,18 +113,6 @@ export class BidLedger {
89
113
  }
90
114
 
91
115
  const key = tupleKey(bid.parentBlockHash, bid.parentBlockRoot);
92
- if (bidsForSlot.has(key)) {
93
- throw new BidLedgerError(
94
- {
95
- code: BidLedgerErrorCode.DUPLICATE_BID,
96
- slot: bid.slot,
97
- parentBlockHash: bid.parentBlockHash,
98
- parentBlockRoot: bid.parentBlockRoot,
99
- },
100
- `Bid already recorded slot=${bid.slot} parentBlockHash=${bid.parentBlockHash} parentBlockRoot=${bid.parentBlockRoot}`
101
- );
102
- }
103
-
104
116
  const record = {...bid, wonBlockRoots: new Set<RootHex>(), paymentSettled: false};
105
117
  bidsForSlot.set(key, record);
106
118
  return toRecord(record);
@@ -198,9 +210,11 @@ export class BidLedger {
198
210
  }
199
211
 
200
212
  prune(currentSlot: Slot): number {
213
+ // Pruning must not make an expired slot eligible for another submission.
214
+ this.pruneCutoffSlot = Math.max(this.pruneCutoffSlot, currentSlot - KEEP_SLOTS);
201
215
  let removed = 0;
202
216
  for (const [slot, bidsForSlot] of this.bidsBySlot) {
203
- if (slot >= currentSlot - KEEP_SLOTS) {
217
+ if (slot >= this.pruneCutoffSlot) {
204
218
  continue;
205
219
  }
206
220
 
@@ -216,7 +230,7 @@ export class BidLedger {
216
230
  }
217
231
 
218
232
  for (const [blockRoot, revealedPayload] of this.revealedPayloadByBlockRoot) {
219
- if (revealedPayload.slot < currentSlot - KEEP_SLOTS) {
233
+ if (revealedPayload.slot < this.pruneCutoffSlot) {
220
234
  this.revealedPayloadByBlockRoot.delete(blockRoot);
221
235
  }
222
236
  }
@@ -0,0 +1,95 @@
1
+ import type {ApiClient} from "@lodestar/api";
2
+ import type {ChainForkConfig} from "@lodestar/config";
3
+ import {isForkPostGloas} from "@lodestar/params";
4
+ import type {BuilderIndex, RootHex, Slot, gloas, heze} from "@lodestar/types";
5
+ import {sszTypesFor} from "@lodestar/types";
6
+ import {LodestarError, toRootHex} from "@lodestar/utils";
7
+ import type {BidIdentity, BidLedger} from "./bidLedger.js";
8
+ import type {BuilderSigner} from "./builderSigner.js";
9
+
10
+ export type BidPublisherModules = {
11
+ api: ApiClient;
12
+ config: ChainForkConfig;
13
+ signer: BuilderSigner;
14
+ ledger: BidLedger;
15
+ builderIndex: BuilderIndex;
16
+ hasPayload: (identity: BidIdentity) => boolean;
17
+ };
18
+
19
+ export enum BidPublisherErrorCode {
20
+ BUILDER_INDEX_MISMATCH = "BID_PUBLISHER_ERROR_BUILDER_INDEX_MISMATCH",
21
+ PAYLOAD_NOT_RETAINED = "BID_PUBLISHER_ERROR_PAYLOAD_NOT_RETAINED",
22
+ PRE_GLOAS_BID = "BID_PUBLISHER_ERROR_PRE_GLOAS_BID",
23
+ }
24
+
25
+ export type BidPublisherErrorType =
26
+ | {
27
+ code: BidPublisherErrorCode.PRE_GLOAS_BID;
28
+ slot: Slot;
29
+ }
30
+ | {
31
+ code: BidPublisherErrorCode.BUILDER_INDEX_MISMATCH;
32
+ builderIndex: BuilderIndex;
33
+ bidBuilderIndex: BuilderIndex;
34
+ }
35
+ | {
36
+ code: BidPublisherErrorCode.PAYLOAD_NOT_RETAINED;
37
+ slot: Slot;
38
+ parentBlockHash: RootHex;
39
+ parentBlockRoot: RootHex;
40
+ blockHash: RootHex;
41
+ };
42
+
43
+ export class BidPublisherError extends LodestarError<BidPublisherErrorType> {}
44
+
45
+ /** Signs and submits a bid only if its payload is retained locally. */
46
+ export class BidPublisher {
47
+ constructor(private readonly modules: BidPublisherModules) {}
48
+
49
+ publish(bid: heze.ExecutionPayloadBid, signal: AbortSignal): Promise<heze.SignedExecutionPayloadBid>;
50
+ publish(bid: gloas.ExecutionPayloadBid, signal: AbortSignal): Promise<gloas.SignedExecutionPayloadBid>;
51
+ async publish(bid: gloas.ExecutionPayloadBid, signal: AbortSignal): Promise<gloas.SignedExecutionPayloadBid> {
52
+ signal.throwIfAborted();
53
+
54
+ const {api, config, builderIndex, hasPayload, ledger, signer} = this.modules;
55
+ const fork = config.getForkName(bid.slot);
56
+ if (!isForkPostGloas(fork)) {
57
+ throw new BidPublisherError({code: BidPublisherErrorCode.PRE_GLOAS_BID, slot: bid.slot});
58
+ }
59
+ if (bid.builderIndex !== builderIndex) {
60
+ throw new BidPublisherError(
61
+ {
62
+ code: BidPublisherErrorCode.BUILDER_INDEX_MISMATCH,
63
+ builderIndex,
64
+ bidBuilderIndex: bid.builderIndex,
65
+ },
66
+ `Bid builder index does not match local builder index builderIndex=${builderIndex} bidBuilderIndex=${bid.builderIndex}`
67
+ );
68
+ }
69
+
70
+ const identity: BidIdentity = {
71
+ slot: bid.slot,
72
+ parentBlockHash: toRootHex(bid.parentBlockHash),
73
+ parentBlockRoot: toRootHex(bid.parentBlockRoot),
74
+ blockHash: toRootHex(bid.blockHash),
75
+ };
76
+ if (!hasPayload(identity)) {
77
+ throw new BidPublisherError(
78
+ {code: BidPublisherErrorCode.PAYLOAD_NOT_RETAINED, ...identity},
79
+ `Bid payload is not retained slot=${identity.slot} parentBlockHash=${identity.parentBlockHash} parentBlockRoot=${identity.parentBlockRoot} blockHash=${identity.blockHash}`
80
+ );
81
+ }
82
+
83
+ ledger.assertCanRecordBid(identity);
84
+
85
+ const signedExecutionPayloadBid = signer.signExecutionPayloadBid(bid);
86
+ const signedBidRoot = toRootHex(
87
+ sszTypesFor(fork, "SignedExecutionPayloadBid").hashTreeRoot(signedExecutionPayloadBid)
88
+ );
89
+ ledger.recordBid({...identity, valueGwei: bid.value, signedBidRoot});
90
+
91
+ const response = await api.beacon.publishExecutionPayloadBid({signedExecutionPayloadBid}, {signal});
92
+ response.assertOk();
93
+ return signedExecutionPayloadBid;
94
+ }
95
+ }