@jinn-network/client 0.1.0 → 0.1.1-canary.245b6e94
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/README.md +98 -11
- package/deployments/deployment-jinn-testnet-faucet-baseSepolia-fast.json +15 -0
- package/dist/adapters/claim-registry/abi.d.ts +127 -0
- package/dist/adapters/claim-registry/abi.js +93 -0
- package/dist/adapters/claim-registry/abi.js.map +1 -0
- package/dist/adapters/claim-registry/client.d.ts +89 -0
- package/dist/adapters/claim-registry/client.js +205 -0
- package/dist/adapters/claim-registry/client.js.map +1 -0
- package/dist/adapters/mech/adapter.d.ts +2 -0
- package/dist/adapters/mech/adapter.js +59 -4
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +2 -0
- package/dist/adapters/mech/contracts.js +32 -7
- package/dist/adapters/mech/contracts.js.map +1 -1
- package/dist/adapters/mech/ipfs.d.ts +8 -0
- package/dist/adapters/mech/ipfs.js +12 -0
- package/dist/adapters/mech/ipfs.js.map +1 -1
- package/dist/adapters/mech/types.d.ts +0 -74
- package/dist/adapters/mech/types.js +3 -50
- package/dist/adapters/mech/types.js.map +1 -1
- package/dist/api/gather-status.js +11 -0
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/portfolio-v0-build.d.ts +81 -0
- package/dist/api/portfolio-v0-build.js +141 -0
- package/dist/api/portfolio-v0-build.js.map +1 -0
- package/dist/api/portfolio-v0-doctor.d.ts +37 -0
- package/dist/api/portfolio-v0-doctor.js +123 -0
- package/dist/api/portfolio-v0-doctor.js.map +1 -0
- package/dist/api/server.js +12 -0
- package/dist/api/server.js.map +1 -1
- package/dist/api/status-build.d.ts +6 -0
- package/dist/api/status-build.js +1 -0
- package/dist/api/status-build.js.map +1 -1
- package/dist/api/status-rollup-build.d.ts +4 -0
- package/dist/api/status-rollup-build.js +4 -0
- package/dist/api/status-rollup-build.js.map +1 -1
- package/dist/bin/jinn-mcp.d.ts +14 -0
- package/dist/bin/jinn-mcp.js +19 -0
- package/dist/bin/jinn-mcp.js.map +1 -0
- package/dist/build-meta.json +1 -1
- package/dist/cli/commands/auth.d.ts +3 -0
- package/dist/cli/commands/auth.js +236 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/bootstrap.js +1 -0
- package/dist/cli/commands/bootstrap.js.map +1 -1
- package/dist/cli/commands/doctor.js +148 -15
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/fund-requirements.js +69 -1
- package/dist/cli/commands/fund-requirements.js.map +1 -1
- package/dist/cli/commands/history.js +1 -0
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/init.js +31 -7
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/keys-backup.js +142 -10
- package/dist/cli/commands/keys-backup.js.map +1 -1
- package/dist/cli/commands/logs.js +28 -13
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/plugin-install.d.ts +3 -0
- package/dist/cli/commands/plugin-install.js +799 -0
- package/dist/cli/commands/plugin-install.js.map +1 -0
- package/dist/cli/commands/quickstart.d.ts +3 -0
- package/dist/cli/commands/quickstart.js +236 -0
- package/dist/cli/commands/quickstart.js.map +1 -0
- package/dist/cli/commands/run.js +6 -0
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/stop.js +1 -0
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/commands/submit-intent.js +11 -1
- package/dist/cli/commands/submit-intent.js.map +1 -1
- package/dist/cli/commands/update.d.ts +3 -0
- package/dist/cli/commands/update.js +154 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/version.js +15 -1
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/cli/deployment-digest.js +20 -4
- package/dist/cli/deployment-digest.js.map +1 -1
- package/dist/cli/index.js +8 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/password.d.ts +15 -0
- package/dist/cli/password.js +29 -1
- package/dist/cli/password.js.map +1 -1
- package/dist/config.d.ts +110 -7
- package/dist/config.js +38 -5
- package/dist/config.js.map +1 -1
- package/dist/daemon/balance-topup-loop.d.ts +40 -0
- package/dist/daemon/balance-topup-loop.js +96 -0
- package/dist/daemon/balance-topup-loop.js.map +1 -0
- package/dist/daemon/daemon.d.ts +36 -0
- package/dist/daemon/daemon.js +97 -1
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/dashboard/index.html +500 -0
- package/dist/earning/bootstrap.d.ts +3 -1
- package/dist/earning/bootstrap.js +101 -17
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/contracts.d.ts +24 -0
- package/dist/earning/contracts.js +19 -1
- package/dist/earning/contracts.js.map +1 -1
- package/dist/earning/faucet.d.ts +15 -0
- package/dist/earning/faucet.js +64 -0
- package/dist/earning/faucet.js.map +1 -0
- package/dist/earning/store.d.ts +5 -0
- package/dist/earning/store.js +7 -3
- package/dist/earning/store.js.map +1 -1
- package/dist/errors/unauthorized-account.d.ts +10 -0
- package/dist/errors/unauthorized-account.js +14 -0
- package/dist/errors/unauthorized-account.js.map +1 -0
- package/dist/main.js +116 -1
- package/dist/main.js.map +1 -1
- package/dist/mcp/operator-server.d.ts +34 -0
- package/dist/mcp/operator-server.js +219 -0
- package/dist/mcp/operator-server.js.map +1 -0
- package/dist/operator-errors.js +11 -0
- package/dist/operator-errors.js.map +1 -1
- package/dist/preflight/claude-auth.d.ts +68 -0
- package/dist/preflight/claude-auth.js +171 -0
- package/dist/preflight/claude-auth.js.map +1 -0
- package/dist/restorer/engine/canonical-json.d.ts +18 -0
- package/dist/restorer/engine/canonical-json.js +59 -0
- package/dist/restorer/engine/canonical-json.js.map +1 -0
- package/dist/restorer/engine/claim.d.ts +69 -0
- package/dist/restorer/engine/claim.js +104 -0
- package/dist/restorer/engine/claim.js.map +1 -0
- package/dist/restorer/engine/delivery.d.ts +52 -0
- package/dist/restorer/engine/delivery.js +63 -0
- package/dist/restorer/engine/delivery.js.map +1 -0
- package/dist/restorer/engine/engine.d.ts +199 -0
- package/dist/restorer/engine/engine.js +657 -0
- package/dist/restorer/engine/engine.js.map +1 -0
- package/dist/restorer/engine/manifest-assembly.d.ts +67 -0
- package/dist/restorer/engine/manifest-assembly.js +79 -0
- package/dist/restorer/engine/manifest-assembly.js.map +1 -0
- package/dist/restorer/engine/packaging.d.ts +87 -0
- package/dist/restorer/engine/packaging.js +350 -0
- package/dist/restorer/engine/packaging.js.map +1 -0
- package/dist/restorer/engine/persistence.d.ts +167 -0
- package/dist/restorer/engine/persistence.js +377 -0
- package/dist/restorer/engine/persistence.js.map +1 -0
- package/dist/restorer/engine/recovery.d.ts +22 -0
- package/dist/restorer/engine/recovery.js +24 -0
- package/dist/restorer/engine/recovery.js.map +1 -0
- package/dist/restorer/engine/registry.d.ts +58 -0
- package/dist/restorer/engine/registry.js +69 -0
- package/dist/restorer/engine/registry.js.map +1 -0
- package/dist/restorer/engine/signing.d.ts +30 -0
- package/dist/restorer/engine/signing.js +39 -0
- package/dist/restorer/engine/signing.js.map +1 -0
- package/dist/restorer/engine/state.d.ts +42 -0
- package/dist/restorer/engine/state.js +87 -0
- package/dist/restorer/engine/state.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.d.ts +64 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js +96 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.d.ts +87 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.js +560 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +137 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js +865 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.d.ts +74 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js +74 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.d.ts +97 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js +226 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js.map +1 -0
- package/dist/restorer/impls/legacy-claude/index.d.ts +41 -0
- package/dist/restorer/impls/legacy-claude/index.js +56 -0
- package/dist/restorer/impls/legacy-claude/index.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.d.ts +68 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js +117 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.d.ts +49 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js +91 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.d.ts +78 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js +274 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.d.ts +23 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js +49 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.d.ts +25 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js +44 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.d.ts +17 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js +43 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/index.d.ts +32 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/index.js +413 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/index.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/score.d.ts +21 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/score.js +32 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/score.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/types.d.ts +38 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/types.js +8 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/types.js.map +1 -0
- package/dist/restorer/types.d.ts +51 -0
- package/dist/restorer/types.js +7 -0
- package/dist/restorer/types.js.map +1 -0
- package/dist/runner/claude.js +15 -0
- package/dist/runner/claude.js.map +1 -1
- package/dist/store/store.d.ts +3 -1
- package/dist/store/store.js +8 -0
- package/dist/store/store.js.map +1 -1
- package/dist/tx-retry.js +11 -1
- package/dist/tx-retry.js.map +1 -1
- package/dist/types/desired-state.d.ts +53 -0
- package/dist/types/desired-state.js +20 -0
- package/dist/types/desired-state.js.map +1 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.js +2 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/portfolio.d.ts +1000 -0
- package/dist/types/portfolio.js +168 -0
- package/dist/types/portfolio.js.map +1 -0
- package/dist/venues/hyperliquid/account-value.d.ts +30 -0
- package/dist/venues/hyperliquid/account-value.js +30 -0
- package/dist/venues/hyperliquid/account-value.js.map +1 -0
- package/dist/venues/hyperliquid/client.d.ts +63 -0
- package/dist/venues/hyperliquid/client.js +135 -0
- package/dist/venues/hyperliquid/client.js.map +1 -0
- package/dist/venues/hyperliquid/grid.d.ts +36 -0
- package/dist/venues/hyperliquid/grid.js +61 -0
- package/dist/venues/hyperliquid/grid.js.map +1 -0
- package/dist/venues/hyperliquid/types.d.ts +81 -0
- package/dist/venues/hyperliquid/types.js +8 -0
- package/dist/venues/hyperliquid/types.js.map +1 -0
- package/package.json +17 -3
- 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
|
|
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
|
-
#
|
|
24
|
-
jinn doctor
|
|
32
|
+
# 2. Verify the environment and resolved deployment.
|
|
33
|
+
jinn doctor --human
|
|
25
34
|
|
|
26
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 |
|
|
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
|
|
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":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,gFAAgF;IAEhF;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAChD,OAAO,EAAE,EAAE;KACZ;IACD;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAChD,OAAO,EAAE,EAAE;KACZ;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAChD,OAAO,EAAE,EAAE;KACZ;IAED,gFAAgF;IAEhF;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAChD,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;YACpC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;SACvC;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACvC,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;YACpC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;SACvC;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IAED,gFAAgF;IAEhF;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,OAAO;QACb,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;YACrD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;YACnD,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;SACvD;KACF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,OAAO;QACb,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;YACrD,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;SAC5D;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,OAAO;QACb,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;YACrD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;SACpD;KACF;CACO,CAAC"}
|
|
@@ -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
|
+
}
|