@jinn-network/client 0.1.0 → 0.1.1-canary.4a6ed8b2

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 (269) hide show
  1. package/README.md +98 -11
  2. package/deployments/deployment-jinn-testnet-faucet-baseSepolia-fast.json +15 -0
  3. package/dist/adapters/claim-registry/abi.d.ts +127 -0
  4. package/dist/adapters/claim-registry/abi.js +93 -0
  5. package/dist/adapters/claim-registry/abi.js.map +1 -0
  6. package/dist/adapters/claim-registry/client.d.ts +89 -0
  7. package/dist/adapters/claim-registry/client.js +205 -0
  8. package/dist/adapters/claim-registry/client.js.map +1 -0
  9. package/dist/adapters/mech/adapter.d.ts +2 -0
  10. package/dist/adapters/mech/adapter.js +110 -41
  11. package/dist/adapters/mech/adapter.js.map +1 -1
  12. package/dist/adapters/mech/contracts.d.ts +2 -0
  13. package/dist/adapters/mech/contracts.js +32 -7
  14. package/dist/adapters/mech/contracts.js.map +1 -1
  15. package/dist/adapters/mech/ipfs.d.ts +8 -0
  16. package/dist/adapters/mech/ipfs.js +12 -0
  17. package/dist/adapters/mech/ipfs.js.map +1 -1
  18. package/dist/adapters/mech/types.d.ts +20 -46
  19. package/dist/adapters/mech/types.js +16 -35
  20. package/dist/adapters/mech/types.js.map +1 -1
  21. package/dist/api/gather-status.js +11 -0
  22. package/dist/api/gather-status.js.map +1 -1
  23. package/dist/api/portfolio-v0-build.d.ts +81 -0
  24. package/dist/api/portfolio-v0-build.js +141 -0
  25. package/dist/api/portfolio-v0-build.js.map +1 -0
  26. package/dist/api/portfolio-v0-doctor.d.ts +37 -0
  27. package/dist/api/portfolio-v0-doctor.js +123 -0
  28. package/dist/api/portfolio-v0-doctor.js.map +1 -0
  29. package/dist/api/server.js +12 -0
  30. package/dist/api/server.js.map +1 -1
  31. package/dist/api/status-build.d.ts +6 -0
  32. package/dist/api/status-build.js +1 -0
  33. package/dist/api/status-build.js.map +1 -1
  34. package/dist/api/status-rollup-build.d.ts +4 -0
  35. package/dist/api/status-rollup-build.js +4 -0
  36. package/dist/api/status-rollup-build.js.map +1 -1
  37. package/dist/bin/jinn-mcp.d.ts +14 -0
  38. package/dist/bin/jinn-mcp.js +19 -0
  39. package/dist/bin/jinn-mcp.js.map +1 -0
  40. package/dist/build-meta.json +1 -1
  41. package/dist/cli/commands/auth.d.ts +3 -0
  42. package/dist/cli/commands/auth.js +236 -0
  43. package/dist/cli/commands/auth.js.map +1 -0
  44. package/dist/cli/commands/bootstrap.js +1 -0
  45. package/dist/cli/commands/bootstrap.js.map +1 -1
  46. package/dist/cli/commands/doctor.js +148 -15
  47. package/dist/cli/commands/doctor.js.map +1 -1
  48. package/dist/cli/commands/fund-requirements.js +69 -1
  49. package/dist/cli/commands/fund-requirements.js.map +1 -1
  50. package/dist/cli/commands/history.js +1 -0
  51. package/dist/cli/commands/history.js.map +1 -1
  52. package/dist/cli/commands/init.js +31 -7
  53. package/dist/cli/commands/init.js.map +1 -1
  54. package/dist/cli/commands/keys-backup.js +142 -10
  55. package/dist/cli/commands/keys-backup.js.map +1 -1
  56. package/dist/cli/commands/logs.js +28 -13
  57. package/dist/cli/commands/logs.js.map +1 -1
  58. package/dist/cli/commands/plugin-install.d.ts +3 -0
  59. package/dist/cli/commands/plugin-install.js +799 -0
  60. package/dist/cli/commands/plugin-install.js.map +1 -0
  61. package/dist/cli/commands/quickstart.d.ts +3 -0
  62. package/dist/cli/commands/quickstart.js +236 -0
  63. package/dist/cli/commands/quickstart.js.map +1 -0
  64. package/dist/cli/commands/run.js +6 -0
  65. package/dist/cli/commands/run.js.map +1 -1
  66. package/dist/cli/commands/stop.js +1 -0
  67. package/dist/cli/commands/stop.js.map +1 -1
  68. package/dist/cli/commands/submit-intent.js +79 -5
  69. package/dist/cli/commands/submit-intent.js.map +1 -1
  70. package/dist/cli/commands/update.d.ts +3 -0
  71. package/dist/cli/commands/update.js +154 -0
  72. package/dist/cli/commands/update.js.map +1 -0
  73. package/dist/cli/commands/version.js +15 -1
  74. package/dist/cli/commands/version.js.map +1 -1
  75. package/dist/cli/deployment-digest.js +20 -4
  76. package/dist/cli/deployment-digest.js.map +1 -1
  77. package/dist/cli/index.js +8 -0
  78. package/dist/cli/index.js.map +1 -1
  79. package/dist/cli/password.d.ts +15 -0
  80. package/dist/cli/password.js +29 -1
  81. package/dist/cli/password.js.map +1 -1
  82. package/dist/config.d.ts +110 -7
  83. package/dist/config.js +38 -5
  84. package/dist/config.js.map +1 -1
  85. package/dist/daemon/balance-topup-loop.d.ts +40 -0
  86. package/dist/daemon/balance-topup-loop.js +96 -0
  87. package/dist/daemon/balance-topup-loop.js.map +1 -0
  88. package/dist/daemon/daemon.d.ts +37 -0
  89. package/dist/daemon/daemon.js +98 -1
  90. package/dist/daemon/daemon.js.map +1 -1
  91. package/dist/dashboard/index.html +500 -0
  92. package/dist/earning/bootstrap.d.ts +3 -1
  93. package/dist/earning/bootstrap.js +138 -17
  94. package/dist/earning/bootstrap.js.map +1 -1
  95. package/dist/earning/contracts.d.ts +24 -0
  96. package/dist/earning/contracts.js +20 -1
  97. package/dist/earning/contracts.js.map +1 -1
  98. package/dist/earning/faucet.d.ts +15 -0
  99. package/dist/earning/faucet.js +64 -0
  100. package/dist/earning/faucet.js.map +1 -0
  101. package/dist/earning/store.d.ts +5 -0
  102. package/dist/earning/store.js +7 -3
  103. package/dist/earning/store.js.map +1 -1
  104. package/dist/errors/unauthorized-account.d.ts +10 -0
  105. package/dist/errors/unauthorized-account.js +14 -0
  106. package/dist/errors/unauthorized-account.js.map +1 -0
  107. package/dist/main.js +128 -1
  108. package/dist/main.js.map +1 -1
  109. package/dist/mcp/operator-server.d.ts +34 -0
  110. package/dist/mcp/operator-server.js +219 -0
  111. package/dist/mcp/operator-server.js.map +1 -0
  112. package/dist/operator-errors.js +11 -0
  113. package/dist/operator-errors.js.map +1 -1
  114. package/dist/preflight/claude-auth.d.ts +68 -0
  115. package/dist/preflight/claude-auth.js +171 -0
  116. package/dist/preflight/claude-auth.js.map +1 -0
  117. package/dist/restorer/engine/canonical-json.d.ts +18 -0
  118. package/dist/restorer/engine/canonical-json.js +59 -0
  119. package/dist/restorer/engine/canonical-json.js.map +1 -0
  120. package/dist/restorer/engine/claim.d.ts +69 -0
  121. package/dist/restorer/engine/claim.js +104 -0
  122. package/dist/restorer/engine/claim.js.map +1 -0
  123. package/dist/restorer/engine/delivery.d.ts +52 -0
  124. package/dist/restorer/engine/delivery.js +63 -0
  125. package/dist/restorer/engine/delivery.js.map +1 -0
  126. package/dist/restorer/engine/engine.d.ts +203 -0
  127. package/dist/restorer/engine/engine.js +658 -0
  128. package/dist/restorer/engine/engine.js.map +1 -0
  129. package/dist/restorer/engine/manifest-assembly.d.ts +67 -0
  130. package/dist/restorer/engine/manifest-assembly.js +79 -0
  131. package/dist/restorer/engine/manifest-assembly.js.map +1 -0
  132. package/dist/restorer/engine/packaging.d.ts +87 -0
  133. package/dist/restorer/engine/packaging.js +350 -0
  134. package/dist/restorer/engine/packaging.js.map +1 -0
  135. package/dist/restorer/engine/persistence.d.ts +170 -0
  136. package/dist/restorer/engine/persistence.js +381 -0
  137. package/dist/restorer/engine/persistence.js.map +1 -0
  138. package/dist/restorer/engine/recovery.d.ts +22 -0
  139. package/dist/restorer/engine/recovery.js +24 -0
  140. package/dist/restorer/engine/recovery.js.map +1 -0
  141. package/dist/restorer/engine/registry.d.ts +62 -0
  142. package/dist/restorer/engine/registry.js +73 -0
  143. package/dist/restorer/engine/registry.js.map +1 -0
  144. package/dist/restorer/engine/signing.d.ts +30 -0
  145. package/dist/restorer/engine/signing.js +39 -0
  146. package/dist/restorer/engine/signing.js.map +1 -0
  147. package/dist/restorer/engine/state.d.ts +42 -0
  148. package/dist/restorer/engine/state.js +87 -0
  149. package/dist/restorer/engine/state.js.map +1 -0
  150. package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.d.ts +64 -0
  151. package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js +96 -0
  152. package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js.map +1 -0
  153. package/dist/restorer/impls/claude-mcp-hyperliquid/index.d.ts +88 -0
  154. package/dist/restorer/impls/claude-mcp-hyperliquid/index.js +560 -0
  155. package/dist/restorer/impls/claude-mcp-hyperliquid/index.js.map +1 -0
  156. package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +137 -0
  157. package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js +865 -0
  158. package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -0
  159. package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.d.ts +74 -0
  160. package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js +74 -0
  161. package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js.map +1 -0
  162. package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.d.ts +97 -0
  163. package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js +226 -0
  164. package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js.map +1 -0
  165. package/dist/restorer/impls/legacy-claude/index.d.ts +42 -0
  166. package/dist/restorer/impls/legacy-claude/index.js +60 -0
  167. package/dist/restorer/impls/legacy-claude/index.js.map +1 -0
  168. package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.d.ts +68 -0
  169. package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js +117 -0
  170. package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js.map +1 -0
  171. package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.d.ts +49 -0
  172. package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js +91 -0
  173. package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js.map +1 -0
  174. package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.d.ts +78 -0
  175. package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js +274 -0
  176. package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js.map +1 -0
  177. package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.d.ts +23 -0
  178. package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js +49 -0
  179. package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js.map +1 -0
  180. package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.d.ts +25 -0
  181. package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js +44 -0
  182. package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js.map +1 -0
  183. package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.d.ts +17 -0
  184. package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js +43 -0
  185. package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js.map +1 -0
  186. package/dist/restorer/impls/portfolio-v0-evaluator/index.d.ts +43 -0
  187. package/dist/restorer/impls/portfolio-v0-evaluator/index.js +431 -0
  188. package/dist/restorer/impls/portfolio-v0-evaluator/index.js.map +1 -0
  189. package/dist/restorer/impls/portfolio-v0-evaluator/score.d.ts +21 -0
  190. package/dist/restorer/impls/portfolio-v0-evaluator/score.js +32 -0
  191. package/dist/restorer/impls/portfolio-v0-evaluator/score.js.map +1 -0
  192. package/dist/restorer/impls/portfolio-v0-evaluator/types.d.ts +32 -0
  193. package/dist/restorer/impls/portfolio-v0-evaluator/types.js +8 -0
  194. package/dist/restorer/impls/portfolio-v0-evaluator/types.js.map +1 -0
  195. package/dist/restorer/impls/prediction-v0-baseline/index.d.ts +26 -0
  196. package/dist/restorer/impls/prediction-v0-baseline/index.js +82 -0
  197. package/dist/restorer/impls/prediction-v0-baseline/index.js.map +1 -0
  198. package/dist/restorer/impls/prediction-v0-baseline/strategy.d.ts +8 -0
  199. package/dist/restorer/impls/prediction-v0-baseline/strategy.js +41 -0
  200. package/dist/restorer/impls/prediction-v0-baseline/strategy.js.map +1 -0
  201. package/dist/restorer/impls/prediction-v0-baseline/types.d.ts +7 -0
  202. package/dist/restorer/impls/prediction-v0-baseline/types.js +2 -0
  203. package/dist/restorer/impls/prediction-v0-baseline/types.js.map +1 -0
  204. package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.d.ts +20 -0
  205. package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.js +66 -0
  206. package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.js.map +1 -0
  207. package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.d.ts +9 -0
  208. package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.js +23 -0
  209. package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.js.map +1 -0
  210. package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.d.ts +3 -0
  211. package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.js +13 -0
  212. package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.js.map +1 -0
  213. package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.d.ts +7 -0
  214. package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js +74 -0
  215. package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js.map +1 -0
  216. package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.d.ts +5 -0
  217. package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.js +20 -0
  218. package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.js.map +1 -0
  219. package/dist/restorer/impls/prediction-v0-evaluator/index.d.ts +33 -0
  220. package/dist/restorer/impls/prediction-v0-evaluator/index.js +179 -0
  221. package/dist/restorer/impls/prediction-v0-evaluator/index.js.map +1 -0
  222. package/dist/restorer/impls/prediction-v0-evaluator/score.d.ts +8 -0
  223. package/dist/restorer/impls/prediction-v0-evaluator/score.js +15 -0
  224. package/dist/restorer/impls/prediction-v0-evaluator/score.js.map +1 -0
  225. package/dist/restorer/impls/prediction-v0-evaluator/types.d.ts +7 -0
  226. package/dist/restorer/impls/prediction-v0-evaluator/types.js +2 -0
  227. package/dist/restorer/impls/prediction-v0-evaluator/types.js.map +1 -0
  228. package/dist/restorer/types.d.ts +62 -0
  229. package/dist/restorer/types.js +7 -0
  230. package/dist/restorer/types.js.map +1 -0
  231. package/dist/runner/claude.js +15 -0
  232. package/dist/runner/claude.js.map +1 -1
  233. package/dist/store/store.d.ts +3 -1
  234. package/dist/store/store.js +8 -0
  235. package/dist/store/store.js.map +1 -1
  236. package/dist/tx-retry.js +11 -1
  237. package/dist/tx-retry.js.map +1 -1
  238. package/dist/types/desired-state.d.ts +53 -0
  239. package/dist/types/desired-state.js +20 -0
  240. package/dist/types/desired-state.js.map +1 -1
  241. package/dist/types/index.d.ts +3 -1
  242. package/dist/types/index.js +3 -1
  243. package/dist/types/index.js.map +1 -1
  244. package/dist/types/portfolio.d.ts +1000 -0
  245. package/dist/types/portfolio.js +168 -0
  246. package/dist/types/portfolio.js.map +1 -0
  247. package/dist/types/prediction.d.ts +751 -0
  248. package/dist/types/prediction.js +128 -0
  249. package/dist/types/prediction.js.map +1 -0
  250. package/dist/venues/chainlink/client.d.ts +99 -0
  251. package/dist/venues/chainlink/client.js +130 -0
  252. package/dist/venues/chainlink/client.js.map +1 -0
  253. package/dist/venues/chainlink/feeds.d.ts +8 -0
  254. package/dist/venues/chainlink/feeds.js +9 -0
  255. package/dist/venues/chainlink/feeds.js.map +1 -0
  256. package/dist/venues/hyperliquid/account-value.d.ts +30 -0
  257. package/dist/venues/hyperliquid/account-value.js +30 -0
  258. package/dist/venues/hyperliquid/account-value.js.map +1 -0
  259. package/dist/venues/hyperliquid/client.d.ts +63 -0
  260. package/dist/venues/hyperliquid/client.js +135 -0
  261. package/dist/venues/hyperliquid/client.js.map +1 -0
  262. package/dist/venues/hyperliquid/grid.d.ts +36 -0
  263. package/dist/venues/hyperliquid/grid.js +61 -0
  264. package/dist/venues/hyperliquid/grid.js.map +1 -0
  265. package/dist/venues/hyperliquid/types.d.ts +81 -0
  266. package/dist/venues/hyperliquid/types.js +8 -0
  267. package/dist/venues/hyperliquid/types.js.map +1 -0
  268. package/package.json +18 -3
  269. package/skills/jinn-operator/SKILL.md +213 -0
