@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.
Files changed (278) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -0
  3. package/deployments/deployment-phase1a-l2-baseSepolia-fast.json +32 -0
  4. package/deployments/deployment-phase1a-token-baseSepolia-fast.json +27 -0
  5. package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +26 -0
  6. package/deployments/deployment-stolas-l2-baseSepolia-fast.json +35 -0
  7. package/dist/adapters/adapter.d.ts +11 -0
  8. package/dist/adapters/adapter.js +2 -0
  9. package/dist/adapters/adapter.js.map +1 -0
  10. package/dist/adapters/local/adapter.d.ts +20 -0
  11. package/dist/adapters/local/adapter.js +146 -0
  12. package/dist/adapters/local/adapter.js.map +1 -0
  13. package/dist/adapters/mech/adapter.d.ts +29 -0
  14. package/dist/adapters/mech/adapter.js +332 -0
  15. package/dist/adapters/mech/adapter.js.map +1 -0
  16. package/dist/adapters/mech/claim-policy.d.ts +40 -0
  17. package/dist/adapters/mech/claim-policy.js +104 -0
  18. package/dist/adapters/mech/claim-policy.js.map +1 -0
  19. package/dist/adapters/mech/contracts.d.ts +44 -0
  20. package/dist/adapters/mech/contracts.js +323 -0
  21. package/dist/adapters/mech/contracts.js.map +1 -0
  22. package/dist/adapters/mech/ipfs.d.ts +43 -0
  23. package/dist/adapters/mech/ipfs.js +142 -0
  24. package/dist/adapters/mech/ipfs.js.map +1 -0
  25. package/dist/adapters/mech/safe.d.ts +15 -0
  26. package/dist/adapters/mech/safe.js +113 -0
  27. package/dist/adapters/mech/safe.js.map +1 -0
  28. package/dist/adapters/mech/types.d.ts +561 -0
  29. package/dist/adapters/mech/types.js +340 -0
  30. package/dist/adapters/mech/types.js.map +1 -0
  31. package/dist/api/balance-build.d.ts +22 -0
  32. package/dist/api/balance-build.js +37 -0
  33. package/dist/api/balance-build.js.map +1 -0
  34. package/dist/api/fleet-build.d.ts +62 -0
  35. package/dist/api/fleet-build.js +91 -0
  36. package/dist/api/fleet-build.js.map +1 -0
  37. package/dist/api/gather-status.d.ts +20 -0
  38. package/dist/api/gather-status.js +137 -0
  39. package/dist/api/gather-status.js.map +1 -0
  40. package/dist/api/history-build.d.ts +32 -0
  41. package/dist/api/history-build.js +48 -0
  42. package/dist/api/history-build.js.map +1 -0
  43. package/dist/api/peers.d.ts +27 -0
  44. package/dist/api/peers.js +94 -0
  45. package/dist/api/peers.js.map +1 -0
  46. package/dist/api/rewards-build.d.ts +20 -0
  47. package/dist/api/rewards-build.js +42 -0
  48. package/dist/api/rewards-build.js.map +1 -0
  49. package/dist/api/server.d.ts +34 -0
  50. package/dist/api/server.js +130 -0
  51. package/dist/api/server.js.map +1 -0
  52. package/dist/api/status-build.d.ts +92 -0
  53. package/dist/api/status-build.js +175 -0
  54. package/dist/api/status-build.js.map +1 -0
  55. package/dist/api/status-rollup-build.d.ts +36 -0
  56. package/dist/api/status-rollup-build.js +69 -0
  57. package/dist/api/status-rollup-build.js.map +1 -0
  58. package/dist/auth/erc8128.d.ts +43 -0
  59. package/dist/auth/erc8128.js +88 -0
  60. package/dist/auth/erc8128.js.map +1 -0
  61. package/dist/bin/jinn.d.ts +11 -0
  62. package/dist/bin/jinn.js +20 -0
  63. package/dist/bin/jinn.js.map +1 -0
  64. package/dist/build-meta.json +3 -0
  65. package/dist/chain-read-errors.d.ts +9 -0
  66. package/dist/chain-read-errors.js +43 -0
  67. package/dist/chain-read-errors.js.map +1 -0
  68. package/dist/cli/action.d.ts +26 -0
  69. package/dist/cli/action.js +56 -0
  70. package/dist/cli/action.js.map +1 -0
  71. package/dist/cli/command.d.ts +62 -0
  72. package/dist/cli/command.js +29 -0
  73. package/dist/cli/command.js.map +1 -0
  74. package/dist/cli/commands/balance.d.ts +3 -0
  75. package/dist/cli/commands/balance.js +46 -0
  76. package/dist/cli/commands/balance.js.map +1 -0
  77. package/dist/cli/commands/bootstrap.d.ts +3 -0
  78. package/dist/cli/commands/bootstrap.js +165 -0
  79. package/dist/cli/commands/bootstrap.js.map +1 -0
  80. package/dist/cli/commands/claim-rewards.d.ts +3 -0
  81. package/dist/cli/commands/claim-rewards.js +121 -0
  82. package/dist/cli/commands/claim-rewards.js.map +1 -0
  83. package/dist/cli/commands/doctor.d.ts +3 -0
  84. package/dist/cli/commands/doctor.js +151 -0
  85. package/dist/cli/commands/doctor.js.map +1 -0
  86. package/dist/cli/commands/fleet-scale.d.ts +3 -0
  87. package/dist/cli/commands/fleet-scale.js +449 -0
  88. package/dist/cli/commands/fleet-scale.js.map +1 -0
  89. package/dist/cli/commands/fleet.d.ts +3 -0
  90. package/dist/cli/commands/fleet.js +45 -0
  91. package/dist/cli/commands/fleet.js.map +1 -0
  92. package/dist/cli/commands/fund-requirements.d.ts +3 -0
  93. package/dist/cli/commands/fund-requirements.js +139 -0
  94. package/dist/cli/commands/fund-requirements.js.map +1 -0
  95. package/dist/cli/commands/history.d.ts +3 -0
  96. package/dist/cli/commands/history.js +61 -0
  97. package/dist/cli/commands/history.js.map +1 -0
  98. package/dist/cli/commands/init.d.ts +3 -0
  99. package/dist/cli/commands/init.js +91 -0
  100. package/dist/cli/commands/init.js.map +1 -0
  101. package/dist/cli/commands/keys-backup.d.ts +3 -0
  102. package/dist/cli/commands/keys-backup.js +107 -0
  103. package/dist/cli/commands/keys-backup.js.map +1 -0
  104. package/dist/cli/commands/logs.d.ts +3 -0
  105. package/dist/cli/commands/logs.js +69 -0
  106. package/dist/cli/commands/logs.js.map +1 -0
  107. package/dist/cli/commands/rewards.d.ts +3 -0
  108. package/dist/cli/commands/rewards.js +54 -0
  109. package/dist/cli/commands/rewards.js.map +1 -0
  110. package/dist/cli/commands/run.d.ts +3 -0
  111. package/dist/cli/commands/run.js +96 -0
  112. package/dist/cli/commands/run.js.map +1 -0
  113. package/dist/cli/commands/status.d.ts +3 -0
  114. package/dist/cli/commands/status.js +54 -0
  115. package/dist/cli/commands/status.js.map +1 -0
  116. package/dist/cli/commands/stop.d.ts +3 -0
  117. package/dist/cli/commands/stop.js +82 -0
  118. package/dist/cli/commands/stop.js.map +1 -0
  119. package/dist/cli/commands/submit-intent.d.ts +3 -0
  120. package/dist/cli/commands/submit-intent.js +169 -0
  121. package/dist/cli/commands/submit-intent.js.map +1 -0
  122. package/dist/cli/commands/version.d.ts +3 -0
  123. package/dist/cli/commands/version.js +114 -0
  124. package/dist/cli/commands/version.js.map +1 -0
  125. package/dist/cli/commands/withdraw.d.ts +3 -0
  126. package/dist/cli/commands/withdraw.js +181 -0
  127. package/dist/cli/commands/withdraw.js.map +1 -0
  128. package/dist/cli/deployment-digest.d.ts +10 -0
  129. package/dist/cli/deployment-digest.js +25 -0
  130. package/dist/cli/deployment-digest.js.map +1 -0
  131. package/dist/cli/execution-context.d.ts +50 -0
  132. package/dist/cli/execution-context.js +154 -0
  133. package/dist/cli/execution-context.js.map +1 -0
  134. package/dist/cli/help.d.ts +3 -0
  135. package/dist/cli/help.js +37 -0
  136. package/dist/cli/help.js.map +1 -0
  137. package/dist/cli/index.d.ts +17 -0
  138. package/dist/cli/index.js +132 -0
  139. package/dist/cli/index.js.map +1 -0
  140. package/dist/cli/introspection-context.d.ts +10 -0
  141. package/dist/cli/introspection-context.js +60 -0
  142. package/dist/cli/introspection-context.js.map +1 -0
  143. package/dist/cli/output.d.ts +36 -0
  144. package/dist/cli/output.js +35 -0
  145. package/dist/cli/output.js.map +1 -0
  146. package/dist/cli/password.d.ts +12 -0
  147. package/dist/cli/password.js +51 -0
  148. package/dist/cli/password.js.map +1 -0
  149. package/dist/config.d.ts +174 -0
  150. package/dist/config.js +252 -0
  151. package/dist/config.js.map +1 -0
  152. package/dist/daemon/creator.d.ts +24 -0
  153. package/dist/daemon/creator.js +80 -0
  154. package/dist/daemon/creator.js.map +1 -0
  155. package/dist/daemon/daemon.d.ts +60 -0
  156. package/dist/daemon/daemon.js +158 -0
  157. package/dist/daemon/daemon.js.map +1 -0
  158. package/dist/daemon/delivery-watcher.d.ts +10 -0
  159. package/dist/daemon/delivery-watcher.js +37 -0
  160. package/dist/daemon/delivery-watcher.js.map +1 -0
  161. package/dist/daemon/restorer.d.ts +19 -0
  162. package/dist/daemon/restorer.js +82 -0
  163. package/dist/daemon/restorer.js.map +1 -0
  164. package/dist/daemon/reward-claim-loop.d.ts +38 -0
  165. package/dist/daemon/reward-claim-loop.js +48 -0
  166. package/dist/daemon/reward-claim-loop.js.map +1 -0
  167. package/dist/discovery/registry.d.ts +43 -0
  168. package/dist/discovery/registry.js +104 -0
  169. package/dist/discovery/registry.js.map +1 -0
  170. package/dist/discovery/subgraph.d.ts +37 -0
  171. package/dist/discovery/subgraph.js +87 -0
  172. package/dist/discovery/subgraph.js.map +1 -0
  173. package/dist/earning/bootstrap.d.ts +79 -0
  174. package/dist/earning/bootstrap.js +989 -0
  175. package/dist/earning/bootstrap.js.map +1 -0
  176. package/dist/earning/contracts.d.ts +431 -0
  177. package/dist/earning/contracts.js +518 -0
  178. package/dist/earning/contracts.js.map +1 -0
  179. package/dist/earning/evidence-simhash.d.ts +59 -0
  180. package/dist/earning/evidence-simhash.js +87 -0
  181. package/dist/earning/evidence-simhash.js.map +1 -0
  182. package/dist/earning/fleet-display-index.d.ts +8 -0
  183. package/dist/earning/fleet-display-index.js +12 -0
  184. package/dist/earning/fleet-display-index.js.map +1 -0
  185. package/dist/earning/fleet-retire.d.ts +28 -0
  186. package/dist/earning/fleet-retire.js +75 -0
  187. package/dist/earning/fleet-retire.js.map +1 -0
  188. package/dist/earning/jinn-rewards.d.ts +62 -0
  189. package/dist/earning/jinn-rewards.js +81 -0
  190. package/dist/earning/jinn-rewards.js.map +1 -0
  191. package/dist/earning/next-service-index.d.ts +4 -0
  192. package/dist/earning/next-service-index.js +7 -0
  193. package/dist/earning/next-service-index.js.map +1 -0
  194. package/dist/earning/orphan-sweep.d.ts +33 -0
  195. package/dist/earning/orphan-sweep.js +157 -0
  196. package/dist/earning/orphan-sweep.js.map +1 -0
  197. package/dist/earning/reconcile.d.ts +37 -0
  198. package/dist/earning/reconcile.js +216 -0
  199. package/dist/earning/reconcile.js.map +1 -0
  200. package/dist/earning/safe-adapter.d.ts +70 -0
  201. package/dist/earning/safe-adapter.js +228 -0
  202. package/dist/earning/safe-adapter.js.map +1 -0
  203. package/dist/earning/stolas-claim.d.ts +47 -0
  204. package/dist/earning/stolas-claim.js +115 -0
  205. package/dist/earning/stolas-claim.js.map +1 -0
  206. package/dist/earning/store.d.ts +36 -0
  207. package/dist/earning/store.js +156 -0
  208. package/dist/earning/store.js.map +1 -0
  209. package/dist/earning/types.d.ts +123 -0
  210. package/dist/earning/types.js +64 -0
  211. package/dist/earning/types.js.map +1 -0
  212. package/dist/earning/viem-clients.d.ts +9 -0
  213. package/dist/earning/viem-clients.js +22 -0
  214. package/dist/earning/viem-clients.js.map +1 -0
  215. package/dist/earning/wallet.d.ts +20 -0
  216. package/dist/earning/wallet.js +103 -0
  217. package/dist/earning/wallet.js.map +1 -0
  218. package/dist/errors/envelope.d.ts +41 -0
  219. package/dist/errors/envelope.js +48 -0
  220. package/dist/errors/envelope.js.map +1 -0
  221. package/dist/index.d.ts +14 -0
  222. package/dist/index.js +17 -0
  223. package/dist/index.js.map +1 -0
  224. package/dist/main.d.ts +32 -0
  225. package/dist/main.js +281 -0
  226. package/dist/main.js.map +1 -0
  227. package/dist/mcp/server.d.ts +14 -0
  228. package/dist/mcp/server.js +205 -0
  229. package/dist/mcp/server.js.map +1 -0
  230. package/dist/operator-errors.d.ts +16 -0
  231. package/dist/operator-errors.js +88 -0
  232. package/dist/operator-errors.js.map +1 -0
  233. package/dist/preflight/claude-binary.d.ts +19 -0
  234. package/dist/preflight/claude-binary.js +44 -0
  235. package/dist/preflight/claude-binary.js.map +1 -0
  236. package/dist/preflight/claude-invocation-envelope.d.ts +11 -0
  237. package/dist/preflight/claude-invocation-envelope.js +67 -0
  238. package/dist/preflight/claude-invocation-envelope.js.map +1 -0
  239. package/dist/runner/claude.d.ts +15 -0
  240. package/dist/runner/claude.js +193 -0
  241. package/dist/runner/claude.js.map +1 -0
  242. package/dist/runner/runner.d.ts +11 -0
  243. package/dist/runner/runner.js +2 -0
  244. package/dist/runner/runner.js.map +1 -0
  245. package/dist/runner/simple.d.ts +8 -0
  246. package/dist/runner/simple.js +11 -0
  247. package/dist/runner/simple.js.map +1 -0
  248. package/dist/store/store.d.ts +74 -0
  249. package/dist/store/store.js +173 -0
  250. package/dist/store/store.js.map +1 -0
  251. package/dist/tx-retry.d.ts +55 -0
  252. package/dist/tx-retry.js +214 -0
  253. package/dist/tx-retry.js.map +1 -0
  254. package/dist/types/desired-state.d.ts +41 -0
  255. package/dist/types/desired-state.js +16 -0
  256. package/dist/types/desired-state.js.map +1 -0
  257. package/dist/types/errors.d.ts +8 -0
  258. package/dist/types/errors.js +17 -0
  259. package/dist/types/errors.js.map +1 -0
  260. package/dist/types/index.d.ts +2 -0
  261. package/dist/types/index.js +3 -0
  262. package/dist/types/index.js.map +1 -0
  263. package/dist/withdraw/args.d.ts +29 -0
  264. package/dist/withdraw/args.js +198 -0
  265. package/dist/withdraw/args.js.map +1 -0
  266. package/dist/withdraw/run-withdraw-plan.d.ts +21 -0
  267. package/dist/withdraw/run-withdraw-plan.js +257 -0
  268. package/dist/withdraw/run-withdraw-plan.js.map +1 -0
  269. package/dist/x402/acquire.d.ts +6 -0
  270. package/dist/x402/acquire.js +32 -0
  271. package/dist/x402/acquire.js.map +1 -0
  272. package/dist/x402/facilitator.d.ts +11 -0
  273. package/dist/x402/facilitator.js +52 -0
  274. package/dist/x402/facilitator.js.map +1 -0
  275. package/dist/x402/handler.d.ts +15 -0
  276. package/dist/x402/handler.js +40 -0
  277. package/dist/x402/handler.js.map +1 -0
  278. package/package.json +72 -0
