@jinn-network/client 0.1.1 → 0.1.2-canary.d6e72dfd
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 +14 -0
- package/CONTRIBUTING.md +123 -0
- package/README.md +210 -37
- package/deployments/deployment-claim-registry-baseSepolia.json +13 -0
- package/deployments/deployment-jinn-testnet-faucet-baseSepolia-fast.json +15 -0
- package/dist/adapters/claim-registry/abi.d.ts +127 -0
- package/dist/adapters/claim-registry/abi.js +93 -0
- package/dist/adapters/claim-registry/abi.js.map +1 -0
- package/dist/adapters/claim-registry/client.d.ts +89 -0
- package/dist/adapters/claim-registry/client.js +205 -0
- package/dist/adapters/claim-registry/client.js.map +1 -0
- package/dist/adapters/mech/adapter.d.ts +1 -0
- package/dist/adapters/mech/adapter.js +75 -41
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +2 -0
- package/dist/adapters/mech/contracts.js +57 -7
- package/dist/adapters/mech/contracts.js.map +1 -1
- package/dist/adapters/mech/ipfs.d.ts +8 -0
- package/dist/adapters/mech/ipfs.js +12 -0
- package/dist/adapters/mech/ipfs.js.map +1 -1
- package/dist/adapters/mech/types.d.ts +20 -46
- package/dist/adapters/mech/types.js +16 -35
- package/dist/adapters/mech/types.js.map +1 -1
- package/dist/api/gather-status.d.ts +1 -0
- package/dist/api/gather-status.js +33 -1
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/portfolio-v0-build.d.ts +81 -0
- package/dist/api/portfolio-v0-build.js +141 -0
- package/dist/api/portfolio-v0-build.js.map +1 -0
- package/dist/api/portfolio-v0-doctor.d.ts +37 -0
- package/dist/api/portfolio-v0-doctor.js +123 -0
- package/dist/api/portfolio-v0-doctor.js.map +1 -0
- package/dist/api/rewards-build.js +1 -1
- package/dist/api/rewards-build.js.map +1 -1
- package/dist/api/status-build.d.ts +7 -0
- package/dist/api/status-build.js +1 -0
- package/dist/api/status-build.js.map +1 -1
- package/dist/bin/jinn-mcp.d.ts +0 -12
- package/dist/bin/jinn-mcp.js +5 -14
- package/dist/bin/jinn-mcp.js.map +1 -1
- package/dist/build-meta.json +1 -1
- package/dist/cli/commands/auth.js +115 -25
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/bootstrap.js +1 -0
- package/dist/cli/commands/bootstrap.js.map +1 -1
- package/dist/cli/commands/doctor.js +130 -14
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/fleet-scale.js +1 -0
- package/dist/cli/commands/fleet-scale.js.map +1 -1
- package/dist/cli/commands/fund-requirements.js +2 -0
- package/dist/cli/commands/fund-requirements.js.map +1 -1
- package/dist/cli/commands/intents.d.ts +17 -0
- package/dist/cli/commands/intents.js +489 -0
- package/dist/cli/commands/intents.js.map +1 -0
- package/dist/cli/commands/keys-backup.js +13 -11
- package/dist/cli/commands/keys-backup.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts +3 -0
- package/dist/cli/commands/mcp.js +19 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/plugin-install.js +8 -4
- package/dist/cli/commands/plugin-install.js.map +1 -1
- package/dist/cli/commands/quickstart.js +60 -4
- package/dist/cli/commands/quickstart.js.map +1 -1
- package/dist/cli/commands/rewards.js +27 -1
- package/dist/cli/commands/rewards.js.map +1 -1
- package/dist/cli/commands/submit-intent.js +108 -5
- package/dist/cli/commands/submit-intent.js.map +1 -1
- package/dist/cli/commands/version.js +1 -0
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/cli/deployment-digest.js +5 -0
- package/dist/cli/deployment-digest.js.map +1 -1
- package/dist/cli/execution-context.js +1 -0
- package/dist/cli/execution-context.js.map +1 -1
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/intent-registry-access.d.ts +64 -0
- package/dist/cli/intent-registry-access.js +187 -0
- package/dist/cli/intent-registry-access.js.map +1 -0
- package/dist/cli/introspection-context.js +1 -0
- package/dist/cli/introspection-context.js.map +1 -1
- package/dist/cli/password.d.ts +21 -9
- package/dist/cli/password.js +45 -24
- package/dist/cli/password.js.map +1 -1
- package/dist/config.d.ts +110 -8
- package/dist/config.js +41 -12
- package/dist/config.js.map +1 -1
- package/dist/daemon/creator.d.ts +7 -1
- package/dist/daemon/creator.js +38 -3
- package/dist/daemon/creator.js.map +1 -1
- package/dist/daemon/daemon.d.ts +43 -0
- package/dist/daemon/daemon.js +87 -2
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/earning/bootstrap.d.ts +2 -1
- package/dist/earning/bootstrap.js +72 -4
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/contracts.d.ts +10 -0
- package/dist/earning/contracts.js +24 -0
- package/dist/earning/contracts.js.map +1 -1
- package/dist/earning/jinn-rewards.d.ts +9 -0
- package/dist/earning/jinn-rewards.js +7 -0
- package/dist/earning/jinn-rewards.js.map +1 -1
- package/dist/intents/prediction-apy-v0-auto.d.ts +11 -0
- package/dist/intents/prediction-apy-v0-auto.js +46 -0
- package/dist/intents/prediction-apy-v0-auto.js.map +1 -0
- package/dist/intents/prediction-apy-v0-template.d.ts +8 -0
- package/dist/intents/prediction-apy-v0-template.js +22 -0
- package/dist/intents/prediction-apy-v0-template.js.map +1 -0
- package/dist/intents/prediction-v0-auto.d.ts +53 -0
- package/dist/intents/prediction-v0-auto.js +84 -0
- package/dist/intents/prediction-v0-auto.js.map +1 -0
- package/dist/intents/prediction-v0-template.d.ts +65 -0
- package/dist/intents/prediction-v0-template.js +125 -0
- package/dist/intents/prediction-v0-template.js.map +1 -0
- package/dist/main.js +149 -1
- package/dist/main.js.map +1 -1
- package/dist/mcp/operator-server.d.ts +1 -1
- package/dist/mcp/operator-server.js +1 -1
- package/dist/preflight/claude-auth.d.ts +12 -1
- package/dist/preflight/claude-auth.js +21 -3
- package/dist/preflight/claude-auth.js.map +1 -1
- package/dist/restorer/engine/canonical-json.d.ts +18 -0
- package/dist/restorer/engine/canonical-json.js +59 -0
- package/dist/restorer/engine/canonical-json.js.map +1 -0
- package/dist/restorer/engine/claim.d.ts +69 -0
- package/dist/restorer/engine/claim.js +104 -0
- package/dist/restorer/engine/claim.js.map +1 -0
- package/dist/restorer/engine/delivery.d.ts +52 -0
- package/dist/restorer/engine/delivery.js +63 -0
- package/dist/restorer/engine/delivery.js.map +1 -0
- package/dist/restorer/engine/engine.d.ts +203 -0
- package/dist/restorer/engine/engine.js +753 -0
- package/dist/restorer/engine/engine.js.map +1 -0
- package/dist/restorer/engine/manifest-assembly.d.ts +67 -0
- package/dist/restorer/engine/manifest-assembly.js +79 -0
- package/dist/restorer/engine/manifest-assembly.js.map +1 -0
- package/dist/restorer/engine/packaging.d.ts +87 -0
- package/dist/restorer/engine/packaging.js +350 -0
- package/dist/restorer/engine/packaging.js.map +1 -0
- package/dist/restorer/engine/persistence.d.ts +170 -0
- package/dist/restorer/engine/persistence.js +381 -0
- package/dist/restorer/engine/persistence.js.map +1 -0
- package/dist/restorer/engine/recovery.d.ts +22 -0
- package/dist/restorer/engine/recovery.js +24 -0
- package/dist/restorer/engine/recovery.js.map +1 -0
- package/dist/restorer/engine/registry.d.ts +62 -0
- package/dist/restorer/engine/registry.js +73 -0
- package/dist/restorer/engine/registry.js.map +1 -0
- package/dist/restorer/engine/signing.d.ts +30 -0
- package/dist/restorer/engine/signing.js +39 -0
- package/dist/restorer/engine/signing.js.map +1 -0
- package/dist/restorer/engine/state.d.ts +42 -0
- package/dist/restorer/engine/state.js +87 -0
- package/dist/restorer/engine/state.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.d.ts +64 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js +96 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.d.ts +101 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.js +710 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +137 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js +865 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.d.ts +74 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js +74 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.d.ts +97 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js +226 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction/index.d.ts +43 -0
- package/dist/restorer/impls/claude-mcp-prediction/index.js +230 -0
- package/dist/restorer/impls/claude-mcp-prediction/index.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction/mcp-tools.d.ts +38 -0
- package/dist/restorer/impls/claude-mcp-prediction/mcp-tools.js +135 -0
- package/dist/restorer/impls/claude-mcp-prediction/mcp-tools.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction/prompt.d.ts +8 -0
- package/dist/restorer/impls/claude-mcp-prediction/prompt.js +54 -0
- package/dist/restorer/impls/claude-mcp-prediction/prompt.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.d.ts +36 -0
- package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.js +137 -0
- package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction/types.d.ts +82 -0
- package/dist/restorer/impls/claude-mcp-prediction/types.js +6 -0
- package/dist/restorer/impls/claude-mcp-prediction/types.js.map +1 -0
- package/dist/restorer/impls/legacy-claude/index.d.ts +45 -0
- package/dist/restorer/impls/legacy-claude/index.js +71 -0
- package/dist/restorer/impls/legacy-claude/index.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.d.ts +68 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js +117 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.d.ts +49 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js +91 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.d.ts +78 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js +274 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.d.ts +23 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js +49 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.d.ts +25 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js +44 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.d.ts +17 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js +43 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/index.d.ts +43 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/index.js +431 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/index.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/score.d.ts +21 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/score.js +32 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/score.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/types.d.ts +32 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/types.js +8 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/types.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/index.d.ts +39 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/index.js +98 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/index.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/strategy.d.ts +2 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/strategy.js +7 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/strategy.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/types.d.ts +4 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/types.js +2 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/types.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.d.ts +2 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.js +7 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/index.d.ts +39 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/index.js +186 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/index.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/score.d.ts +9 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/score.js +20 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/score.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/types.d.ts +7 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/types.js +2 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/types.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-baseline/index.d.ts +29 -0
- package/dist/restorer/impls/prediction-v0-baseline/index.js +94 -0
- package/dist/restorer/impls/prediction-v0-baseline/index.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-baseline/strategy.d.ts +8 -0
- package/dist/restorer/impls/prediction-v0-baseline/strategy.js +41 -0
- package/dist/restorer/impls/prediction-v0-baseline/strategy.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-baseline/types.d.ts +7 -0
- package/dist/restorer/impls/prediction-v0-baseline/types.js +2 -0
- package/dist/restorer/impls/prediction-v0-baseline/types.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.d.ts +20 -0
- package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.js +66 -0
- package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.d.ts +9 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.js +23 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.d.ts +3 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.js +13 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.d.ts +7 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js +93 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.d.ts +5 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.js +20 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/index.d.ts +33 -0
- package/dist/restorer/impls/prediction-v0-evaluator/index.js +208 -0
- package/dist/restorer/impls/prediction-v0-evaluator/index.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/score.d.ts +8 -0
- package/dist/restorer/impls/prediction-v0-evaluator/score.js +15 -0
- package/dist/restorer/impls/prediction-v0-evaluator/score.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/types.d.ts +7 -0
- package/dist/restorer/impls/prediction-v0-evaluator/types.js +2 -0
- package/dist/restorer/impls/prediction-v0-evaluator/types.js.map +1 -0
- package/dist/restorer/types.d.ts +177 -0
- package/dist/restorer/types.js +7 -0
- package/dist/restorer/types.js.map +1 -0
- package/dist/store/store.d.ts +3 -1
- package/dist/store/store.js +3 -0
- package/dist/store/store.js.map +1 -1
- package/dist/types/desired-state.d.ts +53 -0
- package/dist/types/desired-state.js +20 -0
- package/dist/types/desired-state.js.map +1 -1
- package/dist/types/index.d.ts +4 -1
- package/dist/types/index.js +4 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/portfolio.d.ts +1000 -0
- package/dist/types/portfolio.js +168 -0
- package/dist/types/portfolio.js.map +1 -0
- package/dist/types/prediction-apy.d.ts +919 -0
- package/dist/types/prediction-apy.js +121 -0
- package/dist/types/prediction-apy.js.map +1 -0
- package/dist/types/prediction.d.ts +925 -0
- package/dist/types/prediction.js +140 -0
- package/dist/types/prediction.js.map +1 -0
- package/dist/venues/aave-v3/addresses.d.ts +6 -0
- package/dist/venues/aave-v3/addresses.js +19 -0
- package/dist/venues/aave-v3/addresses.js.map +1 -0
- package/dist/venues/aave-v3/client.d.ts +81 -0
- package/dist/venues/aave-v3/client.js +97 -0
- package/dist/venues/aave-v3/client.js.map +1 -0
- package/dist/venues/chainlink/client.d.ts +99 -0
- package/dist/venues/chainlink/client.js +130 -0
- package/dist/venues/chainlink/client.js.map +1 -0
- package/dist/venues/chainlink/feeds.d.ts +8 -0
- package/dist/venues/chainlink/feeds.js +9 -0
- package/dist/venues/chainlink/feeds.js.map +1 -0
- package/dist/venues/hyperliquid/account-value.d.ts +30 -0
- package/dist/venues/hyperliquid/account-value.js +30 -0
- package/dist/venues/hyperliquid/account-value.js.map +1 -0
- package/dist/venues/hyperliquid/client.d.ts +63 -0
- package/dist/venues/hyperliquid/client.js +135 -0
- package/dist/venues/hyperliquid/client.js.map +1 -0
- package/dist/venues/hyperliquid/grid.d.ts +36 -0
- package/dist/venues/hyperliquid/grid.js +61 -0
- package/dist/venues/hyperliquid/grid.js.map +1 -0
- package/dist/venues/hyperliquid/types.d.ts +81 -0
- package/dist/venues/hyperliquid/types.js +8 -0
- package/dist/venues/hyperliquid/types.js.map +1 -0
- package/dist/withdraw/run-withdraw-plan.js +2 -0
- package/dist/withdraw/run-withdraw-plan.js.map +1 -1
- package/docker-compose.yml +44 -0
- package/package.json +12 -1
- package/skills/jinn-operator/SKILL.md +85 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Availability checks for portfolio.v0.eval — §7.4.
|
|
3
|
+
*
|
|
4
|
+
* availability.hyperliquid_reachable
|
|
5
|
+
* availability.hl_pre_snapshot_rederivable
|
|
6
|
+
* availability.hl_fills_rederivable
|
|
7
|
+
*
|
|
8
|
+
* FAIL in any of these → verdict INDETERMINATE per §7.3.
|
|
9
|
+
*/
|
|
10
|
+
import { bracketGridPoints } from '../../../../venues/hyperliquid/grid.js';
|
|
11
|
+
// ── hyperliquid_reachable ─────────────────────────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* Wraps a HL API call that should succeed if HL is reachable.
|
|
14
|
+
*
|
|
15
|
+
* Returns PASS if the call completes without throwing, FAIL otherwise.
|
|
16
|
+
*/
|
|
17
|
+
export function checkHlReachable(reachable, errorMsg) {
|
|
18
|
+
if (reachable) {
|
|
19
|
+
return { name: 'availability.hyperliquid_reachable', status: 'PASS' };
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
name: 'availability.hyperliquid_reachable',
|
|
23
|
+
status: 'FAIL',
|
|
24
|
+
detail: errorMsg ?? 'Hyperliquid API is unreachable',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// ── hl_pre_snapshot_rederivable ───────────────────────────────────────────────
|
|
28
|
+
/**
|
|
29
|
+
* Check whether the pre-snapshot equity can be rederived from the portfolio
|
|
30
|
+
* grid. A bracket must exist around preTs.
|
|
31
|
+
*
|
|
32
|
+
* Returns PASS if a bracket is found, FAIL if the grid has no bracket.
|
|
33
|
+
*/
|
|
34
|
+
export function checkPreSnapshotRederivable(grid, preTs) {
|
|
35
|
+
const bracket = bracketGridPoints(grid, preTs);
|
|
36
|
+
if (bracket !== null) {
|
|
37
|
+
return { name: 'availability.hl_pre_snapshot_rederivable', status: 'PASS' };
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
name: 'availability.hl_pre_snapshot_rederivable',
|
|
41
|
+
status: 'FAIL',
|
|
42
|
+
detail: `No grid bracket found for preTs=${preTs}`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// ── hl_fills_rederivable ──────────────────────────────────────────────────────
|
|
46
|
+
/**
|
|
47
|
+
* Check whether fills could be fetched without clamping.
|
|
48
|
+
*
|
|
49
|
+
* If startTimeClamped is true, HL silently moved the retention horizon and
|
|
50
|
+
* fills are incomplete — FAIL.
|
|
51
|
+
*/
|
|
52
|
+
export function checkFillsRederivable(startTimeClamped) {
|
|
53
|
+
if (!startTimeClamped) {
|
|
54
|
+
return { name: 'availability.hl_fills_rederivable', status: 'PASS' };
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
name: 'availability.hl_fills_rederivable',
|
|
58
|
+
status: 'FAIL',
|
|
59
|
+
detail: 'HL userFillsByTime startTime was clamped to retention horizon — fills are incomplete',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// ── Post-snapshot funding-accrual edge case ───────────────────────────────────
|
|
63
|
+
/**
|
|
64
|
+
* Check whether the post-snapshot is rederivable (no funding accrual issue).
|
|
65
|
+
*
|
|
66
|
+
* Per §7.5: if postSnapshot.capturedAt > endTs + 60s, emit SKIP and
|
|
67
|
+
* downstream consistency checks should be skipped → INDETERMINATE.
|
|
68
|
+
*
|
|
69
|
+
* This check is named availability.hl_post_snapshot_rederivable and uses
|
|
70
|
+
* SKIP status to propagate INDETERMINATE via the derivation rule (SKIP ≠ FAIL
|
|
71
|
+
* for availability — a FAIL would cause INDETERMINATE, but SKIP means we
|
|
72
|
+
* surface it separately).
|
|
73
|
+
*
|
|
74
|
+
* However, per §7.3 the derivation rule is:
|
|
75
|
+
* if any "availability.*" FAIL → INDETERMINATE
|
|
76
|
+
*
|
|
77
|
+
* A SKIP doesn't trigger INDETERMINATE via the rule, so the eval impl must
|
|
78
|
+
* handle this edge case explicitly by checking for SKIP in downstream checks.
|
|
79
|
+
*/
|
|
80
|
+
export function checkPostSnapshotFundingAccrual(postCapturedAt, endTs) {
|
|
81
|
+
const threshold = endTs + 60_000; // 60 seconds
|
|
82
|
+
if (postCapturedAt > threshold) {
|
|
83
|
+
return {
|
|
84
|
+
name: 'availability.hl_post_snapshot_rederivable',
|
|
85
|
+
status: 'SKIP',
|
|
86
|
+
detail: `postSnapshot.capturedAt (${postCapturedAt}) > endTs+60s (${threshold}) — funding may have accrued`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return { name: 'availability.hl_post_snapshot_rederivable', status: 'PASS' };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=availability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"availability.js","sourceRoot":"","sources":["../../../../../src/restorer/impls/portfolio-v0-evaluator/checks/availability.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAG3E,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAkB,EAAE,QAAiB;IACpE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,EAAE,IAAI,EAAE,oCAAoC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACxE,CAAC;IACD,OAAO;QACL,IAAI,EAAE,oCAAoC;QAC1C,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,QAAQ,IAAI,gCAAgC;KACrD,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAAmB,EACnB,KAAa;IAEb,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,0CAA0C,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC9E,CAAC;IACD,OAAO;QACL,IAAI,EAAE,0CAA0C;QAChD,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,mCAAmC,KAAK,EAAE;KACnD,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,gBAAyB;IAC7D,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,mCAAmC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACvE,CAAC;IACD,OAAO;QACL,IAAI,EAAE,mCAAmC;QACzC,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,sFAAsF;KAC/F,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,+BAA+B,CAC7C,cAAsB,EACtB,KAAa;IAEb,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC,aAAa;IAC/C,IAAI,cAAc,GAAG,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,2CAA2C;YACjD,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,4BAA4B,cAAc,kBAAkB,SAAS,8BAA8B;SAC5G,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,2CAA2C,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consistency checks for portfolio.v0.eval — §7.4.
|
|
3
|
+
*
|
|
4
|
+
* consistency.pre_snapshot
|
|
5
|
+
* consistency.post_snapshot
|
|
6
|
+
* consistency.fills (set match by tid; per-fill fields exact)
|
|
7
|
+
* consistency.gating.equity_return
|
|
8
|
+
* consistency.gating.max_drawdown
|
|
9
|
+
* consistency.gating.closed_trades
|
|
10
|
+
* consistency.gating.traded_notional
|
|
11
|
+
*
|
|
12
|
+
* FAIL in any consistency.* check → verdict FAIL per §7.3.
|
|
13
|
+
*
|
|
14
|
+
* Tolerance rules per §7.5:
|
|
15
|
+
* Snapshot decimal fields: 0.01% relative OR 0.0001 USD absolute (whichever greater)
|
|
16
|
+
* Per-fill HL fields: exact
|
|
17
|
+
* Fills set membership (by tid): exact
|
|
18
|
+
* equityReturnPct, maxDrawdownPct: 0.05% absolute
|
|
19
|
+
* closedTradesCount: exact
|
|
20
|
+
* tradedNotionalMultiple: 0.05% relative
|
|
21
|
+
*/
|
|
22
|
+
import type { HlFill } from '../../../../venues/hyperliquid/types.js';
|
|
23
|
+
import type { Check } from '../types.js';
|
|
24
|
+
/**
|
|
25
|
+
* Extract the canonical accountValue from a snapshot payload.
|
|
26
|
+
*
|
|
27
|
+
* Supports two shapes:
|
|
28
|
+
* 1. Legacy: `{ marginSummary: { accountValue } }` (HL's raw clearinghouseState).
|
|
29
|
+
* 2. Unified (current restorer): `{ accountValue, clearinghouseState, spotClearinghouseState, ... }`
|
|
30
|
+
* — top-level `accountValue` is perps margin + spot USDC, matching HL's
|
|
31
|
+
* `portfolio` endpoint unified equity.
|
|
32
|
+
*/
|
|
33
|
+
export declare function extractAccountValue(payload: unknown): number | null;
|
|
34
|
+
/**
|
|
35
|
+
* Check pre-snapshot consistency.
|
|
36
|
+
*
|
|
37
|
+
* Compares accountValue between claimed and rederived pre-snapshot.
|
|
38
|
+
* If either snapshot lacks a parseable accountValue, SKIP (not enough data).
|
|
39
|
+
*/
|
|
40
|
+
export declare function checkPreSnapshot(claimedPayload: unknown, rederived: {
|
|
41
|
+
capturedAt: number;
|
|
42
|
+
payload: unknown;
|
|
43
|
+
} | null): Check;
|
|
44
|
+
/**
|
|
45
|
+
* Check post-snapshot consistency.
|
|
46
|
+
*
|
|
47
|
+
* Compares accountValue between claimed and rederived post-snapshot.
|
|
48
|
+
* If postSnapshot rederivation was skipped (funding accrual), SKIP.
|
|
49
|
+
*/
|
|
50
|
+
export declare function checkPostSnapshot(claimedPayload: unknown, rederived: {
|
|
51
|
+
capturedAt: number;
|
|
52
|
+
payload: unknown;
|
|
53
|
+
} | null): Check;
|
|
54
|
+
/**
|
|
55
|
+
* Check fills consistency: set membership by tid (exact), and per-fill field
|
|
56
|
+
* equality for px, sz, time, fee, closedPnl.
|
|
57
|
+
*/
|
|
58
|
+
export declare function checkFills(claimedFills: unknown[], rederived: HlFill[]): Check;
|
|
59
|
+
/**
|
|
60
|
+
* Check consistency of equityReturnPct (claimed vs rederived).
|
|
61
|
+
* Tolerance: 0.05% absolute.
|
|
62
|
+
*/
|
|
63
|
+
export declare function checkGatingEquityReturn(claimed: string, rederived: number): Check;
|
|
64
|
+
/**
|
|
65
|
+
* Check consistency of maxDrawdownPct (claimed vs rederived).
|
|
66
|
+
* Tolerance: 0.05% absolute.
|
|
67
|
+
*/
|
|
68
|
+
export declare function checkGatingMaxDrawdown(claimed: string, rederived: number): Check;
|
|
69
|
+
/**
|
|
70
|
+
* Check consistency of closedTradesCount (claimed vs rederived).
|
|
71
|
+
* Tolerance: exact.
|
|
72
|
+
*/
|
|
73
|
+
export declare function checkGatingClosedTrades(claimed: number, rederived: number): Check;
|
|
74
|
+
/**
|
|
75
|
+
* Check consistency of tradedNotionalMultiple (claimed vs rederived).
|
|
76
|
+
* Tolerance: 0.05% relative.
|
|
77
|
+
*/
|
|
78
|
+
export declare function checkGatingTradedNotional(claimed: string, rederived: number): Check;
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consistency checks for portfolio.v0.eval — §7.4.
|
|
3
|
+
*
|
|
4
|
+
* consistency.pre_snapshot
|
|
5
|
+
* consistency.post_snapshot
|
|
6
|
+
* consistency.fills (set match by tid; per-fill fields exact)
|
|
7
|
+
* consistency.gating.equity_return
|
|
8
|
+
* consistency.gating.max_drawdown
|
|
9
|
+
* consistency.gating.closed_trades
|
|
10
|
+
* consistency.gating.traded_notional
|
|
11
|
+
*
|
|
12
|
+
* FAIL in any consistency.* check → verdict FAIL per §7.3.
|
|
13
|
+
*
|
|
14
|
+
* Tolerance rules per §7.5:
|
|
15
|
+
* Snapshot decimal fields: 0.01% relative OR 0.0001 USD absolute (whichever greater)
|
|
16
|
+
* Per-fill HL fields: exact
|
|
17
|
+
* Fills set membership (by tid): exact
|
|
18
|
+
* equityReturnPct, maxDrawdownPct: 0.05% absolute
|
|
19
|
+
* closedTradesCount: exact
|
|
20
|
+
* tradedNotionalMultiple: 0.05% relative
|
|
21
|
+
*/
|
|
22
|
+
// ── Tolerance helpers ─────────────────────────────────────────────────────────
|
|
23
|
+
const SNAPSHOT_REL_TOL = 0.0001; // 0.01%
|
|
24
|
+
const SNAPSHOT_ABS_TOL = 0.0001; // 0.0001 USD
|
|
25
|
+
const METRIC_ABS_TOL = 0.05; // 0.05% absolute (for equityReturnPct, maxDrawdownPct)
|
|
26
|
+
const NOTIONAL_REL_TOL = 0.0005; // 0.05% relative (for tradedNotionalMultiple)
|
|
27
|
+
/**
|
|
28
|
+
* Snapshot field comparison: 0.01% relative OR 0.0001 absolute, whichever is greater.
|
|
29
|
+
*/
|
|
30
|
+
function snapshotFieldClose(claimed, rederived) {
|
|
31
|
+
const absDiff = Math.abs(claimed - rederived);
|
|
32
|
+
const relTol = Math.abs(claimed) * SNAPSHOT_REL_TOL;
|
|
33
|
+
const effectiveTol = Math.max(relTol, SNAPSHOT_ABS_TOL);
|
|
34
|
+
return absDiff <= effectiveTol;
|
|
35
|
+
}
|
|
36
|
+
// ── Snapshot checks ───────────────────────────────────────────────────────────
|
|
37
|
+
/**
|
|
38
|
+
* Extract the canonical accountValue from a snapshot payload.
|
|
39
|
+
*
|
|
40
|
+
* Supports two shapes:
|
|
41
|
+
* 1. Legacy: `{ marginSummary: { accountValue } }` (HL's raw clearinghouseState).
|
|
42
|
+
* 2. Unified (current restorer): `{ accountValue, clearinghouseState, spotClearinghouseState, ... }`
|
|
43
|
+
* — top-level `accountValue` is perps margin + spot USDC, matching HL's
|
|
44
|
+
* `portfolio` endpoint unified equity.
|
|
45
|
+
*/
|
|
46
|
+
export function extractAccountValue(payload) {
|
|
47
|
+
if (payload !== null &&
|
|
48
|
+
typeof payload === 'object' &&
|
|
49
|
+
'marginSummary' in payload) {
|
|
50
|
+
const ms = payload.marginSummary;
|
|
51
|
+
if (ms !== null && typeof ms === 'object' && 'accountValue' in ms) {
|
|
52
|
+
const val = parseFloat(String(ms.accountValue));
|
|
53
|
+
return isNaN(val) ? null : val;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Also try direct accountValue field
|
|
57
|
+
if (payload !== null && typeof payload === 'object' && 'accountValue' in payload) {
|
|
58
|
+
const val = parseFloat(String(payload.accountValue));
|
|
59
|
+
return isNaN(val) ? null : val;
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check pre-snapshot consistency.
|
|
65
|
+
*
|
|
66
|
+
* Compares accountValue between claimed and rederived pre-snapshot.
|
|
67
|
+
* If either snapshot lacks a parseable accountValue, SKIP (not enough data).
|
|
68
|
+
*/
|
|
69
|
+
export function checkPreSnapshot(claimedPayload, rederived) {
|
|
70
|
+
if (rederived === null) {
|
|
71
|
+
return {
|
|
72
|
+
name: 'consistency.pre_snapshot',
|
|
73
|
+
status: 'SKIP',
|
|
74
|
+
detail: 'Pre-snapshot rederivation was skipped (no grid bracket)',
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const claimedValue = extractAccountValue(claimedPayload);
|
|
78
|
+
const rederivValue = extractAccountValue(rederived.payload);
|
|
79
|
+
if (claimedValue === null || rederivValue === null) {
|
|
80
|
+
return {
|
|
81
|
+
name: 'consistency.pre_snapshot',
|
|
82
|
+
status: 'SKIP',
|
|
83
|
+
detail: 'Could not extract accountValue from snapshot payload(s)',
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (snapshotFieldClose(claimedValue, rederivValue)) {
|
|
87
|
+
return { name: 'consistency.pre_snapshot', status: 'PASS' };
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
name: 'consistency.pre_snapshot',
|
|
91
|
+
status: 'FAIL',
|
|
92
|
+
detail: {
|
|
93
|
+
claimed: claimedValue,
|
|
94
|
+
rederived: rederivValue,
|
|
95
|
+
absDiff: Math.abs(claimedValue - rederivValue),
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Check post-snapshot consistency.
|
|
101
|
+
*
|
|
102
|
+
* Compares accountValue between claimed and rederived post-snapshot.
|
|
103
|
+
* If postSnapshot rederivation was skipped (funding accrual), SKIP.
|
|
104
|
+
*/
|
|
105
|
+
export function checkPostSnapshot(claimedPayload, rederived) {
|
|
106
|
+
if (rederived === null) {
|
|
107
|
+
return {
|
|
108
|
+
name: 'consistency.post_snapshot',
|
|
109
|
+
status: 'SKIP',
|
|
110
|
+
detail: 'Post-snapshot rederivation was skipped',
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
const claimedValue = extractAccountValue(claimedPayload);
|
|
114
|
+
const rederivValue = extractAccountValue(rederived.payload);
|
|
115
|
+
if (claimedValue === null || rederivValue === null) {
|
|
116
|
+
return {
|
|
117
|
+
name: 'consistency.post_snapshot',
|
|
118
|
+
status: 'SKIP',
|
|
119
|
+
detail: 'Could not extract accountValue from snapshot payload(s)',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (snapshotFieldClose(claimedValue, rederivValue)) {
|
|
123
|
+
return { name: 'consistency.post_snapshot', status: 'PASS' };
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
name: 'consistency.post_snapshot',
|
|
127
|
+
status: 'FAIL',
|
|
128
|
+
detail: {
|
|
129
|
+
claimed: claimedValue,
|
|
130
|
+
rederived: rederivValue,
|
|
131
|
+
absDiff: Math.abs(claimedValue - rederivValue),
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// ── Fills consistency ─────────────────────────────────────────────────────────
|
|
136
|
+
/**
|
|
137
|
+
* Check fills consistency: set membership by tid (exact), and per-fill field
|
|
138
|
+
* equality for px, sz, time, fee, closedPnl.
|
|
139
|
+
*/
|
|
140
|
+
export function checkFills(claimedFills, rederived) {
|
|
141
|
+
const claimed = claimedFills;
|
|
142
|
+
// Set membership by tid — exact match required
|
|
143
|
+
const claimedTids = new Set(claimed.map((f) => f.tid));
|
|
144
|
+
const rederivTids = new Set(rederived.map((f) => f.tid));
|
|
145
|
+
const missingInRederived = [...claimedTids].filter((t) => !rederivTids.has(t));
|
|
146
|
+
const extraInRederived = [...rederivTids].filter((t) => !claimedTids.has(t));
|
|
147
|
+
if (missingInRederived.length > 0 || extraInRederived.length > 0) {
|
|
148
|
+
return {
|
|
149
|
+
name: 'consistency.fills',
|
|
150
|
+
status: 'FAIL',
|
|
151
|
+
detail: {
|
|
152
|
+
missingInRederived,
|
|
153
|
+
extraInRederived,
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
// Per-fill field equality (exact) for matching tids
|
|
158
|
+
const rederivMap = new Map(rederived.map((f) => [f.tid, f]));
|
|
159
|
+
const fieldMismatches = [];
|
|
160
|
+
const EXACT_FIELDS = ['px', 'sz', 'time', 'fee', 'closedPnl', 'coin', 'side'];
|
|
161
|
+
for (const fill of claimed) {
|
|
162
|
+
const re = rederivMap.get(fill.tid);
|
|
163
|
+
if (!re)
|
|
164
|
+
continue; // Already caught above
|
|
165
|
+
for (const field of EXACT_FIELDS) {
|
|
166
|
+
if (String(fill[field]) !== String(re[field])) {
|
|
167
|
+
fieldMismatches.push({
|
|
168
|
+
tid: fill.tid,
|
|
169
|
+
field,
|
|
170
|
+
claimed: fill[field],
|
|
171
|
+
rederived: re[field],
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (fieldMismatches.length > 0) {
|
|
177
|
+
return {
|
|
178
|
+
name: 'consistency.fills',
|
|
179
|
+
status: 'FAIL',
|
|
180
|
+
detail: { fieldMismatches: fieldMismatches.slice(0, 10) }, // cap output
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
return { name: 'consistency.fills', status: 'PASS' };
|
|
184
|
+
}
|
|
185
|
+
// ── Gating metric checks ──────────────────────────────────────────────────────
|
|
186
|
+
/**
|
|
187
|
+
* Check consistency of equityReturnPct (claimed vs rederived).
|
|
188
|
+
* Tolerance: 0.05% absolute.
|
|
189
|
+
*/
|
|
190
|
+
export function checkGatingEquityReturn(claimed, rederived) {
|
|
191
|
+
const claimedNum = parseFloat(claimed);
|
|
192
|
+
if (isNaN(claimedNum)) {
|
|
193
|
+
return {
|
|
194
|
+
name: 'consistency.gating.equity_return',
|
|
195
|
+
status: 'FAIL',
|
|
196
|
+
detail: `claimed equityReturnPct is not a number: ${claimed}`,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
if (Math.abs(claimedNum - rederived) <= METRIC_ABS_TOL) {
|
|
200
|
+
return { name: 'consistency.gating.equity_return', status: 'PASS' };
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
name: 'consistency.gating.equity_return',
|
|
204
|
+
status: 'FAIL',
|
|
205
|
+
detail: { claimed: claimedNum, rederived, absDiff: Math.abs(claimedNum - rederived) },
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Check consistency of maxDrawdownPct (claimed vs rederived).
|
|
210
|
+
* Tolerance: 0.05% absolute.
|
|
211
|
+
*/
|
|
212
|
+
export function checkGatingMaxDrawdown(claimed, rederived) {
|
|
213
|
+
const claimedNum = parseFloat(claimed);
|
|
214
|
+
if (isNaN(claimedNum)) {
|
|
215
|
+
return {
|
|
216
|
+
name: 'consistency.gating.max_drawdown',
|
|
217
|
+
status: 'FAIL',
|
|
218
|
+
detail: `claimed maxDrawdownPct is not a number: ${claimed}`,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
if (Math.abs(claimedNum - rederived) <= METRIC_ABS_TOL) {
|
|
222
|
+
return { name: 'consistency.gating.max_drawdown', status: 'PASS' };
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
name: 'consistency.gating.max_drawdown',
|
|
226
|
+
status: 'FAIL',
|
|
227
|
+
detail: { claimed: claimedNum, rederived, absDiff: Math.abs(claimedNum - rederived) },
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Check consistency of closedTradesCount (claimed vs rederived).
|
|
232
|
+
* Tolerance: exact.
|
|
233
|
+
*/
|
|
234
|
+
export function checkGatingClosedTrades(claimed, rederived) {
|
|
235
|
+
if (claimed === rederived) {
|
|
236
|
+
return { name: 'consistency.gating.closed_trades', status: 'PASS' };
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
name: 'consistency.gating.closed_trades',
|
|
240
|
+
status: 'FAIL',
|
|
241
|
+
detail: { claimed, rederived },
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Check consistency of tradedNotionalMultiple (claimed vs rederived).
|
|
246
|
+
* Tolerance: 0.05% relative.
|
|
247
|
+
*/
|
|
248
|
+
export function checkGatingTradedNotional(claimed, rederived) {
|
|
249
|
+
const claimedNum = parseFloat(claimed);
|
|
250
|
+
if (isNaN(claimedNum)) {
|
|
251
|
+
return {
|
|
252
|
+
name: 'consistency.gating.traded_notional',
|
|
253
|
+
status: 'FAIL',
|
|
254
|
+
detail: `claimed tradedNotionalMultiple is not a number: ${claimed}`,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
// 0.05% relative tolerance
|
|
258
|
+
const absDiff = Math.abs(claimedNum - rederived);
|
|
259
|
+
const relTol = Math.abs(claimedNum) * NOTIONAL_REL_TOL;
|
|
260
|
+
if (absDiff <= Math.max(relTol, 1e-9)) {
|
|
261
|
+
return { name: 'consistency.gating.traded_notional', status: 'PASS' };
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
name: 'consistency.gating.traded_notional',
|
|
265
|
+
status: 'FAIL',
|
|
266
|
+
detail: {
|
|
267
|
+
claimed: claimedNum,
|
|
268
|
+
rederived,
|
|
269
|
+
absDiff,
|
|
270
|
+
relTol,
|
|
271
|
+
},
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=consistency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consistency.js","sourceRoot":"","sources":["../../../../../src/restorer/impls/portfolio-v0-evaluator/checks/consistency.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eligibility checks for portfolio.v0.eval — §7.4.
|
|
3
|
+
*
|
|
4
|
+
* eligibility.min_closed_trades
|
|
5
|
+
* eligibility.min_traded_notional
|
|
6
|
+
*
|
|
7
|
+
* FAIL in any of these → verdict REJECTED per §7.3.
|
|
8
|
+
*/
|
|
9
|
+
import type { Check } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Check that the number of closed trades meets the minimum threshold.
|
|
12
|
+
*
|
|
13
|
+
* @param count Rederived closedTradesCount
|
|
14
|
+
* @param minRequired Minimum from intent.eligibility.minClosedTrades (default 20)
|
|
15
|
+
*/
|
|
16
|
+
export declare function checkMinClosedTrades(count: number, minRequired: number): Check;
|
|
17
|
+
/**
|
|
18
|
+
* Check that the traded notional multiple meets the minimum threshold.
|
|
19
|
+
*
|
|
20
|
+
* @param multiple Rederived tradedNotionalMultiple
|
|
21
|
+
* @param minRequired Minimum from intent.eligibility.minTradedNotionalMultiple (default 5.0)
|
|
22
|
+
*/
|
|
23
|
+
export declare function checkMinTradedNotional(multiple: number, minRequired: number): Check;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eligibility checks for portfolio.v0.eval — §7.4.
|
|
3
|
+
*
|
|
4
|
+
* eligibility.min_closed_trades
|
|
5
|
+
* eligibility.min_traded_notional
|
|
6
|
+
*
|
|
7
|
+
* FAIL in any of these → verdict REJECTED per §7.3.
|
|
8
|
+
*/
|
|
9
|
+
// ── min_closed_trades ─────────────────────────────────────────────────────────
|
|
10
|
+
/**
|
|
11
|
+
* Check that the number of closed trades meets the minimum threshold.
|
|
12
|
+
*
|
|
13
|
+
* @param count Rederived closedTradesCount
|
|
14
|
+
* @param minRequired Minimum from intent.eligibility.minClosedTrades (default 20)
|
|
15
|
+
*/
|
|
16
|
+
export function checkMinClosedTrades(count, minRequired) {
|
|
17
|
+
if (count >= minRequired) {
|
|
18
|
+
return { name: 'eligibility.min_closed_trades', status: 'PASS' };
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
name: 'eligibility.min_closed_trades',
|
|
22
|
+
status: 'FAIL',
|
|
23
|
+
detail: {
|
|
24
|
+
required: minRequired,
|
|
25
|
+
actual: count,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// ── min_traded_notional ───────────────────────────────────────────────────────
|
|
30
|
+
/**
|
|
31
|
+
* Check that the traded notional multiple meets the minimum threshold.
|
|
32
|
+
*
|
|
33
|
+
* @param multiple Rederived tradedNotionalMultiple
|
|
34
|
+
* @param minRequired Minimum from intent.eligibility.minTradedNotionalMultiple (default 5.0)
|
|
35
|
+
*/
|
|
36
|
+
export function checkMinTradedNotional(multiple, minRequired) {
|
|
37
|
+
if (multiple >= minRequired) {
|
|
38
|
+
return { name: 'eligibility.min_traded_notional', status: 'PASS' };
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
name: 'eligibility.min_traded_notional',
|
|
42
|
+
status: 'FAIL',
|
|
43
|
+
detail: {
|
|
44
|
+
required: minRequired,
|
|
45
|
+
actual: multiple,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=eligibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eligibility.js","sourceRoot":"","sources":["../../../../../src/restorer/impls/portfolio-v0-evaluator/checks/eligibility.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,WAAmB;IACrE,IAAI,KAAK,IAAI,WAAW,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,+BAA+B,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACnE,CAAC;IACD,OAAO;QACL,IAAI,EAAE,+BAA+B;QACrC,MAAM,EAAE,MAAM;QACd,MAAM,EAAE;YACN,QAAQ,EAAE,WAAW;YACrB,MAAM,EAAE,KAAK;SACd;KACF,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB,EAAE,WAAmB;IAC1E,IAAI,QAAQ,IAAI,WAAW,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,iCAAiC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACrE,CAAC;IACD,OAAO;QACL,IAAI,EAAE,iCAAiC;QACvC,MAAM,EAAE,MAAM;QACd,MAAM,EAAE;YACN,QAAQ,EAAE,WAAW;YACrB,MAAM,EAAE,QAAQ;SACjB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integrity checks for portfolio.v0.eval — §7.4.
|
|
3
|
+
*
|
|
4
|
+
* impl-declared:
|
|
5
|
+
* integrity.window_bounds (pre.capturedAt >= startTs, post.capturedAt >= endTs)
|
|
6
|
+
*
|
|
7
|
+
* engine-prepended (NOT this impl's job):
|
|
8
|
+
* integrity.signature
|
|
9
|
+
* integrity.intent_ref
|
|
10
|
+
* integrity.onchain_anchor
|
|
11
|
+
*
|
|
12
|
+
* FAIL in any integrity.* check → verdict FAIL per §7.3.
|
|
13
|
+
*/
|
|
14
|
+
import type { Check } from '../types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Check that snapshot timestamps are within the declared window bounds.
|
|
17
|
+
*
|
|
18
|
+
* Per §7.4:
|
|
19
|
+
* pre.capturedAt >= startTs
|
|
20
|
+
* post.capturedAt >= endTs
|
|
21
|
+
*
|
|
22
|
+
* (The restorer should have captured these at the right times, so a violation
|
|
23
|
+
* indicates the manifest was produced outside the valid window.)
|
|
24
|
+
*/
|
|
25
|
+
export declare function checkWindowBounds(preCapturedAt: number, postCapturedAt: number, startTs: number, endTs: number): Check;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integrity checks for portfolio.v0.eval — §7.4.
|
|
3
|
+
*
|
|
4
|
+
* impl-declared:
|
|
5
|
+
* integrity.window_bounds (pre.capturedAt >= startTs, post.capturedAt >= endTs)
|
|
6
|
+
*
|
|
7
|
+
* engine-prepended (NOT this impl's job):
|
|
8
|
+
* integrity.signature
|
|
9
|
+
* integrity.intent_ref
|
|
10
|
+
* integrity.onchain_anchor
|
|
11
|
+
*
|
|
12
|
+
* FAIL in any integrity.* check → verdict FAIL per §7.3.
|
|
13
|
+
*/
|
|
14
|
+
// ── window_bounds ─────────────────────────────────────────────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* Check that snapshot timestamps are within the declared window bounds.
|
|
17
|
+
*
|
|
18
|
+
* Per §7.4:
|
|
19
|
+
* pre.capturedAt >= startTs
|
|
20
|
+
* post.capturedAt >= endTs
|
|
21
|
+
*
|
|
22
|
+
* (The restorer should have captured these at the right times, so a violation
|
|
23
|
+
* indicates the manifest was produced outside the valid window.)
|
|
24
|
+
*/
|
|
25
|
+
export function checkWindowBounds(preCapturedAt, postCapturedAt, startTs, endTs) {
|
|
26
|
+
const preOk = preCapturedAt >= startTs;
|
|
27
|
+
const postOk = postCapturedAt >= endTs;
|
|
28
|
+
if (preOk && postOk) {
|
|
29
|
+
return { name: 'integrity.window_bounds', status: 'PASS' };
|
|
30
|
+
}
|
|
31
|
+
const violations = [];
|
|
32
|
+
if (!preOk) {
|
|
33
|
+
violations.push(`pre.capturedAt (${preCapturedAt}) < startTs (${startTs})`);
|
|
34
|
+
}
|
|
35
|
+
if (!postOk) {
|
|
36
|
+
violations.push(`post.capturedAt (${postCapturedAt}) < endTs (${endTs})`);
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
name: 'integrity.window_bounds',
|
|
40
|
+
status: 'FAIL',
|
|
41
|
+
detail: violations.join('; '),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=integrity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrity.js","sourceRoot":"","sources":["../../../../../src/restorer/impls/portfolio-v0-evaluator/checks/integrity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,iFAAiF;AAEjF;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,aAAqB,EACrB,cAAsB,EACtB,OAAe,EACf,KAAa;IAEb,MAAM,KAAK,GAAG,aAAa,IAAI,OAAO,CAAC;IACvC,MAAM,MAAM,GAAG,cAAc,IAAI,KAAK,CAAC;IAEvC,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC7D,CAAC;IAED,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,UAAU,CAAC,IAAI,CACb,mBAAmB,aAAa,gBAAgB,OAAO,GAAG,CAC3D,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,UAAU,CAAC,IAAI,CACb,oBAAoB,cAAc,cAAc,KAAK,GAAG,CACzD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;KAC9B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec checks for portfolio.v0.eval — §7.4.
|
|
3
|
+
*
|
|
4
|
+
* spec.equity_return_target
|
|
5
|
+
* spec.max_drawdown_constraint
|
|
6
|
+
*
|
|
7
|
+
* FAIL in any spec.* check → verdict FAIL per §7.3.
|
|
8
|
+
*/
|
|
9
|
+
import type { Check } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Check that rederived equityReturnPct >= intent spec's minReturnPct.
|
|
12
|
+
*/
|
|
13
|
+
export declare function checkEquityReturnTarget(equityReturnPct: number, minReturnPct: number): Check;
|
|
14
|
+
/**
|
|
15
|
+
* Check that rederived maxDrawdownPct <= intent spec's maxDrawdownPct constraint.
|
|
16
|
+
*/
|
|
17
|
+
export declare function checkMaxDrawdownConstraint(maxDrawdownPct: number, maxAllowed: number): Check;
|