package/README.md CHANGED
@@ -16,20 +16,49 @@ yarn global add @jinn-network/client@latest
16
16
 
17
17
  ## Quick start
18
18
 
19
+ The fast path for a new operator on Base Sepolia:
20
+
21
+ ```bash
22
+ # Zero-to-running in one command (init + funding check + bootstrap + run).
23
+ JINN_PASSWORD=your-keystore-password jinn quickstart
24
+ ```
25
+
26
+ Or step by step:
27
+
19
28
  ```bash
20
- # Generate wallet and keystore
21
- jinn init
29
+ # 1. Generate the encrypted keystore (picks an HD wallet deterministically).
30
+ JINN_PASSWORD=your-keystore-password jinn init
22
31
 
23
- # Check environment readiness
24
- jinn doctor
32
+ # 2. Verify the environment and resolved deployment.
33
+ jinn doctor --human
25
34
 
26
- # Start the daemon
35
+ # 3. List exact funding gaps. On testnet this is ETH only — the staking pool
36
+ # is managed protocol-side and operators don't hold bond tokens directly.
37
+ jinn fund-requirements --human
38
+
39
+ # 4. Send the requested testnet funds to the printed master address, then:
40
+ JINN_PASSWORD=your-keystore-password jinn bootstrap
41
+
42
+ # 5. Start the daemon.
27
43
  JINN_PASSWORD=your-keystore-password jinn run
28
44
  ```