@@ -0,0 +1,115 @@
1
+ /**
2
+ * stOLAS ExternalStakingDistributor reward claims for fleet services.
3
+ *
4
+ * The distributor's claim() calls checkpointAndClaim on each staking proxy; the OLAS-style
5
+ * staking implementation reverts on zero reward, so we read calculateStakingReward first and
6
+ * skip sends when pending is zero (no revert loop).
7
+ *
8
+ * TODO(self-bond): rewards are owned by the service Safe; wire Safe-batched staking.claim /
9
+ * checkpointAndClaim when staking_mode is self-bond (not distributor-mediated).
10
+ */
11
+ import { encodeFunctionData, getAddress } from 'viem';
12
+ import { STOLAS_DISTRIBUTOR_ABI } from './contracts.js';
13
+ import { JINN_STAKING_ABI } from './jinn-rewards.js';
14
+ import { isRecoverableTransactionError, viemSendTransactionWithRetry, waitForTransactionReceiptWithRetry, } from '../tx-retry.js';
15
+ import { TransientError } from '../types/errors.js';
16
+ /** Steps where the service is staked and may accrue staking rewards. */
17
+ const STEPS_WITH_STAKING_REWARDS = new Set([
18
+ 'staked',
19
+ 'mech_deployed',
20
+ 'complete',
21
+ ]);
22
+ /**
23
+ * Services that may need distributor.claim (pure filter for tests and tick).
24
+ */
25
+ export function listStolasClaimTargets(services) {
26
+ const out = [];
27
+ for (const s of services) {
28
+ if (!STEPS_WITH_STAKING_REWARDS.has(s.step))
29
+ continue;
30
+ if (s.service_id === null || s.staking_address === null)
31
+ continue;
32
+ out.push({ stakingProxy: s.staking_address, serviceId: s.service_id });
33
+ }
34
+ return out;
35
+ }
36
+ /**
37
+ * For each fleet service with pending staking rewards, submit distributor.claim([proxy],[id]).
38
+ * Errors on individual services are logged and swallowed so the daemon loop stays healthy.
39
+ */
40
+ export async function tickStolasDistributorClaims(publicClient, masterWallet, options) {
41
+ const result = {
42
+ attempted: 0,
43
+ submitted: 0,
44
+ skippedNoPending: 0,
45
+ skippedNoDistributor: false,
46
+ skippedWrongMode: false,
47
+ claimAttempted: 0,
48
+ failedRecoverable: 0,
49
+ failedPermanent: 0,
50
+ };
51
+ if (options.stakingMode !== 'standard') {
52
+ result.skippedWrongMode = true;
53
+ return result;
54
+ }
55
+ const distributor = options.distributorAddress;
56
+ if (!distributor) {
57
+ result.skippedNoDistributor = true;
58
+ return result;
59
+ }
60
+ for (const { stakingProxy, serviceId } of options.targets) {
61
+ result.attempted += 1;
62
+ try {
63
+ const pending = await publicClient.readContract({
64
+ address: getAddress(stakingProxy),
65
+ abi: JINN_STAKING_ABI,
66
+ functionName: 'calculateStakingReward',
67
+ args: [BigInt(serviceId)],
68
+ });
69
+ if (pending === 0n) {
70
+ result.skippedNoPending += 1;
71
+ continue;
72
+ }
73
+ result.claimAttempted += 1;
74
+ const data = encodeFunctionData({
75
+ abi: STOLAS_DISTRIBUTOR_ABI,
76
+ functionName: 'claim',
77
+ args: [[getAddress(stakingProxy)], [BigInt(serviceId)]],
78
+ });
79
+ const txHash = await viemSendTransactionWithRetry(masterWallet, publicClient, {
80
+ account: masterWallet.account,
81
+ to: getAddress(distributor),
82
+ data,
83
+ gas: 1200000n,
84
+ });
85
+ const receipt = await waitForTransactionReceiptWithRetry(publicClient, txHash);
86
+ if (receipt.status !== 'success') {
87
+ result.failedPermanent += 1;
88
+ console.error(`[reward-claim] claim tx failed for service ${serviceId} (hash=${txHash})`);
89
+ continue;
90
+ }
91
+ result.submitted += 1;
92
+ console.log(`[reward-claim] Submitted distributor.claim for service ${serviceId} (~${pending.toString()} wei pending before tx)`);
93
+ }
94
+ catch (err) {
95
+ if (isRecoverableTransactionError(err)) {
96
+ result.failedRecoverable += 1;
97
+ }
98
+ else {
99
+ result.failedPermanent += 1;
100
+ }
101
+ console.error(`[reward-claim] Skipped service ${serviceId}:`, err instanceof Error ? err.message : err);
102
+ }
103
+ }
104
+ if (options.strict) {
105
+ const totalFailed = result.failedRecoverable + result.failedPermanent;
106
+ if (result.submitted === 0 && totalFailed > 0 && result.failedPermanent === 0) {
107
+ throw new TransientError(`Distributor claim: all ${totalFailed} failed service check(s) / claim attempt(s) hit recoverable errors.`);
108
+ }
109
+ if (result.submitted === 0 && result.failedPermanent > 0) {
110
+ throw new Error(`Distributor claim: all ${totalFailed} failed service check(s) / claim attempt(s) were non-recoverable or had bad receipts.`);
111
+ }
112
+ }
113
+ return result;
114
+ }
115
+ //# sourceMappingURL=stolas-claim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stolas-claim.js","sourceRoot":"","sources":["../../src/earning/stolas-claim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Fleet state persistence.
3
+ *
4
+ * State lives at ~/.jinn-client/earning/earning_state.json.
5
+ * Mnemonic keystore lives at ~/.jinn-client/earning/master_keystore.json.
6
+ * Legacy keystore (if present) at ~/.jinn-client/earning/agent_keystore.json.
7
+ */
8
+ import { type FleetState, type ServiceState } from './types.js';
9
+ export declare const DEFAULT_EARNING_DIR: string;
10
+ /** Parse fleet JSON without side effects (for status / read-only tools). */
11
+ export declare function parseFleetStateJson(raw: string): FleetState | null;
12
+ export declare class FleetStateStore {
13
+ private readonly statePath;
14
+ private readonly mnemonicKeystorePath;
15
+ private readonly legacyKeystorePath;
16
+ private readonly earningDir;
17
+ constructor(earningDir?: string);
18
+ get dir(): string;
19
+ hasMnemonicKeystore(): boolean;
20
+ loadMnemonicKeystore(): Promise<string>;
21
+ saveMnemonicKeystore(encryptedJson: string): Promise<void>;
22
+ hasLegacyKeystore(): boolean;
23
+ migrateLegacyFiles(): Promise<void>;
24
+ /**
25
+ * Read persisted fleet state if the file exists and validates.
26
+ * Does not create a default file (unlike load()).
27
+ */
28
+ tryLoadExisting(): Promise<FleetState | null>;
29
+ load(chain?: 'base' | 'base-sepolia'): Promise<FleetState>;
30
+ save(state: FleetState): Promise<FleetState>;
31
+ patchFleet(patch: Partial<Omit<FleetState, 'services'>>): Promise<FleetState>;
32
+ updateService(index: number, patch: Partial<ServiceState>): Promise<FleetState>;
33
+ addService(service: ServiceState): Promise<FleetState>;
34
+ /** Remove one service row by its persisted `index` (not array offset). */
35
+ removeService(index: number): Promise<FleetState>;
36
+ }
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Fleet state persistence.
3
+ *
4
+ * State lives at ~/.jinn-client/earning/earning_state.json.
5
+ * Mnemonic keystore lives at ~/.jinn-client/earning/master_keystore.json.
6
+ * Legacy keystore (if present) at ~/.jinn-client/earning/agent_keystore.json.
7
+ */
8
+ import { existsSync } from 'fs';
9
+ import { mkdir, readFile, rename, writeFile } from 'fs/promises';
10
+ import os from 'os';
11
+ import path from 'path';
12
+ import { FleetStateSchema, createDefaultFleetState, } from './types.js';
13
+ export const DEFAULT_EARNING_DIR = path.join(os.homedir(), '.jinn-client', 'earning');
14
+ const STATE_FILE = 'earning_state.json';
15
+ const MNEMONIC_KEYSTORE_FILE = 'master_keystore.json';
16
+ const LEGACY_KEYSTORE_FILE = 'agent_keystore.json';
17
+ async function writeJsonAtomic(filePath, data) {
18
+ const dir = path.dirname(filePath);
19
+ await mkdir(dir, { recursive: true });
20
+ const tmpPath = `${filePath}.tmp-${Date.now()}-${Math.random().toString(16).slice(2)}`;
21
+ await writeFile(tmpPath, `${JSON.stringify(data, null, 2)}\n`, 'utf8');
22
+ await rename(tmpPath, filePath);
23
+ }
24
+ /** Parse fleet JSON without side effects (for status / read-only tools). */
25
+ export function parseFleetStateJson(raw) {
26
+ try {
27
+ const parsed = JSON.parse(raw);
28
+ const result = FleetStateSchema.safeParse(parsed);
29
+ if (result.success) {
30
+ return result.data;
31
+ }
32
+ return null;
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ function parseFleetStateOrNull(raw) {
39
+ const data = parseFleetStateJson(raw);
40
+ if (data)
41
+ return data;
42
+ try {
43
+ JSON.parse(raw);
44
+ console.error('[earning-store] Invalid state schema; resetting.');
45
+ }
46
+ catch (error) {
47
+ console.error('[earning-store] Failed to parse state; resetting:', error);
48
+ }
49
+ return null;
50
+ }
51
+ export class FleetStateStore {
52
+ statePath;
53
+ mnemonicKeystorePath;
54
+ legacyKeystorePath;
55
+ earningDir;
56
+ constructor(earningDir = DEFAULT_EARNING_DIR) {
57
+ this.earningDir = earningDir;
58
+ this.statePath = path.join(earningDir, STATE_FILE);
59
+ this.mnemonicKeystorePath = path.join(earningDir, MNEMONIC_KEYSTORE_FILE);
60
+ this.legacyKeystorePath = path.join(earningDir, LEGACY_KEYSTORE_FILE);
61
+ }
62
+ get dir() {
63
+ return this.earningDir;
64
+ }
65
+ // ── Mnemonic keystore ──────────────────────────────────────────────────
66
+ hasMnemonicKeystore() {
67
+ return existsSync(this.mnemonicKeystorePath);
68
+ }
69
+ async loadMnemonicKeystore() {
70
+ return readFile(this.mnemonicKeystorePath, 'utf8');
71
+ }
72
+ async saveMnemonicKeystore(encryptedJson) {
73
+ await writeJsonAtomic(this.mnemonicKeystorePath, JSON.parse(encryptedJson));
74
+ }
75
+ // ── Legacy detection ───────────────────────────────────────────────────
76
+ hasLegacyKeystore() {
77
+ return existsSync(this.legacyKeystorePath);
78
+ }
79
+ async migrateLegacyFiles() {
80
+ if (existsSync(this.legacyKeystorePath)) {
81
+ await rename(this.legacyKeystorePath, `${this.legacyKeystorePath}.legacy`);
82
+ }
83
+ if (existsSync(this.statePath)) {
84
+ await rename(this.statePath, `${this.statePath}.legacy`);
85
+ }
86
+ console.error('[earning-store] Legacy keystore detected. Old files renamed with .legacy suffix. ' +
87
+ 'A new mnemonic wallet will be generated.');
88
+ }
89
+ // ── Fleet state ────────────────────────────────────────────────────────
90
+ /**
91
+ * Read persisted fleet state if the file exists and validates.
92
+ * Does not create a default file (unlike load()).
93
+ */
94
+ async tryLoadExisting() {
95
+ if (!existsSync(this.statePath)) {
96
+ return null;
97
+ }
98
+ const raw = await readFile(this.statePath, 'utf8');
99
+ return parseFleetStateJson(raw);
100
+ }
101
+ async load(chain = 'base') {
102
+ if (!existsSync(this.statePath)) {
103
+ const state = createDefaultFleetState(chain);
104
+ await writeJsonAtomic(this.statePath, state);
105
+ return state;
106
+ }
107
+ const raw = await readFile(this.statePath, 'utf8');
108
+ const parsed = parseFleetStateOrNull(raw);
109
+ if (parsed) {
110
+ return parsed;
111
+ }
112
+ const backupPath = `${this.statePath}.invalid-${Date.now()}`;
113
+ await rename(this.statePath, backupPath);
114
+ const state = createDefaultFleetState(chain);
115
+ await writeJsonAtomic(this.statePath, state);
116
+ console.error(`[earning-store] Backed up invalid state to ${backupPath}`);
117
+ return state;
118
+ }
119
+ async save(state) {
120
+ const next = {
121
+ ...state,
122
+ updated_at: new Date().toISOString(),
123
+ };
124
+ const validated = FleetStateSchema.parse(next);
125
+ await writeJsonAtomic(this.statePath, validated);
126
+ return validated;
127
+ }
128
+ async patchFleet(patch) {
129
+ const current = await this.load();
130
+ return this.save({ ...current, ...patch });
131
+ }
132
+ async updateService(index, patch) {
133
+ const current = await this.load();
134
+ const svcIdx = current.services.findIndex(s => s.index === index);
135
+ if (svcIdx === -1) {
136
+ throw new Error(`Service at index ${index} not found in state`);
137
+ }
138
+ current.services[svcIdx] = { ...current.services[svcIdx], ...patch };
139
+ return this.save(current);
140
+ }
141
+ async addService(service) {
142
+ const current = await this.load();
143
+ current.services.push(service);
144
+ return this.save(current);
145
+ }
146
+ /** Remove one service row by its persisted `index` (not array offset). */
147
+ async removeService(index) {
148
+ const current = await this.load();
149
+ const next = current.services.filter(s => s.index !== index);
150
+ if (next.length === current.services.length) {
151
+ throw new Error(`Service at index ${index} not found in state`);
152
+ }
153
+ return this.save({ ...current, services: next });
154
+ }
155
+ }
156
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/earning/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ import { z } from 'zod';
2
+ export declare const StakingModeSchema: z.ZodEnum<["standard", "self-bond"]>;
3
+ export type StakingMode = z.infer<typeof StakingModeSchema>;
4
+ export declare const ServiceStepSchema: z.ZodEnum<["awaiting_stake", "service_created", "service_activated", "agents_registered", "service_deployed", "service_staked", "staked", "mech_deployed", "complete"]>;
5
+ export type ServiceStep = z.infer<typeof ServiceStepSchema>;
6
+ export declare const ServiceStateSchema: z.ZodObject<{
7
+ index: z.ZodNumber;
8
+ agent_address: z.ZodString;
9
+ safe_address: z.ZodNullable<z.ZodString>;
10
+ service_id: z.ZodNullable<z.ZodNumber>;
11
+ mech_address: z.ZodNullable<z.ZodString>;
12
+ staking_address: z.ZodNullable<z.ZodString>;
13
+ step: z.ZodEnum<["awaiting_stake", "service_created", "service_activated", "agents_registered", "service_deployed", "service_staked", "staked", "mech_deployed", "complete"]>;
14
+ error: z.ZodNullable<z.ZodString>;
15
+ }, "strip", z.ZodTypeAny, {
16
+ error: string | null;
17
+ index: number;
18
+ agent_address: string;
19
+ safe_address: string | null;
20
+ service_id: number | null;
21
+ mech_address: string | null;
22
+ staking_address: string | null;
23
+ step: "awaiting_stake" | "service_created" | "service_activated" | "agents_registered" | "service_deployed" | "service_staked" | "staked" | "mech_deployed" | "complete";
24
+ }, {
25
+ error: string | null;
26
+ index: number;
27
+ agent_address: string;
28
+ safe_address: string | null;
29
+ service_id: number | null;
30
+ mech_address: string | null;
31
+ staking_address: string | null;
32
+ step: "awaiting_stake" | "service_created" | "service_activated" | "agents_registered" | "service_deployed" | "service_staked" | "staked" | "mech_deployed" | "complete";
33
+ }>;
34
+ export type ServiceState = z.infer<typeof ServiceStateSchema>;
35
+ export declare const FleetStateSchema: z.ZodObject<{
36
+ master_address: z.ZodNullable<z.ZodString>;
37
+ chain: z.ZodEnum<["base", "base-sepolia"]>;
38
+ staking_mode: z.ZodDefault<z.ZodEnum<["standard", "self-bond"]>>;
39
+ services: z.ZodArray<z.ZodObject<{
40
+ index: z.ZodNumber;
41
+ agent_address: z.ZodString;
42
+ safe_address: z.ZodNullable<z.ZodString>;
43
+ service_id: z.ZodNullable<z.ZodNumber>;
44
+ mech_address: z.ZodNullable<z.ZodString>;
45
+ staking_address: z.ZodNullable<z.ZodString>;
46
+ step: z.ZodEnum<["awaiting_stake", "service_created", "service_activated", "agents_registered", "service_deployed", "service_staked", "staked", "mech_deployed", "complete"]>;
47
+ error: z.ZodNullable<z.ZodString>;
48
+ }, "strip", z.ZodTypeAny, {
49
+ error: string | null;
50
+ index: number;
51
+ agent_address: string;
52
+ safe_address: string | null;
53
+ service_id: number | null;
54
+ mech_address: string | null;
55
+ staking_address: string | null;
56
+ step: "awaiting_stake" | "service_created" | "service_activated" | "agents_registered" | "service_deployed" | "service_staked" | "staked" | "mech_deployed" | "complete";
57
+ }, {
58
+ error: string | null;
59
+ index: number;
60
+ agent_address: string;
61
+ safe_address: string | null;
62
+ service_id: number | null;
63
+ mech_address: string | null;
64
+ staking_address: string | null;
65
+ step: "awaiting_stake" | "service_created" | "service_activated" | "agents_registered" | "service_deployed" | "service_staked" | "staked" | "mech_deployed" | "complete";
66
+ }>, "many">;
67
+ updated_at: z.ZodString;
68
+ }, "strip", z.ZodTypeAny, {
69
+ chain: "base" | "base-sepolia";
70
+ master_address: string | null;
71
+ staking_mode: "standard" | "self-bond";
72
+ services: {
73
+ error: string | null;
74
+ index: number;
75
+ agent_address: string;
76
+ safe_address: string | null;
77
+ service_id: number | null;
78
+ mech_address: string | null;
79
+ staking_address: string | null;
80
+ step: "awaiting_stake" | "service_created" | "service_activated" | "agents_registered" | "service_deployed" | "service_staked" | "staked" | "mech_deployed" | "complete";
81
+ }[];
82
+ updated_at: string;
83
+ }, {
84
+ chain: "base" | "base-sepolia";
85
+ master_address: string | null;
86
+ services: {
87
+ error: string | null;
88
+ index: number;
89
+ agent_address: string;
90
+ safe_address: string | null;
91
+ service_id: number | null;
92
+ mech_address: string | null;
93
+ staking_address: string | null;
94
+ step: "awaiting_stake" | "service_created" | "service_activated" | "agents_registered" | "service_deployed" | "service_staked" | "staked" | "mech_deployed" | "complete";
95
+ }[];
96
+ updated_at: string;
97
+ staking_mode?: "standard" | "self-bond" | undefined;
98
+ }>;
99
+ export type FleetState = z.infer<typeof FleetStateSchema>;
100
+ export declare function createDefaultFleetState(chain?: 'base' | 'base-sepolia'): FleetState;
101
+ export declare function createDefaultServiceState(index: number, agentAddress: string): ServiceState;
102
+ export interface FundingRequirement {
103
+ master_address: string;
104
+ eth_required: string;
105
+ eth_balance: string;
106
+ }
107
+ export interface SelfBondFundingRequirement {
108
+ agent_address: string;
109
+ agent_eth_required: string;
110
+ agent_eth_balance: string;
111
+ safe_address: string;
112
+ safe_eth_required: string;
113
+ safe_eth_balance: string;
114
+ safe_olas_required: string;
115
+ safe_olas_balance: string;
116
+ }
117
+ export interface FleetBootstrapResult {
118
+ ok: boolean;
119
+ fleet_state: FleetState;
120
+ message: string;
121
+ funding?: FundingRequirement;
122
+ self_bond_funding?: SelfBondFundingRequirement;
123
+ }
@@ -0,0 +1,64 @@
1
+ import { z } from 'zod';
2
+ // ── Staking mode ─────────────────────────────────────────────────────────────
3
+ export const StakingModeSchema = z.enum(['standard', 'self-bond']);
4
+ // ── Service step progression ─────────────────────────────────────────────────
5
+ //
6
+ // Standard (stOLAS) mode:
7
+ // awaiting_stake -> staked -> mech_deployed -> complete
8
+ //
9
+ // Self-bond mode (legacy):
10
+ // awaiting_stake -> service_created -> service_activated -> agents_registered ->
11
+ // service_deployed -> service_staked -> mech_deployed -> complete
12
+ export const ServiceStepSchema = z.enum([
13
+ 'awaiting_stake',
14
+ 'service_created',
15
+ 'service_activated',
16
+ 'agents_registered',
17
+ 'service_deployed',
18
+ 'service_staked',
19
+ 'staked',
20
+ 'mech_deployed',
21
+ 'complete',
22
+ ]);
23
+ // ── Per-service state ────────────────────────────────────────────────────────
24
+ export const ServiceStateSchema = z.object({
25
+ index: z.number().int().min(1),
26
+ agent_address: z.string(),
27
+ safe_address: z.string().nullable(),
28
+ service_id: z.number().nullable(),
29
+ mech_address: z.string().nullable(),
30
+ staking_address: z.string().nullable(),
31
+ step: ServiceStepSchema,
32
+ error: z.string().nullable(),
33
+ });
34
+ // ── Fleet state (top-level) ──────────────────────────────────────────────────
35
+ export const FleetStateSchema = z.object({
36
+ master_address: z.string().nullable(),
37
+ chain: z.enum(['base', 'base-sepolia']),
38
+ staking_mode: StakingModeSchema.default('standard'),
39
+ services: z.array(ServiceStateSchema),
40
+ updated_at: z.string(),
41
+ });
42
+ // ── Factories ────────────────────────────────────────────────────────────────
43
+ export function createDefaultFleetState(chain = 'base') {
44
+ return {
45
+ master_address: null,
46
+ chain,
47
+ staking_mode: 'standard',
48
+ services: [],
49
+ updated_at: new Date().toISOString(),
50
+ };
51
+ }
52
+ export function createDefaultServiceState(index, agentAddress) {
53
+ return {
54
+ index,
55
+ agent_address: agentAddress,
56
+ safe_address: null,
57
+ service_id: null,
58
+ mech_address: null,
59
+ staking_address: null,
60
+ step: 'awaiting_stake',
61
+ error: null,
62
+ };
63
+ }
64
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/earning/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;AAGnE,gFAAgF;AAChF,EAAE;AACF,0BAA0B;AAC1B,0DAA0D;AAC1D,EAAE;AACF,2BAA2B;AAC3B,mFAAmF;AACnF,oEAAoE;AAEpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC;IACtC,gBAAgB;IAChB,iBAAiB;IACjB,mBAAmB;IACnB,mBAAmB;IACnB,kBAAkB;IAClB,gBAAgB;IAChB,QAAQ;IACR,eAAe;IACf,UAAU;CACX,CAAC,CAAC;AAIH,gFAAgF;AAEhF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,IAAI,EAAE,iBAAiB;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC;AAIH,gFAAgF;AAEhF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvC,YAAY,EAAE,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC;IACnD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;IACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAIH,gFAAgF;AAEhF,MAAM,UAAU,uBAAuB,CAAC,QAAiC,MAAM;IAC7E,OAAO;QACL,cAAc,EAAE,IAAI;QACpB,KAAK;QACL,YAAY,EAAE,UAAU;QACxB,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAa,EAAE,YAAoB;IAC3E,OAAO;QACL,KAAK;QACL,aAAa,EAAE,YAAY;QAC3B,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;QAClB,eAAe,EAAE,IAAI;QACrB,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,IAAI;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Shared viem PublicClient / WalletClient wiring for fleet earning + CLI.
3
+ */
4
+ import { type Chain, type PublicClient, type Transport, type WalletClient } from 'viem';
5
+ import type { PrivateKeyAccount } from 'viem/accounts';
6
+ export type JinnOnchainNetwork = 'base' | 'base-sepolia';
7
+ export declare function jinnChain(network: JinnOnchainNetwork): Chain;
8
+ export declare function createJinnPublicClient(rpcUrl: string, network: JinnOnchainNetwork): PublicClient<Transport, Chain>;
9
+ export declare function createJinnWalletClient(rpcUrl: string, network: JinnOnchainNetwork, account: PrivateKeyAccount): WalletClient<Transport, Chain, PrivateKeyAccount>;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Shared viem PublicClient / WalletClient wiring for fleet earning + CLI.
3
+ */
4
+ import { createPublicClient, createWalletClient, http, } from 'viem';
5
+ import { base, baseSepolia } from 'viem/chains';
6
+ export function jinnChain(network) {
7
+ return network === 'base-sepolia' ? baseSepolia : base;
8
+ }
9
+ export function createJinnPublicClient(rpcUrl, network) {
10
+ return createPublicClient({
11
+ chain: jinnChain(network),
12
+ transport: http(rpcUrl),
13
+ });
14
+ }
15
+ export function createJinnWalletClient(rpcUrl, network, account) {
16
+ return createWalletClient({
17
+ account,
18
+ chain: jinnChain(network),
19
+ transport: http(rpcUrl),
20
+ });
21
+ }
22
+ //# sourceMappingURL=viem-clients.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viem-clients.js","sourceRoot":"","sources":["../../src/earning/viem-clients.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,IAAI,GAKL,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAKhD,MAAM,UAAU,SAAS,CAAC,OAA2B;IACnD,OAAO,OAAO,KAAK,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,MAAc,EACd,OAA2B;IAE3B,OAAO,kBAAkB,CAAC;QACxB,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC;QACzB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;KACxB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,MAAc,EACd,OAA2B,EAC3B,OAA0B;IAE1B,OAAO,kBAAkB,CAAC;QACxB,OAAO;QACP,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC;QACzB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;KACxB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * HD wallet derivation for fleet management.
3
+ *
4
+ * Mnemonic -> derive master (index 0) and agent (index 1+) wallets.
5
+ * Master is the funder, agents are service instances.
6
+ *
7
+ * Derivation path: m/44'/60'/0'/0/{index}
8
+ * Index 0: master wallet (funder)
9
+ * Index 1+: agent wallets (one per service)
10
+ */
11
+ import { type Hex } from 'viem';
12
+ import { type PrivateKeyAccount } from 'viem/accounts';
13
+ export declare function walletPrivateKeyAtIndex(mnemonic: string, index: number): Hex;
14
+ export declare function generateMnemonic(): string;
15
+ export declare function encryptMnemonic(mnemonic: string, password: string): Promise<string>;
16
+ export declare function decryptMnemonic(encrypted: string, password: string): Promise<string>;
17
+ export declare function deriveMasterAddress(mnemonic: string): string;
18
+ export declare function deriveAgentAddress(mnemonic: string, index: number): string;
19
+ export declare function deriveMasterSigner(mnemonic: string): PrivateKeyAccount;
20
+ export declare function deriveAgentSigner(mnemonic: string, index: number): PrivateKeyAccount;