@jinn-network/client 0.1.2-canary.d6e72dfd → 0.1.2
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 +2 -0
- package/README.md +3 -0
- package/dist/adapters/adapter.d.ts +7 -0
- package/dist/adapters/mech/adapter.d.ts +4 -0
- package/dist/adapters/mech/adapter.js +140 -19
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +17 -1
- package/dist/adapters/mech/contracts.js +55 -1
- package/dist/adapters/mech/contracts.js.map +1 -1
- package/dist/adapters/mech/ipfs.d.ts +30 -5
- package/dist/adapters/mech/ipfs.js +162 -17
- package/dist/adapters/mech/ipfs.js.map +1 -1
- package/dist/adapters/mech/safe.js +8 -6
- package/dist/adapters/mech/safe.js.map +1 -1
- package/dist/adapters/mech/types.d.ts +2 -0
- package/dist/adapters/mech/types.js.map +1 -1
- package/dist/api/balance-build.js +3 -3
- package/dist/api/balance-build.js.map +1 -1
- package/dist/api/fleet-build.js +35 -40
- package/dist/api/fleet-build.js.map +1 -1
- package/dist/api/gather-status.d.ts +5 -0
- package/dist/api/gather-status.js +158 -7
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/history-build.d.ts +5 -1
- package/dist/api/history-build.js +51 -26
- package/dist/api/history-build.js.map +1 -1
- package/dist/api/portfolio-v0-build.d.ts +3 -1
- package/dist/api/portfolio-v0-build.js +12 -10
- package/dist/api/portfolio-v0-build.js.map +1 -1
- package/dist/api/rewards-build.js +29 -13
- package/dist/api/rewards-build.js.map +1 -1
- package/dist/api/status-build.d.ts +32 -6
- package/dist/api/status-build.js +2 -1
- package/dist/api/status-build.js.map +1 -1
- package/dist/api/status-rollup-build.d.ts +2 -0
- package/dist/api/status-rollup-build.js +30 -3
- package/dist/api/status-rollup-build.js.map +1 -1
- package/dist/build-meta.json +1 -1
- package/dist/cli/commands/auth.js +27 -5
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/balance.js +8 -1
- package/dist/cli/commands/balance.js.map +1 -1
- package/dist/cli/commands/bootstrap.js +22 -0
- package/dist/cli/commands/bootstrap.js.map +1 -1
- package/dist/cli/commands/doctor.js +33 -3
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/fleet.js +10 -1
- package/dist/cli/commands/fleet.js.map +1 -1
- package/dist/cli/commands/history.js +25 -6
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/logs.js +35 -11
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/quickstart.js +39 -1
- package/dist/cli/commands/quickstart.js.map +1 -1
- package/dist/cli/commands/run.js +38 -0
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/status.js +11 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/submit-intent.js +62 -99
- package/dist/cli/commands/submit-intent.js.map +1 -1
- package/dist/cli/intent-registry-access.d.ts +3 -5
- package/dist/cli/intent-registry-access.js +12 -34
- package/dist/cli/intent-registry-access.js.map +1 -1
- package/dist/cli/introspection-context.js +11 -8
- package/dist/cli/introspection-context.js.map +1 -1
- package/dist/config.d.ts +28 -1
- package/dist/config.js +29 -0
- package/dist/config.js.map +1 -1
- package/dist/daemon/balance-topup-loop.js +32 -4
- package/dist/daemon/balance-topup-loop.js.map +1 -1
- package/dist/daemon/creator.d.ts +6 -9
- package/dist/daemon/creator.js +45 -51
- package/dist/daemon/creator.js.map +1 -1
- package/dist/daemon/daemon.d.ts +9 -20
- package/dist/daemon/daemon.js +34 -27
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/delivery-watcher.d.ts +3 -1
- package/dist/daemon/delivery-watcher.js +19 -1
- package/dist/daemon/delivery-watcher.js.map +1 -1
- package/dist/daemon/reward-claim-loop.js +38 -1
- package/dist/daemon/reward-claim-loop.js.map +1 -1
- package/dist/dashboard/index.html +71 -496
- package/dist/discovery/registry.d.ts +54 -0
- package/dist/discovery/registry.js +73 -0
- package/dist/discovery/registry.js.map +1 -1
- package/dist/earning/bootstrap.js +8 -38
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/stolas-claim.d.ts +6 -0
- package/dist/earning/stolas-claim.js +7 -0
- package/dist/earning/stolas-claim.js.map +1 -1
- package/dist/intents/kinds/constants.d.ts +5 -0
- package/dist/intents/kinds/constants.js +6 -0
- package/dist/intents/kinds/constants.js.map +1 -0
- package/dist/intents/kinds/index.d.ts +28 -0
- package/dist/intents/kinds/index.js +50 -0
- package/dist/intents/kinds/index.js.map +1 -0
- package/dist/intents/kinds/portfolio-v0.d.ts +2 -0
- package/dist/intents/kinds/portfolio-v0.js +13 -0
- package/dist/intents/kinds/portfolio-v0.js.map +1 -0
- package/dist/intents/kinds/prediction-apy-v0.d.ts +3 -0
- package/dist/intents/kinds/prediction-apy-v0.js +21 -0
- package/dist/intents/kinds/prediction-apy-v0.js.map +1 -0
- package/dist/intents/kinds/prediction-v0.d.ts +3 -0
- package/dist/intents/kinds/prediction-v0.js +32 -0
- package/dist/intents/kinds/prediction-v0.js.map +1 -0
- package/dist/intents/kinds/spec-kind.d.ts +38 -0
- package/dist/intents/kinds/spec-kind.js +6 -0
- package/dist/intents/kinds/spec-kind.js.map +1 -0
- package/dist/intents/posting-service.d.ts +26 -0
- package/dist/intents/posting-service.js +218 -0
- package/dist/intents/posting-service.js.map +1 -0
- package/dist/intents/prediction-apy-v0-auto.js +1 -1
- package/dist/intents/prediction-apy-v0-auto.js.map +1 -1
- package/dist/intents/prediction-v0-template.d.ts +8 -3
- package/dist/intents/prediction-v0-template.js +21 -1
- package/dist/intents/prediction-v0-template.js.map +1 -1
- package/dist/intents/sources.d.ts +39 -0
- package/dist/intents/sources.js +42 -0
- package/dist/intents/sources.js.map +1 -0
- package/dist/main.js +89 -65
- package/dist/main.js.map +1 -1
- package/dist/mcp/server.js +8 -4
- package/dist/mcp/server.js.map +1 -1
- package/dist/observability/emit-event.d.ts +12 -0
- package/dist/observability/emit-event.js +27 -0
- package/dist/observability/emit-event.js.map +1 -0
- package/dist/preflight/api-port.d.ts +13 -0
- package/dist/preflight/api-port.js +32 -0
- package/dist/preflight/api-port.js.map +1 -0
- package/dist/preflight/rpc-network.d.ts +44 -0
- package/dist/preflight/rpc-network.js +121 -0
- package/dist/preflight/rpc-network.js.map +1 -0
- package/dist/restorer/engine/engine.d.ts +10 -0
- package/dist/restorer/engine/engine.js +60 -44
- package/dist/restorer/engine/engine.js.map +1 -1
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.d.ts +7 -4
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.js +12 -1
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.js.map +1 -1
- package/dist/restorer/impls/claude-mcp-prediction/index.d.ts +2 -1
- package/dist/restorer/impls/claude-mcp-prediction/index.js +9 -0
- package/dist/restorer/impls/claude-mcp-prediction/index.js.map +1 -1
- package/dist/restorer/impls/claude-mcp-prediction/types.d.ts +2 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/index.d.ts +34 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/index.js +233 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/index.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/mcp-tools.d.ts +18 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/mcp-tools.js +136 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/mcp-tools.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/prompt.d.ts +7 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/prompt.js +46 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/prompt.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.d.ts +27 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.js +128 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/types.d.ts +64 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/types.js +6 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/types.js.map +1 -0
- package/dist/restorer/impls/evaluation-context.d.ts +16 -0
- package/dist/restorer/impls/evaluation-context.js +18 -0
- package/dist/restorer/impls/evaluation-context.js.map +1 -0
- package/dist/restorer/impls/index.d.ts +46 -0
- package/dist/restorer/impls/index.js +88 -0
- package/dist/restorer/impls/index.js.map +1 -0
- package/dist/restorer/impls/legacy-claude/index.d.ts +8 -1
- package/dist/restorer/impls/legacy-claude/index.js +79 -10
- package/dist/restorer/impls/legacy-claude/index.js.map +1 -1
- package/dist/restorer/impls/portfolio-v0-evaluator/index.d.ts +2 -1
- package/dist/restorer/impls/portfolio-v0-evaluator/index.js +9 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/index.js.map +1 -1
- package/dist/restorer/impls/portfolio-v0-evaluator/types.d.ts +2 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/index.d.ts +1 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/index.js +12 -3
- package/dist/restorer/impls/prediction-apy-v0-baseline/index.js.map +1 -1
- package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.d.ts +4 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.js +4 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.js.map +1 -1
- package/dist/restorer/impls/prediction-apy-v0-evaluator/index.d.ts +6 -3
- package/dist/restorer/impls/prediction-apy-v0-evaluator/index.js +55 -33
- package/dist/restorer/impls/prediction-apy-v0-evaluator/index.js.map +1 -1
- package/dist/restorer/impls/prediction-apy-v0-evaluator/parse-submission.d.ts +7 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/parse-submission.js +29 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/parse-submission.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/types.d.ts +1 -1
- package/dist/restorer/impls/prediction-v0-baseline/index.d.ts +2 -0
- package/dist/restorer/impls/prediction-v0-baseline/index.js +6 -0
- package/dist/restorer/impls/prediction-v0-baseline/index.js.map +1 -1
- package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.d.ts +6 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js +19 -1
- package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js.map +1 -1
- package/dist/restorer/impls/prediction-v0-evaluator/index.d.ts +6 -3
- package/dist/restorer/impls/prediction-v0-evaluator/index.js +30 -4
- package/dist/restorer/impls/prediction-v0-evaluator/index.js.map +1 -1
- package/dist/restorer/impls/prediction-v0-evaluator/types.d.ts +1 -1
- package/dist/restorer/types.d.ts +17 -0
- package/dist/restorer/types.js +22 -1
- package/dist/restorer/types.js.map +1 -1
- package/dist/rpc-error-context.d.ts +10 -0
- package/dist/rpc-error-context.js +26 -0
- package/dist/rpc-error-context.js.map +1 -0
- package/dist/store/store.d.ts +98 -0
- package/dist/store/store.js +331 -4
- package/dist/store/store.js.map +1 -1
- package/dist/trajectory/schema.d.ts +510 -0
- package/dist/trajectory/schema.js +74 -0
- package/dist/trajectory/schema.js.map +1 -0
- package/dist/types/prediction-apy.d.ts +21 -10
- package/dist/types/prediction-apy.js +17 -5
- package/dist/types/prediction-apy.js.map +1 -1
- package/dist/types/prediction.d.ts +11 -10
- package/dist/types/prediction.js +3 -2
- package/dist/types/prediction.js.map +1 -1
- package/dist/venues/aave-v3/client.d.ts +6 -2
- package/dist/venues/aave-v3/client.js +14 -5
- package/dist/venues/aave-v3/client.js.map +1 -1
- package/package.json +4 -3
- package/dist/daemon/restorer.d.ts +0 -19
- package/dist/daemon/restorer.js +0 -82
- package/dist/daemon/restorer.js.map +0 -1
package/dist/restorer/types.d.ts
CHANGED
|
@@ -7,6 +7,13 @@ import type { DesiredState } from '../types/desired-state.js';
|
|
|
7
7
|
import type { OutputArtifact, RationaleEntry, Snapshot } from '../types/portfolio.js';
|
|
8
8
|
export interface RestorationContext {
|
|
9
9
|
intent: DesiredState;
|
|
10
|
+
/**
|
|
11
|
+
* IPFS CID of this job's desired state (from Marketplace / observe).
|
|
12
|
+
* Restorers' submission manifests should reference the same CID; evaluators
|
|
13
|
+
* compare it via integrity.intent_ref. May be an empty string when
|
|
14
|
+
* provenance is missing (dev / legacy).
|
|
15
|
+
*/
|
|
16
|
+
intentCid?: string;
|
|
10
17
|
/** Persistent directory for impl-specific state. */
|
|
11
18
|
implStateDir: string;
|
|
12
19
|
/** Ephemeral working directory (cleared between attempts). */
|
|
@@ -50,6 +57,8 @@ export interface ReadyStatus {
|
|
|
50
57
|
url?: string;
|
|
51
58
|
};
|
|
52
59
|
}
|
|
60
|
+
/** Use when an impl is built in CLI `stub` mode (no live fleet / signer). */
|
|
61
|
+
export declare const REQUIRES_LIVE_DAEMON_READINESS: ReadyStatus;
|
|
53
62
|
/**
|
|
54
63
|
* Argument a kind-specific enable flow wants from the operator, surfaced
|
|
55
64
|
* via `enableMetadata()`. The generic `jinn intents enable <kind>` verb
|
|
@@ -110,6 +119,14 @@ export type EnableResult = {
|
|
|
110
119
|
message: string;
|
|
111
120
|
details?: Record<string, unknown>;
|
|
112
121
|
};
|
|
122
|
+
/**
|
|
123
|
+
* Thrown by a {@link RestorerImpl} when the attempt should be recorded as a
|
|
124
|
+
* deliberate skip (no failure / no claim retry), e.g. Claude CLI unavailable.
|
|
125
|
+
*/
|
|
126
|
+
export declare class SkippableError extends Error {
|
|
127
|
+
readonly reason: string;
|
|
128
|
+
constructor(reason: string, message?: string);
|
|
129
|
+
}
|
|
113
130
|
export interface RestorerImpl {
|
|
114
131
|
name: string;
|
|
115
132
|
/** semver */
|
package/dist/restorer/types.js
CHANGED
|
@@ -3,5 +3,26 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Pure type definitions; no runtime side effects.
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
/** Use when an impl is built in CLI `stub` mode (no live fleet / signer). */
|
|
7
|
+
export const REQUIRES_LIVE_DAEMON_READINESS = {
|
|
8
|
+
ready: false,
|
|
9
|
+
reason: 'requires live daemon',
|
|
10
|
+
nextStep: {
|
|
11
|
+
description: 'Run the daemon with a configured fleet and wallet',
|
|
12
|
+
cli: 'jinn run',
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
// ── Sentinel errors (impl → engine) ───────────────────────────────────────────
|
|
16
|
+
/**
|
|
17
|
+
* Thrown by a {@link RestorerImpl} when the attempt should be recorded as a
|
|
18
|
+
* deliberate skip (no failure / no claim retry), e.g. Claude CLI unavailable.
|
|
19
|
+
*/
|
|
20
|
+
export class SkippableError extends Error {
|
|
21
|
+
reason;
|
|
22
|
+
constructor(reason, message) {
|
|
23
|
+
super(message ?? reason);
|
|
24
|
+
this.name = 'SkippableError';
|
|
25
|
+
this.reason = reason;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
7
28
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/restorer/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/restorer/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2DH,6EAA6E;AAC7E,MAAM,CAAC,MAAM,8BAA8B,GAAgB;IACzD,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,sBAAsB;IAC9B,QAAQ,EAAE;QACR,WAAW,EAAE,mDAAmD;QAChE,GAAG,EAAE,UAAU;KAChB;CACF,CAAC;AA0DF,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,MAAM,CAAS;IAExB,YAAY,MAAc,EAAE,OAAgB;QAC1C,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface RpcErrorContext {
|
|
2
|
+
operation: string;
|
|
3
|
+
rpcUrl?: string;
|
|
4
|
+
chain?: 'base' | 'base-sepolia' | string;
|
|
5
|
+
address?: string;
|
|
6
|
+
contract?: string;
|
|
7
|
+
fromBlock?: bigint | number | string;
|
|
8
|
+
toBlock?: bigint | number | string;
|
|
9
|
+
}
|
|
10
|
+
export declare function formatRpcError(error: unknown, context: RpcErrorContext): string;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { flattenErrorMessage } from './tx-retry.js';
|
|
2
|
+
import { rpcHostForDisplay } from './preflight/rpc-network.js';
|
|
3
|
+
function blockValue(value) {
|
|
4
|
+
if (value === undefined)
|
|
5
|
+
return undefined;
|
|
6
|
+
return String(value);
|
|
7
|
+
}
|
|
8
|
+
export function formatRpcError(error, context) {
|
|
9
|
+
const parts = [`operation=${context.operation}`];
|
|
10
|
+
if (context.chain)
|
|
11
|
+
parts.push(`chain=${context.chain}`);
|
|
12
|
+
if (context.rpcUrl)
|
|
13
|
+
parts.push(`rpc=${rpcHostForDisplay(context.rpcUrl)}`);
|
|
14
|
+
if (context.contract)
|
|
15
|
+
parts.push(`contract=${context.contract}`);
|
|
16
|
+
if (context.address)
|
|
17
|
+
parts.push(`address=${context.address}`);
|
|
18
|
+
const from = blockValue(context.fromBlock);
|
|
19
|
+
const to = blockValue(context.toBlock);
|
|
20
|
+
if (from !== undefined || to !== undefined) {
|
|
21
|
+
parts.push(`blocks=${from ?? '?'}..${to ?? '?'}`);
|
|
22
|
+
}
|
|
23
|
+
parts.push(`cause=${flattenErrorMessage(error)}`);
|
|
24
|
+
return parts.join(' ');
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=rpc-error-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-error-context.js","sourceRoot":"","sources":["../src/rpc-error-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAY/D,SAAS,UAAU,CAAC,KAA2C;IAC7D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,OAAwB;IACrE,MAAM,KAAK,GAAG,CAAC,aAAa,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3E,IAAI,OAAO,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,IAAI,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,SAAS,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
|
package/dist/store/store.d.ts
CHANGED
|
@@ -1,16 +1,95 @@
|
|
|
1
1
|
import Database from 'better-sqlite3';
|
|
2
|
+
export interface ActivityEventInput {
|
|
3
|
+
ts: string | null;
|
|
4
|
+
kind: string;
|
|
5
|
+
requestId?: string | null;
|
|
6
|
+
serviceIndex?: number | null;
|
|
7
|
+
txHash?: string | null;
|
|
8
|
+
specKind?: string | null;
|
|
9
|
+
outcome?: string | null;
|
|
10
|
+
detail?: string | null;
|
|
11
|
+
}
|
|
12
|
+
export interface ActivityEventRow {
|
|
13
|
+
id: number;
|
|
14
|
+
ts: string | null;
|
|
15
|
+
kind: string;
|
|
16
|
+
requestId: string | null;
|
|
17
|
+
serviceIndex: number | null;
|
|
18
|
+
txHash: string | null;
|
|
19
|
+
specKind: string | null;
|
|
20
|
+
outcome: string | null;
|
|
21
|
+
detail: string | null;
|
|
22
|
+
}
|
|
23
|
+
export interface RewardClaimInput {
|
|
24
|
+
ts: string;
|
|
25
|
+
serviceIndex: number;
|
|
26
|
+
serviceId?: number | null;
|
|
27
|
+
stakingProxy: string;
|
|
28
|
+
distributor: string;
|
|
29
|
+
txHash: string;
|
|
30
|
+
amountWei: string;
|
|
31
|
+
asset?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface BalanceCacheEntry {
|
|
34
|
+
role: string;
|
|
35
|
+
address: string;
|
|
36
|
+
nativeWei?: string | null;
|
|
37
|
+
bondWei?: string | null;
|
|
38
|
+
assetExtraJson?: string | null;
|
|
39
|
+
fetchedAt: string;
|
|
40
|
+
error?: string | null;
|
|
41
|
+
}
|
|
42
|
+
export type IntentPostingPolicyType = 'once_per_safe' | 'once_per_bucket' | 'interval';
|
|
43
|
+
export interface IntentPostRecord {
|
|
44
|
+
creatorSafeAddress: string;
|
|
45
|
+
sourceKey: string;
|
|
46
|
+
policyType: IntentPostingPolicyType;
|
|
47
|
+
scopeKey: string;
|
|
48
|
+
desiredStateId: string;
|
|
49
|
+
requestId: string;
|
|
50
|
+
firstPostedAt: string;
|
|
51
|
+
lastPostedAt: string;
|
|
52
|
+
postCount: number;
|
|
53
|
+
}
|
|
2
54
|
export declare class Store {
|
|
3
55
|
/** Exposed for engine persistence layer — treat as package-internal. */
|
|
4
56
|
readonly db: Database.Database;
|
|
5
57
|
readonly path: string;
|
|
6
58
|
constructor(dbPath: string);
|
|
59
|
+
/** Idempotent: older DBs before idx_reward_claims_tx may lack the unique index. */
|
|
60
|
+
private ensureRewardClaimsTxIndex;
|
|
7
61
|
recordOwnActivity(requestId: string, role: 'created' | 'claimed' | 'delivered' | 'evaluated'): void;
|
|
8
62
|
isOwnActivity(requestId: string): boolean;
|
|
9
63
|
setShutdownState(state: 'clean' | 'running'): void;
|
|
10
64
|
getShutdownState(): string | null;
|
|
65
|
+
setDaemonStartedAt(value: string): void;
|
|
66
|
+
getDaemonStartedAt(): string | null;
|
|
11
67
|
/** Generic config row (e.g. last_reward_claim_tick_at). */
|
|
12
68
|
getConfigValue(key: string): string | null;
|
|
13
69
|
setConfigValue(key: string, value: string): void;
|
|
70
|
+
getIntentPostRecord(args: {
|
|
71
|
+
creatorSafeAddress: string;
|
|
72
|
+
sourceKey: string;
|
|
73
|
+
policyType: IntentPostingPolicyType;
|
|
74
|
+
scopeKey: string;
|
|
75
|
+
}): IntentPostRecord | null;
|
|
76
|
+
upsertIntentPostRecord(record: IntentPostRecord): void;
|
|
77
|
+
acquireIntentPostLock(args: {
|
|
78
|
+
creatorSafeAddress: string;
|
|
79
|
+
sourceKey: string;
|
|
80
|
+
policyType: IntentPostingPolicyType;
|
|
81
|
+
scopeKey: string;
|
|
82
|
+
ownerToken: string;
|
|
83
|
+
lockedAt: string;
|
|
84
|
+
staleAfterMs: number;
|
|
85
|
+
}): boolean;
|
|
86
|
+
releaseIntentPostLock(args: {
|
|
87
|
+
creatorSafeAddress: string;
|
|
88
|
+
sourceKey: string;
|
|
89
|
+
policyType: IntentPostingPolicyType;
|
|
90
|
+
scopeKey: string;
|
|
91
|
+
ownerToken: string;
|
|
92
|
+
}): void;
|
|
14
93
|
/** Counts of protocol roles recorded for this node (best-effort activity hints). */
|
|
15
94
|
getOwnActivityCounts(): Record<string, number>;
|
|
16
95
|
/** Latest own_activity rows by insertion order (approximate). */
|
|
@@ -18,6 +97,25 @@ export declare class Store {
|
|
|
18
97
|
requestId: string;
|
|
19
98
|
role: string;
|
|
20
99
|
}>;
|
|
100
|
+
recordActivityEvent(event: ActivityEventInput): void;
|
|
101
|
+
getRecentActivityEvents(limit: number, opts?: {
|
|
102
|
+
since?: string;
|
|
103
|
+
cursor?: string;
|
|
104
|
+
}): ActivityEventRow[];
|
|
105
|
+
/** Newer events first, then ascending id for `jinn logs --follow` (oldest in batch printed first in caller). */
|
|
106
|
+
getActivityEventsAfterId(afterId: number, limit: number): ActivityEventRow[];
|
|
107
|
+
getActivityCountsByKind(): Record<string, number>;
|
|
108
|
+
getLastEventAtForService(serviceIndex: number): string | null;
|
|
109
|
+
getActivityCountsForService(serviceIndex: number): Record<string, number>;
|
|
110
|
+
recordRewardClaim(claim: RewardClaimInput): void;
|
|
111
|
+
getClaimedRewardsByService(): Record<number, {
|
|
112
|
+
total: string;
|
|
113
|
+
lastAt: string;
|
|
114
|
+
lastTxHash: string;
|
|
115
|
+
}>;
|
|
116
|
+
upsertBalanceCache(entry: BalanceCacheEntry): void;
|
|
117
|
+
getBalanceCache(): BalanceCacheEntry[];
|
|
118
|
+
private backfillActivityEvents;
|
|
21
119
|
getLastProcessedBlock(): bigint | null;
|
|
22
120
|
setLastProcessedBlock(block: bigint): void;
|
|
23
121
|
insertArtifact(artifact: {
|
package/dist/store/store.js
CHANGED
|
@@ -32,6 +32,69 @@ CREATE INDEX IF NOT EXISTS idx_artifacts_desired_state ON artifacts (desired_sta
|
|
|
32
32
|
CREATE INDEX IF NOT EXISTS idx_artifacts_outcome ON artifacts (outcome);
|
|
33
33
|
CREATE INDEX IF NOT EXISTS idx_artifacts_remote ON artifacts (remote);
|
|
34
34
|
|
|
35
|
+
CREATE TABLE IF NOT EXISTS activity_events (
|
|
36
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
37
|
+
ts TEXT,
|
|
38
|
+
kind TEXT NOT NULL,
|
|
39
|
+
request_id TEXT,
|
|
40
|
+
service_index INTEGER,
|
|
41
|
+
tx_hash TEXT,
|
|
42
|
+
spec_kind TEXT,
|
|
43
|
+
outcome TEXT,
|
|
44
|
+
detail TEXT
|
|
45
|
+
);
|
|
46
|
+
CREATE INDEX IF NOT EXISTS idx_activity_events_ts ON activity_events (ts DESC);
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_activity_events_req ON activity_events (request_id);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_activity_events_service_idx ON activity_events (service_index);
|
|
49
|
+
|
|
50
|
+
CREATE TABLE IF NOT EXISTS reward_claims (
|
|
51
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
52
|
+
ts TEXT NOT NULL,
|
|
53
|
+
service_index INTEGER NOT NULL,
|
|
54
|
+
service_id INTEGER,
|
|
55
|
+
staking_proxy TEXT NOT NULL,
|
|
56
|
+
distributor TEXT NOT NULL,
|
|
57
|
+
tx_hash TEXT NOT NULL,
|
|
58
|
+
amount_wei TEXT NOT NULL,
|
|
59
|
+
asset TEXT NOT NULL DEFAULT 'reward'
|
|
60
|
+
);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS idx_reward_claims_svc ON reward_claims (service_index);
|
|
62
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_reward_claims_tx ON reward_claims (tx_hash);
|
|
63
|
+
|
|
64
|
+
CREATE TABLE IF NOT EXISTS balance_cache (
|
|
65
|
+
role TEXT PRIMARY KEY,
|
|
66
|
+
address TEXT NOT NULL,
|
|
67
|
+
native_wei TEXT,
|
|
68
|
+
bond_wei TEXT,
|
|
69
|
+
asset_extra_json TEXT,
|
|
70
|
+
fetched_at TEXT NOT NULL,
|
|
71
|
+
error TEXT
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
CREATE TABLE IF NOT EXISTS intent_posts (
|
|
75
|
+
creator_safe_address TEXT NOT NULL,
|
|
76
|
+
source_key TEXT NOT NULL,
|
|
77
|
+
policy_type TEXT NOT NULL CHECK (policy_type IN ('once_per_safe', 'once_per_bucket', 'interval')),
|
|
78
|
+
scope_key TEXT NOT NULL DEFAULT '',
|
|
79
|
+
desired_state_id TEXT NOT NULL,
|
|
80
|
+
request_id TEXT NOT NULL,
|
|
81
|
+
first_posted_at TEXT NOT NULL,
|
|
82
|
+
last_posted_at TEXT NOT NULL,
|
|
83
|
+
post_count INTEGER NOT NULL DEFAULT 1,
|
|
84
|
+
PRIMARY KEY (creator_safe_address, source_key, policy_type, scope_key)
|
|
85
|
+
);
|
|
86
|
+
CREATE INDEX IF NOT EXISTS idx_intent_posts_desired_state ON intent_posts (desired_state_id);
|
|
87
|
+
|
|
88
|
+
CREATE TABLE IF NOT EXISTS intent_post_locks (
|
|
89
|
+
creator_safe_address TEXT NOT NULL,
|
|
90
|
+
source_key TEXT NOT NULL,
|
|
91
|
+
policy_type TEXT NOT NULL CHECK (policy_type IN ('once_per_safe', 'once_per_bucket', 'interval')),
|
|
92
|
+
scope_key TEXT NOT NULL DEFAULT '',
|
|
93
|
+
owner_token TEXT NOT NULL,
|
|
94
|
+
locked_at TEXT NOT NULL,
|
|
95
|
+
PRIMARY KEY (creator_safe_address, source_key, policy_type, scope_key)
|
|
96
|
+
);
|
|
97
|
+
|
|
35
98
|
`;
|
|
36
99
|
export class Store {
|
|
37
100
|
/** Exposed for engine persistence layer — treat as package-internal. */
|
|
@@ -46,9 +109,17 @@ export class Store {
|
|
|
46
109
|
this.db.pragma('journal_mode = WAL');
|
|
47
110
|
this.db.exec(SCHEMA);
|
|
48
111
|
this.db.exec(RESTORATION_INTENTS_SCHEMA);
|
|
112
|
+
this.ensureRewardClaimsTxIndex();
|
|
113
|
+
this.backfillActivityEvents();
|
|
114
|
+
}
|
|
115
|
+
/** Idempotent: older DBs before idx_reward_claims_tx may lack the unique index. */
|
|
116
|
+
ensureRewardClaimsTxIndex() {
|
|
117
|
+
this.db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_reward_claims_tx ON reward_claims (tx_hash)`);
|
|
49
118
|
}
|
|
50
119
|
recordOwnActivity(requestId, role) {
|
|
51
120
|
this.db.prepare(`INSERT OR REPLACE INTO own_activity (request_id, role) VALUES (?, ?)`).run(requestId, role);
|
|
121
|
+
const ts = new Date().toISOString();
|
|
122
|
+
this.recordActivityEvent({ ts, kind: role, requestId });
|
|
52
123
|
}
|
|
53
124
|
isOwnActivity(requestId) {
|
|
54
125
|
const row = this.db.prepare('SELECT 1 FROM own_activity WHERE request_id = ?').get(requestId);
|
|
@@ -61,6 +132,13 @@ export class Store {
|
|
|
61
132
|
const row = this.db.prepare('SELECT value FROM config WHERE key = ?').get('shutdown_state');
|
|
62
133
|
return row?.value ?? null;
|
|
63
134
|
}
|
|
135
|
+
setDaemonStartedAt(value) {
|
|
136
|
+
this.db.prepare('INSERT OR REPLACE INTO config (key, value) VALUES (?, ?)').run('daemon_started_at', value);
|
|
137
|
+
}
|
|
138
|
+
getDaemonStartedAt() {
|
|
139
|
+
const row = this.db.prepare('SELECT value FROM config WHERE key = ?').get('daemon_started_at');
|
|
140
|
+
return row?.value ?? null;
|
|
141
|
+
}
|
|
64
142
|
/** Generic config row (e.g. last_reward_claim_tick_at). */
|
|
65
143
|
getConfigValue(key) {
|
|
66
144
|
const row = this.db.prepare('SELECT value FROM config WHERE key = ?').get(key);
|
|
@@ -69,19 +147,268 @@ export class Store {
|
|
|
69
147
|
setConfigValue(key, value) {
|
|
70
148
|
this.db.prepare('INSERT OR REPLACE INTO config (key, value) VALUES (?, ?)').run(key, value);
|
|
71
149
|
}
|
|
150
|
+
getIntentPostRecord(args) {
|
|
151
|
+
const row = this.db.prepare(`SELECT creator_safe_address, source_key, policy_type, scope_key, desired_state_id, request_id,
|
|
152
|
+
first_posted_at, last_posted_at, post_count
|
|
153
|
+
FROM intent_posts
|
|
154
|
+
WHERE creator_safe_address = @creatorSafeAddress
|
|
155
|
+
AND source_key = @sourceKey
|
|
156
|
+
AND policy_type = @policyType
|
|
157
|
+
AND scope_key = @scopeKey`).get(args);
|
|
158
|
+
if (!row)
|
|
159
|
+
return null;
|
|
160
|
+
return {
|
|
161
|
+
creatorSafeAddress: row.creator_safe_address,
|
|
162
|
+
sourceKey: row.source_key,
|
|
163
|
+
policyType: row.policy_type,
|
|
164
|
+
scopeKey: row.scope_key,
|
|
165
|
+
desiredStateId: row.desired_state_id,
|
|
166
|
+
requestId: row.request_id,
|
|
167
|
+
firstPostedAt: row.first_posted_at,
|
|
168
|
+
lastPostedAt: row.last_posted_at,
|
|
169
|
+
postCount: row.post_count,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
upsertIntentPostRecord(record) {
|
|
173
|
+
this.db.prepare(`INSERT INTO intent_posts
|
|
174
|
+
(creator_safe_address, source_key, policy_type, scope_key, desired_state_id, request_id,
|
|
175
|
+
first_posted_at, last_posted_at, post_count)
|
|
176
|
+
VALUES
|
|
177
|
+
(@creatorSafeAddress, @sourceKey, @policyType, @scopeKey, @desiredStateId, @requestId,
|
|
178
|
+
@firstPostedAt, @lastPostedAt, @postCount)
|
|
179
|
+
ON CONFLICT(creator_safe_address, source_key, policy_type, scope_key) DO UPDATE SET
|
|
180
|
+
desired_state_id = excluded.desired_state_id,
|
|
181
|
+
request_id = excluded.request_id,
|
|
182
|
+
first_posted_at = excluded.first_posted_at,
|
|
183
|
+
last_posted_at = excluded.last_posted_at,
|
|
184
|
+
post_count = excluded.post_count`).run(record);
|
|
185
|
+
}
|
|
186
|
+
acquireIntentPostLock(args) {
|
|
187
|
+
const tx = this.db.transaction((params) => {
|
|
188
|
+
const existing = this.db.prepare(`SELECT owner_token, locked_at
|
|
189
|
+
FROM intent_post_locks
|
|
190
|
+
WHERE creator_safe_address = @creatorSafeAddress
|
|
191
|
+
AND source_key = @sourceKey
|
|
192
|
+
AND policy_type = @policyType
|
|
193
|
+
AND scope_key = @scopeKey`).get(params);
|
|
194
|
+
if (!existing) {
|
|
195
|
+
this.db.prepare(`INSERT INTO intent_post_locks
|
|
196
|
+
(creator_safe_address, source_key, policy_type, scope_key, owner_token, locked_at)
|
|
197
|
+
VALUES
|
|
198
|
+
(@creatorSafeAddress, @sourceKey, @policyType, @scopeKey, @ownerToken, @lockedAt)`).run(params);
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
const lockedAtMs = Date.parse(existing.locked_at);
|
|
202
|
+
const nowMs = Date.parse(params.lockedAt);
|
|
203
|
+
const isStale = Number.isFinite(lockedAtMs)
|
|
204
|
+
&& Number.isFinite(nowMs)
|
|
205
|
+
&& (nowMs - lockedAtMs) >= params.staleAfterMs;
|
|
206
|
+
if (!isStale) {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
this.db.prepare(`UPDATE intent_post_locks
|
|
210
|
+
SET owner_token = @ownerToken, locked_at = @lockedAt
|
|
211
|
+
WHERE creator_safe_address = @creatorSafeAddress
|
|
212
|
+
AND source_key = @sourceKey
|
|
213
|
+
AND policy_type = @policyType
|
|
214
|
+
AND scope_key = @scopeKey`).run(params);
|
|
215
|
+
return true;
|
|
216
|
+
});
|
|
217
|
+
return tx(args);
|
|
218
|
+
}
|
|
219
|
+
releaseIntentPostLock(args) {
|
|
220
|
+
this.db.prepare(`DELETE FROM intent_post_locks
|
|
221
|
+
WHERE creator_safe_address = @creatorSafeAddress
|
|
222
|
+
AND source_key = @sourceKey
|
|
223
|
+
AND policy_type = @policyType
|
|
224
|
+
AND scope_key = @scopeKey
|
|
225
|
+
AND owner_token = @ownerToken`).run(args);
|
|
226
|
+
}
|
|
72
227
|
/** Counts of protocol roles recorded for this node (best-effort activity hints). */
|
|
73
228
|
getOwnActivityCounts() {
|
|
229
|
+
const counts = this.getActivityCountsByKind();
|
|
230
|
+
if (Object.keys(counts).length > 0)
|
|
231
|
+
return counts;
|
|
74
232
|
const rows = this.db.prepare(`SELECT role, COUNT(*) as c FROM own_activity GROUP BY role`).all();
|
|
75
233
|
const out = {};
|
|
76
|
-
for (const r of rows)
|
|
234
|
+
for (const r of rows)
|
|
77
235
|
out[r.role] = r.c;
|
|
78
|
-
}
|
|
79
236
|
return out;
|
|
80
237
|
}
|
|
81
238
|
/** Latest own_activity rows by insertion order (approximate). */
|
|
82
239
|
getRecentOwnActivity(limit) {
|
|
83
|
-
const rows = this.
|
|
84
|
-
|
|
240
|
+
const rows = this.getRecentActivityEvents(limit);
|
|
241
|
+
if (rows.length > 0)
|
|
242
|
+
return rows.map((r) => ({ requestId: r.requestId ?? '', role: r.kind }));
|
|
243
|
+
const legacyRows = this.db.prepare(`SELECT request_id, role FROM own_activity ORDER BY rowid DESC LIMIT ?`).all(Math.max(0, Math.min(limit, 1000)));
|
|
244
|
+
return legacyRows.map(r => ({ requestId: r.request_id, role: r.role }));
|
|
245
|
+
}
|
|
246
|
+
recordActivityEvent(event) {
|
|
247
|
+
this.db.prepare(`INSERT INTO activity_events (ts, kind, request_id, service_index, tx_hash, spec_kind, outcome, detail)
|
|
248
|
+
VALUES (@ts, @kind, @requestId, @serviceIndex, @txHash, @specKind, @outcome, @detail)`).run({
|
|
249
|
+
ts: event.ts ?? null,
|
|
250
|
+
kind: event.kind,
|
|
251
|
+
requestId: event.requestId ?? null,
|
|
252
|
+
serviceIndex: event.serviceIndex ?? null,
|
|
253
|
+
txHash: event.txHash ?? null,
|
|
254
|
+
specKind: event.specKind ?? null,
|
|
255
|
+
outcome: event.outcome ?? null,
|
|
256
|
+
detail: event.detail ?? null,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
getRecentActivityEvents(limit, opts = {}) {
|
|
260
|
+
const effectiveLimit = Math.max(0, Math.min(limit, 1000));
|
|
261
|
+
const clauses = [];
|
|
262
|
+
const params = { limit: effectiveLimit };
|
|
263
|
+
if (opts.since) {
|
|
264
|
+
clauses.push('ts IS NOT NULL AND ts >= @since');
|
|
265
|
+
params['since'] = opts.since;
|
|
266
|
+
}
|
|
267
|
+
if (opts.cursor) {
|
|
268
|
+
clauses.push('ts IS NOT NULL AND ts < @cursor');
|
|
269
|
+
params['cursor'] = opts.cursor;
|
|
270
|
+
}
|
|
271
|
+
const where = clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : '';
|
|
272
|
+
const rows = this.db.prepare(`SELECT id, ts, kind, request_id, service_index, tx_hash, spec_kind, outcome, detail
|
|
273
|
+
FROM activity_events
|
|
274
|
+
${where}
|
|
275
|
+
ORDER BY id DESC
|
|
276
|
+
LIMIT @limit`).all(params);
|
|
277
|
+
return rows.map((r) => ({
|
|
278
|
+
id: r.id,
|
|
279
|
+
ts: r.ts,
|
|
280
|
+
kind: r.kind,
|
|
281
|
+
requestId: r.request_id,
|
|
282
|
+
serviceIndex: r.service_index,
|
|
283
|
+
txHash: r.tx_hash,
|
|
284
|
+
specKind: r.spec_kind,
|
|
285
|
+
outcome: r.outcome,
|
|
286
|
+
detail: r.detail,
|
|
287
|
+
}));
|
|
288
|
+
}
|
|
289
|
+
/** Newer events first, then ascending id for `jinn logs --follow` (oldest in batch printed first in caller). */
|
|
290
|
+
getActivityEventsAfterId(afterId, limit) {
|
|
291
|
+
const effectiveLimit = Math.max(0, Math.min(limit, 1000));
|
|
292
|
+
const rows = this.db
|
|
293
|
+
.prepare(`SELECT id, ts, kind, request_id, service_index, tx_hash, spec_kind, outcome, detail
|
|
294
|
+
FROM activity_events
|
|
295
|
+
WHERE id > @afterId
|
|
296
|
+
ORDER BY id ASC
|
|
297
|
+
LIMIT @limit`)
|
|
298
|
+
.all({ afterId, limit: effectiveLimit });
|
|
299
|
+
return rows.map((r) => ({
|
|
300
|
+
id: r.id,
|
|
301
|
+
ts: r.ts,
|
|
302
|
+
kind: r.kind,
|
|
303
|
+
requestId: r.request_id,
|
|
304
|
+
serviceIndex: r.service_index,
|
|
305
|
+
txHash: r.tx_hash,
|
|
306
|
+
specKind: r.spec_kind,
|
|
307
|
+
outcome: r.outcome,
|
|
308
|
+
detail: r.detail,
|
|
309
|
+
}));
|
|
310
|
+
}
|
|
311
|
+
getActivityCountsByKind() {
|
|
312
|
+
const rows = this.db.prepare(`SELECT kind, COUNT(*) as c FROM activity_events GROUP BY kind`).all();
|
|
313
|
+
const out = {};
|
|
314
|
+
for (const r of rows)
|
|
315
|
+
out[r.kind] = r.c;
|
|
316
|
+
return out;
|
|
317
|
+
}
|
|
318
|
+
getLastEventAtForService(serviceIndex) {
|
|
319
|
+
const row = this.db.prepare(`SELECT ts FROM activity_events WHERE service_index = ? AND ts IS NOT NULL ORDER BY id DESC LIMIT 1`).get(serviceIndex);
|
|
320
|
+
return row?.ts ?? null;
|
|
321
|
+
}
|
|
322
|
+
getActivityCountsForService(serviceIndex) {
|
|
323
|
+
const rows = this.db.prepare(`SELECT kind, COUNT(*) as c FROM activity_events WHERE service_index = ? GROUP BY kind`).all(serviceIndex);
|
|
324
|
+
const out = {};
|
|
325
|
+
for (const r of rows)
|
|
326
|
+
out[r.kind] = r.c;
|
|
327
|
+
return out;
|
|
328
|
+
}
|
|
329
|
+
recordRewardClaim(claim) {
|
|
330
|
+
this.db
|
|
331
|
+
.prepare(`INSERT OR IGNORE INTO reward_claims
|
|
332
|
+
(ts, service_index, service_id, staking_proxy, distributor, tx_hash, amount_wei, asset)
|
|
333
|
+
VALUES (@ts, @serviceIndex, @serviceId, @stakingProxy, @distributor, @txHash, @amountWei, @asset)`)
|
|
334
|
+
.run({
|
|
335
|
+
ts: claim.ts,
|
|
336
|
+
serviceIndex: claim.serviceIndex,
|
|
337
|
+
serviceId: claim.serviceId ?? null,
|
|
338
|
+
stakingProxy: claim.stakingProxy,
|
|
339
|
+
distributor: claim.distributor,
|
|
340
|
+
txHash: claim.txHash,
|
|
341
|
+
amountWei: claim.amountWei,
|
|
342
|
+
asset: claim.asset ?? 'reward',
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
getClaimedRewardsByService() {
|
|
346
|
+
const rows = this.db.prepare(`SELECT id, service_index, amount_wei, ts, tx_hash FROM reward_claims ORDER BY id ASC`).all();
|
|
347
|
+
const out = {};
|
|
348
|
+
const lastId = {};
|
|
349
|
+
for (const r of rows) {
|
|
350
|
+
const current = out[r.service_index];
|
|
351
|
+
const nextTotal = (current ? BigInt(current.total) : 0n) + BigInt(r.amount_wei);
|
|
352
|
+
const isNewer = !current || r.id > (lastId[r.service_index] ?? 0);
|
|
353
|
+
if (isNewer) {
|
|
354
|
+
lastId[r.service_index] = r.id;
|
|
355
|
+
}
|
|
356
|
+
out[r.service_index] = {
|
|
357
|
+
total: nextTotal.toString(),
|
|
358
|
+
lastAt: isNewer || !current ? r.ts : current.lastAt,
|
|
359
|
+
lastTxHash: isNewer || !current ? r.tx_hash : current.lastTxHash,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
return out;
|
|
363
|
+
}
|
|
364
|
+
upsertBalanceCache(entry) {
|
|
365
|
+
this.db.prepare(`INSERT INTO balance_cache (role, address, native_wei, bond_wei, asset_extra_json, fetched_at, error)
|
|
366
|
+
VALUES (@role, @address, @nativeWei, @bondWei, @assetExtraJson, @fetchedAt, @error)
|
|
367
|
+
ON CONFLICT(role) DO UPDATE SET
|
|
368
|
+
address=excluded.address,
|
|
369
|
+
native_wei=excluded.native_wei,
|
|
370
|
+
bond_wei=excluded.bond_wei,
|
|
371
|
+
asset_extra_json=excluded.asset_extra_json,
|
|
372
|
+
fetched_at=excluded.fetched_at,
|
|
373
|
+
error=excluded.error`).run({
|
|
374
|
+
role: entry.role,
|
|
375
|
+
address: entry.address,
|
|
376
|
+
nativeWei: entry.nativeWei ?? null,
|
|
377
|
+
bondWei: entry.bondWei ?? null,
|
|
378
|
+
assetExtraJson: entry.assetExtraJson ?? null,
|
|
379
|
+
fetchedAt: entry.fetchedAt,
|
|
380
|
+
error: entry.error ?? null,
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
getBalanceCache() {
|
|
384
|
+
const rows = this.db.prepare(`SELECT role, address, native_wei, bond_wei, asset_extra_json, fetched_at, error
|
|
385
|
+
FROM balance_cache`).all();
|
|
386
|
+
return rows.map((r) => ({
|
|
387
|
+
role: r.role,
|
|
388
|
+
address: r.address,
|
|
389
|
+
nativeWei: r.native_wei,
|
|
390
|
+
bondWei: r.bond_wei,
|
|
391
|
+
assetExtraJson: r.asset_extra_json,
|
|
392
|
+
fetchedAt: r.fetched_at,
|
|
393
|
+
error: r.error,
|
|
394
|
+
}));
|
|
395
|
+
}
|
|
396
|
+
backfillActivityEvents() {
|
|
397
|
+
const migrationKey = 'activity_events_migrated_v1';
|
|
398
|
+
const insert = this.db.prepare(`INSERT INTO activity_events (ts, kind, request_id)
|
|
399
|
+
SELECT NULL, o.role, o.request_id
|
|
400
|
+
FROM own_activity o
|
|
401
|
+
WHERE NOT EXISTS (
|
|
402
|
+
SELECT 1 FROM activity_events a
|
|
403
|
+
WHERE a.request_id = o.request_id AND a.kind = o.role
|
|
404
|
+
)`);
|
|
405
|
+
const tx = this.db.transaction(() => {
|
|
406
|
+
if (this.getConfigValue(migrationKey) === 'true')
|
|
407
|
+
return;
|
|
408
|
+
insert.run();
|
|
409
|
+
this.setConfigValue(migrationKey, 'true');
|
|
410
|
+
});
|
|
411
|
+
tx();
|
|
85
412
|
}
|
|
86
413
|
getLastProcessedBlock() {
|
|
87
414
|
const row = this.db.prepare('SELECT value FROM config WHERE key = ?').get('last_processed_block');
|
package/dist/store/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAE/E,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Bd,CAAC;AAEF,MAAM,OAAO,KAAK;IAChB,wEAAwE;IAC/D,EAAE,CAAoB;IACtB,IAAI,CAAS;IAEtB,YAAY,MAAc;QACxB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1B,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC3C,CAAC;IAED,iBAAiB,CAAC,SAAiB,EAAE,IAAuD;QAC1F,IAAI,CAAC,EAAE,CAAC,OAAO,CACb,sEAAsE,CACvE,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,aAAa,CAAC,SAAiB;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9F,OAAO,GAAG,KAAK,SAAS,CAAC;IAC3B,CAAC;IAED,gBAAgB,CAAC,KAA0B;QACzC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IAC3G,CAAC;IAED,gBAAgB;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAkC,CAAC;QAC7H,OAAO,GAAG,EAAE,KAAK,IAAI,IAAI,CAAC;IAC5B,CAAC;IAED,2DAA2D;IAC3D,cAAc,CAAC,GAAW;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAkC,CAAC;QAChH,OAAO,GAAG,EAAE,KAAK,IAAI,IAAI,CAAC;IAC5B,CAAC;IAED,cAAc,CAAC,GAAW,EAAE,KAAa;QACvC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9F,CAAC;IAED,oFAAoF;IACpF,oBAAoB;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,4DAA4D,CAC7D,CAAC,GAAG,EAAwC,CAAC;QAC9C,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,iEAAiE;IACjE,oBAAoB,CAAC,KAAa;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,uEAAuE,CACxE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAgD,CAAC;QACzF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,qBAAqB;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAkC,CAAC;QACnI,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAED,qBAAqB,CAAC,KAAa;QACjC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5H,CAAC;IAED,cAAc,CAAC,QAQd;QACC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC;YACL,GAAG,QAAQ;YACX,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CAAC,KAQf;QACC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAA4B,EAAE,CAAC;QAE3C,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;QACpC,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;QACxC,CAAC;QAED,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACtD,MAAM,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC;QAClD,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;QAChC,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,UAAU,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QAClC,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBACtC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAEhC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,qGAAqG,KAAK,mCAAmC,KAAK,EAAE,CACrJ,CAAC,GAAG,CAAC,MAAM,CAA2J,CAAC;QAExK,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtB,GAAG,GAAG;YACN,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAa;SACvC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,oBAAoB,CAAC,QAUpB;QACC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC;YACL,GAAG,QAAQ;YACX,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;YACnC,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB,CAAC,EAAU;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,CAAC,EAAE,CAA2C,CAAC;QAC5H,OAAO,GAAG,EAAE,OAAO,IAAI,IAAI,CAAC;IAC9B,CAAC;IAED,qBAAqB,CAAC,EAAU;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,kFAAkF,CACnF,CAAC,GAAG,CAAC,EAAE,CAAkF,CAAC;QAC3F,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO;YACL,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,SAAS;SAC9B,CAAC;IACJ,CAAC;IAED,sBAAsB,CAAC,SAAiB,EAAE,GAAW;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,+HAA+H,CAChI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,GAAG,CAA8F,CAAC;QAC1H,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAa,EAAE,CAAC;IAC5D,CAAC;IAED,kBAAkB,CAAC,EAAU,EAAE,OAAe;QAC5C,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"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"}
|