29
45
 
30
- On first run, the bootstrap generates a master wallet and prints a funding address. Send testnet ETH to it, then re-run. The bootstrap is idempotent — it picks up where it left off.
46
+ `jinn init`, `jinn fund-requirements`, `jinn bootstrap`, and `jinn run` all
47
+ share the same encrypted keystore and fleet state under `~/.jinn-client/earning/`
48
+ by default. They are idempotent — re-run any of them safely.
31
49
 
32
- `JINN_PASSWORD` encrypts the local keystore and is env-only; never put it in a config file.
50
+ To keep testnet and mainnet state side-by-side on the same machine, set
51
+ `JINN_EARNING_DIR` to a network-specific path:
52
+
53
+ ```bash
54
+ JINN_NETWORK=testnet JINN_EARNING_DIR=~/.jinn-client/earning-testnet jinn run
55
+ JINN_NETWORK=mainnet JINN_EARNING_DIR=~/.jinn-client/earning-mainnet jinn run
56
+ ```
57
+
58
+ `JINN_PASSWORD` encrypts the local keystore and is **required** for every
59
+ verb that touches private keys (`init`, `bootstrap`, `run`,
60
+ `fund-requirements`, `keys backup`, `submit-intent`, `claim-rewards`,
61
+ `withdraw`). It is env-only; never put it in a config file.
33
62
 
