@xyo-network/chain-sdk 5.0.4 → 5.1.0
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/browser/index.d.ts +1 -0
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.mjs +1 -0
- package/dist/browser/index.mjs.map +2 -2
- package/dist/browser/modules/analyze/ChainHeadSelector.d.ts +40 -0
- package/dist/browser/modules/analyze/ChainHeadSelector.d.ts.map +1 -1
- package/dist/browser/modules/analyze/admission.d.ts +65 -0
- package/dist/browser/modules/analyze/admission.d.ts.map +1 -0
- package/dist/browser/modules/analyze/index.d.ts +1 -0
- package/dist/browser/modules/analyze/index.d.ts.map +1 -1
- package/dist/browser/modules/protocol/block/BuildBlockOptions.d.ts +8 -0
- package/dist/browser/modules/protocol/block/BuildBlockOptions.d.ts.map +1 -1
- package/dist/browser/modules/protocol/block/buildBlock.d.ts.map +1 -1
- package/dist/browser/modules/protocol/block/buildNextBlock.d.ts +2 -1
- package/dist/browser/modules/protocol/block/buildNextBlock.d.ts.map +1 -1
- package/dist/browser/modules/services/implementation/processPendingBlocks.d.ts +9 -1
- package/dist/browser/modules/services/implementation/processPendingBlocks.d.ts.map +1 -1
- package/dist/browser/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +34 -1
- package/dist/browser/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
- package/dist/browser/modules/services/simple/block/runner/index.d.ts +1 -0
- package/dist/browser/modules/services/simple/block/runner/index.d.ts.map +1 -1
- package/dist/browser/modules/services/simple/block/runner/selectSupersededCandidate.d.ts +22 -0
- package/dist/browser/modules/services/simple/block/runner/selectSupersededCandidate.d.ts.map +1 -0
- package/dist/browser/modules/slashing/detect/DetectedOffense.d.ts +27 -0
- package/dist/browser/modules/slashing/detect/DetectedOffense.d.ts.map +1 -0
- package/dist/browser/modules/slashing/detect/candidatePairs.d.ts +44 -0
- package/dist/browser/modules/slashing/detect/candidatePairs.d.ts.map +1 -0
- package/dist/browser/modules/slashing/detect/index.d.ts +5 -0
- package/dist/browser/modules/slashing/detect/index.d.ts.map +1 -0
- package/dist/browser/modules/slashing/detect/offenseGate.d.ts +18 -0
- package/dist/browser/modules/slashing/detect/offenseGate.d.ts.map +1 -0
- package/dist/browser/modules/slashing/detect/suppression.d.ts +23 -0
- package/dist/browser/modules/slashing/detect/suppression.d.ts.map +1 -0
- package/dist/browser/modules/slashing/eligibility/evaluateProducerEligibility.d.ts +71 -0
- package/dist/browser/modules/slashing/eligibility/evaluateProducerEligibility.d.ts.map +1 -0
- package/dist/browser/modules/slashing/eligibility/index.d.ts +2 -0
- package/dist/browser/modules/slashing/eligibility/index.d.ts.map +1 -0
- package/dist/browser/modules/slashing/index/SlashIndexStore.d.ts +22 -0
- package/dist/browser/modules/slashing/index/SlashIndexStore.d.ts.map +1 -0
- package/dist/browser/modules/slashing/index/foldSlashIndex.d.ts +56 -0
- package/dist/browser/modules/slashing/index/foldSlashIndex.d.ts.map +1 -0
- package/dist/browser/modules/slashing/index/index.d.ts +3 -0
- package/dist/browser/modules/slashing/index/index.d.ts.map +1 -0
- package/dist/browser/modules/slashing/index.d.ts +6 -0
- package/dist/browser/modules/slashing/index.d.ts.map +1 -0
- package/dist/browser/modules/slashing/model/OffenseProcedure.d.ts +28 -0
- package/dist/browser/modules/slashing/model/OffenseProcedure.d.ts.map +1 -0
- package/dist/browser/modules/slashing/model/OffenseVerificationContext.d.ts +88 -0
- package/dist/browser/modules/slashing/model/OffenseVerificationContext.d.ts.map +1 -0
- package/dist/browser/modules/slashing/model/SlashHistoryReader.d.ts +34 -0
- package/dist/browser/modules/slashing/model/SlashHistoryReader.d.ts.map +1 -0
- package/dist/browser/modules/slashing/model/VerificationOutcome.d.ts +39 -0
- package/dist/browser/modules/slashing/model/VerificationOutcome.d.ts.map +1 -0
- package/dist/browser/modules/slashing/model/index.d.ts +6 -0
- package/dist/browser/modules/slashing/model/index.d.ts.map +1 -0
- package/dist/browser/modules/slashing/model/offenseKey.d.ts +42 -0
- package/dist/browser/modules/slashing/model/offenseKey.d.ts.map +1 -0
- package/dist/browser/modules/slashing/verify/index.d.ts +10 -0
- package/dist/browser/modules/slashing/verify/index.d.ts.map +1 -0
- package/dist/browser/modules/slashing/verify/preamble.d.ts +63 -0
- package/dist/browser/modules/slashing/verify/preamble.d.ts.map +1 -0
- package/dist/browser/modules/slashing/verify/verifyEquivocation.d.ts +19 -0
- package/dist/browser/modules/slashing/verify/verifyEquivocation.d.ts.map +1 -0
- package/dist/browser/modules/slashing/verify/verifyFalseAnchor.d.ts +15 -0
- package/dist/browser/modules/slashing/verify/verifyFalseAnchor.d.ts.map +1 -0
- package/dist/browser/modules/slashing/verify/verifyFalseAttestation.d.ts +22 -0
- package/dist/browser/modules/slashing/verify/verifyFalseAttestation.d.ts.map +1 -0
- package/dist/browser/modules/slashing/verify/verifyIneligibleProduction.d.ts +18 -0
- package/dist/browser/modules/slashing/verify/verifyIneligibleProduction.d.ts.map +1 -0
- package/dist/browser/modules/slashing/verify/verifyInvalidBlock.d.ts +18 -0
- package/dist/browser/modules/slashing/verify/verifyInvalidBlock.d.ts.map +1 -0
- package/dist/browser/modules/slashing/verify/verifyInvalidSlashRequest.d.ts +11 -0
- package/dist/browser/modules/slashing/verify/verifyInvalidSlashRequest.d.ts.map +1 -0
- package/dist/browser/modules/slashing/verify/verifyOffense.d.ts +29 -0
- package/dist/browser/modules/slashing/verify/verifyOffense.d.ts.map +1 -0
- package/dist/browser/modules/slashing/verify/verifyRewardOvermint.d.ts +23 -0
- package/dist/browser/modules/slashing/verify/verifyRewardOvermint.d.ts.map +1 -0
- package/dist/browser/modules/validation/elevatedPayload/lib/findElevatingTransaction.d.ts +14 -0
- package/dist/browser/modules/validation/elevatedPayload/lib/findElevatingTransaction.d.ts.map +1 -0
- package/dist/browser/modules/validation/elevatedPayload/lib/index.d.ts +2 -0
- package/dist/browser/modules/validation/elevatedPayload/lib/index.d.ts.map +1 -1
- package/dist/browser/modules/validation/elevatedPayload/lib/validateSlashPayloadInBlock.d.ts +33 -0
- package/dist/browser/modules/validation/elevatedPayload/lib/validateSlashPayloadInBlock.d.ts.map +1 -0
- package/dist/browser/modules/validation/elevatedPayload/payloads/index.d.ts +5 -0
- package/dist/browser/modules/validation/elevatedPayload/payloads/index.d.ts.map +1 -1
- package/dist/browser/modules/validation/elevatedPayload/payloads/validateSlashAdjudicationInBlock.d.ts +14 -0
- package/dist/browser/modules/validation/elevatedPayload/payloads/validateSlashAdjudicationInBlock.d.ts.map +1 -0
- package/dist/browser/modules/validation/elevatedPayload/payloads/validateSlashChallengeInBlock.d.ts +10 -0
- package/dist/browser/modules/validation/elevatedPayload/payloads/validateSlashChallengeInBlock.d.ts.map +1 -0
- package/dist/browser/modules/validation/elevatedPayload/payloads/validateSlashCommitInBlock.d.ts +10 -0
- package/dist/browser/modules/validation/elevatedPayload/payloads/validateSlashCommitInBlock.d.ts.map +1 -0
- package/dist/browser/modules/validation/elevatedPayload/payloads/validateSlashEvidenceInBlock.d.ts +10 -0
- package/dist/browser/modules/validation/elevatedPayload/payloads/validateSlashEvidenceInBlock.d.ts.map +1 -0
- package/dist/browser/modules/validation/elevatedPayload/payloads/validateSlashRequestInBlock.d.ts +14 -0
- package/dist/browser/modules/validation/elevatedPayload/payloads/validateSlashRequestInBlock.d.ts.map +1 -0
- package/dist/browser/modules/validation/elevatedPayload/validatePayloadInBlock.d.ts.map +1 -1
- package/dist/browser/slashing.d.ts +2 -0
- package/dist/browser/slashing.d.ts.map +1 -0
- package/dist/neutral/analyze.mjs +85 -3
- package/dist/neutral/analyze.mjs.map +3 -3
- package/dist/neutral/index.d.ts +1 -0
- package/dist/neutral/index.d.ts.map +1 -1
- package/dist/neutral/index.mjs +1 -0
- package/dist/neutral/index.mjs.map +2 -2
- package/dist/neutral/modules/analyze/ChainHeadSelector.d.ts +40 -0
- package/dist/neutral/modules/analyze/ChainHeadSelector.d.ts.map +1 -1
- package/dist/neutral/modules/analyze/admission.d.ts +65 -0
- package/dist/neutral/modules/analyze/admission.d.ts.map +1 -0
- package/dist/neutral/modules/analyze/index.d.ts +1 -0
- package/dist/neutral/modules/analyze/index.d.ts.map +1 -1
- package/dist/neutral/modules/protocol/block/BuildBlockOptions.d.ts +8 -0
- package/dist/neutral/modules/protocol/block/BuildBlockOptions.d.ts.map +1 -1
- package/dist/neutral/modules/protocol/block/buildBlock.d.ts.map +1 -1
- package/dist/neutral/modules/protocol/block/buildNextBlock.d.ts +2 -1
- package/dist/neutral/modules/protocol/block/buildNextBlock.d.ts.map +1 -1
- package/dist/neutral/modules/services/implementation/processPendingBlocks.d.ts +9 -1
- package/dist/neutral/modules/services/implementation/processPendingBlocks.d.ts.map +1 -1
- package/dist/neutral/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +34 -1
- package/dist/neutral/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
- package/dist/neutral/modules/services/simple/block/runner/index.d.ts +1 -0
- package/dist/neutral/modules/services/simple/block/runner/index.d.ts.map +1 -1
- package/dist/neutral/modules/services/simple/block/runner/selectSupersededCandidate.d.ts +22 -0
- package/dist/neutral/modules/services/simple/block/runner/selectSupersededCandidate.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/detect/DetectedOffense.d.ts +27 -0
- package/dist/neutral/modules/slashing/detect/DetectedOffense.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/detect/candidatePairs.d.ts +44 -0
- package/dist/neutral/modules/slashing/detect/candidatePairs.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/detect/index.d.ts +5 -0
- package/dist/neutral/modules/slashing/detect/index.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/detect/offenseGate.d.ts +18 -0
- package/dist/neutral/modules/slashing/detect/offenseGate.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/detect/suppression.d.ts +23 -0
- package/dist/neutral/modules/slashing/detect/suppression.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/eligibility/evaluateProducerEligibility.d.ts +71 -0
- package/dist/neutral/modules/slashing/eligibility/evaluateProducerEligibility.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/eligibility/index.d.ts +2 -0
- package/dist/neutral/modules/slashing/eligibility/index.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/index/SlashIndexStore.d.ts +22 -0
- package/dist/neutral/modules/slashing/index/SlashIndexStore.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/index/foldSlashIndex.d.ts +56 -0
- package/dist/neutral/modules/slashing/index/foldSlashIndex.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/index/index.d.ts +3 -0
- package/dist/neutral/modules/slashing/index/index.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/index.d.ts +6 -0
- package/dist/neutral/modules/slashing/index.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/model/OffenseProcedure.d.ts +28 -0
- package/dist/neutral/modules/slashing/model/OffenseProcedure.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/model/OffenseVerificationContext.d.ts +88 -0
- package/dist/neutral/modules/slashing/model/OffenseVerificationContext.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/model/SlashHistoryReader.d.ts +34 -0
- package/dist/neutral/modules/slashing/model/SlashHistoryReader.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/model/VerificationOutcome.d.ts +39 -0
- package/dist/neutral/modules/slashing/model/VerificationOutcome.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/model/index.d.ts +6 -0
- package/dist/neutral/modules/slashing/model/index.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/model/offenseKey.d.ts +42 -0
- package/dist/neutral/modules/slashing/model/offenseKey.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/verify/index.d.ts +10 -0
- package/dist/neutral/modules/slashing/verify/index.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/verify/preamble.d.ts +63 -0
- package/dist/neutral/modules/slashing/verify/preamble.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/verify/verifyEquivocation.d.ts +19 -0
- package/dist/neutral/modules/slashing/verify/verifyEquivocation.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/verify/verifyFalseAnchor.d.ts +15 -0
- package/dist/neutral/modules/slashing/verify/verifyFalseAnchor.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/verify/verifyFalseAttestation.d.ts +22 -0
- package/dist/neutral/modules/slashing/verify/verifyFalseAttestation.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/verify/verifyIneligibleProduction.d.ts +18 -0
- package/dist/neutral/modules/slashing/verify/verifyIneligibleProduction.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/verify/verifyInvalidBlock.d.ts +18 -0
- package/dist/neutral/modules/slashing/verify/verifyInvalidBlock.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/verify/verifyInvalidSlashRequest.d.ts +11 -0
- package/dist/neutral/modules/slashing/verify/verifyInvalidSlashRequest.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/verify/verifyOffense.d.ts +29 -0
- package/dist/neutral/modules/slashing/verify/verifyOffense.d.ts.map +1 -0
- package/dist/neutral/modules/slashing/verify/verifyRewardOvermint.d.ts +23 -0
- package/dist/neutral/modules/slashing/verify/verifyRewardOvermint.d.ts.map +1 -0
- package/dist/neutral/modules/validation/elevatedPayload/lib/findElevatingTransaction.d.ts +14 -0
- package/dist/neutral/modules/validation/elevatedPayload/lib/findElevatingTransaction.d.ts.map +1 -0
- package/dist/neutral/modules/validation/elevatedPayload/lib/index.d.ts +2 -0
- package/dist/neutral/modules/validation/elevatedPayload/lib/index.d.ts.map +1 -1
- package/dist/neutral/modules/validation/elevatedPayload/lib/validateSlashPayloadInBlock.d.ts +33 -0
- package/dist/neutral/modules/validation/elevatedPayload/lib/validateSlashPayloadInBlock.d.ts.map +1 -0
- package/dist/neutral/modules/validation/elevatedPayload/payloads/index.d.ts +5 -0
- package/dist/neutral/modules/validation/elevatedPayload/payloads/index.d.ts.map +1 -1
- package/dist/neutral/modules/validation/elevatedPayload/payloads/validateSlashAdjudicationInBlock.d.ts +14 -0
- package/dist/neutral/modules/validation/elevatedPayload/payloads/validateSlashAdjudicationInBlock.d.ts.map +1 -0
- package/dist/neutral/modules/validation/elevatedPayload/payloads/validateSlashChallengeInBlock.d.ts +10 -0
- package/dist/neutral/modules/validation/elevatedPayload/payloads/validateSlashChallengeInBlock.d.ts.map +1 -0
- package/dist/neutral/modules/validation/elevatedPayload/payloads/validateSlashCommitInBlock.d.ts +10 -0
- package/dist/neutral/modules/validation/elevatedPayload/payloads/validateSlashCommitInBlock.d.ts.map +1 -0
- package/dist/neutral/modules/validation/elevatedPayload/payloads/validateSlashEvidenceInBlock.d.ts +10 -0
- package/dist/neutral/modules/validation/elevatedPayload/payloads/validateSlashEvidenceInBlock.d.ts.map +1 -0
- package/dist/neutral/modules/validation/elevatedPayload/payloads/validateSlashRequestInBlock.d.ts +14 -0
- package/dist/neutral/modules/validation/elevatedPayload/payloads/validateSlashRequestInBlock.d.ts.map +1 -0
- package/dist/neutral/modules/validation/elevatedPayload/validatePayloadInBlock.d.ts.map +1 -1
- package/dist/neutral/protocol.mjs +8 -3
- package/dist/neutral/protocol.mjs.map +2 -2
- package/dist/neutral/services.mjs +77 -7
- package/dist/neutral/services.mjs.map +4 -4
- package/dist/neutral/slashing.d.ts +2 -0
- package/dist/neutral/slashing.d.ts.map +1 -0
- package/dist/neutral/slashing.mjs +824 -0
- package/dist/neutral/slashing.mjs.map +7 -0
- package/dist/neutral/validation.mjs +274 -43
- package/dist/neutral/validation.mjs.map +4 -4
- package/dist/node/index.d.ts +1 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.mjs +1 -0
- package/dist/node/index.mjs.map +2 -2
- package/dist/node/modules/analyze/ChainHeadSelector.d.ts +40 -0
- package/dist/node/modules/analyze/ChainHeadSelector.d.ts.map +1 -1
- package/dist/node/modules/analyze/admission.d.ts +65 -0
- package/dist/node/modules/analyze/admission.d.ts.map +1 -0
- package/dist/node/modules/analyze/index.d.ts +1 -0
- package/dist/node/modules/analyze/index.d.ts.map +1 -1
- package/dist/node/modules/protocol/block/BuildBlockOptions.d.ts +8 -0
- package/dist/node/modules/protocol/block/BuildBlockOptions.d.ts.map +1 -1
- package/dist/node/modules/protocol/block/buildBlock.d.ts.map +1 -1
- package/dist/node/modules/protocol/block/buildNextBlock.d.ts +2 -1
- package/dist/node/modules/protocol/block/buildNextBlock.d.ts.map +1 -1
- package/dist/node/modules/services/implementation/processPendingBlocks.d.ts +9 -1
- package/dist/node/modules/services/implementation/processPendingBlocks.d.ts.map +1 -1
- package/dist/node/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +34 -1
- package/dist/node/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
- package/dist/node/modules/services/simple/block/runner/index.d.ts +1 -0
- package/dist/node/modules/services/simple/block/runner/index.d.ts.map +1 -1
- package/dist/node/modules/services/simple/block/runner/selectSupersededCandidate.d.ts +22 -0
- package/dist/node/modules/services/simple/block/runner/selectSupersededCandidate.d.ts.map +1 -0
- package/dist/node/modules/slashing/detect/DetectedOffense.d.ts +27 -0
- package/dist/node/modules/slashing/detect/DetectedOffense.d.ts.map +1 -0
- package/dist/node/modules/slashing/detect/candidatePairs.d.ts +44 -0
- package/dist/node/modules/slashing/detect/candidatePairs.d.ts.map +1 -0
- package/dist/node/modules/slashing/detect/index.d.ts +5 -0
- package/dist/node/modules/slashing/detect/index.d.ts.map +1 -0
- package/dist/node/modules/slashing/detect/offenseGate.d.ts +18 -0
- package/dist/node/modules/slashing/detect/offenseGate.d.ts.map +1 -0
- package/dist/node/modules/slashing/detect/suppression.d.ts +23 -0
- package/dist/node/modules/slashing/detect/suppression.d.ts.map +1 -0
- package/dist/node/modules/slashing/eligibility/evaluateProducerEligibility.d.ts +71 -0
- package/dist/node/modules/slashing/eligibility/evaluateProducerEligibility.d.ts.map +1 -0
- package/dist/node/modules/slashing/eligibility/index.d.ts +2 -0
- package/dist/node/modules/slashing/eligibility/index.d.ts.map +1 -0
- package/dist/node/modules/slashing/index/SlashIndexStore.d.ts +22 -0
- package/dist/node/modules/slashing/index/SlashIndexStore.d.ts.map +1 -0
- package/dist/node/modules/slashing/index/foldSlashIndex.d.ts +56 -0
- package/dist/node/modules/slashing/index/foldSlashIndex.d.ts.map +1 -0
- package/dist/node/modules/slashing/index/index.d.ts +3 -0
- package/dist/node/modules/slashing/index/index.d.ts.map +1 -0
- package/dist/node/modules/slashing/index.d.ts +6 -0
- package/dist/node/modules/slashing/index.d.ts.map +1 -0
- package/dist/node/modules/slashing/model/OffenseProcedure.d.ts +28 -0
- package/dist/node/modules/slashing/model/OffenseProcedure.d.ts.map +1 -0
- package/dist/node/modules/slashing/model/OffenseVerificationContext.d.ts +88 -0
- package/dist/node/modules/slashing/model/OffenseVerificationContext.d.ts.map +1 -0
- package/dist/node/modules/slashing/model/SlashHistoryReader.d.ts +34 -0
- package/dist/node/modules/slashing/model/SlashHistoryReader.d.ts.map +1 -0
- package/dist/node/modules/slashing/model/VerificationOutcome.d.ts +39 -0
- package/dist/node/modules/slashing/model/VerificationOutcome.d.ts.map +1 -0
- package/dist/node/modules/slashing/model/index.d.ts +6 -0
- package/dist/node/modules/slashing/model/index.d.ts.map +1 -0
- package/dist/node/modules/slashing/model/offenseKey.d.ts +42 -0
- package/dist/node/modules/slashing/model/offenseKey.d.ts.map +1 -0
- package/dist/node/modules/slashing/verify/index.d.ts +10 -0
- package/dist/node/modules/slashing/verify/index.d.ts.map +1 -0
- package/dist/node/modules/slashing/verify/preamble.d.ts +63 -0
- package/dist/node/modules/slashing/verify/preamble.d.ts.map +1 -0
- package/dist/node/modules/slashing/verify/verifyEquivocation.d.ts +19 -0
- package/dist/node/modules/slashing/verify/verifyEquivocation.d.ts.map +1 -0
- package/dist/node/modules/slashing/verify/verifyFalseAnchor.d.ts +15 -0
- package/dist/node/modules/slashing/verify/verifyFalseAnchor.d.ts.map +1 -0
- package/dist/node/modules/slashing/verify/verifyFalseAttestation.d.ts +22 -0
- package/dist/node/modules/slashing/verify/verifyFalseAttestation.d.ts.map +1 -0
- package/dist/node/modules/slashing/verify/verifyIneligibleProduction.d.ts +18 -0
- package/dist/node/modules/slashing/verify/verifyIneligibleProduction.d.ts.map +1 -0
- package/dist/node/modules/slashing/verify/verifyInvalidBlock.d.ts +18 -0
- package/dist/node/modules/slashing/verify/verifyInvalidBlock.d.ts.map +1 -0
- package/dist/node/modules/slashing/verify/verifyInvalidSlashRequest.d.ts +11 -0
- package/dist/node/modules/slashing/verify/verifyInvalidSlashRequest.d.ts.map +1 -0
- package/dist/node/modules/slashing/verify/verifyOffense.d.ts +29 -0
- package/dist/node/modules/slashing/verify/verifyOffense.d.ts.map +1 -0
- package/dist/node/modules/slashing/verify/verifyRewardOvermint.d.ts +23 -0
- package/dist/node/modules/slashing/verify/verifyRewardOvermint.d.ts.map +1 -0
- package/dist/node/modules/validation/elevatedPayload/lib/findElevatingTransaction.d.ts +14 -0
- package/dist/node/modules/validation/elevatedPayload/lib/findElevatingTransaction.d.ts.map +1 -0
- package/dist/node/modules/validation/elevatedPayload/lib/index.d.ts +2 -0
- package/dist/node/modules/validation/elevatedPayload/lib/index.d.ts.map +1 -1
- package/dist/node/modules/validation/elevatedPayload/lib/validateSlashPayloadInBlock.d.ts +33 -0
- package/dist/node/modules/validation/elevatedPayload/lib/validateSlashPayloadInBlock.d.ts.map +1 -0
- package/dist/node/modules/validation/elevatedPayload/payloads/index.d.ts +5 -0
- package/dist/node/modules/validation/elevatedPayload/payloads/index.d.ts.map +1 -1
- package/dist/node/modules/validation/elevatedPayload/payloads/validateSlashAdjudicationInBlock.d.ts +14 -0
- package/dist/node/modules/validation/elevatedPayload/payloads/validateSlashAdjudicationInBlock.d.ts.map +1 -0
- package/dist/node/modules/validation/elevatedPayload/payloads/validateSlashChallengeInBlock.d.ts +10 -0
- package/dist/node/modules/validation/elevatedPayload/payloads/validateSlashChallengeInBlock.d.ts.map +1 -0
- package/dist/node/modules/validation/elevatedPayload/payloads/validateSlashCommitInBlock.d.ts +10 -0
- package/dist/node/modules/validation/elevatedPayload/payloads/validateSlashCommitInBlock.d.ts.map +1 -0
- package/dist/node/modules/validation/elevatedPayload/payloads/validateSlashEvidenceInBlock.d.ts +10 -0
- package/dist/node/modules/validation/elevatedPayload/payloads/validateSlashEvidenceInBlock.d.ts.map +1 -0
- package/dist/node/modules/validation/elevatedPayload/payloads/validateSlashRequestInBlock.d.ts +14 -0
- package/dist/node/modules/validation/elevatedPayload/payloads/validateSlashRequestInBlock.d.ts.map +1 -0
- package/dist/node/modules/validation/elevatedPayload/validatePayloadInBlock.d.ts.map +1 -1
- package/dist/node/slashing.d.ts +2 -0
- package/dist/node/slashing.d.ts.map +1 -0
- package/package.json +11 -5
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/modules/analyze/analyzeChain.ts", "../../src/modules/analyze/BalanceAnalyzer/BalanceAnalyzer.ts", "../../src/modules/analyze/BalanceAnalyzer/ChainSummaryBalances.ts", "../../src/modules/analyze/ChainFinalizer.ts", "../../src/modules/analyze/ChainHeadSelector.ts", "../../src/modules/analyze/producer/ChainProducersAnalyzer.ts", "../../src/modules/analyze/producer/ChainSummaryProducers.ts", "../../src/modules/analyze/producer/ChainStakeIntentAnalyzer.ts", "../../src/modules/analyze/producer/ChainSummaryStakeIntent.ts", "../../src/modules/analyze/TransferAnalyzer/ChainSummaryTransfers.ts", "../../src/modules/analyze/TransferAnalyzer/TransferAnalyzer.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable complexity */\nimport type { Hash } from '@ariestools/sdk'\nimport {\n assertEx, isError, spanRootAsync,\n} from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport type {\n BlockContextRead,\n ChainAnalyzer,\n HydratedBlock, HydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport { hydrateBlock } from '@xyo-network/xl1-sdk'\n\nconst analyzeBlock = async (block: HydratedBlock, handlers: ChainAnalyzer[]): Promise<HydratedBlock> => {\n await Promise.all(handlers.map(async (handler) => {\n await handler.onBlock(block)\n }))\n return block\n}\n\nexport const analyzeChain = async (\n context: BlockContextRead,\n handlers: ChainAnalyzer[],\n /* the hash to start at */\n head: Hash | HydratedBlockWithHashMeta,\n /* a hash that we should stop at if we reach it */\n previousHead: Hash | null = null,\n /* max number of blocks to analyze (-1 for no limit) */\n maxDepth = -1n,\n): Promise<Payload[]> => {\n const { logger } = context\n logger?.log('analyzeChain.start', previousHead)\n return assertEx(await spanRootAsync('analyzeChain', async () => {\n let lastBlockNumber = -1\n let maxDepthLimit = maxDepth === -1n ? BigInt(Number.MAX_SAFE_INTEGER) : maxDepth\n let cursor: HydratedBlockWithHashMeta | null = typeof head === 'string' ? await hydrateBlock(context, head) : head\n // If the terminal block is the current head, we don't need to analyze it\n logger?.log('analyzeChain.cursor', cursor?.[0].block)\n if (previousHead !== null && cursor?.[0]._hash === previousHead) return []\n while (cursor && (maxDepthLimit > 0n)) {\n maxDepthLimit -= 1n\n await analyzeBlock(cursor, handlers)\n lastBlockNumber = cursor[0].block\n try {\n cursor = cursor[0].previous === null ? null : await hydrateBlock(context, cursor[0].previous)\n } catch (ex) {\n if (isError(ex)) {\n logger?.warn('Error in hydrateBlock', ex)\n }\n break\n }\n if (cursor?.[0]._hash === previousHead) break\n }\n if (previousHead === null && maxDepth === -1n && lastBlockNumber !== 0) {\n logger?.warn(`Expected root block number to be 0, but was ${lastBlockNumber} : ${previousHead}`)\n }\n logger?.log('analyzeChain.done', lastBlockNumber)\n return handlers.map((handler) => {\n return handler.result()\n })\n }, context), () => 'analyzeChain failed')\n}\n", "import type { Address, Hash } from '@ariestools/sdk'\nimport { isDefined, toAddress } from '@ariestools/sdk'\nimport { trace, type Tracer } from '@opentelemetry/api'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport type {\n ChainAnalyzer,\n HydratedBlockWithHashMeta, SignedBigInt,\n} from '@xyo-network/xl1-sdk'\nimport {\n netBalancesForPayloads,\n parseSignedBigInt, toSignedBigInt,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ChainSummaryBalances } from './ChainSummaryBalances.ts'\nimport { ChainSummaryBalancesSchema } from './ChainSummaryBalances.ts'\n\nconst bigintBalances = (balances: Partial<Record<Address, SignedBigInt>>) => {\n const result: Record<string, bigint> = {}\n for (const [address, balance] of Object.entries(balances)) {\n if (isDefined(balance)) {\n const propertyKey = String(toAddress(address))\n result[propertyKey] = parseSignedBigInt(balance)\n }\n }\n return result\n}\n\nexport class BalanceAnalyzer implements ChainAnalyzer {\n protected _tracer: Tracer | undefined\n private _addresses: Address[]\n private _balances: Record<string, bigint> = {}\n private _firstBlock?: Hash\n private _lastBlock?: Hash\n private _minBalances: bigint[]\n\n constructor(addresses: Address[] = [], minBalances: bigint[] = [], startingBalances?: ChainSummaryBalances) {\n this._addresses = addresses\n this._minBalances = minBalances\n this._balances = startingBalances ? bigintBalances(startingBalances.balances) : {}\n }\n\n protected get tracer() {\n if (this._tracer) return this._tracer\n this._tracer = trace.getTracer('BalanceAnalyzer')\n return this._tracer\n }\n\n onBlock([block, payloads]: HydratedBlockWithHashMeta): boolean {\n this._firstBlock = this._firstBlock ?? block._hash\n this._lastBlock = block._hash\n const netBalances = netBalancesForPayloads({ singletons: {} }, payloads)\n for (const [address, balance] of Object.entries(netBalances)) {\n const propertyKey = String(toAddress(address))\n this._balances[propertyKey] = (this._balances[propertyKey] ?? 0n) + balance\n }\n return this.shouldContinue()\n }\n\n result() {\n const balances: Record<string, SignedBigInt> = {}\n const positiveBalances = Object.entries(this._balances).filter(([, balance]) => balance > 0n)\n for (const [address, balance] of positiveBalances) {\n const propertyKey = String(toAddress(address))\n balances[propertyKey] = toSignedBigInt(balance)\n }\n const builder = new PayloadBuilder<ChainSummaryBalances>({ schema: ChainSummaryBalancesSchema })\n return builder.fields({\n firstBlock: this._firstBlock ?? null,\n lastBlock: this._lastBlock ?? null,\n balances,\n }).build()\n }\n\n shouldContinue() {\n return !this.allMinBalancesReached()\n }\n\n protected allMinBalancesReached() {\n if (this._minBalances.length === 0) return true\n for (let i = 0; i < this._addresses.length; i++) {\n const propertyKey = String(this._addresses[i])\n if ((this._balances[propertyKey] ?? 0n) < this._minBalances[i]) return false\n }\n return true\n }\n}\n", "import {\n type Address, type Hash, type Hex,\n} from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type { SignedBigInt } from '@xyo-network/xl1-sdk'\n\nexport const ChainSummaryBalancesSchema = asSchema('network.xyo.chain.summary.balances', true)\nexport type ChainSummaryBalancesSchema = typeof ChainSummaryBalancesSchema\n\nexport interface ChainSummaryBalancesFields {\n balances: Partial<Record<Address, SignedBigInt>>\n firstBlock: Hash | null\n hasMinBalance?: Record<Address, Hex>\n lastBlock: Hash | null\n}\n\nexport type ChainSummaryBalances = Payload<ChainSummaryBalancesFields, ChainSummaryBalancesSchema>\nexport const isChainSummaryBalances = isPayloadOfSchemaType<ChainSummaryBalances>(ChainSummaryBalancesSchema)\n", "import type { BaseParams, Promisable } from '@ariestools/sdk'\nimport { Base } from '@ariestools/sdk'\nimport type { Tracer } from '@opentelemetry/api'\nimport type { BlockViewer, SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-sdk'\nimport { asXL1BlockRange } from '@xyo-network/xl1-sdk'\n\nexport interface ChainFinalizerParams extends BaseParams {\n blockViewer: BlockViewer\n maxWindowSize?: number\n windowedFinalizedChain?: SignedHydratedBlockWithHashMeta[]\n}\n\nexport class ChainFinalizer<TParams extends ChainFinalizerParams = ChainFinalizerParams> extends Base<TParams> {\n protected _tracer: Tracer | undefined\n // the chainArchivist is assumed to be an archivist with already validated blocks in it along with all the transactions and payloads\n // it is also assumed that the sequence order of archivist is that newer blocks come after older blocks\n\n protected windowedFinalizedChain: SignedHydratedBlockWithHashMeta[]\n\n constructor(params: TParams) {\n super(params)\n this.windowedFinalizedChain = [...(params.windowedFinalizedChain ?? [])]\n }\n\n protected get blockViewer() {\n return this.params.blockViewer\n }\n\n protected get finalizedBlockNumber() {\n return this.windowedFinalizedChain?.at(-1)?.[0].block ?? -1\n }\n\n protected get maxWindowSize() {\n return this.params.maxWindowSize ?? 100\n }\n\n protected get windowRange() {\n return asXL1BlockRange([this.windowedFinalizedChain.at(0)?.[0].block ?? 0, this.finalizedBlockNumber])\n }\n\n finalizeChainFragment(chain: SignedHydratedBlockWithHashMeta[]): Promisable<void> {\n this.windowedFinalizedChain = [...this.windowedFinalizedChain, ...chain].slice(-this.maxWindowSize)\n }\n}\n", "import type { Address } from '@ariestools/sdk'\nimport {\n isDefined, spanRootAsync, toAddress,\n} from '@ariestools/sdk'\nimport type {\n BaseContext, MempoolViewer, SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport {\n findBestUncle, findUncles, getWindowedChain,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ChainFinalizerParams } from './ChainFinalizer.ts'\nimport { ChainFinalizer } from './ChainFinalizer.ts'\n\nexport interface ChainHeadSelectorParams extends ChainFinalizerParams {\n /**\n * List of allowed producer addresses, if undefined anyone can participate\n */\n allowedProducers?: Address[]\n /**\n * Back-off timeout (ms) after which a head is accepted even with fewer than\n * minCandidates uncle chains available.\n * When undefined, findBestUncle applies DEFAULT_BACKOFF_MS from the protocol SDK.\n */\n backoffMs?: number\n context: BaseContext\n mempoolViewer: MempoolViewer\n /**\n * Minimum number of uncle candidates required before accepting one.\n * When undefined, findBestUncle applies DEFAULT_MIN_CANDIDATES from the protocol SDK.\n */\n minCandidates?: number\n}\n\nexport class ChainHeadSelector extends ChainFinalizer<ChainHeadSelectorParams> {\n protected allowedProducers?: Address[]\n protected backoffMs?: number\n protected minCandidates?: number\n private _timeSinceLastUncle = Date.now()\n\n constructor(params: ChainHeadSelectorParams) {\n super(params)\n this.allowedProducers = params.allowedProducers\n this.backoffMs = params.backoffMs\n this.minCandidates = params.minCandidates\n }\n\n protected get context() {\n return this.params.context\n }\n\n protected get mempoolViewer() {\n return this.params.mempoolViewer\n }\n\n async findBestHead(): Promise<SignedHydratedBlockWithHashMeta[]> {\n return await spanRootAsync('findBestHead', async () => {\n const allProposedBlocks = await this.mempoolViewer.pendingBlocks()\n const allowedProducers = this.allowedProducers\n\n // if only allowed producers, enforce it\n const proposedBlocks = isDefined(allowedProducers) && allowedProducers.length > 0\n ? allProposedBlocks.filter(pb => allowedProducers.includes(toAddress(pb[0].addresses[0])))\n : allProposedBlocks\n\n // TODO: Validate proposed blocks\n this.windowedFinalizedChain = await getWindowedChain(this.context, this.blockViewer, this.maxWindowSize, this.windowedFinalizedChain)\n const uncles = findUncles(this.context, this.windowedFinalizedChain, proposedBlocks)\n return findBestUncle(this.windowedFinalizedChain, uncles, { backoffMs: this.backoffMs, minCandidates: this.minCandidates }) ?? this.windowedFinalizedChain\n }, this.context)\n }\n}\n\n/*\n\nComparing two heads for which is better\n\nProducer Energy\n\n1. +1 Point for every block not produced by it in recent chain LOG(active producers * 100)\n2a. Energy Multiplied by - # of transactions in block is above normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n2b. Energy Divided by - # of transactions in block is below normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n3a. Energy Multiplied by - # of gas in block is above normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n3b. Energy Divided by - # of gas in block is below normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n\nOther Ideas\n\n1. Total diverse addresses in block (not quite incentivizing what we really want)\n2. Total transactions in block (more is better, encourages non-lethargic blocks)\n3. Sum total of transactions in block (higher value means more influential/better)\n4. Sum of gas of transactions in block (higher is better, prioritizes paying contributors)\n5. Exp of transactions in block (lower is better, prioritizes not aging out before inclusion)\n6. Recency of this producer's last produced block (encourages diversification in block producers)\n\n*/\n", "import type { Promisable } from '@ariestools/sdk'\nimport { isDefined, toAddress } from '@ariestools/sdk'\nimport { type ChainAnalyzer, type HydratedBlock } from '@xyo-network/xl1-sdk'\n\nimport type { AnalyzedProducer, ChainSummaryProducers } from './ChainSummaryProducers.ts'\nimport { ChainSummaryProducersSchema } from './ChainSummaryProducers.ts'\n\nexport class ChainProducersAnalyzer implements ChainAnalyzer<ChainSummaryProducers> {\n private endingBlock = 0\n private producers: Record<string, AnalyzedProducer> = {}\n private startingBlock = 0\n\n onBlock([block]: HydratedBlock): Promisable<boolean> {\n // avoid analyzing the same block twice\n if (block.block === this.endingBlock) return true\n\n // update the ending block\n this.endingBlock = block.block\n const blockProducerAddressRaw = block.addresses[0]\n\n if (blockProducerAddressRaw === undefined) return true\n\n const blockProducerAddress = toAddress(blockProducerAddressRaw)\n\n const producerKey = String(blockProducerAddress)\n const existingProducer: AnalyzedProducer | undefined = this.producers[producerKey]\n if (isDefined(existingProducer)) {\n existingProducer.rewardsEarned = (existingProducer.rewardsEarned ?? 0n) + 0n\n existingProducer.blocksProduced++\n } else {\n const newProducer: AnalyzedProducer = {\n address: blockProducerAddress, rewardsEarned: 0n, blocksProduced: 1,\n }\n this.producers[producerKey] = newProducer\n }\n\n return true\n }\n\n result(): ChainSummaryProducers {\n return {\n endingBlock: this.endingBlock,\n producers: this.producers,\n schema: ChainSummaryProducersSchema,\n startingBlock: this.startingBlock,\n }\n }\n\n shouldContinue(): boolean {\n return true\n }\n}\n", "import type { Address } from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\n\nexport const ChainSummaryProducersSchema = asSchema('network.xyo.chain.summary.producers', true)\nexport type ChainSummaryProducersSchema = typeof ChainSummaryProducersSchema\n\nexport interface AnalyzedProducer {\n address: Address\n blocksProduced: number\n rewardsEarned: bigint\n}\n\nexport interface ChainSummaryProducersFields {\n endingBlock: number\n producers: Record<string, AnalyzedProducer>\n startingBlock: number\n}\n\nexport type ChainSummaryProducers = Payload<ChainSummaryProducersFields, ChainSummaryProducersSchema>\nexport const isChainSummaryProducers = isPayloadOfSchemaType<ChainSummaryProducers>(ChainSummaryProducersSchema)\n", "import type { Promisable } from '@ariestools/sdk'\nimport { assertEx } from '@ariestools/sdk'\nimport {\n type ChainAnalyzer, type ChainStakeIntent, type HydratedBlock,\n type Intent,\n isChainStakeIntentWithStorageMeta,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ChainSummaryStakeIntent } from './ChainSummaryStakeIntent.ts'\nimport { ChainSummaryStakeIntentSchema } from './ChainSummaryStakeIntent.ts'\n\nexport class ChainStakeIntentAnalyzer implements ChainAnalyzer<ChainSummaryStakeIntent> {\n private _endingBlock: number | undefined = undefined\n private _intent: Intent\n private _intentPayloads: ChainStakeIntent[] = []\n private _startingBlock: number | undefined = undefined\n\n constructor(intent: Intent) {\n this._intent = intent\n }\n\n onBlock([block, validatedPayloads]: HydratedBlock): Promisable<boolean> {\n this._startingBlock ??= block.block\n\n // Update the ending block\n this._endingBlock = block.block\n const intents = validatedPayloads.filter(isChainStakeIntentWithStorageMeta)\n const desiredIntents = intents.filter(intent => intent.intent === this._intent)\n this._intentPayloads.push(...desiredIntents)\n return true\n }\n\n result(): ChainSummaryStakeIntent {\n assertEx(this._startingBlock !== undefined, () => 'ChainStakeIntentAnalyzer: Invalid startingBlock')\n assertEx(this._endingBlock !== undefined, () => 'ChainStakeIntentAnalyzer: Invalid endingBlock')\n return {\n endingBlock: this._endingBlock!,\n intents: this._intentPayloads,\n schema: ChainSummaryStakeIntentSchema,\n startingBlock: this._startingBlock!,\n }\n }\n\n shouldContinue(): boolean {\n return true\n }\n}\n", "import type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type { ChainStakeIntent } from '@xyo-network/xl1-sdk'\n\nexport const ChainSummaryStakeIntentSchema = asSchema('network.xyo.chain.summary.staked.intent', true)\nexport type ChainSummaryStakeIntentSchema = typeof ChainSummaryStakeIntentSchema\n\ninterface ChainSummaryStakeIntentFields {\n endingBlock: number\n intents: ChainStakeIntent[]\n startingBlock: number\n}\n\nexport type ChainSummaryStakeIntent = Payload<ChainSummaryStakeIntentFields, ChainSummaryStakeIntentSchema>\nexport const isChainSummaryStakeIntent = isPayloadOfSchemaType<ChainSummaryStakeIntent>(ChainSummaryStakeIntentSchema)\n", "import {\n type Address, type Hash, type Hex,\n} from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type { SignedBigInt } from '@xyo-network/xl1-sdk'\n\nexport const ChainSummaryTransfersSchema = asSchema('network.xyo.chain.summary.transfers', true)\nexport type ChainSummaryTransfersSchema = typeof ChainSummaryTransfersSchema\n\nexport interface ChainSummaryTransfersFields {\n firstBlock: Hash | null\n hasMinTransfer?: Record<Address, Hex>\n lastBlock: Hash | null\n transfers: Record<Address, Record<Address, SignedBigInt>>\n}\n\nexport type ChainSummaryTransfers = Payload<ChainSummaryTransfersFields, ChainSummaryTransfersSchema>\nexport const isChainSummaryTransfers = isPayloadOfSchemaType<ChainSummaryTransfers>(ChainSummaryTransfersSchema)\n", "import type { Address, Hash } from '@ariestools/sdk'\nimport { isDefined, toAddress } from '@ariestools/sdk'\nimport { trace, type Tracer } from '@opentelemetry/api'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport type {\n ChainAnalyzer,\n HydratedBlockWithHashMeta, SignedBigInt,\n} from '@xyo-network/xl1-sdk'\nimport {\n netTransfersForPayloads,\n parseSignedBigInt, toSignedBigInt,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ChainSummaryTransfers } from './ChainSummaryTransfers.ts'\nimport { ChainSummaryTransfersSchema } from './ChainSummaryTransfers.ts'\n\nconst bigintTransfers = (transfers: Record<Address, Record<Address, SignedBigInt>>) => {\n const result: Record<string, Record<string, bigint>> = {}\n for (const [from, toMap] of Object.entries(transfers)) {\n const fromKey = String(toAddress(from))\n for (const [to, balance] of Object.entries(toMap)) {\n const toKey = String(toAddress(to))\n if (isDefined(balance)) {\n const fromTransfers = result[fromKey] ?? {}\n result[fromKey] = fromTransfers\n fromTransfers[toKey] = parseSignedBigInt(balance)\n }\n }\n }\n return result\n}\n\nexport class TransferAnalyzer implements ChainAnalyzer {\n protected _tracer: Tracer | undefined\n private _firstBlock?: Hash\n private _lastBlock?: Hash\n private _transfers: Record<string, Record<string, bigint>> = {}\n\n constructor(startingTransfers?: ChainSummaryTransfers) {\n this._transfers = startingTransfers ? bigintTransfers(startingTransfers.transfers) : {}\n }\n\n protected get tracer() {\n if (this._tracer) return this._tracer\n this._tracer = trace.getTracer('TransferAnalyzer')\n return this._tracer\n }\n\n onBlock([block, payloads]: HydratedBlockWithHashMeta): boolean {\n this._firstBlock = this._firstBlock ?? block._hash\n this._lastBlock = block._hash\n const netTransfers = netTransfersForPayloads({ singletons: {} }, payloads)\n for (const [from, toMap] of Object.entries(netTransfers)) {\n const fromKey = String(toAddress(from))\n const fromTransfers = this._transfers[fromKey] ?? {}\n this._transfers[fromKey] = fromTransfers\n for (const [to, balance] of Object.entries(toMap)) {\n const toKey = String(toAddress(to))\n fromTransfers[toKey] = (fromTransfers[toKey] ?? 0n) + balance\n }\n }\n return this.shouldContinue()\n }\n\n result() {\n const transfers: Record<string, Record<string, SignedBigInt>> = {}\n for (const [from, toMap] of Object.entries(this._transfers)) {\n const fromKey = String(toAddress(from))\n const positiveTransfers = Object.entries(toMap).filter(([, balance]) => balance > 0n)\n for (const [to, balance] of positiveTransfers) {\n const fromTransfers = transfers[fromKey] ?? {}\n transfers[fromKey] = fromTransfers\n const toKey = String(toAddress(to))\n fromTransfers[toKey] = toSignedBigInt(balance)\n }\n }\n const builder = new PayloadBuilder<ChainSummaryTransfers>({ schema: ChainSummaryTransfersSchema })\n return builder.fields({\n firstBlock: this._firstBlock ?? null,\n lastBlock: this._lastBlock ?? null,\n transfers,\n }).build()\n }\n\n shouldContinue() {\n return true\n }\n}\n"],
|
|
5
|
-
"mappings": ";
|
|
3
|
+
"sources": ["../../src/modules/analyze/admission.ts", "../../src/modules/analyze/analyzeChain.ts", "../../src/modules/analyze/BalanceAnalyzer/BalanceAnalyzer.ts", "../../src/modules/analyze/BalanceAnalyzer/ChainSummaryBalances.ts", "../../src/modules/analyze/ChainFinalizer.ts", "../../src/modules/analyze/ChainHeadSelector.ts", "../../src/modules/analyze/producer/ChainProducersAnalyzer.ts", "../../src/modules/analyze/producer/ChainSummaryProducers.ts", "../../src/modules/analyze/producer/ChainStakeIntentAnalyzer.ts", "../../src/modules/analyze/producer/ChainSummaryStakeIntent.ts", "../../src/modules/analyze/TransferAnalyzer/ChainSummaryTransfers.ts", "../../src/modules/analyze/TransferAnalyzer/TransferAnalyzer.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Promisable } from '@ariestools/sdk'\nimport type { XyoAddress } from '@xyo-network/sdk'\nimport type { SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-sdk'\n\nimport type { EligibilityEvaluation } from '#slashing'\n\n/**\n * How a finalizer decides which candidates it will consider.\n *\n * Three postures, and moving between them is a configuration change rather than a different\n * build. That constraint is deliberate: a network that had to be redeployed to step back from\n * enforcement would, in the moment it most needed to step back, be unable to.\n *\n * - `allowlist` \u2014 only the named producers, which is how the chain runs today\n * - `shadow` \u2014 the same gate, plus participation computed and published for every candidate\n * - `enforce` \u2014 participation itself gates\n */\nexport const AdmissionModes = ['allowlist', 'shadow', 'enforce'] as const\n\n/** How a finalizer decides which candidates it will consider. */\nexport type AdmissionMode = typeof AdmissionModes[number]\n\n/** Evaluates whether a candidate's producer had standing to produce it. */\nexport type ProducerEligibilityEvaluator\n = (candidate: SignedHydratedBlockWithHashMeta) => Promisable<EligibilityEvaluation>\n\n/** What both gates concluded about one candidate. */\nexport interface AdmissionAssessment {\n /** Whether the allow-list admits it. */\n admittedByAllowList: boolean\n /** The candidate's height. */\n block: number\n /** The candidate's signed identity. */\n dataHash: string\n /** What the participation predicate concluded. */\n eligibility: EligibilityEvaluation\n /** The producer. */\n producer: XyoAddress\n}\n\n/**\n * What the two gates said about a round of candidates, and where they disagreed.\n *\n * Published rather than logged, because the whole purpose of the shadow posture is that anyone \u2014\n * not just the operator holding the terminal \u2014 can see what enforcement would have done before it\n * does it. An operator convinced by their own logs has convinced nobody.\n */\nexport interface AdmissionShadowReport {\n /** Every candidate considered this round. */\n assessments: AdmissionAssessment[]\n /** Only those where the two gates disagreed. */\n divergent: AdmissionAssessment[]\n /** The finalized height this round was selected against. */\n head: number\n}\n\n/** Moniker the admission shadow publisher resolves under. */\nexport const AdmissionShadowPublishRunnerMoniker = 'AdmissionShadowPublishRunner'\n\n/**\n * Publishes what both admission gates concluded.\n *\n * An interface rather than a class here because the finalizer must not depend on the launcher\n * that supplies the implementation \u2014 the actor states what it needs, and orchestration decides\n * what satisfies it.\n */\nexport interface AdmissionShadowPublishRunner {\n publish(report: AdmissionShadowReport): Promisable<void>\n}\n\n/** Whether a resolved provider can actually publish shadow reports. */\nexport function isAdmissionShadowPublishRunner(value: unknown): value is AdmissionShadowPublishRunner {\n return typeof (value as Partial<AdmissionShadowPublishRunner> | undefined)?.publish === 'function'\n}\n\n/** Whether the two gates reached different conclusions about a candidate. */\nexport function isDivergent(assessment: AdmissionAssessment): boolean {\n // an unresolvable evaluation is not a disagreement \u2014 it is an absence of one\n if (!assessment.eligibility.resolvable) return false\n return assessment.admittedByAllowList !== (assessment.eligibility.eligible === true)\n}\n", "/* eslint-disable complexity */\nimport type { Hash } from '@ariestools/sdk'\nimport {\n assertEx, isError, spanRootAsync,\n} from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport type {\n BlockContextRead,\n ChainAnalyzer,\n HydratedBlock, HydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport { hydrateBlock } from '@xyo-network/xl1-sdk'\n\nconst analyzeBlock = async (block: HydratedBlock, handlers: ChainAnalyzer[]): Promise<HydratedBlock> => {\n await Promise.all(handlers.map(async (handler) => {\n await handler.onBlock(block)\n }))\n return block\n}\n\nexport const analyzeChain = async (\n context: BlockContextRead,\n handlers: ChainAnalyzer[],\n /* the hash to start at */\n head: Hash | HydratedBlockWithHashMeta,\n /* a hash that we should stop at if we reach it */\n previousHead: Hash | null = null,\n /* max number of blocks to analyze (-1 for no limit) */\n maxDepth = -1n,\n): Promise<Payload[]> => {\n const { logger } = context\n logger?.log('analyzeChain.start', previousHead)\n return assertEx(await spanRootAsync('analyzeChain', async () => {\n let lastBlockNumber = -1\n let maxDepthLimit = maxDepth === -1n ? BigInt(Number.MAX_SAFE_INTEGER) : maxDepth\n let cursor: HydratedBlockWithHashMeta | null = typeof head === 'string' ? await hydrateBlock(context, head) : head\n // If the terminal block is the current head, we don't need to analyze it\n logger?.log('analyzeChain.cursor', cursor?.[0].block)\n if (previousHead !== null && cursor?.[0]._hash === previousHead) return []\n while (cursor && (maxDepthLimit > 0n)) {\n maxDepthLimit -= 1n\n await analyzeBlock(cursor, handlers)\n lastBlockNumber = cursor[0].block\n try {\n cursor = cursor[0].previous === null ? null : await hydrateBlock(context, cursor[0].previous)\n } catch (ex) {\n if (isError(ex)) {\n logger?.warn('Error in hydrateBlock', ex)\n }\n break\n }\n if (cursor?.[0]._hash === previousHead) break\n }\n if (previousHead === null && maxDepth === -1n && lastBlockNumber !== 0) {\n logger?.warn(`Expected root block number to be 0, but was ${lastBlockNumber} : ${previousHead}`)\n }\n logger?.log('analyzeChain.done', lastBlockNumber)\n return handlers.map((handler) => {\n return handler.result()\n })\n }, context), () => 'analyzeChain failed')\n}\n", "import type { Address, Hash } from '@ariestools/sdk'\nimport { isDefined, toAddress } from '@ariestools/sdk'\nimport { trace, type Tracer } from '@opentelemetry/api'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport type {\n ChainAnalyzer,\n HydratedBlockWithHashMeta, SignedBigInt,\n} from '@xyo-network/xl1-sdk'\nimport {\n netBalancesForPayloads,\n parseSignedBigInt, toSignedBigInt,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ChainSummaryBalances } from './ChainSummaryBalances.ts'\nimport { ChainSummaryBalancesSchema } from './ChainSummaryBalances.ts'\n\nconst bigintBalances = (balances: Partial<Record<Address, SignedBigInt>>) => {\n const result: Record<string, bigint> = {}\n for (const [address, balance] of Object.entries(balances)) {\n if (isDefined(balance)) {\n const propertyKey = String(toAddress(address))\n result[propertyKey] = parseSignedBigInt(balance)\n }\n }\n return result\n}\n\nexport class BalanceAnalyzer implements ChainAnalyzer {\n protected _tracer: Tracer | undefined\n private _addresses: Address[]\n private _balances: Record<string, bigint> = {}\n private _firstBlock?: Hash\n private _lastBlock?: Hash\n private _minBalances: bigint[]\n\n constructor(addresses: Address[] = [], minBalances: bigint[] = [], startingBalances?: ChainSummaryBalances) {\n this._addresses = addresses\n this._minBalances = minBalances\n this._balances = startingBalances ? bigintBalances(startingBalances.balances) : {}\n }\n\n protected get tracer() {\n if (this._tracer) return this._tracer\n this._tracer = trace.getTracer('BalanceAnalyzer')\n return this._tracer\n }\n\n onBlock([block, payloads]: HydratedBlockWithHashMeta): boolean {\n this._firstBlock = this._firstBlock ?? block._hash\n this._lastBlock = block._hash\n const netBalances = netBalancesForPayloads({ singletons: {} }, payloads)\n for (const [address, balance] of Object.entries(netBalances)) {\n const propertyKey = String(toAddress(address))\n this._balances[propertyKey] = (this._balances[propertyKey] ?? 0n) + balance\n }\n return this.shouldContinue()\n }\n\n result() {\n const balances: Record<string, SignedBigInt> = {}\n const positiveBalances = Object.entries(this._balances).filter(([, balance]) => balance > 0n)\n for (const [address, balance] of positiveBalances) {\n const propertyKey = String(toAddress(address))\n balances[propertyKey] = toSignedBigInt(balance)\n }\n const builder = new PayloadBuilder<ChainSummaryBalances>({ schema: ChainSummaryBalancesSchema })\n return builder.fields({\n firstBlock: this._firstBlock ?? null,\n lastBlock: this._lastBlock ?? null,\n balances,\n }).build()\n }\n\n shouldContinue() {\n return !this.allMinBalancesReached()\n }\n\n protected allMinBalancesReached() {\n if (this._minBalances.length === 0) return true\n for (let i = 0; i < this._addresses.length; i++) {\n const propertyKey = String(this._addresses[i])\n if ((this._balances[propertyKey] ?? 0n) < this._minBalances[i]) return false\n }\n return true\n }\n}\n", "import {\n type Address, type Hash, type Hex,\n} from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type { SignedBigInt } from '@xyo-network/xl1-sdk'\n\nexport const ChainSummaryBalancesSchema = asSchema('network.xyo.chain.summary.balances', true)\nexport type ChainSummaryBalancesSchema = typeof ChainSummaryBalancesSchema\n\nexport interface ChainSummaryBalancesFields {\n balances: Partial<Record<Address, SignedBigInt>>\n firstBlock: Hash | null\n hasMinBalance?: Record<Address, Hex>\n lastBlock: Hash | null\n}\n\nexport type ChainSummaryBalances = Payload<ChainSummaryBalancesFields, ChainSummaryBalancesSchema>\nexport const isChainSummaryBalances = isPayloadOfSchemaType<ChainSummaryBalances>(ChainSummaryBalancesSchema)\n", "import type { BaseParams, Promisable } from '@ariestools/sdk'\nimport { Base } from '@ariestools/sdk'\nimport type { Tracer } from '@opentelemetry/api'\nimport type { BlockViewer, SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-sdk'\nimport { asXL1BlockRange } from '@xyo-network/xl1-sdk'\n\nexport interface ChainFinalizerParams extends BaseParams {\n blockViewer: BlockViewer\n maxWindowSize?: number\n windowedFinalizedChain?: SignedHydratedBlockWithHashMeta[]\n}\n\nexport class ChainFinalizer<TParams extends ChainFinalizerParams = ChainFinalizerParams> extends Base<TParams> {\n protected _tracer: Tracer | undefined\n // the chainArchivist is assumed to be an archivist with already validated blocks in it along with all the transactions and payloads\n // it is also assumed that the sequence order of archivist is that newer blocks come after older blocks\n\n protected windowedFinalizedChain: SignedHydratedBlockWithHashMeta[]\n\n constructor(params: TParams) {\n super(params)\n this.windowedFinalizedChain = [...(params.windowedFinalizedChain ?? [])]\n }\n\n protected get blockViewer() {\n return this.params.blockViewer\n }\n\n protected get finalizedBlockNumber() {\n return this.windowedFinalizedChain?.at(-1)?.[0].block ?? -1\n }\n\n protected get maxWindowSize() {\n return this.params.maxWindowSize ?? 100\n }\n\n protected get windowRange() {\n return asXL1BlockRange([this.windowedFinalizedChain.at(0)?.[0].block ?? 0, this.finalizedBlockNumber])\n }\n\n finalizeChainFragment(chain: SignedHydratedBlockWithHashMeta[]): Promisable<void> {\n this.windowedFinalizedChain = [...this.windowedFinalizedChain, ...chain].slice(-this.maxWindowSize)\n }\n}\n", "import type { Address } from '@ariestools/sdk'\nimport {\n isDefined, spanRootAsync, toAddress,\n} from '@ariestools/sdk'\nimport type {\n BaseContext, MempoolViewer, SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-sdk'\nimport {\n findBestUncle, findUncles, getWindowedChain,\n} from '@xyo-network/xl1-sdk'\n\nimport type {\n AdmissionAssessment, AdmissionMode, AdmissionShadowReport, ProducerEligibilityEvaluator,\n} from './admission.ts'\nimport { isDivergent } from './admission.ts'\nimport type { ChainFinalizerParams } from './ChainFinalizer.ts'\nimport { ChainFinalizer } from './ChainFinalizer.ts'\n\nexport interface ChainHeadSelectorParams extends ChainFinalizerParams {\n /**\n * How candidates are admitted. Defaults to `allowlist`, which is how the chain runs today.\n */\n admission?: AdmissionMode\n /**\n * List of allowed producer addresses, if undefined anyone can participate\n */\n allowedProducers?: Address[]\n /**\n * Back-off timeout (ms) after which a head is accepted even with fewer than\n * minCandidates uncle chains available.\n * When undefined, findBestUncle applies DEFAULT_BACKOFF_MS from the protocol SDK.\n */\n backoffMs?: number\n context: BaseContext\n /**\n * Computes whether a candidate's producer had standing. Absent means the question is never\n * asked, which is what keeps a node with no stake readers running exactly as it does today.\n */\n eligibility?: ProducerEligibilityEvaluator\n mempoolViewer: MempoolViewer\n /**\n * Minimum number of uncle candidates required before accepting one.\n * When undefined, findBestUncle applies DEFAULT_MIN_CANDIDATES from the protocol SDK.\n */\n minCandidates?: number\n /** Where to publish what the two gates concluded, in shadow posture. */\n publishAdmissionShadow?: (report: AdmissionShadowReport) => Promise<void>\n}\n\nexport class ChainHeadSelector extends ChainFinalizer<ChainHeadSelectorParams> {\n protected admission: AdmissionMode\n protected allowedProducers?: Address[]\n protected backoffMs?: number\n protected minCandidates?: number\n private _timeSinceLastUncle = Date.now()\n\n constructor(params: ChainHeadSelectorParams) {\n super(params)\n this.admission = params.admission ?? 'allowlist'\n this.allowedProducers = params.allowedProducers\n this.backoffMs = params.backoffMs\n this.minCandidates = params.minCandidates\n }\n\n protected get context() {\n return this.params.context\n }\n\n protected get mempoolViewer() {\n return this.params.mempoolViewer\n }\n\n async findBestHead(): Promise<SignedHydratedBlockWithHashMeta[]> {\n return await spanRootAsync('findBestHead', async () => {\n const allProposedBlocks = await this.mempoolViewer.pendingBlocks()\n const allowed = allProposedBlocks.filter(pb => this.isAllowed(pb))\n const proposedBlocks = await this.admit(allProposedBlocks, allowed)\n\n // TODO: Validate proposed blocks\n this.windowedFinalizedChain = await getWindowedChain(this.context, this.blockViewer, this.maxWindowSize, this.windowedFinalizedChain)\n const uncles = findUncles(this.context, this.windowedFinalizedChain, proposedBlocks)\n return findBestUncle(this.windowedFinalizedChain, uncles, { backoffMs: this.backoffMs, minCandidates: this.minCandidates }) ?? this.windowedFinalizedChain\n }, this.context)\n }\n\n /**\n * Applies the configured admission posture.\n *\n * In `shadow` the allow-list still decides \u2014 participation is computed and published beside it,\n * and changes nothing. That is the entire value of the posture: the network keeps behaving\n * exactly as it did while everyone gets to see what the new rule would have done.\n *\n * In `enforce` participation gates, but only when it reached a conclusion. A candidate whose\n * standing cannot be established is admitted, not rejected \u2014 otherwise a finalizer that lost\n * its stake reader would quietly stop accepting anyone's blocks and stall the chain.\n *\n * Assessments publish in both postures. The audit trail must not disappear at the moment\n * admission starts gating \u2014 enforce is when it matters most.\n */\n protected async admit(\n all: SignedHydratedBlockWithHashMeta[],\n allowed: SignedHydratedBlockWithHashMeta[],\n ): Promise<SignedHydratedBlockWithHashMeta[]> {\n if (this.admission === 'allowlist' || this.params.eligibility === undefined) return allowed\n const assessments = await this.assess(all)\n await this.publishShadow(assessments)\n if (this.admission === 'shadow') return allowed\n const ineligible = new Set(assessments\n .filter(assessment => assessment.eligibility.resolvable && assessment.eligibility.eligible !== true)\n .map(assessment => assessment.dataHash))\n return allowed.filter(candidate => !ineligible.has(candidate[0]._dataHash))\n }\n\n /**\n * Runs both gates over every candidate.\n *\n * An evaluator that throws yields an unresolvable assessment rather than an exception: this\n * sits on the head-selection path, and a flaky stake reader must never be able to stop the\n * chain from finalizing.\n */\n protected async assess(all: SignedHydratedBlockWithHashMeta[]): Promise<AdmissionAssessment[]> {\n const evaluate = this.params.eligibility\n if (evaluate === undefined) return []\n const evaluateSafely = async (candidate: SignedHydratedBlockWithHashMeta) => {\n try {\n return await evaluate(candidate)\n } catch {\n return { resolvable: false }\n }\n }\n return await Promise.all(all.map(async candidate => ({\n admittedByAllowList: this.isAllowed(candidate),\n block: candidate[0].block,\n dataHash: candidate[0]._dataHash,\n eligibility: await evaluateSafely(candidate),\n producer: candidate[0].addresses[0],\n })))\n }\n\n /** Whether the configured allow-list admits a candidate. An empty list admits everyone. */\n protected isAllowed(candidate: SignedHydratedBlockWithHashMeta): boolean {\n const allowedProducers = this.allowedProducers\n return isDefined(allowedProducers) && allowedProducers.length > 0\n ? allowedProducers.includes(toAddress(candidate[0].addresses[0]))\n : true\n }\n\n /** Publishes what the two gates concluded, swallowing failures. */\n protected async publishShadow(assessments: AdmissionAssessment[]): Promise<void> {\n const publish = this.params.publishAdmissionShadow\n // an empty round says nothing worth a write\n if (publish === undefined || assessments.length === 0) return\n try {\n await publish({\n assessments,\n divergent: assessments.filter(assessment => isDivergent(assessment)),\n head: this.windowedFinalizedChain[0]?.[0]?.block ?? 0,\n })\n } catch {\n // observing must never be able to stop the chain from finalizing\n }\n }\n}\n\n/*\n\nComparing two heads for which is better\n\nProducer Energy\n\n1. +1 Point for every block not produced by it in recent chain LOG(active producers * 100)\n2a. Energy Multiplied by - # of transactions in block is above normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n2b. Energy Divided by - # of transactions in block is below normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n3a. Energy Multiplied by - # of gas in block is above normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n3b. Energy Divided by - # of gas in block is below normal (last 1000 blocks) (+0.5 per std deviation) (max 2.5)\n\nOther Ideas\n\n1. Total diverse addresses in block (not quite incentivizing what we really want)\n2. Total transactions in block (more is better, encourages non-lethargic blocks)\n3. Sum total of transactions in block (higher value means more influential/better)\n4. Sum of gas of transactions in block (higher is better, prioritizes paying contributors)\n5. Exp of transactions in block (lower is better, prioritizes not aging out before inclusion)\n6. Recency of this producer's last produced block (encourages diversification in block producers)\n\n*/\n", "import type { Promisable } from '@ariestools/sdk'\nimport { isDefined, toAddress } from '@ariestools/sdk'\nimport { type ChainAnalyzer, type HydratedBlock } from '@xyo-network/xl1-sdk'\n\nimport type { AnalyzedProducer, ChainSummaryProducers } from './ChainSummaryProducers.ts'\nimport { ChainSummaryProducersSchema } from './ChainSummaryProducers.ts'\n\nexport class ChainProducersAnalyzer implements ChainAnalyzer<ChainSummaryProducers> {\n private endingBlock = 0\n private producers: Record<string, AnalyzedProducer> = {}\n private startingBlock = 0\n\n onBlock([block]: HydratedBlock): Promisable<boolean> {\n // avoid analyzing the same block twice\n if (block.block === this.endingBlock) return true\n\n // update the ending block\n this.endingBlock = block.block\n const blockProducerAddressRaw = block.addresses[0]\n\n if (blockProducerAddressRaw === undefined) return true\n\n const blockProducerAddress = toAddress(blockProducerAddressRaw)\n\n const producerKey = String(blockProducerAddress)\n const existingProducer: AnalyzedProducer | undefined = this.producers[producerKey]\n if (isDefined(existingProducer)) {\n existingProducer.rewardsEarned = (existingProducer.rewardsEarned ?? 0n) + 0n\n existingProducer.blocksProduced++\n } else {\n const newProducer: AnalyzedProducer = {\n address: blockProducerAddress, rewardsEarned: 0n, blocksProduced: 1,\n }\n this.producers[producerKey] = newProducer\n }\n\n return true\n }\n\n result(): ChainSummaryProducers {\n return {\n endingBlock: this.endingBlock,\n producers: this.producers,\n schema: ChainSummaryProducersSchema,\n startingBlock: this.startingBlock,\n }\n }\n\n shouldContinue(): boolean {\n return true\n }\n}\n", "import type { Address } from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\n\nexport const ChainSummaryProducersSchema = asSchema('network.xyo.chain.summary.producers', true)\nexport type ChainSummaryProducersSchema = typeof ChainSummaryProducersSchema\n\nexport interface AnalyzedProducer {\n address: Address\n blocksProduced: number\n rewardsEarned: bigint\n}\n\nexport interface ChainSummaryProducersFields {\n endingBlock: number\n producers: Record<string, AnalyzedProducer>\n startingBlock: number\n}\n\nexport type ChainSummaryProducers = Payload<ChainSummaryProducersFields, ChainSummaryProducersSchema>\nexport const isChainSummaryProducers = isPayloadOfSchemaType<ChainSummaryProducers>(ChainSummaryProducersSchema)\n", "import type { Promisable } from '@ariestools/sdk'\nimport { assertEx } from '@ariestools/sdk'\nimport {\n type ChainAnalyzer, type ChainStakeIntent, type HydratedBlock,\n type Intent,\n isChainStakeIntentWithStorageMeta,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ChainSummaryStakeIntent } from './ChainSummaryStakeIntent.ts'\nimport { ChainSummaryStakeIntentSchema } from './ChainSummaryStakeIntent.ts'\n\nexport class ChainStakeIntentAnalyzer implements ChainAnalyzer<ChainSummaryStakeIntent> {\n private _endingBlock: number | undefined = undefined\n private _intent: Intent\n private _intentPayloads: ChainStakeIntent[] = []\n private _startingBlock: number | undefined = undefined\n\n constructor(intent: Intent) {\n this._intent = intent\n }\n\n onBlock([block, validatedPayloads]: HydratedBlock): Promisable<boolean> {\n this._startingBlock ??= block.block\n\n // Update the ending block\n this._endingBlock = block.block\n const intents = validatedPayloads.filter(isChainStakeIntentWithStorageMeta)\n const desiredIntents = intents.filter(intent => intent.intent === this._intent)\n this._intentPayloads.push(...desiredIntents)\n return true\n }\n\n result(): ChainSummaryStakeIntent {\n assertEx(this._startingBlock !== undefined, () => 'ChainStakeIntentAnalyzer: Invalid startingBlock')\n assertEx(this._endingBlock !== undefined, () => 'ChainStakeIntentAnalyzer: Invalid endingBlock')\n return {\n endingBlock: this._endingBlock!,\n intents: this._intentPayloads,\n schema: ChainSummaryStakeIntentSchema,\n startingBlock: this._startingBlock!,\n }\n }\n\n shouldContinue(): boolean {\n return true\n }\n}\n", "import type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type { ChainStakeIntent } from '@xyo-network/xl1-sdk'\n\nexport const ChainSummaryStakeIntentSchema = asSchema('network.xyo.chain.summary.staked.intent', true)\nexport type ChainSummaryStakeIntentSchema = typeof ChainSummaryStakeIntentSchema\n\ninterface ChainSummaryStakeIntentFields {\n endingBlock: number\n intents: ChainStakeIntent[]\n startingBlock: number\n}\n\nexport type ChainSummaryStakeIntent = Payload<ChainSummaryStakeIntentFields, ChainSummaryStakeIntentSchema>\nexport const isChainSummaryStakeIntent = isPayloadOfSchemaType<ChainSummaryStakeIntent>(ChainSummaryStakeIntentSchema)\n", "import {\n type Address, type Hash, type Hex,\n} from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/sdk'\nimport type { SignedBigInt } from '@xyo-network/xl1-sdk'\n\nexport const ChainSummaryTransfersSchema = asSchema('network.xyo.chain.summary.transfers', true)\nexport type ChainSummaryTransfersSchema = typeof ChainSummaryTransfersSchema\n\nexport interface ChainSummaryTransfersFields {\n firstBlock: Hash | null\n hasMinTransfer?: Record<Address, Hex>\n lastBlock: Hash | null\n transfers: Record<Address, Record<Address, SignedBigInt>>\n}\n\nexport type ChainSummaryTransfers = Payload<ChainSummaryTransfersFields, ChainSummaryTransfersSchema>\nexport const isChainSummaryTransfers = isPayloadOfSchemaType<ChainSummaryTransfers>(ChainSummaryTransfersSchema)\n", "import type { Address, Hash } from '@ariestools/sdk'\nimport { isDefined, toAddress } from '@ariestools/sdk'\nimport { trace, type Tracer } from '@opentelemetry/api'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport type {\n ChainAnalyzer,\n HydratedBlockWithHashMeta, SignedBigInt,\n} from '@xyo-network/xl1-sdk'\nimport {\n netTransfersForPayloads,\n parseSignedBigInt, toSignedBigInt,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ChainSummaryTransfers } from './ChainSummaryTransfers.ts'\nimport { ChainSummaryTransfersSchema } from './ChainSummaryTransfers.ts'\n\nconst bigintTransfers = (transfers: Record<Address, Record<Address, SignedBigInt>>) => {\n const result: Record<string, Record<string, bigint>> = {}\n for (const [from, toMap] of Object.entries(transfers)) {\n const fromKey = String(toAddress(from))\n for (const [to, balance] of Object.entries(toMap)) {\n const toKey = String(toAddress(to))\n if (isDefined(balance)) {\n const fromTransfers = result[fromKey] ?? {}\n result[fromKey] = fromTransfers\n fromTransfers[toKey] = parseSignedBigInt(balance)\n }\n }\n }\n return result\n}\n\nexport class TransferAnalyzer implements ChainAnalyzer {\n protected _tracer: Tracer | undefined\n private _firstBlock?: Hash\n private _lastBlock?: Hash\n private _transfers: Record<string, Record<string, bigint>> = {}\n\n constructor(startingTransfers?: ChainSummaryTransfers) {\n this._transfers = startingTransfers ? bigintTransfers(startingTransfers.transfers) : {}\n }\n\n protected get tracer() {\n if (this._tracer) return this._tracer\n this._tracer = trace.getTracer('TransferAnalyzer')\n return this._tracer\n }\n\n onBlock([block, payloads]: HydratedBlockWithHashMeta): boolean {\n this._firstBlock = this._firstBlock ?? block._hash\n this._lastBlock = block._hash\n const netTransfers = netTransfersForPayloads({ singletons: {} }, payloads)\n for (const [from, toMap] of Object.entries(netTransfers)) {\n const fromKey = String(toAddress(from))\n const fromTransfers = this._transfers[fromKey] ?? {}\n this._transfers[fromKey] = fromTransfers\n for (const [to, balance] of Object.entries(toMap)) {\n const toKey = String(toAddress(to))\n fromTransfers[toKey] = (fromTransfers[toKey] ?? 0n) + balance\n }\n }\n return this.shouldContinue()\n }\n\n result() {\n const transfers: Record<string, Record<string, SignedBigInt>> = {}\n for (const [from, toMap] of Object.entries(this._transfers)) {\n const fromKey = String(toAddress(from))\n const positiveTransfers = Object.entries(toMap).filter(([, balance]) => balance > 0n)\n for (const [to, balance] of positiveTransfers) {\n const fromTransfers = transfers[fromKey] ?? {}\n transfers[fromKey] = fromTransfers\n const toKey = String(toAddress(to))\n fromTransfers[toKey] = toSignedBigInt(balance)\n }\n }\n const builder = new PayloadBuilder<ChainSummaryTransfers>({ schema: ChainSummaryTransfersSchema })\n return builder.fields({\n firstBlock: this._firstBlock ?? null,\n lastBlock: this._lastBlock ?? null,\n transfers,\n }).build()\n }\n\n shouldContinue() {\n return true\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["isDefined", "spanRootAsync", "toAddress", "spanRootAsync", "isDefined", "toAddress", "isDefined", "toAddress", "asSchema", "isPayloadOfSchemaType", "toAddress", "isDefined", "assertEx", "asSchema", "isPayloadOfSchemaType", "assertEx", "asSchema", "isPayloadOfSchemaType", "isDefined", "toAddress", "trace", "PayloadBuilder", "parseSignedBigInt", "toSignedBigInt", "toAddress", "isDefined", "parseSignedBigInt", "trace", "toSignedBigInt", "PayloadBuilder"]
|
|
7
7
|
}
|
package/dist/neutral/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export * from './modules/ethereum/index.js';
|
|
|
3
3
|
export * from './modules/modules/index.js';
|
|
4
4
|
export * from './modules/protocol/index.js';
|
|
5
5
|
export * from './modules/services/index.js';
|
|
6
|
+
export * from './modules/slashing/index.js';
|
|
6
7
|
export * from './modules/telemetry/index.js';
|
|
7
8
|
export * from './modules/utils/index.js';
|
|
8
9
|
export * from './modules/validation/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,QAAQ,CAAA;AACtB,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,QAAQ,CAAA;AACtB,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA"}
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["// Generated by xy monolith layout sync (package-sync-layout) \u2014 do not edit by hand.\n/* eslint-disable @typescript-eslint/ban-ts-comment -- conditional package imports */\n// @ts-nocheck\nexport * from '#analyze'\nexport * from '#ethereum'\nexport * from '#modules'\nexport * from '#protocol'\nexport * from '#services'\nexport * from '#telemetry'\nexport * from '#utils'\nexport * from '#validation'\nexport * from '#wrappers'\n"],
|
|
5
|
-
"mappings": ";AAGA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
4
|
+
"sourcesContent": ["// Generated by xy monolith layout sync (package-sync-layout) \u2014 do not edit by hand.\n/* eslint-disable @typescript-eslint/ban-ts-comment -- conditional package imports */\n// @ts-nocheck\nexport * from '#analyze'\nexport * from '#ethereum'\nexport * from '#modules'\nexport * from '#protocol'\nexport * from '#services'\nexport * from '#slashing'\nexport * from '#telemetry'\nexport * from '#utils'\nexport * from '#validation'\nexport * from '#wrappers'\n"],
|
|
5
|
+
"mappings": ";AAGA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import type { Address } from '@ariestools/sdk';
|
|
2
2
|
import type { BaseContext, MempoolViewer, SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-sdk';
|
|
3
|
+
import type { AdmissionAssessment, AdmissionMode, AdmissionShadowReport, ProducerEligibilityEvaluator } from './admission.js';
|
|
3
4
|
import type { ChainFinalizerParams } from './ChainFinalizer.js';
|
|
4
5
|
import { ChainFinalizer } from './ChainFinalizer.js';
|
|
5
6
|
export interface ChainHeadSelectorParams extends ChainFinalizerParams {
|
|
7
|
+
/**
|
|
8
|
+
* How candidates are admitted. Defaults to `allowlist`, which is how the chain runs today.
|
|
9
|
+
*/
|
|
10
|
+
admission?: AdmissionMode;
|
|
6
11
|
/**
|
|
7
12
|
* List of allowed producer addresses, if undefined anyone can participate
|
|
8
13
|
*/
|
|
@@ -14,14 +19,22 @@ export interface ChainHeadSelectorParams extends ChainFinalizerParams {
|
|
|
14
19
|
*/
|
|
15
20
|
backoffMs?: number;
|
|
16
21
|
context: BaseContext;
|
|
22
|
+
/**
|
|
23
|
+
* Computes whether a candidate's producer had standing. Absent means the question is never
|
|
24
|
+
* asked, which is what keeps a node with no stake readers running exactly as it does today.
|
|
25
|
+
*/
|
|
26
|
+
eligibility?: ProducerEligibilityEvaluator;
|
|
17
27
|
mempoolViewer: MempoolViewer;
|
|
18
28
|
/**
|
|
19
29
|
* Minimum number of uncle candidates required before accepting one.
|
|
20
30
|
* When undefined, findBestUncle applies DEFAULT_MIN_CANDIDATES from the protocol SDK.
|
|
21
31
|
*/
|
|
22
32
|
minCandidates?: number;
|
|
33
|
+
/** Where to publish what the two gates concluded, in shadow posture. */
|
|
34
|
+
publishAdmissionShadow?: (report: AdmissionShadowReport) => Promise<void>;
|
|
23
35
|
}
|
|
24
36
|
export declare class ChainHeadSelector extends ChainFinalizer<ChainHeadSelectorParams> {
|
|
37
|
+
protected admission: AdmissionMode;
|
|
25
38
|
protected allowedProducers?: Address[];
|
|
26
39
|
protected backoffMs?: number;
|
|
27
40
|
protected minCandidates?: number;
|
|
@@ -37,5 +50,32 @@ export declare class ChainHeadSelector extends ChainFinalizer<ChainHeadSelectorP
|
|
|
37
50
|
};
|
|
38
51
|
protected get mempoolViewer(): MempoolViewer;
|
|
39
52
|
findBestHead(): Promise<SignedHydratedBlockWithHashMeta[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Applies the configured admission posture.
|
|
55
|
+
*
|
|
56
|
+
* In `shadow` the allow-list still decides — participation is computed and published beside it,
|
|
57
|
+
* and changes nothing. That is the entire value of the posture: the network keeps behaving
|
|
58
|
+
* exactly as it did while everyone gets to see what the new rule would have done.
|
|
59
|
+
*
|
|
60
|
+
* In `enforce` participation gates, but only when it reached a conclusion. A candidate whose
|
|
61
|
+
* standing cannot be established is admitted, not rejected — otherwise a finalizer that lost
|
|
62
|
+
* its stake reader would quietly stop accepting anyone's blocks and stall the chain.
|
|
63
|
+
*
|
|
64
|
+
* Assessments publish in both postures. The audit trail must not disappear at the moment
|
|
65
|
+
* admission starts gating — enforce is when it matters most.
|
|
66
|
+
*/
|
|
67
|
+
protected admit(all: SignedHydratedBlockWithHashMeta[], allowed: SignedHydratedBlockWithHashMeta[]): Promise<SignedHydratedBlockWithHashMeta[]>;
|
|
68
|
+
/**
|
|
69
|
+
* Runs both gates over every candidate.
|
|
70
|
+
*
|
|
71
|
+
* An evaluator that throws yields an unresolvable assessment rather than an exception: this
|
|
72
|
+
* sits on the head-selection path, and a flaky stake reader must never be able to stop the
|
|
73
|
+
* chain from finalizing.
|
|
74
|
+
*/
|
|
75
|
+
protected assess(all: SignedHydratedBlockWithHashMeta[]): Promise<AdmissionAssessment[]>;
|
|
76
|
+
/** Whether the configured allow-list admits a candidate. An empty list admits everyone. */
|
|
77
|
+
protected isAllowed(candidate: SignedHydratedBlockWithHashMeta): boolean;
|
|
78
|
+
/** Publishes what the two gates concluded, swallowing failures. */
|
|
79
|
+
protected publishShadow(assessments: AdmissionAssessment[]): Promise<void>;
|
|
40
80
|
}
|
|
41
81
|
//# sourceMappingURL=ChainHeadSelector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChainHeadSelector.d.ts","sourceRoot":"","sources":["../../../../src/modules/analyze/ChainHeadSelector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAI9C,OAAO,KAAK,EACV,WAAW,EAAE,aAAa,EAAE,+BAA+B,EAC5D,MAAM,sBAAsB,CAAA;AAK7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACnE;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,WAAW,CAAA;IACpB,aAAa,EAAE,aAAa,CAAA;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"ChainHeadSelector.d.ts","sourceRoot":"","sources":["../../../../src/modules/analyze/ChainHeadSelector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAI9C,OAAO,KAAK,EACV,WAAW,EAAE,aAAa,EAAE,+BAA+B,EAC5D,MAAM,sBAAsB,CAAA;AAK7B,OAAO,KAAK,EACV,mBAAmB,EAAE,aAAa,EAAE,qBAAqB,EAAE,4BAA4B,EACxF,MAAM,gBAAgB,CAAA;AAEvB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACnE;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,WAAW,CAAA;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,4BAA4B,CAAA;IAC1C,aAAa,EAAE,aAAa,CAAA;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,wEAAwE;IACxE,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1E;AAED,qBAAa,iBAAkB,SAAQ,cAAc,CAAC,uBAAuB,CAAC;IAC5E,SAAS,CAAC,SAAS,EAAE,aAAa,CAAA;IAClC,SAAS,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IACtC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC5B,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAChC,OAAO,CAAC,mBAAmB,CAAa;gBAE5B,MAAM,EAAE,uBAAuB;IAQ3C,SAAS,KAAK,OAAO;;;;;;;MAEpB;IAED,SAAS,KAAK,aAAa,kBAE1B;IAEK,YAAY,IAAI,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAahE;;;;;;;;;;;;;OAaG;cACa,KAAK,CACnB,GAAG,EAAE,+BAA+B,EAAE,EACtC,OAAO,EAAE,+BAA+B,EAAE,GACzC,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAW7C;;;;;;OAMG;cACa,MAAM,CAAC,GAAG,EAAE,+BAA+B,EAAE,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAmB9F,2FAA2F;IAC3F,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,+BAA+B,GAAG,OAAO;IAOxE,mEAAmE;cACnD,aAAa,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAcjF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Promisable } from '@ariestools/sdk';
|
|
2
|
+
import type { XyoAddress } from '@xyo-network/sdk';
|
|
3
|
+
import type { SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-sdk';
|
|
4
|
+
import type { EligibilityEvaluation } from '../slashing/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* How a finalizer decides which candidates it will consider.
|
|
7
|
+
*
|
|
8
|
+
* Three postures, and moving between them is a configuration change rather than a different
|
|
9
|
+
* build. That constraint is deliberate: a network that had to be redeployed to step back from
|
|
10
|
+
* enforcement would, in the moment it most needed to step back, be unable to.
|
|
11
|
+
*
|
|
12
|
+
* - `allowlist` — only the named producers, which is how the chain runs today
|
|
13
|
+
* - `shadow` — the same gate, plus participation computed and published for every candidate
|
|
14
|
+
* - `enforce` — participation itself gates
|
|
15
|
+
*/
|
|
16
|
+
export declare const AdmissionModes: readonly ["allowlist", "shadow", "enforce"];
|
|
17
|
+
/** How a finalizer decides which candidates it will consider. */
|
|
18
|
+
export type AdmissionMode = typeof AdmissionModes[number];
|
|
19
|
+
/** Evaluates whether a candidate's producer had standing to produce it. */
|
|
20
|
+
export type ProducerEligibilityEvaluator = (candidate: SignedHydratedBlockWithHashMeta) => Promisable<EligibilityEvaluation>;
|
|
21
|
+
/** What both gates concluded about one candidate. */
|
|
22
|
+
export interface AdmissionAssessment {
|
|
23
|
+
/** Whether the allow-list admits it. */
|
|
24
|
+
admittedByAllowList: boolean;
|
|
25
|
+
/** The candidate's height. */
|
|
26
|
+
block: number;
|
|
27
|
+
/** The candidate's signed identity. */
|
|
28
|
+
dataHash: string;
|
|
29
|
+
/** What the participation predicate concluded. */
|
|
30
|
+
eligibility: EligibilityEvaluation;
|
|
31
|
+
/** The producer. */
|
|
32
|
+
producer: XyoAddress;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* What the two gates said about a round of candidates, and where they disagreed.
|
|
36
|
+
*
|
|
37
|
+
* Published rather than logged, because the whole purpose of the shadow posture is that anyone —
|
|
38
|
+
* not just the operator holding the terminal — can see what enforcement would have done before it
|
|
39
|
+
* does it. An operator convinced by their own logs has convinced nobody.
|
|
40
|
+
*/
|
|
41
|
+
export interface AdmissionShadowReport {
|
|
42
|
+
/** Every candidate considered this round. */
|
|
43
|
+
assessments: AdmissionAssessment[];
|
|
44
|
+
/** Only those where the two gates disagreed. */
|
|
45
|
+
divergent: AdmissionAssessment[];
|
|
46
|
+
/** The finalized height this round was selected against. */
|
|
47
|
+
head: number;
|
|
48
|
+
}
|
|
49
|
+
/** Moniker the admission shadow publisher resolves under. */
|
|
50
|
+
export declare const AdmissionShadowPublishRunnerMoniker = "AdmissionShadowPublishRunner";
|
|
51
|
+
/**
|
|
52
|
+
* Publishes what both admission gates concluded.
|
|
53
|
+
*
|
|
54
|
+
* An interface rather than a class here because the finalizer must not depend on the launcher
|
|
55
|
+
* that supplies the implementation — the actor states what it needs, and orchestration decides
|
|
56
|
+
* what satisfies it.
|
|
57
|
+
*/
|
|
58
|
+
export interface AdmissionShadowPublishRunner {
|
|
59
|
+
publish(report: AdmissionShadowReport): Promisable<void>;
|
|
60
|
+
}
|
|
61
|
+
/** Whether a resolved provider can actually publish shadow reports. */
|
|
62
|
+
export declare function isAdmissionShadowPublishRunner(value: unknown): value is AdmissionShadowPublishRunner;
|
|
63
|
+
/** Whether the two gates reached different conclusions about a candidate. */
|
|
64
|
+
export declare function isDivergent(assessment: AdmissionAssessment): boolean;
|
|
65
|
+
//# sourceMappingURL=admission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admission.d.ts","sourceRoot":"","sources":["../../../../src/modules/analyze/admission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAA;AAE3E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAEtD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc,6CAA8C,CAAA;AAEzE,iEAAiE;AACjE,MAAM,MAAM,aAAa,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAA;AAEzD,2EAA2E;AAC3E,MAAM,MAAM,4BAA4B,GACpC,CAAC,SAAS,EAAE,+BAA+B,KAAK,UAAU,CAAC,qBAAqB,CAAC,CAAA;AAErF,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,wCAAwC;IACxC,mBAAmB,EAAE,OAAO,CAAA;IAC5B,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAA;IAChB,kDAAkD;IAClD,WAAW,EAAE,qBAAqB,CAAA;IAClC,oBAAoB;IACpB,QAAQ,EAAE,UAAU,CAAA;CACrB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,6CAA6C;IAC7C,WAAW,EAAE,mBAAmB,EAAE,CAAA;IAClC,gDAAgD;IAChD,SAAS,EAAE,mBAAmB,EAAE,CAAA;IAChC,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAA;CACb;AAED,6DAA6D;AAC7D,eAAO,MAAM,mCAAmC,iCAAiC,CAAA;AAEjF;;;;;;GAMG;AACH,MAAM,WAAW,4BAA4B;IAC3C,OAAO,CAAC,MAAM,EAAE,qBAAqB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;CACzD;AAED,uEAAuE;AACvE,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,4BAA4B,CAEpG;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAIpE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/analyze/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,qBAAqB,CAAA;AACnC,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,6BAA6B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/analyze/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,qBAAqB,CAAA;AACnC,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,6BAA6B,CAAA"}
|
|
@@ -20,6 +20,14 @@ export interface BuildNextBlockOptions extends BaseBuildBlockOptions {
|
|
|
20
20
|
previousBlockNumber: XL1BlockNumber;
|
|
21
21
|
previousStepHashes: Hash[];
|
|
22
22
|
stepRewardPoolBalance: AttoXL1;
|
|
23
|
+
/**
|
|
24
|
+
* Hash of this producer's own earlier candidate at the same height and parent, when re-proposing.
|
|
25
|
+
*
|
|
26
|
+
* Signed, so it cannot be added or dropped after the fact. Its whole job is to make honest
|
|
27
|
+
* re-proposal distinguishable from equivocation: two differing candidates at one height are
|
|
28
|
+
* indistinguishable from outside unless the later one says which one it replaces.
|
|
29
|
+
*/
|
|
30
|
+
supersedes?: Hash;
|
|
23
31
|
}
|
|
24
32
|
export declare const isBuildNextBlockOptions: (value: unknown) => value is BuildNextBlockOptions;
|
|
25
33
|
export type BuildBlockOptions = BuildGenesisBlockOptions | BuildNextBlockOptions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuildBlockOptions.d.ts","sourceRoot":"","sources":["../../../../../src/modules/protocol/block/BuildBlockOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAKpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EACV,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAChE,cAAc,EACf,MAAM,sBAAsB,CAAA;AAE7B,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,mBAAmB,EAAE,CAAA;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,mBAAmB,CAAC,EAAE,cAAc,CAAA;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B,GAAG,EAAE,yBAAyB,EAAE,CAAA;CACjC;AAED,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,qBASjE,CAAA;AAED,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,iBAAiB,EAAE,IAAI,CAAA;CACxB;AAED,eAAO,MAAM,0BAA0B,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,wBAYpE,CAAA;AAED,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE,iBAAiB,EAAE,IAAI,CAAA;IACvB,mBAAmB,EAAE,cAAc,CAAA;IACnC,kBAAkB,EAAE,IAAI,EAAE,CAAA;IAC1B,qBAAqB,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"BuildBlockOptions.d.ts","sourceRoot":"","sources":["../../../../../src/modules/protocol/block/BuildBlockOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAKpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EACV,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAChE,cAAc,EACf,MAAM,sBAAsB,CAAA;AAE7B,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,mBAAmB,EAAE,CAAA;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,mBAAmB,CAAC,EAAE,cAAc,CAAA;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B,GAAG,EAAE,yBAAyB,EAAE,CAAA;CACjC;AAED,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,qBASjE,CAAA;AAED,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,iBAAiB,EAAE,IAAI,CAAA;CACxB;AAED,eAAO,MAAM,0BAA0B,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,wBAYpE,CAAA;AAED,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE,iBAAiB,EAAE,IAAI,CAAA;IACvB,mBAAmB,EAAE,cAAc,CAAA;IACnC,kBAAkB,EAAE,IAAI,EAAE,CAAA;IAC1B,qBAAqB,EAAE,OAAO,CAAA;IAC9B;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,IAAI,CAAA;CAClB;AAED,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,qBAejE,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,wBAAwB,GAAG,qBAAqB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildBlock.d.ts","sourceRoot":"","sources":["../../../../../src/modules/protocol/block/buildBlock.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACS,+BAA+B,EACnD,MAAM,sBAAsB,CAAA;AAY7B,OAAO,EACL,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"buildBlock.d.ts","sourceRoot":"","sources":["../../../../../src/modules/protocol/block/buildBlock.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACS,+BAA+B,EACnD,MAAM,sBAAsB,CAAA;AAY7B,OAAO,EACL,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAA;AA6B/B,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAsErG"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Hash } from '@ariestools/sdk';
|
|
1
2
|
import type { AccountInstance, WithHashMeta } from '@xyo-network/sdk';
|
|
2
3
|
import type { AllowedBlockPayload, BlockBoundWitness, ChainId, SignedHydratedBlockWithHashMeta, SignedHydratedTransaction } from '@xyo-network/xl1-sdk';
|
|
3
4
|
import { AttoXL1 } from '@xyo-network/xl1-sdk';
|
|
@@ -5,5 +6,5 @@ export declare function buildNextBlock(previousBlock: WithHashMeta<BlockBoundWit
|
|
|
5
6
|
readonly __hex: true;
|
|
6
7
|
} & {
|
|
7
8
|
readonly __address: true;
|
|
8
|
-
}, stepRewardPoolBalance?: AttoXL1, protocol?: number, chainId?: ChainId): Promise<SignedHydratedBlockWithHashMeta>;
|
|
9
|
+
}, stepRewardPoolBalance?: AttoXL1, protocol?: number, chainId?: ChainId, supersedes?: Hash): Promise<SignedHydratedBlockWithHashMeta>;
|
|
9
10
|
//# sourceMappingURL=buildNextBlock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildNextBlock.d.ts","sourceRoot":"","sources":["../../../../../src/modules/protocol/block/buildNextBlock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,KAAK,EACV,mBAAmB,EAAE,iBAAiB,EACtC,OAAO,EACP,+BAA+B,EAC/B,yBAAyB,EAC1B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,OAAO,EAER,MAAM,sBAAsB,CAAA;AAI7B,wBAAsB,cAAc,CAClC,aAAa,EAAE,YAAY,CAAC,iBAAiB,CAAC,EAC9C,GAAG,EAAE,yBAAyB,EAAE,EAChC,aAAa,EAAE,mBAAmB,EAAE,EACpC,OAAO,EAAE,eAAe,EAAE,EAC1B,sBAAsB;;;;CAA0B,EAChD,qBAAqB,GAAE,OAAqB,EAC5C,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,+BAA+B,CAAC,
|
|
1
|
+
{"version":3,"file":"buildNextBlock.d.ts","sourceRoot":"","sources":["../../../../../src/modules/protocol/block/buildNextBlock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,KAAK,EACV,mBAAmB,EAAE,iBAAiB,EACtC,OAAO,EACP,+BAA+B,EAC/B,yBAAyB,EAC1B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,OAAO,EAER,MAAM,sBAAsB,CAAA;AAI7B,wBAAsB,cAAc,CAClC,aAAa,EAAE,YAAY,CAAC,iBAAiB,CAAC,EAC9C,GAAG,EAAE,yBAAyB,EAAE,EAChC,aAAa,EAAE,mBAAmB,EAAE,EACpC,OAAO,EAAE,eAAe,EAAE,EAC1B,sBAAsB;;;;CAA0B,EAChD,qBAAqB,GAAE,OAAqB,EAC5C,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,EACjB,UAAU,CAAC,EAAE,IAAI,GAChB,OAAO,CAAC,+BAA+B,CAAC,CAc1C"}
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import type { Address, Logger } from '@ariestools/sdk';
|
|
2
2
|
import type { AccountInstance } from '@xyo-network/sdk';
|
|
3
3
|
import type { BaseContext, BlockValidationViewer, BlockViewer, DeadLetterQueueRunner, FinalizationRunner, MempoolViewer } from '@xyo-network/xl1-sdk';
|
|
4
|
+
import type { AdmissionMode, AdmissionShadowReport, ProducerEligibilityEvaluator } from '../../analyze/index.js';
|
|
4
5
|
interface ProcessPendingBlocksParams {
|
|
6
|
+
/** How candidates are admitted; defaults to the allow-list the chain runs on today. */
|
|
7
|
+
admission?: AdmissionMode;
|
|
5
8
|
allowedProducers?: Address[];
|
|
6
9
|
backoffMs?: number;
|
|
7
10
|
blockValidationViewer: BlockValidationViewer;
|
|
8
11
|
blockViewer: BlockViewer;
|
|
9
12
|
context: BaseContext;
|
|
10
13
|
deadLetterQueueRunner?: DeadLetterQueueRunner;
|
|
14
|
+
/** Computes producer standing, for the shadow and enforce postures. */
|
|
15
|
+
eligibility?: ProducerEligibilityEvaluator;
|
|
11
16
|
finalizationRunner: FinalizationRunner;
|
|
12
17
|
logger?: Logger;
|
|
13
18
|
mempoolViewer: MempoolViewer;
|
|
@@ -17,8 +22,10 @@ interface ProcessPendingBlocksParams {
|
|
|
17
22
|
* carry its signature, which is what makes them attributable evidence rather than a local note.
|
|
18
23
|
*/
|
|
19
24
|
observer?: AccountInstance;
|
|
25
|
+
/** Where to publish what both admission gates concluded, in shadow posture. */
|
|
26
|
+
publishAdmissionShadow?: (report: AdmissionShadowReport) => Promise<void>;
|
|
20
27
|
}
|
|
21
|
-
export declare function processPendingBlocks({ blockValidationViewer, blockViewer, context, logger, mempoolViewer, finalizationRunner, allowedProducers, backoffMs, minCandidates, deadLetterQueueRunner, observer, }: ProcessPendingBlocksParams): Promise<[{
|
|
28
|
+
export declare function processPendingBlocks({ blockValidationViewer, blockViewer, context, logger, mempoolViewer, finalizationRunner, allowedProducers, backoffMs, minCandidates, deadLetterQueueRunner, observer, admission, eligibility, publishAdmissionShadow, }: ProcessPendingBlocksParams): Promise<[{
|
|
22
29
|
schema: "network.xyo.boundwitness" & {
|
|
23
30
|
readonly __schema: true;
|
|
24
31
|
};
|
|
@@ -45,6 +52,7 @@ export declare function processPendingBlocks({ blockValidationViewer, blockViewe
|
|
|
45
52
|
$sourceQuery?: import("@ariestools/sdk").BrandedHash | undefined;
|
|
46
53
|
protocol?: number | undefined;
|
|
47
54
|
step_hashes?: import("@ariestools/sdk").BrandedHash[] | undefined;
|
|
55
|
+
supersedes?: import("@ariestools/sdk").BrandedHash | undefined;
|
|
48
56
|
}, {
|
|
49
57
|
[x: string]: unknown;
|
|
50
58
|
schema: import("@xyo-network/sdk").BrandedSchema<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processPendingBlocks.d.ts","sourceRoot":"","sources":["../../../../../src/modules/services/implementation/processPendingBlocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EACV,WAAW,EAAE,qBAAqB,EAAE,WAAW,EAAE,qBAAqB,EAAE,kBAAkB,EAA6B,aAAa,EACrI,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"processPendingBlocks.d.ts","sourceRoot":"","sources":["../../../../../src/modules/services/implementation/processPendingBlocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EACV,WAAW,EAAE,qBAAqB,EAAE,WAAW,EAAE,qBAAqB,EAAE,kBAAkB,EAA6B,aAAa,EACrI,MAAM,sBAAsB,CAAA;AAK7B,OAAO,KAAK,EACV,aAAa,EAAE,qBAAqB,EAAE,4BAA4B,EACnE,MAAM,UAAU,CAAA;AAKjB,UAAU,0BAA0B;IAClC,uFAAuF;IACvF,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qBAAqB,EAAE,qBAAqB,CAAA;IAC5C,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,WAAW,CAAA;IACpB,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;IAC7C,uEAAuE;IACvE,WAAW,CAAC,EAAE,4BAA4B,CAAA;IAC1C,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,+EAA+E;IAC/E,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1E;AAgCD,wBAAsB,oBAAoB,CAAC,EACzC,qBAAqB,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,QAAQ,EACnK,SAAS,EAAE,WAAW,EAAE,sBAAsB,GAC/C,EAAE,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBA2E5B"}
|
|
@@ -37,7 +37,7 @@ export interface SimpleBlockRunnerParams extends CreatableProviderParams {
|
|
|
37
37
|
export declare class SimpleBlockRunner extends AbstractCreatableProvider<SimpleBlockRunnerParams> implements BlockRunner {
|
|
38
38
|
static readonly connectionTypes: readonly ["lmdb", "mongo", "memory"];
|
|
39
39
|
static readonly defaultMoniker: "BlockRunner";
|
|
40
|
-
static readonly dependencies: ("
|
|
40
|
+
static readonly dependencies: ("AccountBalanceViewer" | "MempoolViewer" | "BlockRewardViewer" | "BlockValidationViewer" | "FinalizationViewer" | "TimeSyncViewer")[];
|
|
41
41
|
static readonly monikers: "BlockRunner"[];
|
|
42
42
|
static readonly surface: "node";
|
|
43
43
|
moniker: "BlockRunner";
|
|
@@ -51,7 +51,10 @@ export declare class SimpleBlockRunner extends AbstractCreatableProvider<SimpleB
|
|
|
51
51
|
private _address?;
|
|
52
52
|
private _blockRewardViewer?;
|
|
53
53
|
private _blockValidationViewer?;
|
|
54
|
+
private _chainParamsViewer?;
|
|
54
55
|
private _finalizationViewer?;
|
|
56
|
+
/** Cache of the last candidate this runner signed; the mempool is the source of truth. */
|
|
57
|
+
private _lastSignedCandidate?;
|
|
55
58
|
private _mempoolViewer?;
|
|
56
59
|
private _rewardAddress?;
|
|
57
60
|
private _timeSyncViewer?;
|
|
@@ -127,6 +130,7 @@ export declare class SimpleBlockRunner extends AbstractCreatableProvider<SimpleB
|
|
|
127
130
|
$sourceQuery?: import("@ariestools/sdk").BrandedHash | undefined;
|
|
128
131
|
protocol?: number | undefined;
|
|
129
132
|
step_hashes?: import("@ariestools/sdk").BrandedHash[] | undefined;
|
|
133
|
+
supersedes?: import("@ariestools/sdk").BrandedHash | undefined;
|
|
130
134
|
}, {
|
|
131
135
|
[x: string]: unknown;
|
|
132
136
|
schema: import("@xyo-network/sdk").BrandedSchema<string>;
|
|
@@ -152,8 +156,37 @@ export declare class SimpleBlockRunner extends AbstractCreatableProvider<SimpleB
|
|
|
152
156
|
* @returns True if a heartbeat is required, false otherwise
|
|
153
157
|
*/
|
|
154
158
|
private heartbeatRequired;
|
|
159
|
+
/**
|
|
160
|
+
* The hash of this producer's own earlier candidate at the same height and parent, if any.
|
|
161
|
+
*
|
|
162
|
+
* The parent is part of the match on purpose. Two candidates at one height built on different
|
|
163
|
+
* parents are not a re-proposal, they are different branches, and linking across them would
|
|
164
|
+
* assert a supersession that never happened.
|
|
165
|
+
*
|
|
166
|
+
* Memory is only a cache. A restart wipes it while the pool still holds the prior candidate, so
|
|
167
|
+
* the pool is consulted whenever memory misses. Following the chain to its tip keeps a third
|
|
168
|
+
* proposal pointing at the second rather than back at the first.
|
|
169
|
+
* @param block The height being proposed
|
|
170
|
+
* @param previous The parent this proposal builds on
|
|
171
|
+
* @returns The prior candidate's signed data hash, or undefined when there is none
|
|
172
|
+
*/
|
|
173
|
+
private previousOwnCandidateHash;
|
|
155
174
|
private rejectExhaustedBlock;
|
|
156
175
|
private rejectWrongChainTransactions;
|
|
176
|
+
/**
|
|
177
|
+
* The candidate this proposal supersedes, or undefined when nothing should be stamped.
|
|
178
|
+
*
|
|
179
|
+
* Identity is the signed data hash rather than the storage hash, because that is what an
|
|
180
|
+
* observer recomputes when deciding whether two candidates are the same block — client meta
|
|
181
|
+
* such as `$epoch` must not be able to make one candidate look like two.
|
|
182
|
+
*
|
|
183
|
+
* With no register wired, or with the field unactivated, this never stamps. That is what keeps
|
|
184
|
+
* a producer running this build emission-identical to one running the release before it, which
|
|
185
|
+
* the rollout depends on: stamping before the fleet has upgraded would partition validation.
|
|
186
|
+
* @param head The block being built on
|
|
187
|
+
* @returns The superseded candidate's hash, or undefined
|
|
188
|
+
*/
|
|
189
|
+
private resolveSupersedes;
|
|
157
190
|
private runBuildValidateRetryLoop;
|
|
158
191
|
}
|
|
159
192
|
//# sourceMappingURL=SimpleBlockRunner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SimpleBlockRunner.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/services/simple/block/runner/SimpleBlockRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAAQ,UAAU,EAC1B,MAAM,iBAAiB,CAAA;AAKxB,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EAAE,YAAY,EAChC,MAAM,kBAAkB,CAAA;AAKzB,OAAO,KAAK,EACV,oBAAoB,EAAuB,iBAAiB,EACxC,iBAAiB,EAAE,WAAW,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"SimpleBlockRunner.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/services/simple/block/runner/SimpleBlockRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/services/simple/block/runner/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/services/simple/block/runner/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Hash } from '@ariestools/sdk';
|
|
2
|
+
import type { WithHashMeta, XyoAddress } from '@xyo-network/sdk';
|
|
3
|
+
import type { BlockBoundWitness } from '@xyo-network/xl1-sdk';
|
|
4
|
+
/**
|
|
5
|
+
* Which of a producer's own pending candidates a new proposal at this height supersedes.
|
|
6
|
+
*
|
|
7
|
+
* Matching on the parent as well as the height is the guard that matters. Two candidates at one
|
|
8
|
+
* height built on different parents are not a re-proposal, they are competing branches, and
|
|
9
|
+
* stamping a link across them would assert a supersession that never happened — turning an
|
|
10
|
+
* honest producer's block into evidence against it.
|
|
11
|
+
*
|
|
12
|
+
* When several of its own candidates are already in the pool, the tip of the supersedes chain is
|
|
13
|
+
* the one to point at: the tip is the candidate nothing else has replaced, so a third proposal
|
|
14
|
+
* links to the second rather than reaching back past it and leaving the second orphaned.
|
|
15
|
+
* @param candidates Pending candidates visible to this producer
|
|
16
|
+
* @param address The producer's own signing address
|
|
17
|
+
* @param block The height being proposed
|
|
18
|
+
* @param previous The parent this proposal builds on
|
|
19
|
+
* @returns The signed data hash to supersede, or undefined when there is nothing to link
|
|
20
|
+
*/
|
|
21
|
+
export declare function selectSupersededCandidate(candidates: WithHashMeta<BlockBoundWitness>[], address: XyoAddress, block: number, previous: Hash): Hash | undefined;
|
|
22
|
+
//# sourceMappingURL=selectSupersededCandidate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectSupersededCandidate.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/services/simple/block/runner/selectSupersededCandidate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAE7D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,YAAY,CAAC,iBAAiB,CAAC,EAAE,EAC7C,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,IAAI,GACb,IAAI,GAAG,SAAS,CAOlB"}
|