@jinn-network/client 0.1.6 → 0.1.7-canary.d4e4e183
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/CHANGELOG.md +33 -0
- package/deployments/deployment-jinn-mvi-l1-sepolia-fast.json +23 -4
- package/deployments/deployment-jinn-mvi-l1-sepolia.json +23 -4
- package/deployments/deployment-jinn-mvi-l2-baseSepolia.json +5 -4
- package/dist/adapters/mech/adapter.d.ts +38 -1
- package/dist/adapters/mech/adapter.js +241 -54
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +17 -4
- package/dist/adapters/mech/contracts.js +8 -2
- package/dist/adapters/mech/contracts.js.map +1 -1
- package/dist/adapters/mech/safe-revert.d.ts +20 -0
- package/dist/adapters/mech/safe-revert.js +12 -4
- package/dist/adapters/mech/safe-revert.js.map +1 -1
- package/dist/adapters/mech/safe.d.ts +5 -1
- package/dist/adapters/mech/safe.js +27 -8
- package/dist/adapters/mech/safe.js.map +1 -1
- package/dist/adapters/mech/verdict-code.d.ts +1 -0
- package/dist/adapters/mech/verdict-code.js +18 -0
- package/dist/adapters/mech/verdict-code.js.map +1 -1
- package/dist/api/admin-endpoint.d.ts +15 -3
- package/dist/api/admin-endpoint.js +24 -2
- package/dist/api/admin-endpoint.js.map +1 -1
- package/dist/api/bootstrap-endpoint.js +49 -0
- package/dist/api/bootstrap-endpoint.js.map +1 -1
- package/dist/api/codex-doctor-endpoint.d.ts +73 -0
- package/dist/api/codex-doctor-endpoint.js +177 -0
- package/dist/api/codex-doctor-endpoint.js.map +1 -0
- package/dist/api/discovery-endpoint.d.ts +1 -0
- package/dist/api/discovery-endpoint.js +26 -0
- package/dist/api/discovery-endpoint.js.map +1 -1
- package/dist/api/fleet-build.d.ts +1 -0
- package/dist/api/fleet-build.js +2 -1
- package/dist/api/fleet-build.js.map +1 -1
- package/dist/api/gather-status.d.ts +11 -0
- package/dist/api/gather-status.js +400 -4
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/hermes-doctor-endpoint.d.ts +117 -0
- package/dist/api/hermes-doctor-endpoint.js +229 -23
- package/dist/api/hermes-doctor-endpoint.js.map +1 -1
- package/dist/api/launcher-status.d.ts +21 -16
- package/dist/api/launcher-status.js +2 -1
- package/dist/api/launcher-status.js.map +1 -1
- package/dist/api/portfolio-v0-build.d.ts +10 -0
- package/dist/api/portfolio-v0-build.js +24 -5
- package/dist/api/portfolio-v0-build.js.map +1 -1
- package/dist/api/prediction-v1-build.d.ts +10 -0
- package/dist/api/prediction-v1-build.js +7 -1
- package/dist/api/prediction-v1-build.js.map +1 -1
- package/dist/api/server.d.ts +31 -1
- package/dist/api/server.js +68 -1
- package/dist/api/server.js.map +1 -1
- package/dist/api/setup-endpoints.d.ts +16 -0
- package/dist/api/setup-endpoints.js +78 -4
- package/dist/api/setup-endpoints.js.map +1 -1
- package/dist/api/setup-retry-endpoint.d.ts +19 -0
- package/dist/api/setup-retry-endpoint.js +32 -0
- package/dist/api/setup-retry-endpoint.js.map +1 -0
- package/dist/api/solvernets-endpoints.d.ts +8 -0
- package/dist/api/solvernets-endpoints.js +71 -43
- package/dist/api/solvernets-endpoints.js.map +1 -1
- package/dist/api/status-build.d.ts +72 -0
- package/dist/api/status-build.js +73 -18
- package/dist/api/status-build.js.map +1 -1
- package/dist/api/task-run-routing.d.ts +7 -0
- package/dist/api/task-run-routing.js +12 -0
- package/dist/api/task-run-routing.js.map +1 -0
- package/dist/api/task-runs-build.d.ts +21 -0
- package/dist/api/task-runs-build.js +14 -1
- package/dist/api/task-runs-build.js.map +1 -1
- package/dist/build-info.json +4 -4
- package/dist/build-meta.json +1 -1
- package/dist/chain-read-errors.d.ts +10 -0
- package/dist/chain-read-errors.js +15 -0
- package/dist/chain-read-errors.js.map +1 -1
- package/dist/cli/commands/auth.js +1 -1
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/create.js +3 -2
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +2 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/rewards.js +11 -7
- package/dist/cli/commands/rewards.js.map +1 -1
- package/dist/cli/commands/solver-nets.js +24 -9
- package/dist/cli/commands/solver-nets.js.map +1 -1
- package/dist/cli/commands/status.js +1 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/tasks.js +86 -9
- package/dist/cli/commands/tasks.js.map +1 -1
- package/dist/cli/commands/update.d.ts +10 -0
- package/dist/cli/commands/update.js +36 -0
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/introspection-context.js +5 -0
- package/dist/cli/introspection-context.js.map +1 -1
- package/dist/cli/task-native-readiness.d.ts +3 -1
- package/dist/cli/task-native-readiness.js +28 -6
- package/dist/cli/task-native-readiness.js.map +1 -1
- package/dist/config.d.ts +106 -5
- package/dist/config.js +97 -18
- package/dist/config.js.map +1 -1
- package/dist/daemon/checkpoint-loop.d.ts +48 -0
- package/dist/daemon/checkpoint-loop.js +76 -0
- package/dist/daemon/checkpoint-loop.js.map +1 -0
- package/dist/daemon/creator.d.ts +1 -1
- package/dist/daemon/creator.js +7 -3
- package/dist/daemon/creator.js.map +1 -1
- package/dist/daemon/daemon.d.ts +19 -0
- package/dist/daemon/daemon.js +68 -1
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/eviction-loop.d.ts +40 -0
- package/dist/daemon/eviction-loop.js +67 -0
- package/dist/daemon/eviction-loop.js.map +1 -0
- package/dist/daemon/jinn-claim-loop-wiring.d.ts +33 -0
- package/dist/daemon/jinn-claim-loop-wiring.js +40 -0
- package/dist/daemon/jinn-claim-loop-wiring.js.map +1 -0
- package/dist/daemon/jinn-claim-loop.d.ts +24 -17
- package/dist/daemon/jinn-claim-loop.js +77 -23
- package/dist/daemon/jinn-claim-loop.js.map +1 -1
- package/dist/daemon/skip-log-dedup.d.ts +69 -0
- package/dist/daemon/skip-log-dedup.js +106 -0
- package/dist/daemon/skip-log-dedup.js.map +1 -0
- package/dist/dashboard/assets/index-BUlE8F3Y.js +330 -0
- package/dist/dashboard/assets/index-blqc7eqq.css +32 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/discovery/factory.d.ts +17 -5
- package/dist/discovery/factory.js +46 -18
- package/dist/discovery/factory.js.map +1 -1
- package/dist/discovery/http.js +142 -3
- package/dist/discovery/http.js.map +1 -1
- package/dist/discovery/onchain.d.ts +5 -0
- package/dist/discovery/onchain.js +407 -15
- package/dist/discovery/onchain.js.map +1 -1
- package/dist/discovery/types.d.ts +45 -1
- package/dist/discovery/types.js +8 -10
- package/dist/discovery/types.js.map +1 -1
- package/dist/discovery/with-fallback.d.ts +7 -0
- package/dist/discovery/with-fallback.js +10 -0
- package/dist/discovery/with-fallback.js.map +1 -1
- package/dist/earning/bootstrap.d.ts +92 -1
- package/dist/earning/bootstrap.js +203 -63
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/contracts.d.ts +14 -0
- package/dist/earning/contracts.js +17 -5
- package/dist/earning/contracts.js.map +1 -1
- package/dist/earning/funding-plan.js +27 -18
- package/dist/earning/funding-plan.js.map +1 -1
- package/dist/earning/jinn-rewards.d.ts +46 -0
- package/dist/earning/jinn-rewards.js +32 -0
- package/dist/earning/jinn-rewards.js.map +1 -1
- package/dist/earning/safe-adapter.d.ts +2 -0
- package/dist/earning/safe-adapter.js +26 -12
- package/dist/earning/safe-adapter.js.map +1 -1
- package/dist/earning/store.d.ts +8 -0
- package/dist/earning/store.js.map +1 -1
- package/dist/earning/testnet-setup-migration.d.ts +12 -0
- package/dist/earning/testnet-setup-migration.js +27 -1
- package/dist/earning/testnet-setup-migration.js.map +1 -1
- package/dist/earning/types.d.ts +15 -0
- package/dist/erc8004/reputation.d.ts +8 -0
- package/dist/erc8004/reputation.js +22 -3
- package/dist/erc8004/reputation.js.map +1 -1
- package/dist/harnesses/cost-estimates.d.ts +145 -0
- package/dist/harnesses/cost-estimates.js +297 -0
- package/dist/harnesses/cost-estimates.js.map +1 -0
- package/dist/harnesses/engine/engine.d.ts +72 -0
- package/dist/harnesses/engine/engine.js +105 -8
- package/dist/harnesses/engine/engine.js.map +1 -1
- package/dist/harnesses/engine/persistence.d.ts +51 -1
- package/dist/harnesses/engine/persistence.js +118 -5
- package/dist/harnesses/engine/persistence.js.map +1 -1
- package/dist/harnesses/engine/work-dir-reaper.d.ts +65 -0
- package/dist/harnesses/engine/work-dir-reaper.js +100 -0
- package/dist/harnesses/engine/work-dir-reaper.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/adapter.js +40 -0
- package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +20 -0
- package/dist/harnesses/impls/hermes-agent/bootstrap.js +40 -6
- package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/harness.d.ts +59 -1
- package/dist/harnesses/impls/hermes-agent/harness.js +104 -0
- package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
- package/dist/harnesses/impls/index.d.ts +7 -0
- package/dist/harnesses/impls/index.js +16 -1
- package/dist/harnesses/impls/index.js.map +1 -1
- package/dist/harnesses/impls/learner/harness.d.ts +38 -4
- package/dist/harnesses/impls/learner/harness.js +96 -2
- package/dist/harnesses/impls/learner/harness.js.map +1 -1
- package/dist/harnesses/impls/learner/plugin-path.d.ts +0 -13
- package/dist/harnesses/impls/learner/plugin-path.js +35 -15
- package/dist/harnesses/impls/learner/plugin-path.js.map +1 -1
- package/dist/harnesses/impls/learner/types.d.ts +11 -0
- package/dist/harnesses/impls/stub.d.ts +58 -0
- package/dist/harnesses/impls/stub.js +89 -0
- package/dist/harnesses/impls/stub.js.map +1 -0
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.d.ts +69 -50
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js +178 -93
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.d.ts +12 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +121 -7
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.d.ts +15 -0
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js +54 -4
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.d.ts +6 -0
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js.map +1 -1
- package/dist/harnesses/readiness-registry.js +9 -1
- package/dist/harnesses/readiness-registry.js.map +1 -1
- package/dist/main.js +371 -82
- package/dist/main.js.map +1 -1
- package/dist/observability/emit-event.d.ts +1 -1
- package/dist/observability/emit-event.js.map +1 -1
- package/dist/operator-errors.d.ts +7 -0
- package/dist/operator-errors.js +13 -1
- package/dist/operator-errors.js.map +1 -1
- package/dist/plugins/learner/.claude-plugin/plugin.json +9 -0
- package/dist/plugins/learner/.codex-plugin/plugin.json +39 -0
- package/dist/plugins/learner/AGENTS.md +40 -0
- package/dist/plugins/learner/CLAUDE.md +33 -0
- package/dist/plugins/learner/README.md +59 -0
- package/dist/plugins/learner/hooks/hooks.json +16 -0
- package/dist/plugins/learner/hooks/session-start +38 -0
- package/dist/plugins/learner/skills/learn/SKILL.md +412 -0
- package/dist/plugins/learner/skills/learn/analyst-prompt.md +68 -0
- package/dist/plugins/learner/skills/learn/consolidator-prompt.md +94 -0
- package/dist/plugins/learner/skills/learn/explorer-prompt.md +53 -0
- package/dist/plugins/learner/skills/learn/planner-prompt.md +87 -0
- package/dist/plugins/learner/skills/learn/promoter-prompt.md +113 -0
- package/dist/plugins/learner/skills/learn/step-worker-prompt.md +47 -0
- package/dist/plugins/learner/skills/learn/strategist-prompt.md +85 -0
- package/dist/restart-daemon.d.ts +90 -0
- package/dist/restart-daemon.js +95 -0
- package/dist/restart-daemon.js.map +1 -0
- package/dist/setup/halt-mode.d.ts +14 -0
- package/dist/setup/halt-mode.js +17 -0
- package/dist/setup/halt-mode.js.map +1 -0
- package/dist/solver-nets/prediction-operator-ux.js +43 -3
- package/dist/solver-nets/prediction-operator-ux.js.map +1 -1
- package/dist/solver-nets/registry.d.ts +1 -0
- package/dist/solver-nets/registry.js +1 -1
- package/dist/solver-nets/registry.js.map +1 -1
- package/dist/solver-types/_swe-rebench-v2-pool-cache.d.ts +58 -0
- package/dist/solver-types/_swe-rebench-v2-pool-cache.js +87 -0
- package/dist/solver-types/_swe-rebench-v2-pool-cache.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-substrate.d.ts +1 -0
- package/dist/solver-types/_swe-rebench-v2-substrate.js +10 -0
- package/dist/solver-types/_swe-rebench-v2-substrate.js.map +1 -1
- package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +65 -0
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js +243 -26
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
- package/dist/solver-types/swe-rebench-v2-auto.d.ts +22 -7
- package/dist/solver-types/swe-rebench-v2-auto.js +45 -20
- package/dist/solver-types/swe-rebench-v2-auto.js.map +1 -1
- package/dist/solver-types/swe-rebench-v2.d.ts +13 -2
- package/dist/solver-types/swe-rebench-v2.js +233 -94
- package/dist/solver-types/swe-rebench-v2.js.map +1 -1
- package/dist/solvernets/daemon-init.d.ts +10 -2
- package/dist/solvernets/daemon-init.js +22 -2
- package/dist/solvernets/daemon-init.js.map +1 -1
- package/dist/solvernets/launched-record-dispatcher.js +35 -7
- package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
- package/dist/solvernets/store.d.ts +5 -0
- package/dist/solvernets/store.js +1 -0
- package/dist/solvernets/store.js.map +1 -1
- package/dist/store/store.d.ts +15 -0
- package/dist/store/store.js +118 -3
- package/dist/store/store.js.map +1 -1
- package/dist/tasks/sources.d.ts +18 -1
- package/dist/tasks/sources.js +33 -5
- package/dist/tasks/sources.js.map +1 -1
- package/dist/tx-retry.d.ts +151 -19
- package/dist/tx-retry.js +286 -32
- package/dist/tx-retry.js.map +1 -1
- package/dist/types/payloads/prediction-apy-v0.d.ts +5 -5
- package/dist/types/payloads/prediction-v0.d.ts +5 -5
- package/dist/types/task-document.d.ts +392 -0
- package/dist/types/task-document.js +10 -0
- package/dist/types/task-document.js.map +1 -1
- package/dist/types/task.d.ts +28 -0
- package/dist/util/extract-tx-hash.d.ts +14 -0
- package/dist/util/extract-tx-hash.js +19 -0
- package/dist/util/extract-tx-hash.js.map +1 -0
- package/dist/vendor/@jinn-network/sdk/dist/contracts.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.d.ts +3 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.js +1 -0
- package/package.json +29 -12
- package/dist/dashboard/assets/index-DOlzFN8a.css +0 -32
- package/dist/dashboard/assets/index-NkZ7CTAT.js +0 -140
|
@@ -16,21 +16,24 @@
|
|
|
16
16
|
* Sepolia / Ethereum. The distributor verifies, applies channel
|
|
17
17
|
* weights, and mints to the operator multisig + DAO Timelock.
|
|
18
18
|
*
|
|
19
|
-
* The loop is disabled
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
19
|
+
* The loop is disabled unless the operator explicitly enables it. Each tick
|
|
20
|
+
* iterates over staked services in the FleetStateStore. Failures are logged
|
|
21
|
+
* and surfaced via `tick_error` observability events; they don't crash the
|
|
22
|
+
* daemon. Replay protection lives entirely in the distributor's accumulators
|
|
23
|
+
* — repeated submissions are no-ops on the second mint.
|
|
24
24
|
*
|
|
25
|
-
* Configuration: `jinnClaimLoopIntervalMs` (default
|
|
26
|
-
* (`
|
|
27
|
-
*
|
|
25
|
+
* Configuration: `jinnClaimLoopEnabled`, `jinnClaimLoopIntervalMs` (default
|
|
26
|
+
* 1h), `jinnClaimSubmissionMode` (`emit-only` | `submit`),
|
|
27
|
+
* `jinnMessengerMode` (`canonical` | `mock`). The `mock` submit path requires
|
|
28
|
+
* the daemon's L1 wallet to be the MockMessenger's owner (set at deploy).
|
|
28
29
|
*
|
|
29
|
-
* Automated `run()` / `runOnce()` **only execute mock-mode**
|
|
30
|
-
* When `jinnMessengerMode === 'canonical'`, scheduled
|
|
31
|
-
* canonical OP-Stack finality is multi-day
|
|
32
|
-
* for burn-in and run
|
|
33
|
-
* verifier-only proofs after an
|
|
30
|
+
* Automated submit-mode `run()` / `runOnce()` **only execute mock-mode**
|
|
31
|
+
* emit→fixture→claim. When `jinnMessengerMode === 'canonical'`, scheduled
|
|
32
|
+
* submit ticks **skip** emitting: canonical OP-Stack finality is multi-day
|
|
33
|
+
* (see R-1); operators should use mock for burn-in and run
|
|
34
|
+
* `tsx scripts/verify-canonical-canary.ts` for verifier-only proofs after an
|
|
35
|
+
* intentional L2 emit. Emit-only mode stops after the L2 ticket and can run
|
|
36
|
+
* without L1 wiring.
|
|
34
37
|
*/
|
|
35
38
|
import { getAddress } from 'viem';
|
|
36
39
|
import { isOperationalServiceStep } from '../earning/types.js';
|
|
@@ -62,8 +65,10 @@ export class JinnClaimLoop {
|
|
|
62
65
|
async runOnce() {
|
|
63
66
|
const result = { ticks: 0, emits: 0, submits: 0, errors: 0 };
|
|
64
67
|
// Spec / Phase D: MockMessenger drives automated Sepolia burn-in; canonical
|
|
65
|
-
// verification is verifier-only and must not spam emitClaim each
|
|
66
|
-
|
|
68
|
+
// submit verification is verifier-only and must not spam emitClaim each
|
|
69
|
+
// interval. Emit-only mode intentionally stops after recording the L2
|
|
70
|
+
// ticket, so it is allowed to run with any messenger mode.
|
|
71
|
+
if (this.config.submissionMode === 'submit' && this.config.messengerMode === 'canonical') {
|
|
67
72
|
const detail = '[jinn-claim] Automated runOnce skips messengerMode=canonical (multi-day OP finality). ' +
|
|
68
73
|
'Set jinnMessengerMode=mock for Sepolia burn-in, or run `tsx scripts/verify-canonical-canary.ts` ' +
|
|
69
74
|
'after finality with an existing L2 ClaimTicket tx.';
|
|
@@ -129,6 +134,27 @@ export class JinnClaimLoop {
|
|
|
129
134
|
detail: `Emitted ClaimTicket for service ${serviceId}`,
|
|
130
135
|
}, 'jinn-claim');
|
|
131
136
|
}
|
|
137
|
+
if (this.config.submissionMode === 'emit-only') {
|
|
138
|
+
const snapshot = await this.readSnapshot(serviceId, emitTxHash);
|
|
139
|
+
if (snapshot.multisig.toLowerCase() !== multisig.toLowerCase()) {
|
|
140
|
+
throw new Error(`[jinn-claim] L2 ClaimTicket multisig ${snapshot.multisig} does not match ` +
|
|
141
|
+
`service multisig ${multisig} — refusing to record emit-only ticket`);
|
|
142
|
+
}
|
|
143
|
+
const detail = `Recorded ClaimTicket claimId=${snapshot.claimId} service=${serviceId} ` +
|
|
144
|
+
`weights=${snapshot.taskCreationWeight}/${snapshot.solutionDeliveryWeight}/` +
|
|
145
|
+
`${snapshot.verdictDeliveryWeight}`;
|
|
146
|
+
console.log(`[jinn-claim] Service ${serviceId}: ${detail}`);
|
|
147
|
+
if (this.config.jinnStore) {
|
|
148
|
+
emitEvent(this.config.jinnStore, {
|
|
149
|
+
kind: 'jinn_claim_ticket_recorded',
|
|
150
|
+
serviceIndex: displayIndex,
|
|
151
|
+
txHash: emitTxHash,
|
|
152
|
+
outcome: 'ok',
|
|
153
|
+
detail,
|
|
154
|
+
}, 'jinn-claim');
|
|
155
|
+
}
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
132
158
|
// Step B + C — diverge by mode.
|
|
133
159
|
let submitTxHash;
|
|
134
160
|
if (this.config.messengerMode === 'mock') {
|
|
@@ -173,21 +199,23 @@ export class JinnClaimLoop {
|
|
|
173
199
|
}
|
|
174
200
|
/** Mock-mode Step B + C: read the L2 event, plant fixture on L1, claim. */
|
|
175
201
|
async submitMock(args) {
|
|
202
|
+
const { l1Client, l1Wallet, messengerAddress, distributorAddress } = this.requireL1SubmitConfig();
|
|
176
203
|
const snapshot = await this.readSnapshot(args.serviceId, args.emitTxHash);
|
|
177
204
|
if (snapshot.multisig.toLowerCase() !== args.multisig.toLowerCase()) {
|
|
178
205
|
throw new Error(`[jinn-claim] L2 ClaimTicket multisig ${snapshot.multisig} does not match ` +
|
|
179
206
|
`service multisig ${args.multisig} — refusing to plant mock fixture`);
|
|
180
207
|
}
|
|
181
208
|
// Plant the fixture (daemon wallet must be MockMessenger.owner).
|
|
182
|
-
const fixtureTx = await plantMockFixture(
|
|
183
|
-
await waitForTransactionReceiptWithRetry(
|
|
209
|
+
const fixtureTx = await plantMockFixture(l1Client, l1Wallet, messengerAddress, snapshot);
|
|
210
|
+
await waitForTransactionReceiptWithRetry(l1Client, fixtureTx);
|
|
184
211
|
// Submit the claim on L1.
|
|
185
|
-
const claimTx = await submitMockClaim(
|
|
186
|
-
await waitForTransactionReceiptWithRetry(
|
|
212
|
+
const claimTx = await submitMockClaim(l1Client, l1Wallet, distributorAddress, snapshot.claimId);
|
|
213
|
+
await waitForTransactionReceiptWithRetry(l1Client, claimTx);
|
|
187
214
|
return claimTx;
|
|
188
215
|
}
|
|
189
216
|
/** Canonical-mode Step B + C: build OP-Stack proof, submit on L1. */
|
|
190
217
|
async submitCanonical(args) {
|
|
218
|
+
const { l1Client, messengerAddress } = this.requireL1SubmitConfig();
|
|
191
219
|
if (!this.config.optimismPortalAddress || !this.config.disputeGameFactoryAddress) {
|
|
192
220
|
throw new Error('[jinn-claim-loop] canonical mode requires optimismPortalAddress + disputeGameFactoryAddress');
|
|
193
221
|
}
|
|
@@ -200,14 +228,14 @@ export class JinnClaimLoop {
|
|
|
200
228
|
}
|
|
201
229
|
const snapshot = decodeClaimTicketFromReceipt(receipt.logs, this.config.claimEmitterAddress, claimLog.logIndex ?? 0);
|
|
202
230
|
const result = await buildCanonicalProof({
|
|
203
|
-
l1Client
|
|
231
|
+
l1Client,
|
|
204
232
|
l2ProofClient: this.config.l2ProofClient ?? this.config.l2Client,
|
|
205
233
|
targetChain: this.config.chain === 'base-sepolia' ? baseSepolia : base,
|
|
206
234
|
optimismPortal: this.config.optimismPortalAddress,
|
|
207
235
|
disputeGameFactory: this.config.disputeGameFactoryAddress,
|
|
208
236
|
claimEmitter: this.config.claimEmitterAddress,
|
|
209
237
|
}, { snapshot, l2BlockNumber: receipt.blockNumber });
|
|
210
|
-
await verifyCanonicalClaimCanary(
|
|
238
|
+
await verifyCanonicalClaimCanary(l1Client, messengerAddress, result.proof);
|
|
211
239
|
// Verifier-only canary path: no L1 transaction submitted; return the L2 emit tx.
|
|
212
240
|
return args.emitTxHash;
|
|
213
241
|
}
|
|
@@ -220,15 +248,41 @@ export class JinnClaimLoop {
|
|
|
220
248
|
// can return "receipt not found" briefly after the tx lands when the
|
|
221
249
|
// request hits a backend that hasn't propagated the receipt yet.
|
|
222
250
|
const receipt = await waitForTransactionReceiptWithRetry(this.config.l2Client, emitTxHash);
|
|
251
|
+
const claimLog = receipt.logs.find((log) => log.address.toLowerCase() === this.config.claimEmitterAddress.toLowerCase()
|
|
252
|
+
&& log.topics[0]?.toLowerCase() === CLAIM_TICKET_TOPIC0.toLowerCase());
|
|
253
|
+
if (claimLog) {
|
|
254
|
+
const snapshot = decodeClaimTicketFromReceipt(receipt.logs, this.config.claimEmitterAddress, claimLog.logIndex ?? 0);
|
|
255
|
+
if (snapshot.serviceId !== serviceId) {
|
|
256
|
+
throw new Error(`[jinn-claim] ClaimTicket service ${snapshot.serviceId} does not match expected service ${serviceId}`);
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
...snapshot,
|
|
260
|
+
emitTxHash,
|
|
261
|
+
emitBlockNumber: receipt.blockNumber,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
223
264
|
// Search a small window around the emit block.
|
|
224
265
|
const fromBlock = receipt.blockNumber > 5n ? receipt.blockNumber - 5n : 0n;
|
|
225
|
-
const
|
|
226
|
-
const snapshot = await fetchLatestClaimTicket(this.config.l2Client, this.config.claimEmitterAddress, serviceId, { fromBlock, toBlock });
|
|
266
|
+
const snapshot = await fetchLatestClaimTicket(this.config.l2Client, this.config.claimEmitterAddress, serviceId, { fromBlock, toBlock: 'latest' });
|
|
227
267
|
if (!snapshot) {
|
|
228
268
|
throw new Error(`[jinn-claim] no ClaimTicket event for service ${serviceId} near tx ${emitTxHash}`);
|
|
229
269
|
}
|
|
230
270
|
return snapshot;
|
|
231
271
|
}
|
|
272
|
+
requireL1SubmitConfig() {
|
|
273
|
+
if (!this.config.l1Client ||
|
|
274
|
+
!this.config.l1Wallet ||
|
|
275
|
+
!this.config.distributorAddress ||
|
|
276
|
+
!this.config.messengerAddress) {
|
|
277
|
+
throw new Error('[jinn-claim-loop] submit mode requires L1 client, L1 wallet, distributor, and messenger wiring');
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
l1Client: this.config.l1Client,
|
|
281
|
+
l1Wallet: this.config.l1Wallet,
|
|
282
|
+
distributorAddress: this.config.distributorAddress,
|
|
283
|
+
messengerAddress: this.config.messengerAddress,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
232
286
|
/** Loop forever, sleeping `intervalMs` between ticks. */
|
|
233
287
|
async run() {
|
|
234
288
|
if (this.config.intervalMs <= 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jinn-claim-loop.js","sourceRoot":"","sources":["../../src/daemon/jinn-claim-loop.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"jinn-claim-loop.js","sourceRoot":"","sources":["../../src/daemon/jinn-claim-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dedupes "[daemon] skipping task X — reason" log lines so the engine-watcher
|
|
3
|
+
* loop doesn't emit hundreds of identical lines per minute when a single in-flight
|
|
4
|
+
* slot is occupied. The original loop logged once per `(taskId, reason)` per
|
|
5
|
+
* pass; this helper collapses repeat lines down to one per `(taskId, reason)`
|
|
6
|
+
* pair until the reason changes (or the entry is evicted to keep memory bounded).
|
|
7
|
+
*
|
|
8
|
+
* It additionally maintains a TTL-bounded *work-skip cache*: once `canAcceptTask`
|
|
9
|
+
* rejects a task, the engine-watcher records the skip here and — for
|
|
10
|
+
* `SKIP_RECHECK_TTL_MS` afterwards — fast-skips the task without re-running the
|
|
11
|
+
* (expensive) `canAcceptTask` work at all. With a large backlog of
|
|
12
|
+
* persistently-unacceptable tasks (e.g. ~40 evaluation tasks whose harness is
|
|
13
|
+
* not enabled), re-running manifest resolution + schema validation +
|
|
14
|
+
* `impl.isReady()` for every task every cycle blocks the Node event loop ~1-2s
|
|
15
|
+
* and starves the HTTP API. The cache makes a repeat cycle a Map lookup.
|
|
16
|
+
*
|
|
17
|
+
* SAFETY: the TTL re-check is mandatory and bounded. A task is NEVER skip-cached
|
|
18
|
+
* forever — once `SKIP_RECHECK_TTL_MS` has elapsed the cache reports the task as
|
|
19
|
+
* due for re-check, so a task that becomes acceptable (operator enables the
|
|
20
|
+
* harness, a slot frees up) is always picked up within the TTL.
|
|
21
|
+
*
|
|
22
|
+
* See jinn-mono-kzan (log dedup).
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* How long a task that `canAcceptTask` rejected stays in the work-skip cache
|
|
26
|
+
* before the engine-watcher re-evaluates it. Bounded on purpose: a false
|
|
27
|
+
* permanent skip (a claimable task that is never picked up) is a serious bug,
|
|
28
|
+
* so the cache is only ever a short-lived optimization.
|
|
29
|
+
*/
|
|
30
|
+
export declare const SKIP_RECHECK_TTL_MS = 30000;
|
|
31
|
+
export declare class SkipLogDeduper {
|
|
32
|
+
private entriesByTaskId;
|
|
33
|
+
private readonly maxEntries;
|
|
34
|
+
private readonly recheckTtlMs;
|
|
35
|
+
constructor(maxEntries?: number, recheckTtlMs?: number);
|
|
36
|
+
/**
|
|
37
|
+
* Returns true when the engine-watcher should re-run `canAcceptTask` for
|
|
38
|
+
* `taskId` — i.e. there is no cached skip, or the cached skip is older than
|
|
39
|
+
* `recheckTtlMs`. Returns false when a recent skip is still within the TTL,
|
|
40
|
+
* meaning the caller should fast-skip the task without doing the work.
|
|
41
|
+
*
|
|
42
|
+
* `now` is injectable for deterministic tests; defaults to `Date.now()`.
|
|
43
|
+
*/
|
|
44
|
+
shouldRecheck(taskId: string, now?: number): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Records that `canAcceptTask` rejected `taskId` with `reason`, stamping the
|
|
47
|
+
* skip with the current time so subsequent `shouldRecheck` calls can apply
|
|
48
|
+
* the TTL. Refreshes recency for the FIFO memory bound.
|
|
49
|
+
*
|
|
50
|
+
* `now` is injectable for deterministic tests; defaults to `Date.now()`.
|
|
51
|
+
*/
|
|
52
|
+
recordSkip(taskId: string, reason: string, now?: number): void;
|
|
53
|
+
/**
|
|
54
|
+
* Returns true when this `(taskId, reason)` pair has not been logged yet
|
|
55
|
+
* (or the previous reason for this `taskId` was different). Returns false
|
|
56
|
+
* when the previous skip for this task had the same reason — operators
|
|
57
|
+
* already saw the line; another copy is noise.
|
|
58
|
+
*
|
|
59
|
+
* This only governs log output; it does NOT record a work-skip TTL entry.
|
|
60
|
+
* Callers that want the work-skip fast path must also call `recordSkip`.
|
|
61
|
+
*/
|
|
62
|
+
shouldLog(taskId: string, reason: string): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Forget all skip state for `taskId` — both the last-logged reason and the
|
|
65
|
+
* work-skip TTL entry. Called when the task is accepted/claimed so a future
|
|
66
|
+
* skip logs once and is re-checked immediately rather than fast-skipped.
|
|
67
|
+
*/
|
|
68
|
+
forget(taskId: string): void;
|
|
69
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dedupes "[daemon] skipping task X — reason" log lines so the engine-watcher
|
|
3
|
+
* loop doesn't emit hundreds of identical lines per minute when a single in-flight
|
|
4
|
+
* slot is occupied. The original loop logged once per `(taskId, reason)` per
|
|
5
|
+
* pass; this helper collapses repeat lines down to one per `(taskId, reason)`
|
|
6
|
+
* pair until the reason changes (or the entry is evicted to keep memory bounded).
|
|
7
|
+
*
|
|
8
|
+
* It additionally maintains a TTL-bounded *work-skip cache*: once `canAcceptTask`
|
|
9
|
+
* rejects a task, the engine-watcher records the skip here and — for
|
|
10
|
+
* `SKIP_RECHECK_TTL_MS` afterwards — fast-skips the task without re-running the
|
|
11
|
+
* (expensive) `canAcceptTask` work at all. With a large backlog of
|
|
12
|
+
* persistently-unacceptable tasks (e.g. ~40 evaluation tasks whose harness is
|
|
13
|
+
* not enabled), re-running manifest resolution + schema validation +
|
|
14
|
+
* `impl.isReady()` for every task every cycle blocks the Node event loop ~1-2s
|
|
15
|
+
* and starves the HTTP API. The cache makes a repeat cycle a Map lookup.
|
|
16
|
+
*
|
|
17
|
+
* SAFETY: the TTL re-check is mandatory and bounded. A task is NEVER skip-cached
|
|
18
|
+
* forever — once `SKIP_RECHECK_TTL_MS` has elapsed the cache reports the task as
|
|
19
|
+
* due for re-check, so a task that becomes acceptable (operator enables the
|
|
20
|
+
* harness, a slot frees up) is always picked up within the TTL.
|
|
21
|
+
*
|
|
22
|
+
* See jinn-mono-kzan (log dedup).
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* How long a task that `canAcceptTask` rejected stays in the work-skip cache
|
|
26
|
+
* before the engine-watcher re-evaluates it. Bounded on purpose: a false
|
|
27
|
+
* permanent skip (a claimable task that is never picked up) is a serious bug,
|
|
28
|
+
* so the cache is only ever a short-lived optimization.
|
|
29
|
+
*/
|
|
30
|
+
export const SKIP_RECHECK_TTL_MS = 30_000;
|
|
31
|
+
export class SkipLogDeduper {
|
|
32
|
+
entriesByTaskId = new Map();
|
|
33
|
+
maxEntries;
|
|
34
|
+
recheckTtlMs;
|
|
35
|
+
constructor(maxEntries = 1024, recheckTtlMs = SKIP_RECHECK_TTL_MS) {
|
|
36
|
+
this.maxEntries = Math.max(1, maxEntries);
|
|
37
|
+
this.recheckTtlMs = Math.max(0, recheckTtlMs);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Returns true when the engine-watcher should re-run `canAcceptTask` for
|
|
41
|
+
* `taskId` — i.e. there is no cached skip, or the cached skip is older than
|
|
42
|
+
* `recheckTtlMs`. Returns false when a recent skip is still within the TTL,
|
|
43
|
+
* meaning the caller should fast-skip the task without doing the work.
|
|
44
|
+
*
|
|
45
|
+
* `now` is injectable for deterministic tests; defaults to `Date.now()`.
|
|
46
|
+
*/
|
|
47
|
+
shouldRecheck(taskId, now = Date.now()) {
|
|
48
|
+
const entry = this.entriesByTaskId.get(taskId);
|
|
49
|
+
if (entry === undefined)
|
|
50
|
+
return true;
|
|
51
|
+
return now - entry.checkedAt >= this.recheckTtlMs;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Records that `canAcceptTask` rejected `taskId` with `reason`, stamping the
|
|
55
|
+
* skip with the current time so subsequent `shouldRecheck` calls can apply
|
|
56
|
+
* the TTL. Refreshes recency for the FIFO memory bound.
|
|
57
|
+
*
|
|
58
|
+
* `now` is injectable for deterministic tests; defaults to `Date.now()`.
|
|
59
|
+
*/
|
|
60
|
+
recordSkip(taskId, reason, now = Date.now()) {
|
|
61
|
+
// Delete-then-set so the entry moves to the end of insertion order, keeping
|
|
62
|
+
// actively-skipped tasks away from the FIFO eviction front.
|
|
63
|
+
this.entriesByTaskId.delete(taskId);
|
|
64
|
+
this.entriesByTaskId.set(taskId, { reason, checkedAt: now });
|
|
65
|
+
if (this.entriesByTaskId.size > this.maxEntries) {
|
|
66
|
+
// Map iteration is insertion-order; evict the oldest entry.
|
|
67
|
+
const oldestKey = this.entriesByTaskId.keys().next().value;
|
|
68
|
+
if (oldestKey !== undefined) {
|
|
69
|
+
this.entriesByTaskId.delete(oldestKey);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Returns true when this `(taskId, reason)` pair has not been logged yet
|
|
75
|
+
* (or the previous reason for this `taskId` was different). Returns false
|
|
76
|
+
* when the previous skip for this task had the same reason — operators
|
|
77
|
+
* already saw the line; another copy is noise.
|
|
78
|
+
*
|
|
79
|
+
* This only governs log output; it does NOT record a work-skip TTL entry.
|
|
80
|
+
* Callers that want the work-skip fast path must also call `recordSkip`.
|
|
81
|
+
*/
|
|
82
|
+
shouldLog(taskId, reason) {
|
|
83
|
+
const previous = this.entriesByTaskId.get(taskId);
|
|
84
|
+
if (previous?.reason === reason) {
|
|
85
|
+
// Refresh recency so we don't evict an actively-skipped task, but keep
|
|
86
|
+
// the original `checkedAt` so the TTL keeps counting from the first skip.
|
|
87
|
+
this.entriesByTaskId.delete(taskId);
|
|
88
|
+
this.entriesByTaskId.set(taskId, previous);
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
// New or changed reason: this is a fresh skip. Stamp it now so the
|
|
92
|
+
// work-skip TTL and the log-dedup state stay consistent for a caller that
|
|
93
|
+
// only calls `shouldLog`.
|
|
94
|
+
this.recordSkip(taskId, reason);
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Forget all skip state for `taskId` — both the last-logged reason and the
|
|
99
|
+
* work-skip TTL entry. Called when the task is accepted/claimed so a future
|
|
100
|
+
* skip logs once and is re-checked immediately rather than fast-skipped.
|
|
101
|
+
*/
|
|
102
|
+
forget(taskId) {
|
|
103
|
+
this.entriesByTaskId.delete(taskId);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=skip-log-dedup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skip-log-dedup.js","sourceRoot":"","sources":["../../src/daemon/skip-log-dedup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAS1C,MAAM,OAAO,cAAc;IACjB,eAAe,GAAG,IAAI,GAAG,EAAqB,CAAC;IACtC,UAAU,CAAS;IACnB,YAAY,CAAS;IAEtC,YAAY,UAAU,GAAG,IAAI,EAAE,YAAY,GAAG,mBAAmB;QAC/D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;OAOG;IACH,aAAa,CAAC,MAAc,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC;IACpD,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,MAAc,EAAE,MAAc,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACjE,4EAA4E;QAC5E,4DAA4D;QAC5D,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAChD,4DAA4D;YAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC3D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,CAAC,MAAc,EAAE,MAAc;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,QAAQ,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;YAChC,uEAAuE;YACvE,0EAA0E;YAC1E,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,mEAAmE;QACnE,0EAA0E;QAC1E,0BAA0B;QAC1B,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACF"}
|