34
63
  ## Try without installing
35
64
 
@@ -57,6 +86,8 @@ Because the macOS keychain securely encrypts OAuth tokens, you **cannot** simply
57
86
  Use `-it` so the CLI can open a browser (or show a URL to visit) and receive input. The process stays in the foreground until you finish sign-in.
58
87
  *Follow the URL to authenticate in your browser.*
59
88
 
89
+ > **Note:** this block assumes you've cloned the git repo — the compose file lives at `client/docker-compose.yml`. If you installed via `npm install -g`, copy the compose file from `$(npm root -g)/@jinn-network/client/docker-compose.yml` to a working directory first, then run the commands there.
90
+
60
91
  3. **Start the Fleet:** Now that the Docker volume holds the token, start the headless daemon:
61
92
  ```bash
62
93
  docker compose up -d
@@ -74,13 +105,16 @@ docker run --rm ghcr.io/jinn-network/client:latest version --json
74
105
 
75
106
  | Command | Purpose | Idempotent |
76
107
  |---|---|---|
77
- | `jinn init` | Generate wallet + keystore | Yes |
108
+ | `jinn quickstart` | One-shot init + funding check + bootstrap + run | Yes |
109
+ | `jinn init` | Generate wallet + keystore + fleet state | Yes |
78
110
  | `jinn doctor` | Preflight checks without mutation | Yes |
79
111
  | `jinn bootstrap` | Advance toward a running fleet | Yes |
80
112
  | `jinn fund-requirements` | List what needs funding | Yes |
81
113
  | `jinn run` | Start the daemon (foreground) | N/A |
82
114
  | `jinn stop` | Signal a running daemon to stop | Yes |
83
115
  | `jinn version` | Version, phase, deployment digest | Yes |
116
+ | `jinn update` | Update the client package + refresh plugins | Yes |
117
+ | `jinn plugin install` | Wire Jinn into Claude Code / Codex / other AI tools | Yes |
84
118
 
85
119
  ### Monitoring
86
120
 
@@ -104,7 +138,8 @@ All action verbs support `--dry-run` and `--yes`.
104
138
  | `jinn fleet scale --to N` | Grow or shrink fleet |
105
139
  | `jinn fleet retire <index>` | Retire one service |
106
140
  | `jinn withdraw --to <addr>` | Sweep wallets to external address |
107
- | `jinn keys backup --output <path>` | Export mnemonic |
141
+ | `jinn keys backup --output <path>` | Export mnemonic (writes plaintext; treat the output file as seed material) |
142
+ | `jinn keys change-password` | Re-encrypt the keystore with a new password |
108
143
 
109
144
  ## Output contract
110
145
 
@@ -126,7 +161,7 @@ JINN_PASSWORD=secret jinn run --config ./my-config.json
126
161
 
127
162
  | Config key | Env override | Default |
128
163
  |---|---|---|
129
- | network | JINN_NETWORK | testnet (flips to mainnet at launch) |
164
+ | network | JINN_NETWORK | read from config; `mainnet` if unset (flips to `testnet` default for the Phase 2 mainnet launch window) |
130
165
  | rpcUrl | BASE_RPC_URL / JINN_RPC_URL | network-appropriate public RPC |
131
166
  | claudeModel | JINN_CLAUDE_MODEL | claude-haiku-4-5-20251001 |
132
167
  | claudePath | JINN_CLAUDE_PATH | claude |
@@ -139,14 +174,66 @@ JINN_PASSWORD=secret jinn run --config ./my-config.json
139
174
 
140
175
  `JINN_PASSWORD` is env-only (keystore encryption, never in config files). Alternatively, use `--password-fd <N>` to read from a file descriptor.
141
176
 
177
+ ## Tokens
178
+
179
+ | Role | Phase 1b (testnet, Base Sepolia) | Phase 2 (mainnet, Base) |
180
+ |---|---|---|
181
+ | Gas (native) | ETH (CDP auto-funded on testnet) | ETH |
182
+ | Staking bond | Pooled, protocol-managed via stOLAS distributor (operators hold nothing) | OLAS (operator-held) |
183
+ | Reward | stOLAS | OLAS (+ JINN incentives after launch) |
184
+
185
+ **Important:** under stOLAS standard mode (the Phase 1b default), operators
186
+ **do not hold a bond token themselves**. The stOLAS distributor pools JINN
187
+ contributed by stakers and stakes on behalf of operators; your service gets
188
+ created against that shared pool. `jinn fund-requirements` surfaces only the
189
+ per-wallet ETH you need. If the distributor pool is drained, `jinn doctor`
190
+ will warn you — the fix is a protocol-team refill, not operator action.
191
+
142
192
  ## Switching to mainnet
143
193
 
144
194
  When Phase 2 launches, the default flips. Until then:
145
195
 
146
196
  ```bash
