@jinn-network/client 0.1.0-canary.adfd078d
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/LICENSE +21 -0
- package/README.md +162 -0
- package/deployments/deployment-phase1a-l2-baseSepolia-fast.json +32 -0
- package/deployments/deployment-phase1a-token-baseSepolia-fast.json +27 -0
- package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +26 -0
- package/deployments/deployment-stolas-l2-baseSepolia-fast.json +35 -0
- package/dist/adapters/adapter.d.ts +11 -0
- package/dist/adapters/adapter.js +2 -0
- package/dist/adapters/adapter.js.map +1 -0
- package/dist/adapters/local/adapter.d.ts +20 -0
- package/dist/adapters/local/adapter.js +146 -0
- package/dist/adapters/local/adapter.js.map +1 -0
- package/dist/adapters/mech/adapter.d.ts +29 -0
- package/dist/adapters/mech/adapter.js +332 -0
- package/dist/adapters/mech/adapter.js.map +1 -0
- package/dist/adapters/mech/claim-policy.d.ts +40 -0
- package/dist/adapters/mech/claim-policy.js +104 -0
- package/dist/adapters/mech/claim-policy.js.map +1 -0
- package/dist/adapters/mech/contracts.d.ts +44 -0
- package/dist/adapters/mech/contracts.js +323 -0
- package/dist/adapters/mech/contracts.js.map +1 -0
- package/dist/adapters/mech/ipfs.d.ts +43 -0
- package/dist/adapters/mech/ipfs.js +142 -0
- package/dist/adapters/mech/ipfs.js.map +1 -0
- package/dist/adapters/mech/safe.d.ts +15 -0
- package/dist/adapters/mech/safe.js +113 -0
- package/dist/adapters/mech/safe.js.map +1 -0
- package/dist/adapters/mech/types.d.ts +561 -0
- package/dist/adapters/mech/types.js +340 -0
- package/dist/adapters/mech/types.js.map +1 -0
- package/dist/api/balance-build.d.ts +22 -0
- package/dist/api/balance-build.js +37 -0
- package/dist/api/balance-build.js.map +1 -0
- package/dist/api/fleet-build.d.ts +62 -0
- package/dist/api/fleet-build.js +91 -0
- package/dist/api/fleet-build.js.map +1 -0
- package/dist/api/gather-status.d.ts +20 -0
- package/dist/api/gather-status.js +137 -0
- package/dist/api/gather-status.js.map +1 -0
- package/dist/api/history-build.d.ts +32 -0
- package/dist/api/history-build.js +48 -0
- package/dist/api/history-build.js.map +1 -0
- package/dist/api/peers.d.ts +27 -0
- package/dist/api/peers.js +94 -0
- package/dist/api/peers.js.map +1 -0
- package/dist/api/rewards-build.d.ts +20 -0
- package/dist/api/rewards-build.js +42 -0
- package/dist/api/rewards-build.js.map +1 -0
- package/dist/api/server.d.ts +34 -0
- package/dist/api/server.js +130 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/status-build.d.ts +92 -0
- package/dist/api/status-build.js +175 -0
- package/dist/api/status-build.js.map +1 -0
- package/dist/api/status-rollup-build.d.ts +36 -0
- package/dist/api/status-rollup-build.js +69 -0
- package/dist/api/status-rollup-build.js.map +1 -0
- package/dist/auth/erc8128.d.ts +43 -0
- package/dist/auth/erc8128.js +88 -0
- package/dist/auth/erc8128.js.map +1 -0
- package/dist/bin/jinn.d.ts +11 -0
- package/dist/bin/jinn.js +20 -0
- package/dist/bin/jinn.js.map +1 -0
- package/dist/build-meta.json +3 -0
- package/dist/chain-read-errors.d.ts +9 -0
- package/dist/chain-read-errors.js +43 -0
- package/dist/chain-read-errors.js.map +1 -0
- package/dist/cli/action.d.ts +26 -0
- package/dist/cli/action.js +56 -0
- package/dist/cli/action.js.map +1 -0
- package/dist/cli/command.d.ts +62 -0
- package/dist/cli/command.js +29 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/commands/balance.d.ts +3 -0
- package/dist/cli/commands/balance.js +46 -0
- package/dist/cli/commands/balance.js.map +1 -0
- package/dist/cli/commands/bootstrap.d.ts +3 -0
- package/dist/cli/commands/bootstrap.js +165 -0
- package/dist/cli/commands/bootstrap.js.map +1 -0
- package/dist/cli/commands/claim-rewards.d.ts +3 -0
- package/dist/cli/commands/claim-rewards.js +121 -0
- package/dist/cli/commands/claim-rewards.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.js +151 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/fleet-scale.d.ts +3 -0
- package/dist/cli/commands/fleet-scale.js +449 -0
- package/dist/cli/commands/fleet-scale.js.map +1 -0
- package/dist/cli/commands/fleet.d.ts +3 -0
- package/dist/cli/commands/fleet.js +45 -0
- package/dist/cli/commands/fleet.js.map +1 -0
- package/dist/cli/commands/fund-requirements.d.ts +3 -0
- package/dist/cli/commands/fund-requirements.js +139 -0
- package/dist/cli/commands/fund-requirements.js.map +1 -0
- package/dist/cli/commands/history.d.ts +3 -0
- package/dist/cli/commands/history.js +61 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.js +91 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/keys-backup.d.ts +3 -0
- package/dist/cli/commands/keys-backup.js +107 -0
- package/dist/cli/commands/keys-backup.js.map +1 -0
- package/dist/cli/commands/logs.d.ts +3 -0
- package/dist/cli/commands/logs.js +69 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/rewards.d.ts +3 -0
- package/dist/cli/commands/rewards.js +54 -0
- package/dist/cli/commands/rewards.js.map +1 -0
- package/dist/cli/commands/run.d.ts +3 -0
- package/dist/cli/commands/run.js +96 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.js +54 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +3 -0
- package/dist/cli/commands/stop.js +82 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/submit-intent.d.ts +3 -0
- package/dist/cli/commands/submit-intent.js +169 -0
- package/dist/cli/commands/submit-intent.js.map +1 -0
- package/dist/cli/commands/version.d.ts +3 -0
- package/dist/cli/commands/version.js +114 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/commands/withdraw.d.ts +3 -0
- package/dist/cli/commands/withdraw.js +181 -0
- package/dist/cli/commands/withdraw.js.map +1 -0
- package/dist/cli/deployment-digest.d.ts +10 -0
- package/dist/cli/deployment-digest.js +25 -0
- package/dist/cli/deployment-digest.js.map +1 -0
- package/dist/cli/execution-context.d.ts +50 -0
- package/dist/cli/execution-context.js +154 -0
- package/dist/cli/execution-context.js.map +1 -0
- package/dist/cli/help.d.ts +3 -0
- package/dist/cli/help.js +37 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.js +132 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/introspection-context.d.ts +10 -0
- package/dist/cli/introspection-context.js +60 -0
- package/dist/cli/introspection-context.js.map +1 -0
- package/dist/cli/output.d.ts +36 -0
- package/dist/cli/output.js +35 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/password.d.ts +12 -0
- package/dist/cli/password.js +51 -0
- package/dist/cli/password.js.map +1 -0
- package/dist/config.d.ts +174 -0
- package/dist/config.js +252 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon/creator.d.ts +24 -0
- package/dist/daemon/creator.js +80 -0
- package/dist/daemon/creator.js.map +1 -0
- package/dist/daemon/daemon.d.ts +60 -0
- package/dist/daemon/daemon.js +158 -0
- package/dist/daemon/daemon.js.map +1 -0
- package/dist/daemon/delivery-watcher.d.ts +10 -0
- package/dist/daemon/delivery-watcher.js +37 -0
- package/dist/daemon/delivery-watcher.js.map +1 -0
- package/dist/daemon/restorer.d.ts +19 -0
- package/dist/daemon/restorer.js +82 -0
- package/dist/daemon/restorer.js.map +1 -0
- package/dist/daemon/reward-claim-loop.d.ts +38 -0
- package/dist/daemon/reward-claim-loop.js +48 -0
- package/dist/daemon/reward-claim-loop.js.map +1 -0
- package/dist/discovery/registry.d.ts +43 -0
- package/dist/discovery/registry.js +104 -0
- package/dist/discovery/registry.js.map +1 -0
- package/dist/discovery/subgraph.d.ts +37 -0
- package/dist/discovery/subgraph.js +87 -0
- package/dist/discovery/subgraph.js.map +1 -0
- package/dist/earning/bootstrap.d.ts +79 -0
- package/dist/earning/bootstrap.js +989 -0
- package/dist/earning/bootstrap.js.map +1 -0
- package/dist/earning/contracts.d.ts +431 -0
- package/dist/earning/contracts.js +518 -0
- package/dist/earning/contracts.js.map +1 -0
- package/dist/earning/evidence-simhash.d.ts +59 -0
- package/dist/earning/evidence-simhash.js +87 -0
- package/dist/earning/evidence-simhash.js.map +1 -0
- package/dist/earning/fleet-display-index.d.ts +8 -0
- package/dist/earning/fleet-display-index.js +12 -0
- package/dist/earning/fleet-display-index.js.map +1 -0
- package/dist/earning/fleet-retire.d.ts +28 -0
- package/dist/earning/fleet-retire.js +75 -0
- package/dist/earning/fleet-retire.js.map +1 -0
- package/dist/earning/jinn-rewards.d.ts +62 -0
- package/dist/earning/jinn-rewards.js +81 -0
- package/dist/earning/jinn-rewards.js.map +1 -0
- package/dist/earning/next-service-index.d.ts +4 -0
- package/dist/earning/next-service-index.js +7 -0
- package/dist/earning/next-service-index.js.map +1 -0
- package/dist/earning/orphan-sweep.d.ts +33 -0
- package/dist/earning/orphan-sweep.js +157 -0
- package/dist/earning/orphan-sweep.js.map +1 -0
- package/dist/earning/reconcile.d.ts +37 -0
- package/dist/earning/reconcile.js +216 -0
- package/dist/earning/reconcile.js.map +1 -0
- package/dist/earning/safe-adapter.d.ts +70 -0
- package/dist/earning/safe-adapter.js +228 -0
- package/dist/earning/safe-adapter.js.map +1 -0
- package/dist/earning/stolas-claim.d.ts +47 -0
- package/dist/earning/stolas-claim.js +115 -0
- package/dist/earning/stolas-claim.js.map +1 -0
- package/dist/earning/store.d.ts +36 -0
- package/dist/earning/store.js +156 -0
- package/dist/earning/store.js.map +1 -0
- package/dist/earning/types.d.ts +123 -0
- package/dist/earning/types.js +64 -0
- package/dist/earning/types.js.map +1 -0
- package/dist/earning/viem-clients.d.ts +9 -0
- package/dist/earning/viem-clients.js +22 -0
- package/dist/earning/viem-clients.js.map +1 -0
- package/dist/earning/wallet.d.ts +20 -0
- package/dist/earning/wallet.js +103 -0
- package/dist/earning/wallet.js.map +1 -0
- package/dist/errors/envelope.d.ts +41 -0
- package/dist/errors/envelope.js +48 -0
- package/dist/errors/envelope.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +32 -0
- package/dist/main.js +281 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/server.d.ts +14 -0
- package/dist/mcp/server.js +205 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/operator-errors.d.ts +16 -0
- package/dist/operator-errors.js +88 -0
- package/dist/operator-errors.js.map +1 -0
- package/dist/preflight/claude-binary.d.ts +19 -0
- package/dist/preflight/claude-binary.js +44 -0
- package/dist/preflight/claude-binary.js.map +1 -0
- package/dist/preflight/claude-invocation-envelope.d.ts +11 -0
- package/dist/preflight/claude-invocation-envelope.js +67 -0
- package/dist/preflight/claude-invocation-envelope.js.map +1 -0
- package/dist/runner/claude.d.ts +15 -0
- package/dist/runner/claude.js +193 -0
- package/dist/runner/claude.js.map +1 -0
- package/dist/runner/runner.d.ts +11 -0
- package/dist/runner/runner.js +2 -0
- package/dist/runner/runner.js.map +1 -0
- package/dist/runner/simple.d.ts +8 -0
- package/dist/runner/simple.js +11 -0
- package/dist/runner/simple.js.map +1 -0
- package/dist/store/store.d.ts +74 -0
- package/dist/store/store.js +173 -0
- package/dist/store/store.js.map +1 -0
- package/dist/tx-retry.d.ts +55 -0
- package/dist/tx-retry.js +214 -0
- package/dist/tx-retry.js.map +1 -0
- package/dist/types/desired-state.d.ts +41 -0
- package/dist/types/desired-state.js +16 -0
- package/dist/types/desired-state.js.map +1 -0
- package/dist/types/errors.d.ts +8 -0
- package/dist/types/errors.js +17 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/withdraw/args.d.ts +29 -0
- package/dist/withdraw/args.js +198 -0
- package/dist/withdraw/args.js.map +1 -0
- package/dist/withdraw/run-withdraw-plan.d.ts +21 -0
- package/dist/withdraw/run-withdraw-plan.js +257 -0
- package/dist/withdraw/run-withdraw-plan.js.map +1 -0
- package/dist/x402/acquire.d.ts +6 -0
- package/dist/x402/acquire.js +32 -0
- package/dist/x402/acquire.js.map +1 -0
- package/dist/x402/facilitator.d.ts +11 -0
- package/dist/x402/facilitator.js +52 -0
- package/dist/x402/facilitator.js.map +1 -0
- package/dist/x402/handler.d.ts +15 -0
- package/dist/x402/handler.js +40 -0
- package/dist/x402/handler.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ExecutionAdapter } from '../adapters/adapter.js';
|
|
2
|
+
import type { DesiredState, RequestId } from '../types/index.js';
|
|
3
|
+
import type { Store } from '../store/store.js';
|
|
4
|
+
export interface ActiveAttempt {
|
|
5
|
+
desiredState: DesiredState;
|
|
6
|
+
attemptNumber: number;
|
|
7
|
+
restorationRequestId: string;
|
|
8
|
+
status: 'pending' | 'resolved';
|
|
9
|
+
}
|
|
10
|
+
export declare class CreatorLoop {
|
|
11
|
+
private readonly adapter;
|
|
12
|
+
private readonly desiredStates;
|
|
13
|
+
private readonly store;
|
|
14
|
+
private stopped;
|
|
15
|
+
private posted;
|
|
16
|
+
private attempts;
|
|
17
|
+
private stopResolve;
|
|
18
|
+
private stopPromise;
|
|
19
|
+
private static readonly REPOST_INTERVAL_MS;
|
|
20
|
+
constructor(adapter: ExecutionAdapter, desiredStates: DesiredState[], store: Store);
|
|
21
|
+
tick(): Promise<RequestId | null>;
|
|
22
|
+
run(): Promise<void>;
|
|
23
|
+
stop(): void;
|
|
24
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { TransientError } from '../types/index.js';
|
|
2
|
+
import { isRecoverableTransactionError } from '../tx-retry.js';
|
|
3
|
+
export class CreatorLoop {
|
|
4
|
+
adapter;
|
|
5
|
+
desiredStates;
|
|
6
|
+
store;
|
|
7
|
+
stopped = false;
|
|
8
|
+
posted = new Map(); // stateId → timestamp of last post
|
|
9
|
+
attempts = new Map();
|
|
10
|
+
stopResolve = null;
|
|
11
|
+
stopPromise;
|
|
12
|
+
// Minimum interval between posting the same desired state (ms).
|
|
13
|
+
// ~20 activities/day needed; each cycle = 4 activities; 5 cycles/day = 1 every ~4.8h.
|
|
14
|
+
// Use 4h to provide safety margin.
|
|
15
|
+
static REPOST_INTERVAL_MS = 4 * 60 * 60 * 1000;
|
|
16
|
+
constructor(adapter, desiredStates, store) {
|
|
17
|
+
this.adapter = adapter;
|
|
18
|
+
this.desiredStates = desiredStates;
|
|
19
|
+
this.store = store;
|
|
20
|
+
this.stopPromise = new Promise(resolve => {
|
|
21
|
+
this.stopResolve = resolve;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
async tick() {
|
|
25
|
+
const now = Date.now();
|
|
26
|
+
for (const state of this.desiredStates) {
|
|
27
|
+
const lastPosted = this.posted.get(state.id);
|
|
28
|
+
if (lastPosted && (now - lastPosted) < CreatorLoop.REPOST_INTERVAL_MS)
|
|
29
|
+
continue;
|
|
30
|
+
try {
|
|
31
|
+
const prev = this.attempts.get(state.id);
|
|
32
|
+
const attemptNumber = prev ? prev.attemptNumber + 1 : 1;
|
|
33
|
+
const attemptId = `${state.id}/${attemptNumber}`;
|
|
34
|
+
const stateWithAttempt = {
|
|
35
|
+
...state,
|
|
36
|
+
type: 'restoration',
|
|
37
|
+
attemptId,
|
|
38
|
+
attemptNumber,
|
|
39
|
+
};
|
|
40
|
+
const requestId = await this.adapter.postDesiredState(stateWithAttempt);
|
|
41
|
+
this.posted.set(state.id, now);
|
|
42
|
+
this.attempts.set(state.id, {
|
|
43
|
+
desiredState: state,
|
|
44
|
+
attemptNumber,
|
|
45
|
+
restorationRequestId: requestId,
|
|
46
|
+
status: 'pending',
|
|
47
|
+
});
|
|
48
|
+
this.store.recordOwnActivity(requestId, 'created');
|
|
49
|
+
return requestId;
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (err instanceof TransientError)
|
|
53
|
+
continue;
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
async run() {
|
|
60
|
+
while (!this.stopped) {
|
|
61
|
+
let delayMs = 5000;
|
|
62
|
+
try {
|
|
63
|
+
await this.tick();
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
console.error('[creator] Error:', err);
|
|
67
|
+
delayMs = isRecoverableTransactionError(err) ? 12_000 : 8000;
|
|
68
|
+
}
|
|
69
|
+
await Promise.race([
|
|
70
|
+
new Promise(r => setTimeout(r, delayMs)),
|
|
71
|
+
this.stopPromise,
|
|
72
|
+
]);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
stop() {
|
|
76
|
+
this.stopped = true;
|
|
77
|
+
this.stopResolve?.();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=creator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creator.js","sourceRoot":"","sources":["../../src/daemon/creator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ExecutionAdapter } from '../adapters/adapter.js';
|
|
2
|
+
import type { Runner } from '../runner/runner.js';
|
|
3
|
+
import type { DesiredState } from '../types/index.js';
|
|
4
|
+
import type { StatusGatherConfig } from '../api/gather-status.js';
|
|
5
|
+
import type { EthHttpSigner } from '../auth/erc8128.js';
|
|
6
|
+
import { type RegistryConfig } from '../discovery/registry.js';
|
|
7
|
+
import type { X402Config } from '../x402/handler.js';
|
|
8
|
+
import { type RewardClaimLoopConfig } from './reward-claim-loop.js';
|
|
9
|
+
export interface DaemonConfig {
|
|
10
|
+
adapter: ExecutionAdapter;
|
|
11
|
+
runner: Runner;
|
|
12
|
+
desiredStates: DesiredState[];
|
|
13
|
+
dbPath: string;
|
|
14
|
+
shutdownTimeoutMs?: number;
|
|
15
|
+
apiPort?: number;
|
|
16
|
+
peers?: string[];
|
|
17
|
+
signer?: EthHttpSigner;
|
|
18
|
+
registry?: RegistryConfig;
|
|
19
|
+
subgraphUrl?: string;
|
|
20
|
+
/** This node's public HTTP endpoint (for 8004 registration) */
|
|
21
|
+
nodeEndpoint?: string;
|
|
22
|
+
x402?: X402Config;
|
|
23
|
+
/**
|
|
24
|
+
* Periodic stOLAS distributor reward claims (master EOA pays gas).
|
|
25
|
+
* Omitted or interval 0 → loop not started.
|
|
26
|
+
*/
|
|
27
|
+
rewardClaim?: RewardClaimLoopConfig;
|
|
28
|
+
/** Passed to HTTP API for GET /v1/status (fleet + RPC hints). */
|
|
29
|
+
status?: StatusGatherConfig;
|
|
30
|
+
}
|
|
31
|
+
export declare class Daemon {
|
|
32
|
+
private readonly config;
|
|
33
|
+
private store;
|
|
34
|
+
private creatorLoop;
|
|
35
|
+
private restorerLoop;
|
|
36
|
+
private deliveryWatcherLoop;
|
|
37
|
+
private adapter;
|
|
38
|
+
private loopPromises;
|
|
39
|
+
private cachedShutdownState;
|
|
40
|
+
private apiServer?;
|
|
41
|
+
private peerSync?;
|
|
42
|
+
private registry?;
|
|
43
|
+
private readonly apiPort;
|
|
44
|
+
private rewardClaimLoop?;
|
|
45
|
+
constructor(config: DaemonConfig);
|
|
46
|
+
start(): Promise<void>;
|
|
47
|
+
stop(): Promise<void>;
|
|
48
|
+
getShutdownState(): string | null;
|
|
49
|
+
/**
|
|
50
|
+
* Register an artifact on the 8004 registry (fire-and-forget).
|
|
51
|
+
* Called after local artifact publish if registry is configured.
|
|
52
|
+
*/
|
|
53
|
+
registerArtifact(artifact: {
|
|
54
|
+
id: string;
|
|
55
|
+
title: string;
|
|
56
|
+
tags: string[];
|
|
57
|
+
outcome: string;
|
|
58
|
+
}): void;
|
|
59
|
+
private backfillFromSubgraph;
|
|
60
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { Store } from '../store/store.js';
|
|
2
|
+
import { CreatorLoop } from './creator.js';
|
|
3
|
+
import { RestorerLoop } from './restorer.js';
|
|
4
|
+
import { DeliveryWatcherLoop } from './delivery-watcher.js';
|
|
5
|
+
import { startApiServer } from '../api/server.js';
|
|
6
|
+
import { PeerSync } from '../api/peers.js';
|
|
7
|
+
import { Registry8004 } from '../discovery/registry.js';
|
|
8
|
+
import { queryArtifacts, queryNodes, getMetadataValue } from '../discovery/subgraph.js';
|
|
9
|
+
import { RewardClaimLoop } from './reward-claim-loop.js';
|
|
10
|
+
const DEFAULT_API_PORT = 7331;
|
|
11
|
+
export class Daemon {
|
|
12
|
+
config;
|
|
13
|
+
store;
|
|
14
|
+
creatorLoop;
|
|
15
|
+
restorerLoop;
|
|
16
|
+
deliveryWatcherLoop;
|
|
17
|
+
adapter;
|
|
18
|
+
loopPromises = [];
|
|
19
|
+
cachedShutdownState = null;
|
|
20
|
+
apiServer;
|
|
21
|
+
peerSync;
|
|
22
|
+
registry;
|
|
23
|
+
apiPort;
|
|
24
|
+
rewardClaimLoop;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
this.config = config;
|
|
27
|
+
this.store = new Store(config.dbPath);
|
|
28
|
+
this.adapter = config.adapter;
|
|
29
|
+
this.apiPort = config.apiPort ?? parseInt(process.env['JINN_API_PORT'] ?? String(DEFAULT_API_PORT));
|
|
30
|
+
this.creatorLoop = new CreatorLoop(this.adapter, config.desiredStates, this.store);
|
|
31
|
+
this.restorerLoop = new RestorerLoop(this.adapter, config.runner, this.store, '/tmp', 300000, `http://127.0.0.1:${this.apiPort}`);
|
|
32
|
+
this.deliveryWatcherLoop = new DeliveryWatcherLoop(this.adapter);
|
|
33
|
+
if (config.rewardClaim && config.rewardClaim.intervalMs > 0) {
|
|
34
|
+
this.rewardClaimLoop = new RewardClaimLoop({
|
|
35
|
+
...config.rewardClaim,
|
|
36
|
+
jinnStore: this.store,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async start() {
|
|
41
|
+
await this.adapter.initialize();
|
|
42
|
+
this.store.setShutdownState('running');
|
|
43
|
+
this.cachedShutdownState = 'running';
|
|
44
|
+
// Start HTTP API server
|
|
45
|
+
this.apiServer = await startApiServer({
|
|
46
|
+
port: this.apiPort,
|
|
47
|
+
store: this.store,
|
|
48
|
+
onArtifactPublished: (artifact) => this.registerArtifact(artifact),
|
|
49
|
+
x402: this.config.x402,
|
|
50
|
+
status: this.config.status,
|
|
51
|
+
});
|
|
52
|
+
// Initialize 8004 registry if configured
|
|
53
|
+
if (this.config.registry) {
|
|
54
|
+
this.registry = new Registry8004(this.config.registry);
|
|
55
|
+
console.log('[daemon] 8004 registry configured');
|
|
56
|
+
}
|
|
57
|
+
// Backfill remote artifacts from subgraph if configured
|
|
58
|
+
const subgraphUrl = this.config.subgraphUrl ?? process.env['JINN_SUBGRAPH_URL'];
|
|
59
|
+
if (subgraphUrl) {
|
|
60
|
+
try {
|
|
61
|
+
await this.backfillFromSubgraph({ url: subgraphUrl });
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
console.error('[daemon] Subgraph backfill failed (non-fatal):', err instanceof Error ? err.message : err);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Start peer sync if peers configured
|
|
68
|
+
const peers = this.config.peers ?? (process.env['JINN_PEERS'] ?? '').split(',').filter(Boolean);
|
|
69
|
+
if (peers.length > 0) {
|
|
70
|
+
this.peerSync = new PeerSync({
|
|
71
|
+
peers,
|
|
72
|
+
store: this.store,
|
|
73
|
+
signer: this.config.signer,
|
|
74
|
+
});
|
|
75
|
+
this.loopPromises.push(this.peerSync.run().catch(err => console.error('[daemon] peer-sync crashed:', err)));
|
|
76
|
+
}
|
|
77
|
+
this.loopPromises.push(this.creatorLoop.run().catch(err => console.error('[daemon] creator crashed:', err)), this.restorerLoop.run().catch(err => console.error('[daemon] restorer crashed:', err)), this.deliveryWatcherLoop.run().catch(err => console.error('[daemon] delivery-watcher crashed:', err)));
|
|
78
|
+
if (this.rewardClaimLoop) {
|
|
79
|
+
this.loopPromises.push(this.rewardClaimLoop.run().catch(err => console.error('[daemon] reward-claim crashed:', err)));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async stop() {
|
|
83
|
+
this.creatorLoop.stop();
|
|
84
|
+
this.restorerLoop.stop();
|
|
85
|
+
this.deliveryWatcherLoop.stop();
|
|
86
|
+
this.rewardClaimLoop?.stop();
|
|
87
|
+
this.peerSync?.stop();
|
|
88
|
+
// Stop the adapter to unblock any pending async iterators
|
|
89
|
+
await this.adapter.stop();
|
|
90
|
+
await this.apiServer?.close();
|
|
91
|
+
const timeout = this.config.shutdownTimeoutMs ?? 30000;
|
|
92
|
+
await Promise.race([
|
|
93
|
+
Promise.allSettled(this.loopPromises),
|
|
94
|
+
new Promise(r => setTimeout(r, timeout)),
|
|
95
|
+
]);
|
|
96
|
+
this.store.setShutdownState('clean');
|
|
97
|
+
this.cachedShutdownState = 'clean';
|
|
98
|
+
this.store.close();
|
|
99
|
+
}
|
|
100
|
+
getShutdownState() {
|
|
101
|
+
return this.cachedShutdownState;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Register an artifact on the 8004 registry (fire-and-forget).
|
|
105
|
+
* Called after local artifact publish if registry is configured.
|
|
106
|
+
*/
|
|
107
|
+
registerArtifact(artifact) {
|
|
108
|
+
if (!this.registry)
|
|
109
|
+
return;
|
|
110
|
+
const endpoint = this.config.nodeEndpoint ?? `http://localhost:${this.config.apiPort ?? DEFAULT_API_PORT}`;
|
|
111
|
+
this.registry.registerArtifact({ ...artifact, endpoint }).catch(err => {
|
|
112
|
+
console.error(`[daemon] 8004 artifact registration failed (non-fatal): ${err instanceof Error ? err.message : err}`);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async backfillFromSubgraph(config) {
|
|
116
|
+
console.log(`[daemon] Backfilling from subgraph: ${config.url}`);
|
|
117
|
+
// Backfill artifacts
|
|
118
|
+
const artifacts = await queryArtifacts(config);
|
|
119
|
+
let artifactCount = 0;
|
|
120
|
+
for (const result of artifacts) {
|
|
121
|
+
const artifactId = getMetadataValue(result, 'artifactId');
|
|
122
|
+
const title = getMetadataValue(result, 'title') ?? '';
|
|
123
|
+
const outcome = getMetadataValue(result, 'outcome') ?? 'UNKNOWN';
|
|
124
|
+
const endpoint = getMetadataValue(result, 'endpoint') ?? '';
|
|
125
|
+
const tagsRaw = getMetadataValue(result, 'tags');
|
|
126
|
+
const tags = tagsRaw ? JSON.parse(tagsRaw) : [];
|
|
127
|
+
if (!artifactId || !endpoint)
|
|
128
|
+
continue;
|
|
129
|
+
this.store.insertRemoteArtifact({
|
|
130
|
+
id: artifactId,
|
|
131
|
+
desiredStateId: '',
|
|
132
|
+
requestId: '',
|
|
133
|
+
title,
|
|
134
|
+
tags,
|
|
135
|
+
outcome: outcome,
|
|
136
|
+
ownerAddress: result.owner,
|
|
137
|
+
endpoint,
|
|
138
|
+
});
|
|
139
|
+
artifactCount++;
|
|
140
|
+
}
|
|
141
|
+
// Backfill peer nodes
|
|
142
|
+
const nodes = await queryNodes(config);
|
|
143
|
+
const discoveredPeers = [];
|
|
144
|
+
for (const result of nodes) {
|
|
145
|
+
const endpoint = getMetadataValue(result, 'endpoint');
|
|
146
|
+
if (endpoint)
|
|
147
|
+
discoveredPeers.push(endpoint);
|
|
148
|
+
}
|
|
149
|
+
console.log(`[daemon] Backfill complete: ${artifactCount} artifacts, ${discoveredPeers.length} nodes`);
|
|
150
|
+
// Auto-add discovered peers to peer sync
|
|
151
|
+
if (discoveredPeers.length > 0 && this.peerSync) {
|
|
152
|
+
// PeerSync is already running with configured peers — discovered peers
|
|
153
|
+
// would need to be merged. For now, just log them.
|
|
154
|
+
console.log(`[daemon] Discovered peers: ${discoveredPeers.join(', ')}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/daemon/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ExecutionAdapter } from '../adapters/adapter.js';
|
|
2
|
+
export declare class DeliveryWatcherLoop {
|
|
3
|
+
private readonly adapter;
|
|
4
|
+
private stopped;
|
|
5
|
+
private stopResolve;
|
|
6
|
+
private stopPromise;
|
|
7
|
+
constructor(adapter: ExecutionAdapter);
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
stop(): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { isRecoverableTransactionError } from '../tx-retry.js';
|
|
2
|
+
export class DeliveryWatcherLoop {
|
|
3
|
+
adapter;
|
|
4
|
+
stopped = false;
|
|
5
|
+
stopResolve = null;
|
|
6
|
+
stopPromise;
|
|
7
|
+
constructor(adapter) {
|
|
8
|
+
this.adapter = adapter;
|
|
9
|
+
this.stopPromise = new Promise(resolve => {
|
|
10
|
+
this.stopResolve = resolve;
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
async run() {
|
|
14
|
+
while (!this.stopped) {
|
|
15
|
+
try {
|
|
16
|
+
for await (const delivery of this.adapter.watchForDeliveries()) {
|
|
17
|
+
if (this.stopped)
|
|
18
|
+
break;
|
|
19
|
+
// The adapter handles claim + evaluation creation internally.
|
|
20
|
+
// We just drive the iteration and log for observability.
|
|
21
|
+
const type = delivery.desiredState.type ?? 'unknown';
|
|
22
|
+
console.error(`[delivery-watcher] Processed ${type} delivery: ${delivery.requestId.slice(0, 10)}...`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
console.error('[delivery-watcher] Error:', err);
|
|
27
|
+
const delayMs = isRecoverableTransactionError(err) ? 12_000 : 5000;
|
|
28
|
+
await Promise.race([new Promise(r => setTimeout(r, delayMs)), this.stopPromise]);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
stop() {
|
|
33
|
+
this.stopped = true;
|
|
34
|
+
this.stopResolve?.();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=delivery-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-watcher.js","sourceRoot":"","sources":["../../src/daemon/delivery-watcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAE/D,MAAM,OAAO,mBAAmB;IAKD;IAJrB,OAAO,GAAG,KAAK,CAAC;IAChB,WAAW,GAAwB,IAAI,CAAC;IACxC,WAAW,CAAgB;IAEnC,YAA6B,OAAyB;QAAzB,YAAO,GAAP,OAAO,CAAkB;QACpD,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YACvC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG;QACP,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;oBAC/D,IAAI,IAAI,CAAC,OAAO;wBAAE,MAAM;oBACxB,8DAA8D;oBAC9D,yDAAyD;oBACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,SAAS,CAAC;oBACrD,OAAO,CAAC,KAAK,CAAC,gCAAgC,IAAI,cAAc,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;gBACxG,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;gBAChD,MAAM,OAAO,GAAG,6BAA6B,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;gBACnE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ExecutionAdapter } from '../adapters/adapter.js';
|
|
2
|
+
import type { Runner } from '../runner/runner.js';
|
|
3
|
+
import type { Store } from '../store/store.js';
|
|
4
|
+
export declare class RestorerLoop {
|
|
5
|
+
private readonly adapter;
|
|
6
|
+
private readonly runner;
|
|
7
|
+
private readonly store;
|
|
8
|
+
private readonly workingDirectory;
|
|
9
|
+
private readonly timeoutMs;
|
|
10
|
+
private readonly daemonApiUrl?;
|
|
11
|
+
private stopped;
|
|
12
|
+
private requestIterator;
|
|
13
|
+
private stopResolve;
|
|
14
|
+
private stopPromise;
|
|
15
|
+
constructor(adapter: ExecutionAdapter, runner: Runner, store: Store, workingDirectory?: string, timeoutMs?: number, daemonApiUrl?: string | undefined);
|
|
16
|
+
processOne(): Promise<boolean>;
|
|
17
|
+
run(): Promise<void>;
|
|
18
|
+
stop(): void;
|
|
19
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { PermanentError, TransientError } from '../types/index.js';
|
|
2
|
+
import { isRecoverableTransactionError } from '../tx-retry.js';
|
|
3
|
+
export class RestorerLoop {
|
|
4
|
+
adapter;
|
|
5
|
+
runner;
|
|
6
|
+
store;
|
|
7
|
+
workingDirectory;
|
|
8
|
+
timeoutMs;
|
|
9
|
+
daemonApiUrl;
|
|
10
|
+
stopped = false;
|
|
11
|
+
requestIterator = null;
|
|
12
|
+
stopResolve = null;
|
|
13
|
+
stopPromise;
|
|
14
|
+
constructor(adapter, runner, store, workingDirectory = '/tmp', timeoutMs = 300000, daemonApiUrl) {
|
|
15
|
+
this.adapter = adapter;
|
|
16
|
+
this.runner = runner;
|
|
17
|
+
this.store = store;
|
|
18
|
+
this.workingDirectory = workingDirectory;
|
|
19
|
+
this.timeoutMs = timeoutMs;
|
|
20
|
+
this.daemonApiUrl = daemonApiUrl;
|
|
21
|
+
this.stopPromise = new Promise(resolve => {
|
|
22
|
+
this.stopResolve = resolve;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async processOne() {
|
|
26
|
+
if (!this.requestIterator) {
|
|
27
|
+
this.requestIterator = this.adapter.watchForRequests()[Symbol.asyncIterator]();
|
|
28
|
+
}
|
|
29
|
+
const { value: request, done } = await this.requestIterator.next();
|
|
30
|
+
if (done || !request || !request.requestId)
|
|
31
|
+
return false;
|
|
32
|
+
try {
|
|
33
|
+
await this.adapter.claimRequest(request.requestId);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
if (err instanceof PermanentError) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
this.store.recordOwnActivity(request.requestId, 'claimed');
|
|
42
|
+
try {
|
|
43
|
+
const result = await this.runner.run(request.desiredState, {
|
|
44
|
+
requestId: request.requestId,
|
|
45
|
+
workingDirectory: this.workingDirectory,
|
|
46
|
+
timeoutMs: this.timeoutMs,
|
|
47
|
+
storePath: this.store.path,
|
|
48
|
+
daemonApiUrl: this.daemonApiUrl,
|
|
49
|
+
});
|
|
50
|
+
await this.adapter.submitResult(request.requestId, result);
|
|
51
|
+
this.store.recordOwnActivity(request.requestId, 'delivered');
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
if (!(err instanceof TransientError)) {
|
|
55
|
+
console.error(`[restorer] Failed to restore ${request.requestId}:`, err);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
async run() {
|
|
61
|
+
while (!this.stopped) {
|
|
62
|
+
try {
|
|
63
|
+
await this.processOne();
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
if (err instanceof TransientError) {
|
|
67
|
+
await Promise.race([new Promise(r => setTimeout(r, 5000)), this.stopPromise]);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
console.error('[restorer] Error:', err);
|
|
71
|
+
const delayMs = isRecoverableTransactionError(err) ? 15_000 : 10_000;
|
|
72
|
+
await Promise.race([new Promise(r => setTimeout(r, delayMs)), this.stopPromise]);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
stop() {
|
|
78
|
+
this.stopped = true;
|
|
79
|
+
this.stopResolve?.();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=restorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restorer.js","sourceRoot":"","sources":["../../src/daemon/restorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Periodic stOLAS distributor reward claims for all staked fleet services.
|
|
3
|
+
*
|
|
4
|
+
* Scheduling: interval from config (default 10 minutes). OLAS/Jinn checkpoints are gated by
|
|
5
|
+
* liveness periods (often much longer on mainnet); polling at this cadence is a balance between
|
|
6
|
+
* catching rewards before eviction and RPC/gas overhead. Operators can tune via
|
|
7
|
+
* rewardClaimIntervalMs / JINN_REWARD_CLAIM_INTERVAL_MS. Set interval to 0 to disable.
|
|
8
|
+
*/
|
|
9
|
+
import type { PublicClient } from 'viem';
|
|
10
|
+
import type { WalletClient } from 'viem';
|
|
11
|
+
import { FleetStateStore } from '../earning/store.js';
|
|
12
|
+
import { type StolasClaimTickResult } from '../earning/stolas-claim.js';
|
|
13
|
+
import type { Store } from '../store/store.js';
|
|
14
|
+
export interface RewardClaimLoopConfig {
|
|
15
|
+
intervalMs: number;
|
|
16
|
+
publicClient: PublicClient;
|
|
17
|
+
/** Master EOA — same signer as distributor.stake() in bootstrap (pays gas). */
|
|
18
|
+
masterWallet: WalletClient;
|
|
19
|
+
store: FleetStateStore;
|
|
20
|
+
chain: 'base' | 'base-sepolia';
|
|
21
|
+
/** Resolved from getChainConfig (artifact overrides). */
|
|
22
|
+
distributorAddress: string | undefined;
|
|
23
|
+
/** When set, records last claim-loop tick time for GET /v1/status. */
|
|
24
|
+
jinnStore?: Store;
|
|
25
|
+
}
|
|
26
|
+
export type RewardClaimTickConfig = Omit<RewardClaimLoopConfig, 'intervalMs'> & {
|
|
27
|
+
/** When true, per-service claim failures can throw (CLI); daemon omits. */
|
|
28
|
+
strict?: boolean;
|
|
29
|
+
};
|
|
30
|
+
export declare function runRewardClaimOnce(cfg: RewardClaimTickConfig): Promise<StolasClaimTickResult>;
|
|
31
|
+
export declare class RewardClaimLoop {
|
|
32
|
+
private readonly config;
|
|
33
|
+
private stopped;
|
|
34
|
+
constructor(config: RewardClaimLoopConfig);
|
|
35
|
+
stop(): void;
|
|
36
|
+
runOnce(): Promise<void>;
|
|
37
|
+
run(): Promise<void>;
|
|
38
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Periodic stOLAS distributor reward claims for all staked fleet services.
|
|
3
|
+
*
|
|
4
|
+
* Scheduling: interval from config (default 10 minutes). OLAS/Jinn checkpoints are gated by
|
|
5
|
+
* liveness periods (often much longer on mainnet); polling at this cadence is a balance between
|
|
6
|
+
* catching rewards before eviction and RPC/gas overhead. Operators can tune via
|
|
7
|
+
* rewardClaimIntervalMs / JINN_REWARD_CLAIM_INTERVAL_MS. Set interval to 0 to disable.
|
|
8
|
+
*/
|
|
9
|
+
import { listStolasClaimTargets, tickStolasDistributorClaims, } from '../earning/stolas-claim.js';
|
|
10
|
+
export async function runRewardClaimOnce(cfg) {
|
|
11
|
+
const state = await cfg.store.load(cfg.chain);
|
|
12
|
+
const targets = listStolasClaimTargets(state.services);
|
|
13
|
+
return tickStolasDistributorClaims(cfg.publicClient, cfg.masterWallet, {
|
|
14
|
+
distributorAddress: cfg.distributorAddress,
|
|
15
|
+
stakingMode: state.staking_mode,
|
|
16
|
+
targets,
|
|
17
|
+
strict: cfg.strict,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export class RewardClaimLoop {
|
|
21
|
+
config;
|
|
22
|
+
stopped = false;
|
|
23
|
+
constructor(config) {
|
|
24
|
+
this.config = config;
|
|
25
|
+
}
|
|
26
|
+
stop() {
|
|
27
|
+
this.stopped = true;
|
|
28
|
+
}
|
|
29
|
+
async runOnce() {
|
|
30
|
+
await runRewardClaimOnce(this.config);
|
|
31
|
+
}
|
|
32
|
+
async run() {
|
|
33
|
+
if (this.config.intervalMs <= 0) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
while (!this.stopped) {
|
|
37
|
+
try {
|
|
38
|
+
await this.runOnce();
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
console.error('[reward-claim] Tick failed (non-fatal):', err instanceof Error ? err.message : err);
|
|
42
|
+
}
|
|
43
|
+
this.config.jinnStore?.setConfigValue('last_reward_claim_tick_at', new Date().toISOString());
|
|
44
|
+
await new Promise(r => setTimeout(r, this.config.intervalMs));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=reward-claim-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reward-claim-loop.js","sourceRoot":"","sources":["../../src/daemon/reward-claim-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EACL,sBAAsB,EACtB,2BAA2B,GAE5B,MAAM,4BAA4B,CAAC;AAqBpC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAA0B;IACjE,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvD,OAAO,2BAA2B,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE;QACrE,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;QAC1C,WAAW,EAAE,KAAK,CAAC,YAAY;QAC/B,OAAO;QACP,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,eAAe;IAGG;IAFrB,OAAO,GAAG,KAAK,CAAC;IAExB,YAA6B,MAA6B;QAA7B,WAAM,GAAN,MAAM,CAAuB;IAAG,CAAC;IAE9D,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,GAAG;QACP,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACvB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACrG,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,2BAA2B,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YAC7F,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;CACF"}
|