@jinn-network/client 0.1.3-canary.2d6b2676 → 0.1.3-canary.8e61ba74
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/adapters/adapter.d.ts +15 -4
- package/dist/adapters/local/adapter.d.ts +9 -8
- package/dist/adapters/local/adapter.js +47 -74
- package/dist/adapters/local/adapter.js.map +1 -1
- package/dist/adapters/mech/adapter.d.ts +29 -13
- package/dist/adapters/mech/adapter.js +316 -311
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +62 -16
- package/dist/adapters/mech/contracts.js +226 -92
- package/dist/adapters/mech/contracts.js.map +1 -1
- package/dist/adapters/mech/safe-revert.js +0 -6
- package/dist/adapters/mech/safe-revert.js.map +1 -1
- package/dist/adapters/mech/types.d.ts +237 -84
- package/dist/adapters/mech/types.js +125 -50
- package/dist/adapters/mech/types.js.map +1 -1
- package/dist/agent/agent-ws.d.ts +1 -0
- package/dist/agent/agent-ws.js +13 -1
- package/dist/agent/agent-ws.js.map +1 -1
- package/dist/agent/operator-claude.js +4 -0
- package/dist/agent/operator-claude.js.map +1 -1
- package/dist/api/gather-status.d.ts +0 -1
- package/dist/api/gather-status.js +0 -1
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/setup-endpoints.d.ts +20 -0
- package/dist/api/setup-endpoints.js +110 -3
- package/dist/api/setup-endpoints.js.map +1 -1
- package/dist/build-info.json +4 -4
- package/dist/build-meta.json +1 -1
- package/dist/cli/commands/auth.js +6 -3
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/bootstrap.js +0 -1
- package/dist/cli/commands/bootstrap.js.map +1 -1
- package/dist/cli/commands/create.js +3 -3
- package/dist/cli/commands/doctor.js +4 -12
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/fleet-scale.js +0 -1
- package/dist/cli/commands/fleet-scale.js.map +1 -1
- package/dist/cli/commands/fund-requirements.js +0 -1
- package/dist/cli/commands/fund-requirements.js.map +1 -1
- package/dist/cli/commands/migrate-agent-id.js +0 -1
- package/dist/cli/commands/migrate-agent-id.js.map +1 -1
- package/dist/cli/commands/solver-nets.js +1 -1
- package/dist/cli/commands/solver-plugins.js +3 -1
- package/dist/cli/commands/solver-plugins.js.map +1 -1
- package/dist/cli/commands/tasks.js +20 -11
- package/dist/cli/commands/tasks.js.map +1 -1
- package/dist/cli/commands/version.js +0 -1
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/cli/deployment-digest.js +0 -5
- package/dist/cli/deployment-digest.js.map +1 -1
- package/dist/cli/execution-context.js +0 -1
- package/dist/cli/execution-context.js.map +1 -1
- package/dist/cli/introspection-context.js +0 -1
- package/dist/cli/introspection-context.js.map +1 -1
- package/dist/config.d.ts +410 -22
- package/dist/config.js +41 -30
- package/dist/config.js.map +1 -1
- package/dist/daemon/creator.d.ts +3 -3
- package/dist/daemon/creator.js +3 -3
- package/dist/daemon/creator.js.map +1 -1
- package/dist/daemon/daemon.d.ts +3 -6
- package/dist/daemon/daemon.js +30 -9
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/jinn-claim-loop-canonical.d.ts +11 -11
- package/dist/daemon/jinn-claim-loop-canonical.js +17 -17
- package/dist/daemon/jinn-claim-loop-canonical.js.map +1 -1
- package/dist/daemon/jinn-claim-loop-mock.d.ts +4 -4
- package/dist/daemon/jinn-claim-loop-mock.js +7 -7
- package/dist/daemon/jinn-claim-loop-mock.js.map +1 -1
- package/dist/daemon/jinn-claim-loop.d.ts +4 -4
- package/dist/daemon/jinn-claim-loop.js +3 -3
- package/dist/dashboard/assets/{index-Bxlk5qpa.js → index-CaUOdCs6.js} +6 -6
- package/dist/dashboard/index.html +1 -1
- package/dist/earning/bootstrap.d.ts +0 -1
- package/dist/earning/bootstrap.js +0 -1
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/contracts.d.ts +18 -20
- package/dist/earning/contracts.js +18 -29
- package/dist/earning/contracts.js.map +1 -1
- package/dist/earning/funding-plan.d.ts +0 -1
- package/dist/earning/funding-plan.js +0 -1
- package/dist/earning/funding-plan.js.map +1 -1
- package/dist/earning/migrate-agent-id.d.ts +0 -1
- package/dist/earning/migrate-agent-id.js +0 -1
- package/dist/earning/migrate-agent-id.js.map +1 -1
- package/dist/erc8004/reputation.d.ts +2 -2
- package/dist/erc8004/reputation.js +2 -2
- package/dist/events/types.d.ts +2 -2
- package/dist/harnesses/engine/delivery.d.ts +10 -6
- package/dist/harnesses/engine/delivery.js +10 -6
- package/dist/harnesses/engine/delivery.js.map +1 -1
- package/dist/harnesses/engine/engine.d.ts +16 -29
- package/dist/harnesses/engine/engine.js +67 -106
- package/dist/harnesses/engine/engine.js.map +1 -1
- package/dist/harnesses/engine/persistence.d.ts +5 -1
- package/dist/harnesses/engine/persistence.js +10 -2
- package/dist/harnesses/engine/persistence.js.map +1 -1
- package/dist/harnesses/external-impls/loader.d.ts +1 -1
- package/dist/harnesses/impls/claude-code-learner/types.d.ts +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction/index.d.ts +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction/index.js +6 -6
- package/dist/harnesses/impls/claude-mcp-prediction/types.d.ts +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction/types.js +1 -1
- package/dist/harnesses/impls/index.js +5 -5
- package/dist/harnesses/impls/portfolio-v0-evaluator/index.js +1 -1
- package/dist/harnesses/impls/portfolio-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/prediction-v0-baseline/index.d.ts +4 -4
- package/dist/harnesses/impls/prediction-v0-baseline/index.js +10 -10
- package/dist/harnesses/impls/prediction-v0-evaluator/canonical-metrics.d.ts +3 -3
- package/dist/harnesses/impls/prediction-v0-evaluator/checks/availability.d.ts +1 -1
- package/dist/harnesses/impls/prediction-v0-evaluator/index.d.ts +4 -4
- package/dist/harnesses/impls/prediction-v0-evaluator/index.js +11 -11
- package/dist/harnesses/impls/prediction-v1-baseline/index.d.ts +31 -0
- package/dist/harnesses/impls/prediction-v1-baseline/index.js +79 -0
- package/dist/harnesses/impls/prediction-v1-baseline/index.js.map +1 -0
- package/dist/harnesses/impls/prediction-v1-evaluator/index.d.ts +32 -0
- package/dist/harnesses/impls/prediction-v1-evaluator/index.js +198 -0
- package/dist/harnesses/impls/prediction-v1-evaluator/index.js.map +1 -0
- package/dist/harnesses/manifest/types.d.ts +1 -1
- package/dist/harnesses/manifest/types.js +1 -1
- package/dist/harnesses/types.d.ts +2 -1
- package/dist/harnesses/types.js.map +1 -1
- package/dist/main.js +2 -26
- package/dist/main.js.map +1 -1
- package/dist/mcp/operator-server.js +1 -1
- package/dist/mcp/operator-server.js.map +1 -1
- package/dist/mcp/server.js +2 -2
- package/dist/plugins/manifest.d.ts +1 -1
- package/dist/plugins/manifest.js +1 -1
- package/dist/plugins/manifest.js.map +1 -1
- package/dist/plugins/registry.js +1 -1
- package/dist/plugins/registry.js.map +1 -1
- package/dist/plugins/resolvers.js +2 -1
- package/dist/plugins/resolvers.js.map +1 -1
- package/dist/plugins/types.d.ts +4 -8
- package/dist/plugins/validator.js +5 -7
- package/dist/plugins/validator.js.map +1 -1
- package/dist/preflight/claude-auth.d.ts +3 -1
- package/dist/preflight/claude-auth.js +5 -5
- package/dist/preflight/claude-auth.js.map +1 -1
- package/dist/setup/claude-code-install.d.ts +19 -0
- package/dist/setup/claude-code-install.js +51 -0
- package/dist/setup/claude-code-install.js.map +1 -0
- package/dist/solver-nets/contracts.d.ts +2 -0
- package/dist/solver-nets/contracts.js +2 -0
- package/dist/solver-nets/contracts.js.map +1 -0
- package/dist/solver-nets/registry.d.ts +2 -0
- package/dist/solver-nets/registry.js +13 -5
- package/dist/solver-nets/registry.js.map +1 -1
- package/dist/solver-types/constants.d.ts +1 -1
- package/dist/solver-types/constants.js +1 -1
- package/dist/solver-types/index.d.ts +5 -5
- package/dist/solver-types/index.js +5 -5
- package/dist/solver-types/prediction-apy-v0-auto.js +12 -0
- package/dist/solver-types/prediction-apy-v0-auto.js.map +1 -1
- package/dist/solver-types/prediction-v0-auto.d.ts +4 -4
- package/dist/solver-types/prediction-v0-auto.js +22 -10
- package/dist/solver-types/prediction-v0-auto.js.map +1 -1
- package/dist/solver-types/prediction-v0-template.d.ts +10 -10
- package/dist/solver-types/prediction-v0-template.js +16 -16
- package/dist/solver-types/prediction-v0-template.js.map +1 -1
- package/dist/solver-types/prediction-v0.d.ts +2 -2
- package/dist/solver-types/prediction-v0.js +11 -11
- package/dist/solver-types/prediction-v1-auto.d.ts +22 -0
- package/dist/solver-types/prediction-v1-auto.js +211 -0
- package/dist/solver-types/prediction-v1-auto.js.map +1 -0
- package/dist/solver-types/prediction-v1.d.ts +3 -0
- package/dist/solver-types/prediction-v1.js +29 -0
- package/dist/solver-types/prediction-v1.js.map +1 -0
- package/dist/solver-types/solver-type.d.ts +5 -4
- package/dist/store/store.d.ts +4 -0
- package/dist/store/store.js +28 -4
- package/dist/store/store.js.map +1 -1
- package/dist/tasks/posting-service.d.ts +5 -2
- package/dist/tasks/posting-service.js +12 -6
- package/dist/tasks/posting-service.js.map +1 -1
- package/dist/tasks/sources.d.ts +2 -2
- package/dist/tasks/sources.js +10 -7
- package/dist/tasks/sources.js.map +1 -1
- package/dist/templates/harnesses/alternative-harness/package.json.tmpl +1 -1
- package/dist/templates/harnesses/alternative-harness/src/coordinator.ts.tmpl +1 -1
- package/dist/templates/harnesses/alternative-harness/src/index.ts.tmpl +1 -1
- package/dist/templates/harnesses/alternative-harness/src/mock-harness.ts.tmpl +1 -1
- package/dist/templates/harnesses/alternative-harness/src/phases/debrief.ts.tmpl +1 -1
- package/dist/templates/harnesses/alternative-harness/src/phases/execute.ts.tmpl +1 -1
- package/dist/templates/harnesses/alternative-harness/src/phases/improve.ts.tmpl +1 -1
- package/dist/templates/harnesses/alternative-harness/src/phases/memory.ts.tmpl +1 -1
- package/dist/templates/harnesses/alternative-harness/src/phases/orient.ts.tmpl +1 -1
- package/dist/templates/harnesses/alternative-harness/src/phases/plan.ts.tmpl +1 -1
- package/dist/templates/harnesses/alternative-harness/src/phases/strategize.ts.tmpl +1 -1
- package/dist/templates/harnesses/alternative-harness/test/coordinator.test.ts.tmpl +1 -1
- package/dist/templates/harnesses/alternative-harness/test/unit.test.ts.tmpl +1 -1
- package/dist/templates/harnesses/evaluator/package.json.tmpl +1 -1
- package/dist/templates/harnesses/evaluator/src/index.ts.tmpl +1 -1
- package/dist/templates/harnesses/evaluator/test/unit.test.ts.tmpl +1 -1
- package/dist/templates/harnesses/forecaster/package.json.tmpl +1 -1
- package/dist/templates/harnesses/forecaster/src/index.ts.tmpl +1 -1
- package/dist/templates/harnesses/forecaster/test/unit.test.ts.tmpl +1 -1
- package/dist/trajectory/schema.d.ts +10 -10
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/payloads/index.d.ts +1 -0
- package/dist/types/payloads/index.js +6 -0
- package/dist/types/payloads/index.js.map +1 -1
- package/dist/types/payloads/prediction-v1.d.ts +2 -0
- package/dist/types/payloads/prediction-v1.js +2 -0
- package/dist/types/payloads/prediction-v1.js.map +1 -0
- package/dist/types/prediction-v1.d.ts +2 -0
- package/dist/types/prediction-v1.js +2 -0
- package/dist/types/prediction-v1.js.map +1 -0
- package/dist/types/prediction.d.ts +559 -19
- package/dist/types/prediction.js +12 -9
- package/dist/types/prediction.js.map +1 -1
- package/dist/types/task-document.d.ts +389 -0
- package/dist/types/task-document.js +11 -0
- package/dist/types/task-document.js.map +1 -1
- package/dist/types/task.d.ts +285 -1
- package/dist/types/task.js +6 -1
- package/dist/types/task.js.map +1 -1
- package/dist/vendor/@jinn-network/sdk/README.md +61 -0
- package/dist/vendor/@jinn-network/sdk/dist/capabilities.d.ts +52 -0
- package/dist/vendor/@jinn-network/sdk/dist/capabilities.js +1 -0
- package/dist/vendor/@jinn-network/sdk/dist/contracts.d.ts +105 -0
- package/dist/vendor/@jinn-network/sdk/dist/contracts.js +147 -0
- package/dist/vendor/@jinn-network/sdk/dist/harness.d.ts +69 -0
- package/dist/vendor/@jinn-network/sdk/dist/harness.js +1 -0
- package/dist/vendor/@jinn-network/sdk/dist/index.d.ts +2 -0
- package/dist/vendor/@jinn-network/sdk/dist/index.js +5 -0
- package/dist/vendor/@jinn-network/sdk/dist/manifest.d.ts +69 -0
- package/dist/vendor/@jinn-network/sdk/dist/manifest.js +3 -0
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.d.ts +223 -0
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.js +64 -0
- package/dist/vendor/@jinn-network/sdk/dist/plugins.d.ts +36 -0
- package/dist/vendor/@jinn-network/sdk/dist/plugins.js +54 -0
- package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.d.ts +870 -0
- package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.js +80 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/index.d.ts +2 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/index.js +1 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/prediction-v1.d.ts +6 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/prediction-v1.js +3 -0
- package/dist/vendor/@jinn-network/sdk/dist/types.d.ts +116 -0
- package/dist/vendor/@jinn-network/sdk/dist/types.js +21 -0
- package/dist/vendor/@jinn-network/sdk/package.json +34 -0
- package/dist/venues/polymarket/client.d.ts +77 -0
- package/dist/venues/polymarket/client.js +309 -0
- package/dist/venues/polymarket/client.js.map +1 -0
- package/dist/withdraw/run-withdraw-plan.js +0 -2
- package/dist/withdraw/run-withdraw-plan.js.map +1 -1
- package/package.json +8 -6
- package/plugins/jinn-prediction-plugin/.claude-plugin/plugin.json +13 -86
- package/plugins/jinn-prediction-plugin/.mcp.json +8 -0
- package/plugins/jinn-prediction-plugin/GEMINI.md +3 -0
- package/plugins/jinn-prediction-plugin/gemini-extension.json +13 -0
- package/plugins/jinn-prediction-plugin/jinn.plugin.json +23 -0
- package/plugins/jinn-prediction-plugin/schemas/prediction-v1-solution.schema.json +34 -0
- package/plugins/jinn-prediction-plugin/schemas/prediction-v1-task.schema.json +118 -0
- package/plugins/jinn-prediction-plugin/schemas/prediction-v1-verdict.schema.json +84 -0
- package/templates/harnesses/alternative-harness/package.json.tmpl +1 -1
- package/templates/harnesses/alternative-harness/src/coordinator.ts.tmpl +1 -1
- package/templates/harnesses/alternative-harness/src/index.ts.tmpl +1 -1
- package/templates/harnesses/alternative-harness/src/mock-harness.ts.tmpl +1 -1
- package/templates/harnesses/alternative-harness/src/phases/debrief.ts.tmpl +1 -1
- package/templates/harnesses/alternative-harness/src/phases/execute.ts.tmpl +1 -1
- package/templates/harnesses/alternative-harness/src/phases/improve.ts.tmpl +1 -1
- package/templates/harnesses/alternative-harness/src/phases/memory.ts.tmpl +1 -1
- package/templates/harnesses/alternative-harness/src/phases/orient.ts.tmpl +1 -1
- package/templates/harnesses/alternative-harness/src/phases/plan.ts.tmpl +1 -1
- package/templates/harnesses/alternative-harness/src/phases/strategize.ts.tmpl +1 -1
- package/templates/harnesses/alternative-harness/test/coordinator.test.ts.tmpl +1 -1
- package/templates/harnesses/alternative-harness/test/unit.test.ts.tmpl +1 -1
- package/templates/harnesses/evaluator/package.json.tmpl +1 -1
- package/templates/harnesses/evaluator/src/index.ts.tmpl +1 -1
- package/templates/harnesses/evaluator/test/unit.test.ts.tmpl +1 -1
- package/templates/harnesses/forecaster/package.json.tmpl +1 -1
- package/templates/harnesses/forecaster/src/index.ts.tmpl +1 -1
- package/templates/harnesses/forecaster/test/unit.test.ts.tmpl +1 -1
- package/dist/adapters/claim-registry/abi.d.ts +0 -127
- package/dist/adapters/claim-registry/abi.js +0 -93
- package/dist/adapters/claim-registry/abi.js.map +0 -1
- package/dist/adapters/claim-registry/client.d.ts +0 -98
- package/dist/adapters/claim-registry/client.js +0 -225
- package/dist/adapters/claim-registry/client.js.map +0 -1
- package/dist/adapters/mech/claim-policy.d.ts +0 -40
- package/dist/adapters/mech/claim-policy.js +0 -104
- package/dist/adapters/mech/claim-policy.js.map +0 -1
- package/dist/harnesses/engine/claim.d.ts +0 -69
- package/dist/harnesses/engine/claim.js +0 -111
- package/dist/harnesses/engine/claim.js.map +0 -1
|
@@ -15,6 +15,15 @@ export function makePredictionApyV0Generator(config = {}) {
|
|
|
15
15
|
const startTs = Math.floor(now / windowDurationMs) * windowDurationMs;
|
|
16
16
|
const endTs = startTs + windowDurationMs;
|
|
17
17
|
const resolveTs = endTs + resolveGapMs;
|
|
18
|
+
const claimPolicy = {
|
|
19
|
+
mode: 'parallel',
|
|
20
|
+
maxClaims: 25,
|
|
21
|
+
maxClaimsPerOperator: 1,
|
|
22
|
+
claimWindowStartTs: startTs,
|
|
23
|
+
claimWindowEndTs: endTs,
|
|
24
|
+
submissionDeadlineTs: endTs,
|
|
25
|
+
claimLeaseTtlSeconds: Math.max(60, Math.floor((endTs - startTs) / 1000)),
|
|
26
|
+
};
|
|
18
27
|
try {
|
|
19
28
|
const resolved = await resolvePredictionApyV0Template({
|
|
20
29
|
id: `pred-apy-v0-auto-${startTs}`,
|
|
@@ -51,6 +60,7 @@ export function makePredictionApyV0Generator(config = {}) {
|
|
|
51
60
|
window: resolved.window,
|
|
52
61
|
spec: resolved.spec,
|
|
53
62
|
eligibility: resolved.eligibility ?? {},
|
|
63
|
+
claimPolicy,
|
|
54
64
|
creator: {
|
|
55
65
|
safeAddress: config.safeAddress,
|
|
56
66
|
agentEoa: config.agentEoa,
|
|
@@ -61,6 +71,7 @@ export function makePredictionApyV0Generator(config = {}) {
|
|
|
61
71
|
const task = {
|
|
62
72
|
...resolved,
|
|
63
73
|
solverType: 'prediction.apy.v0',
|
|
74
|
+
claimPolicy,
|
|
64
75
|
spec: Object.fromEntries(Object.entries((resolved.spec ?? {})).filter(([key]) => key !== 'kind')),
|
|
65
76
|
};
|
|
66
77
|
return { ...task, signedTask: signed };
|
|
@@ -69,6 +80,7 @@ export function makePredictionApyV0Generator(config = {}) {
|
|
|
69
80
|
return {
|
|
70
81
|
...resolved,
|
|
71
82
|
solverType: 'prediction.apy.v0',
|
|
83
|
+
claimPolicy,
|
|
72
84
|
spec: Object.fromEntries(Object.entries((resolved.spec ?? {})).filter(([key]) => key !== 'kind')),
|
|
73
85
|
};
|
|
74
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prediction-apy-v0-auto.js","sourceRoot":"","sources":["../../src/solver-types/prediction-apy-v0-auto.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prediction-apy-v0-auto.js","sourceRoot":"","sources":["../../src/solver-types/prediction-apy-v0-auto.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Auto-generator for prediction.
|
|
2
|
+
* Auto-generator for prediction.v1 tasks.
|
|
3
3
|
*
|
|
4
4
|
* Produces a fresh Task per hour bucket: reads current Chainlink
|
|
5
5
|
* price, builds a template with the configured threshold sentinel
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { type PublicClient } from 'viem';
|
|
15
15
|
import type { Task } from '../types/task.js';
|
|
16
|
-
export interface
|
|
16
|
+
export interface PredictionV1AutoConfig {
|
|
17
17
|
/** Chainlink AggregatorV3 proxy address. Defaults to Base Sepolia ETH/USD. */
|
|
18
18
|
feed: `0x${string}`;
|
|
19
19
|
/** Human-readable feed description embedded in the generated task. */
|
|
@@ -54,10 +54,10 @@ export interface PredictionV0AutoConfig {
|
|
|
54
54
|
/** Agent private key — used to sign the TaskV1. */
|
|
55
55
|
agentPrivateKey?: `0x${string}`;
|
|
56
56
|
}
|
|
57
|
-
export type
|
|
57
|
+
export type PredictionV1Generator = () => Promise<Task | null>;
|
|
58
58
|
/**
|
|
59
59
|
* Build a generator closure. Calling the closure returns a freshly-resolved
|
|
60
60
|
* Task for the current hour bucket, or null if Chainlink is
|
|
61
61
|
* unreachable (caller skips this tick).
|
|
62
62
|
*/
|
|
63
|
-
export declare function
|
|
63
|
+
export declare function makePredictionV1Generator(config: PredictionV1AutoConfig): PredictionV1Generator;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Auto-generator for prediction.
|
|
2
|
+
* Auto-generator for prediction.v1 tasks.
|
|
3
3
|
*
|
|
4
4
|
* Produces a fresh Task per hour bucket: reads current Chainlink
|
|
5
5
|
* price, builds a template with the configured threshold sentinel
|
|
@@ -15,7 +15,7 @@ import { randomUUID } from 'node:crypto';
|
|
|
15
15
|
import { createPublicClient, http } from 'viem';
|
|
16
16
|
import { base, baseSepolia } from 'viem/chains';
|
|
17
17
|
import { readChainlinkLatest, scaleToDecimal } from '../venues/chainlink/client.js';
|
|
18
|
-
import {
|
|
18
|
+
import { resolvePredictionV1Template } from './prediction-v0-template.js';
|
|
19
19
|
import { signTaskV1 } from '../tasks/signing.js';
|
|
20
20
|
// ── Generator factory ──────────────────────────────────────────────────────────
|
|
21
21
|
/**
|
|
@@ -23,7 +23,7 @@ import { signTaskV1 } from '../tasks/signing.js';
|
|
|
23
23
|
* Task for the current hour bucket, or null if Chainlink is
|
|
24
24
|
* unreachable (caller skips this tick).
|
|
25
25
|
*/
|
|
26
|
-
export function
|
|
26
|
+
export function makePredictionV1Generator(config) {
|
|
27
27
|
const threshold = config.thresholdSentinel ?? 'current+0.5%';
|
|
28
28
|
const operator = config.operator ?? 'GT';
|
|
29
29
|
const windowDurationMs = config.windowDurationMs ?? 600_000; // 10 min default (fast-test)
|
|
@@ -48,11 +48,11 @@ export function makePredictionV0Generator(config) {
|
|
|
48
48
|
const endTs = startTs + windowDurationMs;
|
|
49
49
|
const resolveTs = endTs + resolveGapMs;
|
|
50
50
|
const template = {
|
|
51
|
-
id: `pred-
|
|
52
|
-
|
|
51
|
+
id: `pred-v1-auto-${startTs}`,
|
|
52
|
+
solverType: 'prediction.v1',
|
|
53
|
+
description: `Auto-generated prediction.v1 task — ${config.feedDescription} ${operator} ${threshold} at ${new Date(resolveTs).toISOString()}`,
|
|
53
54
|
window: { startTs, endTs },
|
|
54
55
|
spec: {
|
|
55
|
-
kind: 'prediction.v0',
|
|
56
56
|
oracle: {
|
|
57
57
|
venue: config.venue,
|
|
58
58
|
feed: config.feed,
|
|
@@ -66,9 +66,18 @@ export function makePredictionV0Generator(config) {
|
|
|
66
66
|
},
|
|
67
67
|
},
|
|
68
68
|
eligibility: { maxSubmissionDelayMs: 60_000 },
|
|
69
|
+
claimPolicy: {
|
|
70
|
+
mode: 'parallel',
|
|
71
|
+
maxClaims: 25,
|
|
72
|
+
maxClaimsPerOperator: 1,
|
|
73
|
+
claimWindowStartTs: startTs,
|
|
74
|
+
claimWindowEndTs: endTs,
|
|
75
|
+
submissionDeadlineTs: endTs,
|
|
76
|
+
claimLeaseTtlSeconds: Math.max(60, Math.floor((endTs - startTs) / 1000)),
|
|
77
|
+
},
|
|
69
78
|
};
|
|
70
79
|
try {
|
|
71
|
-
const resolved = await
|
|
80
|
+
const resolved = await resolvePredictionV1Template(template, {
|
|
72
81
|
readCurrent: async ({ feed }) => {
|
|
73
82
|
const reading = await readChainlinkLatest(feed, getPublicClient());
|
|
74
83
|
return scaleToDecimal(reading.answer, reading.decimals);
|
|
@@ -81,12 +90,13 @@ export function makePredictionV0Generator(config) {
|
|
|
81
90
|
const taskDoc = {
|
|
82
91
|
schemaVersion: 'task.v1',
|
|
83
92
|
id: resolved.id ?? randomUUID(),
|
|
84
|
-
solverType: 'prediction.
|
|
93
|
+
solverType: 'prediction.v1',
|
|
85
94
|
role: 'restoration',
|
|
86
95
|
description: resolved.description,
|
|
87
96
|
window: resolved.window,
|
|
88
97
|
spec: resolved.spec,
|
|
89
98
|
eligibility: resolved.eligibility ?? {},
|
|
99
|
+
claimPolicy: template.claimPolicy,
|
|
90
100
|
creator: {
|
|
91
101
|
safeAddress: config.safeAddress,
|
|
92
102
|
agentEoa: config.agentEoa,
|
|
@@ -96,7 +106,8 @@ export function makePredictionV0Generator(config) {
|
|
|
96
106
|
const signed = await signTaskV1(taskDoc, config.agentPrivateKey);
|
|
97
107
|
const task = {
|
|
98
108
|
...resolved,
|
|
99
|
-
solverType: 'prediction.
|
|
109
|
+
solverType: 'prediction.v1',
|
|
110
|
+
claimPolicy: template.claimPolicy,
|
|
100
111
|
spec: Object.fromEntries(Object.entries((resolved.spec ?? {})).filter(([key]) => key !== 'kind')),
|
|
101
112
|
};
|
|
102
113
|
return { ...task, signedTask: signed };
|
|
@@ -104,7 +115,8 @@ export function makePredictionV0Generator(config) {
|
|
|
104
115
|
// No signing credentials — return the resolved shape without a signed task.
|
|
105
116
|
return {
|
|
106
117
|
...resolved,
|
|
107
|
-
solverType: 'prediction.
|
|
118
|
+
solverType: 'prediction.v1',
|
|
119
|
+
claimPolicy: template.claimPolicy,
|
|
108
120
|
spec: Object.fromEntries(Object.entries((resolved.spec ?? {})).filter(([key]) => key !== 'kind')),
|
|
109
121
|
};
|
|
110
122
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prediction-v0-auto.js","sourceRoot":"","sources":["../../src/solver-types/prediction-v0-auto.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAqB,MAAM,MAAM,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAGpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAgDjD,kFAAkF;AAElF;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAA8B;IACtE,MAAM,SAAS,GAAG,MAAM,CAAC,iBAAiB,IAAI,cAAc,CAAC;IAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;IACzC,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,OAAO,CAAC,CAAG,6BAA6B;IAC5F,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,OAAO,CAAC,CAAW,gBAAgB;IAE/E,wDAAwD;IACxD,IAAI,YAAY,GAAwB,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC;IACrE,MAAM,eAAe,GAAG,GAAiB,EAAE;QACzC,IAAI,YAAY;YAAE,OAAO,YAAY,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,KAAK,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;QACrE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,gBAAgB;YAChE,CAAC,CAAC,0BAA0B;YAC5B,CAAC,CAAC,0BAA0B,CAAC,CAAC;QAChC,YAAY,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAA4B,CAAC;QACjG,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC;IAEF,OAAO,KAAK,IAA0B,EAAE;QACtC,uEAAuE;QACvE,mDAAmD;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;QACtE,MAAM,KAAK,GAAG,OAAO,GAAG,gBAAgB,CAAC;QACzC,MAAM,SAAS,GAAG,KAAK,GAAG,YAAY,CAAC;QAEvC,MAAM,QAAQ,GAAG;YACf,EAAE,EAAE,gBAAgB,OAAO,EAAE;YAC7B,WAAW,EAAE,uCAAuC,MAAM,CAAC,eAAe,IAAI,QAAQ,IAAI,SAAS,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE;YAC7I,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;YAC1B,IAAI,EAAE;gBACJ,
|
|
1
|
+
{"version":3,"file":"prediction-v0-auto.js","sourceRoot":"","sources":["../../src/solver-types/prediction-v0-auto.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sentinel resolution for prediction.
|
|
2
|
+
* Sentinel resolution for prediction.v1 Task templates.
|
|
3
3
|
*
|
|
4
4
|
* Two sentinels are supported in template JSON (e.g.,
|
|
5
|
-
* `client/fixtures/prediction-
|
|
5
|
+
* `client/fixtures/prediction-v1-task.example.json`):
|
|
6
6
|
*
|
|
7
7
|
* 1. window.startTs = 0 → rewritten as Date.now() at call time; the rest of
|
|
8
8
|
* the window (endTs) and resolveTs are computed relative to that.
|
|
@@ -24,14 +24,14 @@
|
|
|
24
24
|
* unit-testable. Both the `jinn tasks submit --spec-file` path and the
|
|
25
25
|
* future auto-generator (jinn-mono-9ew) call through this helper.
|
|
26
26
|
*/
|
|
27
|
-
import { type
|
|
27
|
+
import { type PredictionV1Task } from '../types/prediction.js';
|
|
28
28
|
/** Returns true iff the given value looks like a "current[±N[%]]" sentinel. */
|
|
29
29
|
export declare function isCurrentSentinel(value: unknown): boolean;
|
|
30
30
|
export interface TemplateReaderDeps {
|
|
31
31
|
/**
|
|
32
32
|
* Read the current price of the Chainlink feed referenced in the template.
|
|
33
33
|
* Required only when the template uses a `current[±…]` threshold sentinel
|
|
34
|
-
* (see {@link
|
|
34
|
+
* (see {@link predictionV1TemplateNeedsReadCurrent}).
|
|
35
35
|
*/
|
|
36
36
|
readCurrent?: (args: {
|
|
37
37
|
feed: `0x${string}`;
|
|
@@ -54,17 +54,17 @@ export declare const DEFAULT_WINDOW_DURATION_MS = 600000;
|
|
|
54
54
|
/** Default resolve gap for the startTs-sentinel fill. Tuned for fast-test. */
|
|
55
55
|
export declare const DEFAULT_RESOLVE_GAP_MS = 300000;
|
|
56
56
|
/**
|
|
57
|
-
* True if {@link
|
|
57
|
+
* True if {@link resolvePredictionV1Template} will call `readCurrent` for this
|
|
58
58
|
* template (Chainlink). `window.startTs === 0` does not need `readCurrent`.
|
|
59
59
|
*/
|
|
60
|
-
export declare function
|
|
60
|
+
export declare function predictionV1TemplateNeedsReadCurrent(template: unknown): boolean;
|
|
61
61
|
/**
|
|
62
|
-
* Resolve all supported sentinels in a raw prediction.
|
|
63
|
-
* parsed, validated
|
|
62
|
+
* Resolve all supported sentinels in a raw prediction.v1 template + return a
|
|
63
|
+
* parsed, validated PredictionV1Task.
|
|
64
64
|
*
|
|
65
|
-
* The template must be the JSON shape of a
|
|
65
|
+
* The template must be the JSON shape of a PredictionV1Task with optional
|
|
66
66
|
* sentinel values. Callers that build the template from multiple sources
|
|
67
67
|
* (CLI --spec-file + --id + --description) should merge their bits BEFORE
|
|
68
68
|
* calling this helper.
|
|
69
69
|
*/
|
|
70
|
-
export declare function
|
|
70
|
+
export declare function resolvePredictionV1Template(template: unknown, deps: TemplateReaderDeps): Promise<PredictionV1Task>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sentinel resolution for prediction.
|
|
2
|
+
* Sentinel resolution for prediction.v1 Task templates.
|
|
3
3
|
*
|
|
4
4
|
* Two sentinels are supported in template JSON (e.g.,
|
|
5
|
-
* `client/fixtures/prediction-
|
|
5
|
+
* `client/fixtures/prediction-v1-task.example.json`):
|
|
6
6
|
*
|
|
7
7
|
* 1. window.startTs = 0 → rewritten as Date.now() at call time; the rest of
|
|
8
8
|
* the window (endTs) and resolveTs are computed relative to that.
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
* unit-testable. Both the `jinn tasks submit --spec-file` path and the
|
|
25
25
|
* future auto-generator (jinn-mono-9ew) call through this helper.
|
|
26
26
|
*/
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
27
|
+
import { PredictionV1TaskSchema, } from '../types/prediction.js';
|
|
28
|
+
import { PREDICTION_V1_KIND } from './constants.js';
|
|
29
29
|
// ── Sentinel parsers ──────────────────────────────────────────────────────────
|
|
30
30
|
/**
|
|
31
31
|
* Parse a `current[±N[%]]` sentinel. Returns a function that takes the current
|
|
@@ -68,33 +68,33 @@ export const DEFAULT_WINDOW_DURATION_MS = 600_000;
|
|
|
68
68
|
/** Default resolve gap for the startTs-sentinel fill. Tuned for fast-test. */
|
|
69
69
|
export const DEFAULT_RESOLVE_GAP_MS = 300_000;
|
|
70
70
|
/**
|
|
71
|
-
* True if {@link
|
|
71
|
+
* True if {@link resolvePredictionV1Template} will call `readCurrent` for this
|
|
72
72
|
* template (Chainlink). `window.startTs === 0` does not need `readCurrent`.
|
|
73
73
|
*/
|
|
74
|
-
export function
|
|
74
|
+
export function predictionV1TemplateNeedsReadCurrent(template) {
|
|
75
75
|
if (typeof template !== 'object' || template === null)
|
|
76
76
|
return false;
|
|
77
77
|
const t = template;
|
|
78
78
|
const spec = t['spec'];
|
|
79
|
-
if (
|
|
79
|
+
if ((t['solverType'] ?? PREDICTION_V1_KIND) !== PREDICTION_V1_KIND)
|
|
80
80
|
return false;
|
|
81
|
-
if (spec
|
|
81
|
+
if (spec?.question?.kind === 'threshold' && typeof spec.question.threshold === 'string') {
|
|
82
82
|
return isCurrentSentinel(spec.question.threshold);
|
|
83
83
|
}
|
|
84
84
|
return false;
|
|
85
85
|
}
|
|
86
86
|
/**
|
|
87
|
-
* Resolve all supported sentinels in a raw prediction.
|
|
88
|
-
* parsed, validated
|
|
87
|
+
* Resolve all supported sentinels in a raw prediction.v1 template + return a
|
|
88
|
+
* parsed, validated PredictionV1Task.
|
|
89
89
|
*
|
|
90
|
-
* The template must be the JSON shape of a
|
|
90
|
+
* The template must be the JSON shape of a PredictionV1Task with optional
|
|
91
91
|
* sentinel values. Callers that build the template from multiple sources
|
|
92
92
|
* (CLI --spec-file + --id + --description) should merge their bits BEFORE
|
|
93
93
|
* calling this helper.
|
|
94
94
|
*/
|
|
95
|
-
export async function
|
|
95
|
+
export async function resolvePredictionV1Template(template, deps) {
|
|
96
96
|
if (typeof template !== 'object' || template === null) {
|
|
97
|
-
throw new Error('
|
|
97
|
+
throw new Error('resolvePredictionV1Template: template must be an object');
|
|
98
98
|
}
|
|
99
99
|
// Shallow clone so we don't mutate caller's input.
|
|
100
100
|
const stub = JSON.parse(JSON.stringify(template));
|
|
@@ -113,13 +113,13 @@ export async function resolvePredictionV0Template(template, deps) {
|
|
|
113
113
|
}
|
|
114
114
|
// ── (2) spec.question.threshold sentinel → absolute price ──────────────────
|
|
115
115
|
const spec = stub['spec'];
|
|
116
|
-
if (spec
|
|
116
|
+
if (spec &&
|
|
117
117
|
spec.question?.kind === 'threshold' &&
|
|
118
118
|
typeof spec.question.threshold === 'string') {
|
|
119
119
|
const t = spec.question.threshold;
|
|
120
120
|
if (isCurrentSentinel(t)) {
|
|
121
121
|
if (!deps.readCurrent) {
|
|
122
|
-
throw new Error('
|
|
122
|
+
throw new Error('resolvePredictionV1Template: readCurrent is required when spec.question.threshold uses a current[±…] sentinel');
|
|
123
123
|
}
|
|
124
124
|
if (!spec.oracle?.feed || !spec.oracle.venue) {
|
|
125
125
|
throw new Error('cannot resolve threshold sentinel: spec.oracle.feed and spec.oracle.venue are required');
|
|
@@ -140,6 +140,6 @@ export async function resolvePredictionV0Template(template, deps) {
|
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
142
|
// Final Zod parse — all refinements (window span, resolveTs offset) enforced.
|
|
143
|
-
return
|
|
143
|
+
return PredictionV1TaskSchema.parse(stub);
|
|
144
144
|
}
|
|
145
145
|
//# sourceMappingURL=prediction-v0-template.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prediction-v0-template.js","sourceRoot":"","sources":["../../src/solver-types/prediction-v0-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EACL,sBAAsB,GAEvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,iFAAiF;AAEjF;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;IAC9B,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACnE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI;YAC3D,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;IACpC,MAAM,KAAK,GAAG,UAAU,CAAC,MAAO,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,yCAAyC,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,CAAC,OAAe,EAAE,EAAE;QACzB,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,kDAAkD,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;QAC/B,kEAAkE;QAClE,kDAAkD;QAClD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,+BAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClF,CAAC;AA2BD,kFAAkF;AAClF,MAAM,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAAC;AAClD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAE9C;;;GAGG;AACH,MAAM,UAAU,oCAAoC,CAAC,QAAiB;IACpE,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACpE,MAAM,CAAC,GAAG,QAAmC,CAAC;IAC9C,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAKR,CAAC;IACd,IAAI,
|
|
1
|
+
{"version":3,"file":"prediction-v0-template.js","sourceRoot":"","sources":["../../src/solver-types/prediction-v0-template.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type PredictionV1AutoConfig } from './prediction-v0-auto.js';
|
|
2
2
|
import type { SolverTypeDefinition } from './solver-type.js';
|
|
3
|
-
export declare const
|
|
3
|
+
export declare const predictionV1: SolverTypeDefinition<PredictionV1AutoConfig>;
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import { BASE_SEPOLIA_FEEDS } from '../venues/chainlink/feeds.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
export const
|
|
6
|
-
solverType:
|
|
2
|
+
import { predictionV1TemplateNeedsReadCurrent, resolvePredictionV1Template, } from './prediction-v0-template.js';
|
|
3
|
+
import { makePredictionV1Generator } from './prediction-v0-auto.js';
|
|
4
|
+
import { PREDICTION_V1_KIND } from './constants.js';
|
|
5
|
+
export const predictionV1 = {
|
|
6
|
+
solverType: PREDICTION_V1_KIND,
|
|
7
7
|
async parseSpec(raw, deps) {
|
|
8
|
-
if (
|
|
9
|
-
throw new Error('prediction.
|
|
8
|
+
if (predictionV1TemplateNeedsReadCurrent(raw) && !deps?.readCurrent) {
|
|
9
|
+
throw new Error('prediction.v1 parseSpec requires readCurrent (Chainlink) when the template uses a current[±…] threshold sentinel');
|
|
10
10
|
}
|
|
11
|
-
const task = await
|
|
11
|
+
const task = await resolvePredictionV1Template(raw, {
|
|
12
12
|
readCurrent: deps?.readCurrent,
|
|
13
13
|
});
|
|
14
14
|
return { window: task.window, spec: task.spec, eligibility: task.eligibility };
|
|
15
15
|
},
|
|
16
|
-
buildGenerator: (config) =>
|
|
16
|
+
buildGenerator: (config) => makePredictionV1Generator(config),
|
|
17
17
|
getTestnetAutoConfig: (ctx) => {
|
|
18
18
|
if (ctx.network !== 'testnet')
|
|
19
19
|
return undefined;
|
|
@@ -25,8 +25,8 @@ export const predictionV0 = {
|
|
|
25
25
|
agentEoa: ctx.agentEoa,
|
|
26
26
|
safeAddress: ctx.safeAddress,
|
|
27
27
|
agentPrivateKey: ctx.agentPrivateKey,
|
|
28
|
-
windowDurationMs: ctx.
|
|
29
|
-
resolveGapMs: ctx.
|
|
28
|
+
windowDurationMs: ctx.predictionV1WindowMs,
|
|
29
|
+
resolveGapMs: ctx.predictionV1ResolveGapMs,
|
|
30
30
|
};
|
|
31
31
|
},
|
|
32
32
|
ui: {
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-generator for prediction.v1 Polymarket forecast rounds.
|
|
3
|
+
*/
|
|
4
|
+
import type { Task } from '../types/task.js';
|
|
5
|
+
import { type PolymarketClientConfig } from '../venues/polymarket/client.js';
|
|
6
|
+
export interface PredictionV1AutoConfig extends PolymarketClientConfig {
|
|
7
|
+
minTimeToResolutionHours?: number;
|
|
8
|
+
maxTimeToResolutionHours?: number;
|
|
9
|
+
minLiquidityUsd?: string;
|
|
10
|
+
minVolume24hUsd?: string;
|
|
11
|
+
maxYesSpread?: string;
|
|
12
|
+
maxOrderbookAgeSeconds?: number;
|
|
13
|
+
maxNewRoundsPerPoll?: number;
|
|
14
|
+
maxNewRoundsPerDay?: number;
|
|
15
|
+
maxOpenRounds?: number;
|
|
16
|
+
submissionWindowMs?: number;
|
|
17
|
+
agentEoa?: `0x${string}`;
|
|
18
|
+
safeAddress?: `0x${string}`;
|
|
19
|
+
agentPrivateKey?: `0x${string}`;
|
|
20
|
+
blocklistConditionIds?: string[];
|
|
21
|
+
}
|
|
22
|
+
export declare function makePredictionV1Generator(config?: PredictionV1AutoConfig): () => Promise<Task[] | null>;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-generator for prediction.v1 Polymarket forecast rounds.
|
|
3
|
+
*/
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
import { signTaskV1 } from '../tasks/signing.js';
|
|
6
|
+
import { getOrderbook, listMarketCandidates, } from '../venues/polymarket/client.js';
|
|
7
|
+
const DEFAULTS = {
|
|
8
|
+
minTimeToResolutionHours: 24,
|
|
9
|
+
maxTimeToResolutionHours: 168,
|
|
10
|
+
minLiquidityUsd: '10000',
|
|
11
|
+
minVolume24hUsd: '2500',
|
|
12
|
+
maxYesSpread: '0.10',
|
|
13
|
+
maxOrderbookAgeSeconds: 60,
|
|
14
|
+
maxNewRoundsPerPoll: 25,
|
|
15
|
+
maxNewRoundsPerDay: 100,
|
|
16
|
+
maxOpenRounds: 250,
|
|
17
|
+
submissionWindowMs: 6 * 60 * 60 * 1000,
|
|
18
|
+
};
|
|
19
|
+
export function makePredictionV1Generator(config = {}) {
|
|
20
|
+
const postedAtByCondition = new Map();
|
|
21
|
+
const postedCountByDay = new Map();
|
|
22
|
+
const blocklist = new Set(config.blocklistConditionIds ?? []);
|
|
23
|
+
return async () => {
|
|
24
|
+
const now = Date.now();
|
|
25
|
+
pruneOpenRounds(postedAtByCondition, now);
|
|
26
|
+
const dayKey = new Date(now).toISOString().slice(0, 10);
|
|
27
|
+
const todayCount = postedCountByDay.get(dayKey) ?? 0;
|
|
28
|
+
const dailyRemaining = Math.max(0, (config.maxNewRoundsPerDay ?? DEFAULTS.maxNewRoundsPerDay) - todayCount);
|
|
29
|
+
const openRemaining = Math.max(0, (config.maxOpenRounds ?? DEFAULTS.maxOpenRounds) - postedAtByCondition.size);
|
|
30
|
+
const pollLimit = Math.min(config.maxNewRoundsPerPoll ?? DEFAULTS.maxNewRoundsPerPoll, dailyRemaining, openRemaining);
|
|
31
|
+
if (pollLimit <= 0)
|
|
32
|
+
return null;
|
|
33
|
+
let candidates;
|
|
34
|
+
try {
|
|
35
|
+
candidates = await listMarketCandidates({ ...config, limit: 250 });
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
const eligible = [];
|
|
41
|
+
for (const market of candidates) {
|
|
42
|
+
if (eligible.length >= pollLimit * 3)
|
|
43
|
+
break;
|
|
44
|
+
if (postedAtByCondition.has(market.conditionId) || blocklist.has(market.conditionId))
|
|
45
|
+
continue;
|
|
46
|
+
const checked = await checkMarketEligibility(market, config, now);
|
|
47
|
+
if (checked)
|
|
48
|
+
eligible.push(checked);
|
|
49
|
+
}
|
|
50
|
+
eligible.sort((a, b) => {
|
|
51
|
+
const liquidityDelta = Number(b.market.liquidityUsd) - Number(a.market.liquidityUsd);
|
|
52
|
+
if (Number.isFinite(liquidityDelta) && liquidityDelta !== 0)
|
|
53
|
+
return liquidityDelta;
|
|
54
|
+
const spreadDelta = Number(a.orderbook.spread) - Number(b.orderbook.spread);
|
|
55
|
+
if (Number.isFinite(spreadDelta) && spreadDelta !== 0)
|
|
56
|
+
return spreadDelta;
|
|
57
|
+
return a.timeToResolutionHours - b.timeToResolutionHours;
|
|
58
|
+
});
|
|
59
|
+
const selected = eligible.slice(0, pollLimit);
|
|
60
|
+
const tasks = [];
|
|
61
|
+
for (const entry of selected) {
|
|
62
|
+
const task = await buildTask(entry, config, now);
|
|
63
|
+
postedAtByCondition.set(entry.market.conditionId, Date.parse(entry.market.endTime));
|
|
64
|
+
tasks.push(task);
|
|
65
|
+
}
|
|
66
|
+
if (tasks.length > 0) {
|
|
67
|
+
postedCountByDay.set(dayKey, todayCount + tasks.length);
|
|
68
|
+
}
|
|
69
|
+
return tasks.length > 0 ? tasks : null;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
async function checkMarketEligibility(market, config, now) {
|
|
73
|
+
if (!market.active || market.closed || market.archived)
|
|
74
|
+
return null;
|
|
75
|
+
if (!market.rulesText.trim())
|
|
76
|
+
return null;
|
|
77
|
+
if (Number(market.liquidityUsd) < Number(config.minLiquidityUsd ?? DEFAULTS.minLiquidityUsd))
|
|
78
|
+
return null;
|
|
79
|
+
if (Number(market.volume24hUsd) < Number(config.minVolume24hUsd ?? DEFAULTS.minVolume24hUsd))
|
|
80
|
+
return null;
|
|
81
|
+
const resolutionMs = Date.parse(market.endTime);
|
|
82
|
+
if (!Number.isFinite(resolutionMs))
|
|
83
|
+
return null;
|
|
84
|
+
const timeToResolutionHours = (resolutionMs - now) / 3_600_000;
|
|
85
|
+
if (timeToResolutionHours < (config.minTimeToResolutionHours ?? DEFAULTS.minTimeToResolutionHours))
|
|
86
|
+
return null;
|
|
87
|
+
if (timeToResolutionHours > (config.maxTimeToResolutionHours ?? DEFAULTS.maxTimeToResolutionHours))
|
|
88
|
+
return null;
|
|
89
|
+
let orderbook;
|
|
90
|
+
try {
|
|
91
|
+
orderbook = await getOrderbook({
|
|
92
|
+
...config,
|
|
93
|
+
marketId: market.marketId,
|
|
94
|
+
conditionId: market.conditionId,
|
|
95
|
+
yesTokenId: market.tokenIds.yes,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
const orderbookAgeSeconds = Math.max(0, (now - Date.parse(orderbook.sampledAt)) / 1000);
|
|
102
|
+
if (orderbookAgeSeconds > (config.maxOrderbookAgeSeconds ?? DEFAULTS.maxOrderbookAgeSeconds))
|
|
103
|
+
return null;
|
|
104
|
+
if (Number(orderbook.spread) > Number(config.maxYesSpread ?? DEFAULTS.maxYesSpread))
|
|
105
|
+
return null;
|
|
106
|
+
return { market, orderbook, timeToResolutionHours, orderbookAgeSeconds };
|
|
107
|
+
}
|
|
108
|
+
async function buildTask(entry, config, now) {
|
|
109
|
+
const { market, orderbook, timeToResolutionHours, orderbookAgeSeconds } = entry;
|
|
110
|
+
const startTs = now;
|
|
111
|
+
const endTs = now + (config.submissionWindowMs ?? DEFAULTS.submissionWindowMs);
|
|
112
|
+
const shortCondition = market.conditionId.replace(/^0x/i, '').slice(0, 16);
|
|
113
|
+
const sampledStamp = orderbook.sampledAt.replace(/[-:]/g, '').replace(/\.\d{3}Z$/, 'Z');
|
|
114
|
+
const id = `prediction-v1-polymarket-${shortCondition}-${sampledStamp}`;
|
|
115
|
+
const claimPolicy = {
|
|
116
|
+
mode: 'parallel',
|
|
117
|
+
maxClaims: 25,
|
|
118
|
+
maxClaimsPerOperator: 1,
|
|
119
|
+
claimLeaseTtlSeconds: 30 * 60,
|
|
120
|
+
};
|
|
121
|
+
const spec = {
|
|
122
|
+
question: {
|
|
123
|
+
kind: 'binary',
|
|
124
|
+
text: market.question,
|
|
125
|
+
yesLabel: 'YES',
|
|
126
|
+
noLabel: 'NO',
|
|
127
|
+
},
|
|
128
|
+
source: {
|
|
129
|
+
type: 'prediction-market',
|
|
130
|
+
venue: 'polymarket',
|
|
131
|
+
url: market.url,
|
|
132
|
+
identifiers: {
|
|
133
|
+
marketId: market.marketId,
|
|
134
|
+
conditionId: market.conditionId,
|
|
135
|
+
yesTokenId: market.tokenIds.yes,
|
|
136
|
+
noTokenId: market.tokenIds.no,
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
resolution: {
|
|
140
|
+
expectedResolutionTime: new Date(Date.parse(market.endTime)).toISOString(),
|
|
141
|
+
rulesText: market.rulesText,
|
|
142
|
+
rulesUrl: market.url,
|
|
143
|
+
timezone: 'UTC',
|
|
144
|
+
},
|
|
145
|
+
consensusSnapshot: {
|
|
146
|
+
sampledAt: orderbook.sampledAt,
|
|
147
|
+
probabilityYes: orderbook.midpointYes,
|
|
148
|
+
method: 'best-bid-ask-midpoint',
|
|
149
|
+
bestBidYes: orderbook.bestBidYes,
|
|
150
|
+
bestAskYes: orderbook.bestAskYes,
|
|
151
|
+
spread: orderbook.spread,
|
|
152
|
+
source: 'polymarket-clob',
|
|
153
|
+
},
|
|
154
|
+
eligibilitySnapshot: {
|
|
155
|
+
sampledAt: new Date(now).toISOString(),
|
|
156
|
+
timeToResolutionHours: Number(timeToResolutionHours.toFixed(2)),
|
|
157
|
+
liquidityUsd: market.liquidityUsd,
|
|
158
|
+
volume24hUsd: market.volume24hUsd,
|
|
159
|
+
orderbookAgeSeconds: Number(orderbookAgeSeconds.toFixed(0)),
|
|
160
|
+
selectionReason: 'weekly-binary-liquid-clear-rules',
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
const eligibility = {
|
|
164
|
+
dedupKey: `polymarket:${market.conditionId}`,
|
|
165
|
+
minTimeToResolutionHours: config.minTimeToResolutionHours ?? DEFAULTS.minTimeToResolutionHours,
|
|
166
|
+
maxTimeToResolutionHours: config.maxTimeToResolutionHours ?? DEFAULTS.maxTimeToResolutionHours,
|
|
167
|
+
minLiquidityUsd: config.minLiquidityUsd ?? DEFAULTS.minLiquidityUsd,
|
|
168
|
+
minVolume24hUsd: config.minVolume24hUsd ?? DEFAULTS.minVolume24hUsd,
|
|
169
|
+
maxYesSpread: config.maxYesSpread ?? DEFAULTS.maxYesSpread,
|
|
170
|
+
maxOrderbookAgeSeconds: config.maxOrderbookAgeSeconds ?? DEFAULTS.maxOrderbookAgeSeconds,
|
|
171
|
+
};
|
|
172
|
+
const baseTask = {
|
|
173
|
+
id,
|
|
174
|
+
description: 'Forecast a binary externally resolved prediction market.',
|
|
175
|
+
solverType: 'prediction.v1',
|
|
176
|
+
role: 'restoration',
|
|
177
|
+
window: { startTs, endTs },
|
|
178
|
+
claimPolicy,
|
|
179
|
+
spec,
|
|
180
|
+
eligibility,
|
|
181
|
+
};
|
|
182
|
+
if (config.agentEoa && config.safeAddress && config.agentPrivateKey) {
|
|
183
|
+
const taskDoc = {
|
|
184
|
+
schemaVersion: 'task.v1',
|
|
185
|
+
id,
|
|
186
|
+
solverType: 'prediction.v1',
|
|
187
|
+
role: 'restoration',
|
|
188
|
+
description: baseTask.description,
|
|
189
|
+
window: baseTask.window,
|
|
190
|
+
claimPolicy,
|
|
191
|
+
spec,
|
|
192
|
+
eligibility,
|
|
193
|
+
creator: {
|
|
194
|
+
safeAddress: config.safeAddress,
|
|
195
|
+
agentEoa: config.agentEoa,
|
|
196
|
+
},
|
|
197
|
+
createdAt: now,
|
|
198
|
+
};
|
|
199
|
+
const signedTask = await signTaskV1(taskDoc, config.agentPrivateKey);
|
|
200
|
+
return { ...baseTask, signedTask };
|
|
201
|
+
}
|
|
202
|
+
return { ...baseTask, id: baseTask.id ?? randomUUID() };
|
|
203
|
+
}
|
|
204
|
+
function pruneOpenRounds(postedAtByCondition, now) {
|
|
205
|
+
for (const [conditionId, endTime] of postedAtByCondition.entries()) {
|
|
206
|
+
if (Number.isFinite(endTime) && endTime < now) {
|
|
207
|
+
postedAtByCondition.delete(conditionId);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=prediction-v1-auto.js.map
|