147
- JINN_NETWORK=mainnet JINN_PASSWORD=secret jinn run
197
+ JINN_NETWORK=mainnet \
198
+ JINN_EARNING_DIR=~/.jinn-client/earning-mainnet \
199
+ JINN_PASSWORD=secret \
200
+ jinn run
148
201
  ```
149
202
 
203
+ Use a distinct `JINN_EARNING_DIR` to keep testnet and mainnet keystore
204
+ state isolated. Mixing them on the same directory is an easy way to
205
+ point a mainnet daemon at a testnet-derived master wallet.
206
+
207
+ ## Troubleshooting
208
+
209
+ Quick answers to the things that typically surprise new operators:
210
+
211
+ - **Bootstrap loops for a minute then exits with `funding_required`** —
212
+ the CDP faucet drip is small (~0.0001 ETH per call) and the bootstrap
213
+ floor is 0.005 ETH. The client now drains the faucet up to 60 times per
214
+ invocation automatically; if you still see `funding_required`, CDP rate-
215
+ limited your master address. Wait 24h or fund manually:
216
+ <https://portal.cdp.coinbase.com/products/faucet>.
217
+ - **Claude session exits in ~18 seconds with no trades** — usually means
218
+ the daemon ran from source (via `tsx`) instead of the compiled `dist/`,
219
+ so the MCP wrapper couldn't load `mcp-tools.js`. Run `yarn build && yarn
220
+ dev` (dev) or reinstall via `npm install -g @jinn-network/client@latest`
221
+ (operator). `jinn doctor` flags this as `daemon_runtime_ready`.
222
+ - **Bootstrap fails with `Overflow(20, 0)` at `distributor.stake()`** —
223
+ the testnet stOLAS distributor pool is drained. Operators cannot fix
224
+ this; the Jinn protocol team has to refill it. Report to the testnet
225
+ status channel and re-run `jinn bootstrap` once the pool is topped up.
226
+ - **Position auto-closed within seconds of opening** — most likely
227
+ a competing trading bot is active on the same Hyperliquid master. Use a
228
+ fresh HL master per protocol test; do not share master accounts between
229
+ experiments.
230
+ - **`jinn doctor` passes but `jinn run` fails** — check the specific
231
+ check names in doctor's output vs the specific error from `run`. The
232
+ most common mismatch is auth-context: if you're in the `client/` git
233
+ checkout dir, `detectAuthContext` infers `docker-compose` mode even on
234
+ a bare host. Run the daemon from `$HOME` or any directory without a
235
+ `docker-compose.yml` that names `jinn-daemon`.
236
+
150
237
  ## How it works
151
238
 
152
239
  The daemon runs three concurrent loops:
@@ -0,0 +1,15 @@
1
+ {
2
+ "network": "baseSepolia",
3
+ "chainId": 84532,
4
+ "deployer": "0x15e78734481bD31F6e183dad05225505a45ACd07",
5
+ "deployedAt": "2026-04-20T13:14:18.413Z",
6
+ "config": {
7
+ "jinnToken": "0xAB9a01cd4A379e36006ec6df2960CF39EF79df63",
8
+ "dripAmount": "100000000000000000000",
9
+ "dripInterval": 86400,
10
+ "initialSupplyBridged": "1000000000000000000000"
11
+ },
12
+ "contracts": {
13
+ "faucet": "0xa7c2DBA07E41F16eF94cbEAeAEd97bC904032619"
14
+ }
15
+ }
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Typed ABI fragments for ClaimRegistry.
3
+ *
4
+ * Mirrors the Solidity interface in contracts/src/claiming/ClaimRegistry.sol.
5
+ * Use these instead of the inline fragment in adapters/mech/types.ts when
6
+ * constructing a ClaimRegistryClient — they include the full event set.
7
+ */
8
+ export declare const CLAIM_REGISTRY_ABI: readonly [{
9
+ readonly name: "claimJob";
10
+ readonly type: "function";
11
+ readonly stateMutability: "nonpayable";
12
+ readonly inputs: readonly [{
13
+ readonly name: "requestId";
14
+ readonly type: "bytes32";
15
+ }];
16
+ readonly outputs: readonly [];
17
+ }, {
18
+ readonly name: "releaseClaim";
19
+ readonly type: "function";
20
+ readonly stateMutability: "nonpayable";
21
+ readonly inputs: readonly [{
22
+ readonly name: "requestId";
23
+ readonly type: "bytes32";
24
+ }];
25
+ readonly outputs: readonly [];
26
+ }, {
27
+ readonly name: "expireClaim";
28
+ readonly type: "function";
29
+ readonly stateMutability: "nonpayable";
30
+ readonly inputs: readonly [{
31
+ readonly name: "requestId";
32
+ readonly type: "bytes32";
33
+ }];
34
+ readonly outputs: readonly [];
35
+ }, {
36
+ readonly name: "getJobClaim";
37
+ readonly type: "function";
38
+ readonly stateMutability: "view";
39
+ readonly inputs: readonly [{
40
+ readonly name: "requestId";
41
+ readonly type: "bytes32";
42
+ }];
43
+ readonly outputs: readonly [{
44
+ readonly name: "claimer";
45
+ readonly type: "address";
46
+ }, {
47
+ readonly name: "expiresAt";
48
+ readonly type: "uint256";
49
+ }];
50
+ }, {
51
+ readonly name: "claims";
52
+ readonly type: "function";
53
+ readonly stateMutability: "view";
54
+ readonly inputs: readonly [{
55
+ readonly name: "";
56
+ readonly type: "bytes32";
57
+ }];
58
+ readonly outputs: readonly [{
59
+ readonly name: "claimer";
60
+ readonly type: "address";
61
+ }, {
62
+ readonly name: "expiresAt";
63
+ readonly type: "uint256";
64
+ }];
65
+ }, {
66
+ readonly name: "claimTTL";
67
+ readonly type: "function";
68
+ readonly stateMutability: "view";
69
+ readonly inputs: readonly [];
70
+ readonly outputs: readonly [{
71
+ readonly name: "";
72
+ readonly type: "uint256";
73
+ }];
74
+ }, {
75
+ readonly name: "expiredClaimCount";
76
+ readonly type: "function";
77
+ readonly stateMutability: "view";
78
+ readonly inputs: readonly [{
79
+ readonly name: "";
80
+ readonly type: "address";
81
+ }];
82
+ readonly outputs: readonly [{
83
+ readonly name: "";
84
+ readonly type: "uint256";
85
+ }];
86
+ }, {
87
+ readonly name: "JobClaimed";
88
+ readonly type: "event";
89
+ readonly inputs: readonly [{
90
+ readonly name: "requestId";
91
+ readonly type: "bytes32";
92
+ readonly indexed: true;
93
+ }, {
94
+ readonly name: "claimer";
95
+ readonly type: "address";
96
+ readonly indexed: true;
97
+ }, {
98
+ readonly name: "expiresAt";
99
+ readonly type: "uint256";
100
+ readonly indexed: false;
101
+ }];
102
+ }, {
103
+ readonly name: "ClaimExpired";
104
+ readonly type: "event";
105
+ readonly inputs: readonly [{
106
+ readonly name: "requestId";
107
+ readonly type: "bytes32";
108
+ readonly indexed: true;
109
+ }, {
110
+ readonly name: "previousClaimer";
111
+ readonly type: "address";
112
+ readonly indexed: true;
113
+ }];
114
+ }, {
115
+ readonly name: "ClaimReleased";
116
+ readonly type: "event";
117
+ readonly inputs: readonly [{
118
+ readonly name: "requestId";
119
+ readonly type: "bytes32";
120
+ readonly indexed: true;
121
+ }, {
122
+ readonly name: "claimer";
123
+ readonly type: "address";
124
+ readonly indexed: true;
125
+ }];
126
+ }];
127
+ export type ClaimRegistryAbi = typeof CLAIM_REGISTRY_ABI;
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Typed ABI fragments for ClaimRegistry.
3
+ *
4
+ * Mirrors the Solidity interface in contracts/src/claiming/ClaimRegistry.sol.
5
+ * Use these instead of the inline fragment in adapters/mech/types.ts when
6
+ * constructing a ClaimRegistryClient — they include the full event set.
7
+ */
8
+ export const CLAIM_REGISTRY_ABI = [
9
+ // ── Write functions ──────────────────────────────────────────────────────────
10
+ {
11
+ name: 'claimJob',
12
+ type: 'function',
13
+ stateMutability: 'nonpayable',
14
+ inputs: [{ name: 'requestId', type: 'bytes32' }],
15
+ outputs: [],
16
+ },
17
+ {
18
+ name: 'releaseClaim',
19
+ type: 'function',
20
+ stateMutability: 'nonpayable',
21
+ inputs: [{ name: 'requestId', type: 'bytes32' }],
22
+ outputs: [],
23
+ },
24
+ {
25
+ name: 'expireClaim',
26
+ type: 'function',
27
+ stateMutability: 'nonpayable',
28
+ inputs: [{ name: 'requestId', type: 'bytes32' }],
29
+ outputs: [],
30
+ },
31
+ // ── Read functions ───────────────────────────────────────────────────────────
32
+ {
33
+ name: 'getJobClaim',
34
+ type: 'function',
35
+ stateMutability: 'view',
36
+ inputs: [{ name: 'requestId', type: 'bytes32' }],
37
+ outputs: [
38
+ { name: 'claimer', type: 'address' },
39
+ { name: 'expiresAt', type: 'uint256' },
40
+ ],
41
+ },
42
+ {
43
+ name: 'claims',
44
+ type: 'function',
45
+ stateMutability: 'view',
46
+ inputs: [{ name: '', type: 'bytes32' }],
47
+ outputs: [
48
+ { name: 'claimer', type: 'address' },
49
+ { name: 'expiresAt', type: 'uint256' },
50
+ ],
51
+ },
52
+ {
53
+ name: 'claimTTL',
54
+ type: 'function',
55
+ stateMutability: 'view',
56
+ inputs: [],
57
+ outputs: [{ name: '', type: 'uint256' }],
58
+ },
59
+ {
60
+ name: 'expiredClaimCount',
61
+ type: 'function',
62
+ stateMutability: 'view',
63
+ inputs: [{ name: '', type: 'address' }],
64
+ outputs: [{ name: '', type: 'uint256' }],
65
+ },
66
+ // ── Events ───────────────────────────────────────────────────────────────────
67
+ {
68
+ name: 'JobClaimed',
69
+ type: 'event',
70
+ inputs: [
71
+ { name: 'requestId', type: 'bytes32', indexed: true },
72
+ { name: 'claimer', type: 'address', indexed: true },
73
+ { name: 'expiresAt', type: 'uint256', indexed: false },
74
+ ],
75
+ },
76
+ {
77
+ name: 'ClaimExpired',
78
+ type: 'event',
79
+ inputs: [
80
+ { name: 'requestId', type: 'bytes32', indexed: true },
81
+ { name: 'previousClaimer', type: 'address', indexed: true },
82
+ ],
83
+ },
84
+ {
85
+ name: 'ClaimReleased',
86
+ type: 'event',
87
+ inputs: [
88
+ { name: 'requestId', type: 'bytes32', indexed: true },
89
+ { name: 'claimer', type: 'address', indexed: true },
90
+ ],
91
+ },
92
+ ];
93
+ //# sourceMappingURL=abi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abi.js","sourceRoot":"","sources":["../../../src/adapters/claim-registry/abi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * ClaimRegistryClient — typed wrapper for the ClaimRegistry contract.
3
+ *
4
+ * Wraps the read/write surfaces of ClaimRegistry with proper types and
5
+ * idiomatic async interfaces.
6
+ *
7
+ * Write operations (claimJob, releaseClaim) go through the Safe multisig via
8
+ * executeSafeTransaction. This is required so that the on-chain claimer address
9
+ * matches the Safe — our canonical OLAS/staking identity. Using the raw EOA
10
+ * would cause a mismatch: OnChainClaimPolicy already claims through the Safe,
11
+ * so `weAlreadyClaimed()` would return false even when the Safe holds the claim,
12
+ * triggering a redundant on-chain write that reverts as JobAlreadyClaimed.
13
+ *
14
+ * expireClaim() is permissionless (anyone can GC others' expired claims) and
15
+ * is kept as a direct EOA call — the gas payer does not affect claim ownership.
16
+ */
17
+ import { type Address, type Hex, type PublicClient, type WalletClient } from 'viem';
18
+ export declare const ZERO_ADDRESS: Address;
19
+ export interface JobClaimInfo {
20
+ claimer: Address;
21
+ /** Unix timestamp (seconds) when the claim expires. 0 if no active claim. */
22
+ expiresAt: bigint;
23
+ /** True if claimer !== ZERO_ADDRESS and expiresAt > 0 (claim is still active per contract). */
24
+ isActive: boolean;
25
+ }
26
+ export interface ClaimJobResult {
27
+ /** Transaction hash. Empty string when skipped (already ours or failed). */
28
+ txHash: string;
29
+ /** True if we now hold the claim (new or pre-existing). */
30
+ claimed: boolean;
31
+ }
32
+ export declare class ClaimRegistryClient {
33
+ private readonly publicClient;
34
+ private readonly walletClient;
35
+ private readonly contractAddress;
36
+ /**
37
+ * The Safe multisig address — used as the canonical claimer identity.
38
+ * claimJob/releaseClaim are routed through Safe so that msg.sender on-chain
39
+ * is the Safe address, matching the OLAS staking identity.
40
+ */
41
+ private readonly safeAddress;
42
+ constructor(publicClient: PublicClient, walletClient: WalletClient, contractAddress: Address,
43
+ /**
44
+ * The Safe multisig address — used as the canonical claimer identity.
45
+ * claimJob/releaseClaim are routed through Safe so that msg.sender on-chain
46
+ * is the Safe address, matching the OLAS staking identity.
47
+ */
48
+ safeAddress: Address);
49
+ /**
50
+ * Read the active claim for a request.
51
+ * Returns `(ZERO_ADDRESS, 0, false)` if no active claim (contract returns
52
+ * (address(0), 0) for expired/non-existent claims).
53
+ */
54
+ getJobClaim(requestId: Hex): Promise<JobClaimInfo>;
55
+ /**
56
+ * Check whether the Safe already holds an active claim for this request.
57
+ * Used for idempotency on resume.
58
+ */
59
+ weAlreadyClaimed(requestId: Hex): Promise<boolean>;
60
+ /**
61
+ * Claim a marketplace request through the Safe multisig.
62
+ *
63
+ * Idempotent: if the Safe already holds an active claim, returns
64
+ * `{ txHash: '', claimed: true }` without submitting a transaction.
65
+ *
66
+ * Returns `{ txHash: '', claimed: false }` when:
67
+ * - Another address holds an active claim
68
+ * - The eligibility check fails (IneligibleToClaim)
69
+ * - The tx reverts for any other handled reason
70
+ *
71
+ * Throws on unrecognised RPC errors.
72
+ */
73
+ claimJob(requestId: Hex): Promise<ClaimJobResult>;
74
+ /**
75
+ * Voluntarily release a claim through the Safe multisig (no punishment).
76
+ * Should only be called when the Safe holds the claim.
77
+ * No-op (returns false) if the Safe doesn't hold the claim.
78
+ */
79
+ releaseClaim(requestId: Hex): Promise<boolean>;
80
+ /**
81
+ * Garbage-collect a stale (expired) claim.
82
+ *
83
+ * expireClaim is permissionless — anyone can call it to GC others' expired
84
+ * claims. The caller gets no reward; the previous claimer gets an
85
+ * expiredClaimCount increment. Since the gas payer doesn't affect claim
86
+ * ownership, this is sent directly from the EOA (cheaper than a Safe tx).
87
+ */
88
+ expireClaim(requestId: Hex): Promise<boolean>;
89
+ }