@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,257 @@
1
+ /**
2
+ * Shared withdraw execution (master + optional agent sweeps). Used by `jinn withdraw` and `npm run withdraw`.
3
+ */
4
+ import { encodeFunctionData, formatEther, getAddress, isAddress, parseAbi, } from 'viem';
5
+ import { getChainConfig } from '../earning/contracts.js';
6
+ import { FleetStateStore } from '../earning/store.js';
7
+ import { decryptMnemonic, deriveAgentSigner, deriveMasterSigner } from '../earning/wallet.js';
8
+ import { createJinnPublicClient, createJinnWalletClient } from '../earning/viem-clients.js';
9
+ import { viemSendTransactionWithRetry, waitForTransactionReceiptWithRetry, } from '../tx-retry.js';
10
+ import { withdrawArgsNeedMasterTransfer } from './args.js';
11
+ const ETH_CONFIRM_WEI = 5n * 10n ** 16n; // 0.05 ETH
12
+ const JINN_CONFIRM_WEI = 1000n * 10n ** 18n; // 1000 tokens @ 18 decimals
13
+ const ERC20_ABI = parseAbi([
14
+ 'function transfer(address to, uint256 amount) returns (bool)',
15
+ 'function balanceOf(address account) view returns (uint256)',
16
+ 'function decimals() view returns (uint8)',
17
+ ]);
18
+ export function withdrawNeedsInteractiveConfirm(p, opts) {
19
+ if (p.dryRun || p.yes)
20
+ return false;
21
+ if (p.drainJinn || p.drainEth)
22
+ return true;
23
+ if (opts.sweepWouldSend && p.sweepAgents)
24
+ return true;
25
+ if (p.ethWei !== null && p.ethWei >= ETH_CONFIRM_WEI)
26
+ return true;
27
+ if (p.jinnWei !== null && p.jinnWei >= JINN_CONFIRM_WEI)
28
+ return true;
29
+ return false;
30
+ }
31
+ export function resolveWithdrawTokenAddress(chain, config) {
32
+ const envTok = process.env['JINN_TOKEN']?.trim();
33
+ if (envTok) {
34
+ if (!isAddress(envTok)) {
35
+ throw new Error(`JINN_TOKEN must be a valid address, got: ${envTok}`);
36
+ }
37
+ return getAddress(envTok);
38
+ }
39
+ return getAddress(getChainConfig(chain, {
40
+ testnetL2DeploymentPath: config.testnetL2DeploymentPath,
41
+ testnetL2TokenDeploymentPath: config.testnetL2TokenDeploymentPath,
42
+ testnetMechDeploymentPath: config.testnetMechDeploymentPath,
43
+ testnetStolasDeploymentPath: config.testnetStolasDeploymentPath,
44
+ }).olasToken);
45
+ }
46
+ export async function estimateNativeTransferCostWei(publicClient) {
47
+ try {
48
+ const fees = await publicClient.estimateFeesPerGas();
49
+ if (fees.maxFeePerGas !== undefined) {
50
+ return (21000n * fees.maxFeePerGas * 3n) / 2n;
51
+ }
52
+ }
53
+ catch {
54
+ /* fall through */
55
+ }
56
+ const gasPrice = await publicClient.getGasPrice();
57
+ if (gasPrice === 0n) {
58
+ throw new Error('Could not resolve gas price for fee estimate');
59
+ }
60
+ return (21000n * gasPrice * 3n) / 2n;
61
+ }
62
+ export async function computeSweepWouldSend(publicClient, mnemonic, fleet, to, minSweepWei) {
63
+ void to;
64
+ if (!fleet?.services.length)
65
+ return false;
66
+ const cost = await estimateNativeTransferCostWei(publicClient);
67
+ for (const svc of fleet.services) {
68
+ const derived = getAddress(deriveAgentSigner(mnemonic, svc.index).address);
69
+ const recorded = getAddress(svc.agent_address);
70
+ if (derived !== recorded)
71
+ continue;
72
+ const bal = await publicClient.getBalance({ address: derived });
73
+ if (bal > cost + minSweepWei)
74
+ return true;
75
+ }
76
+ return false;
77
+ }
78
+ async function sweepAgentEoas(opts) {
79
+ const { rpcUrl, network, publicClient, mnemonic, fleet, to, dryRun, minSweepWei, log, warn } = opts;
80
+ if (!fleet?.services.length) {
81
+ log('[withdraw] No services in fleet state; nothing to sweep.');
82
+ return;
83
+ }
84
+ const gasReserve = await estimateNativeTransferCostWei(publicClient);
85
+ for (const svc of fleet.services) {
86
+ const agentAccount = deriveAgentSigner(mnemonic, svc.index);
87
+ const derived = getAddress(agentAccount.address);
88
+ const recorded = getAddress(svc.agent_address);
89
+ if (derived !== recorded) {
90
+ warn(`[withdraw] Skip service ${svc.index}: derived agent ${derived} != state ${recorded}`);
91
+ continue;
92
+ }
93
+ const bal = await publicClient.getBalance({ address: derived });
94
+ const sendWei = bal > gasReserve ? bal - gasReserve : 0n;
95
+ if (sendWei <= minSweepWei) {
96
+ log(`[withdraw] Agent ${svc.index} ${derived}: balance ${bal} wei — below sweep threshold, skip`);
97
+ continue;
98
+ }
99
+ log(`[withdraw] Agent ${svc.index} ${derived}: sweep ${sendWei} wei to ${to}` +
100
+ (dryRun ? ' (dry-run)' : ''));
101
+ if (!dryRun) {
102
+ const agentWallet = createJinnWalletClient(rpcUrl, network, agentAccount);
103
+ const hash = await viemSendTransactionWithRetry(agentWallet, publicClient, {
104
+ account: agentAccount,
105
+ to: getAddress(to),
106
+ value: sendWei,
107
+ });
108
+ await waitForTransactionReceiptWithRetry(publicClient, hash);
109
+ log(`[withdraw] tx ${hash}`);
110
+ }
111
+ }
112
+ }
113
+ async function masterTransfers(opts) {
114
+ const { publicClient, masterWallet, masterAccount, tokenDecimals, tokenAddress, to, parsed, log } = opts;
115
+ const { dryRun } = parsed;
116
+ const chainId = await publicClient.getChainId();
117
+ log(`[withdraw] Master ${masterAccount.address} → ${to} (chain ${chainId})`);
118
+ log(`[withdraw] ERC-20 token contract ${tokenAddress} (set JINN_TOKEN to override)`);
119
+ const tokenAddr = getAddress(tokenAddress);
120
+ if (parsed.jinnWei !== null || parsed.drainJinn) {
121
+ let amount = parsed.jinnWei;
122
+ if (parsed.drainJinn) {
123
+ amount = await publicClient.readContract({
124
+ address: tokenAddr,
125
+ abi: ERC20_ABI,
126
+ functionName: 'balanceOf',
127
+ args: [getAddress(masterAccount.address)],
128
+ });
129
+ log(`[withdraw] Drain JINN: balance ${amount} (${tokenDecimals} decimals)`);
130
+ }
131
+ if (amount === null || amount <= 0n) {
132
+ log('[withdraw] Skipping token transfer (zero amount).');
133
+ }
134
+ else {
135
+ log(`[withdraw] Token transfer ${amount} wei` + (dryRun ? ' (dry-run)' : ''));
136
+ if (!dryRun) {
137
+ const data = encodeFunctionData({
138
+ abi: ERC20_ABI,
139
+ functionName: 'transfer',
140
+ args: [getAddress(to), amount],
141
+ });
142
+ const hash = await viemSendTransactionWithRetry(masterWallet, publicClient, {
143
+ account: masterAccount,
144
+ to: tokenAddr,
145
+ data,
146
+ });
147
+ await waitForTransactionReceiptWithRetry(publicClient, hash);
148
+ log(`[withdraw] tx ${hash}`);
149
+ }
150
+ }
151
+ }
152
+ if (parsed.ethWei !== null || parsed.drainEth) {
153
+ const cost = await estimateNativeTransferCostWei(publicClient);
154
+ let value = parsed.ethWei;
155
+ if (parsed.drainEth) {
156
+ const bal = await publicClient.getBalance({ address: getAddress(masterAccount.address) });
157
+ const reserve = parsed.masterGasReserveWei;
158
+ const raw = bal > reserve + cost ? bal - reserve - cost : 0n;
159
+ value = raw;
160
+ log(`[withdraw] Drain ETH: balance ${bal} wei, reserve ${reserve} wei, est. gas ${cost} wei, send ${value} wei`);
161
+ }
162
+ if (value === null || value <= 0n) {
163
+ log('[withdraw] Skipping ETH transfer (zero amount).');
164
+ }
165
+ else {
166
+ const bal = await publicClient.getBalance({ address: getAddress(masterAccount.address) });
167
+ if (bal < value + cost) {
168
+ throw new Error(`Insufficient ETH for transfer: need ${value + cost} wei (value + est. gas), have ${bal}`);
169
+ }
170
+ log(`[withdraw] ETH transfer ${value} wei (${formatEther(value)} ETH)` + (dryRun ? ' (dry-run)' : ''));
171
+ if (!dryRun) {
172
+ const hash = await viemSendTransactionWithRetry(masterWallet, publicClient, {
173
+ account: masterAccount,
174
+ to: getAddress(to),
175
+ value,
176
+ });
177
+ await waitForTransactionReceiptWithRetry(publicClient, hash);
178
+ log(`[withdraw] tx ${hash}`);
179
+ }
180
+ }
181
+ }
182
+ }
183
+ export async function runWithdrawPlan(options) {
184
+ const log = options.log ?? ((s) => console.log(s));
185
+ const warn = options.warn ?? ((s) => console.warn(s));
186
+ const { password, config, parsed } = options;
187
+ const chain = config.network === 'testnet' ? 'base-sepolia' : 'base';
188
+ const publicClient = createJinnPublicClient(config.rpcUrl, chain);
189
+ const chainId = await publicClient.getChainId();
190
+ const chainConfig = getChainConfig(chain, {
191
+ testnetL2DeploymentPath: config.testnetL2DeploymentPath,
192
+ testnetL2TokenDeploymentPath: config.testnetL2TokenDeploymentPath,
193
+ testnetMechDeploymentPath: config.testnetMechDeploymentPath,
194
+ testnetStolasDeploymentPath: config.testnetStolasDeploymentPath,
195
+ });
196
+ if (chainId !== chainConfig.chainId) {
197
+ throw new Error(`RPC chainId ${chainId} does not match expected ${chainConfig.chainId} for ${chain}.`);
198
+ }
199
+ const store = new FleetStateStore(config.earningDir);
200
+ if (!store.hasMnemonicKeystore()) {
201
+ throw new Error(`No mnemonic keystore at ${store.dir}/master_keystore.json`);
202
+ }
203
+ const mnemonic = await decryptMnemonic(await store.loadMnemonicKeystore(), password);
204
+ const masterAccount = deriveMasterSigner(mnemonic);
205
+ const masterWallet = createJinnWalletClient(config.rpcUrl, chain, masterAccount);
206
+ const fleet = await store.tryLoadExisting();
207
+ if (fleet?.master_address) {
208
+ const m = getAddress(fleet.master_address);
209
+ const w = getAddress(masterAccount.address);
210
+ if (m !== w) {
211
+ throw new Error(`Keystore master ${w} does not match fleet state master ${m}`);
212
+ }
213
+ }
214
+ const tokenAddress = resolveWithdrawTokenAddress(chain, config);
215
+ let tokenDecimals = 18;
216
+ try {
217
+ tokenDecimals = Number(await publicClient.readContract({
218
+ address: getAddress(tokenAddress),
219
+ abi: ERC20_ABI,
220
+ functionName: 'decimals',
221
+ }));
222
+ }
223
+ catch {
224
+ // default 18
225
+ }
226
+ const to = parsed.to;
227
+ if (parsed.sweepAgents) {
228
+ await sweepAgentEoas({
229
+ rpcUrl: config.rpcUrl,
230
+ network: chain,
231
+ publicClient,
232
+ mnemonic,
233
+ fleet,
234
+ to,
235
+ dryRun: parsed.dryRun,
236
+ minSweepWei: parsed.minSweepWei,
237
+ log,
238
+ warn,
239
+ });
240
+ }
241
+ if (withdrawArgsNeedMasterTransfer(parsed)) {
242
+ await masterTransfers({
243
+ publicClient,
244
+ rpcUrl: config.rpcUrl,
245
+ network: chain,
246
+ masterAccount,
247
+ masterWallet,
248
+ tokenDecimals,
249
+ tokenAddress,
250
+ to,
251
+ parsed,
252
+ log,
253
+ });
254
+ }
255
+ log(parsed.dryRun ? '[withdraw] Dry-run complete.' : '[withdraw] Done.');
256
+ }
257
+ //# sourceMappingURL=run-withdraw-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-withdraw-plan.js","sourceRoot":"","sources":["../../src/withdraw/run-withdraw-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * x402 artifact acquisition — fetches remote content with payment.
3
+ * Ported from protocol/src/discovery/acquire.ts.
4
+ */
5
+ export declare function buildAcquisitionUrl(endpoint: string, artifactId: string): string;
6
+ export declare function acquireArtifactWithPayment(endpoint: string, artifactId: string, privateKey: string): Promise<string | null>;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * x402 artifact acquisition — fetches remote content with payment.
3
+ * Ported from protocol/src/discovery/acquire.ts.
4
+ */
5
+ export function buildAcquisitionUrl(endpoint, artifactId) {
6
+ return `${endpoint.replace(/\/$/, '')}/x402/artifacts/${artifactId}/content`;
7
+ }
8
+ export async function acquireArtifactWithPayment(endpoint, artifactId, privateKey) {
9
+ const url = buildAcquisitionUrl(endpoint, artifactId);
10
+ try {
11
+ const { wrapFetchWithPayment, x402Client } = await import('@x402/fetch');
12
+ const { registerExactEvmScheme } = await import('@x402/evm/exact/client');
13
+ const { toClientEvmSigner } = await import('@x402/evm');
14
+ const { privateKeyToAccount } = await import('viem/accounts');
15
+ const pk = (privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`);
16
+ const account = privateKeyToAccount(pk);
17
+ const signer = toClientEvmSigner({ ...account, address: account.address });
18
+ const client = new x402Client();
19
+ registerExactEvmScheme(client, { signer });
20
+ const payFetch = wrapFetchWithPayment(globalThis.fetch, client);
21
+ const response = await payFetch(url);
22
+ if (!response.ok)
23
+ return null;
24
+ const body = (await response.json());
25
+ return body.content ?? null;
26
+ }
27
+ catch (err) {
28
+ console.error(`[x402] Failed to acquire artifact ${artifactId}:`, err);
29
+ return null;
30
+ }
31
+ }
32
+ //# sourceMappingURL=acquire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acquire.js","sourceRoot":"","sources":["../../src/x402/acquire.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,UAAkB;IACtE,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,mBAAmB,UAAU,UAAU,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,QAAgB,EAChB,UAAkB,EAClB,UAAkB;IAElB,MAAM,GAAG,GAAG,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,EAAE,oBAAoB,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACzE,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAC1E,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACxD,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QAE9D,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAQ,CAAC;QACjF,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAwB,EAAE,CAAC,CAAC;QAE5F,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,sBAAsB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAE3C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;QAC7D,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,qCAAqC,UAAU,GAAG,EAAE,GAAG,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * x402 local facilitator — verifies and settles EVM payments.
3
+ * Ported from protocol/src/x402/facilitator.ts.
4
+ */
5
+ import type { FacilitatorClient } from '@x402/core/server';
6
+ export interface X402FacilitatorConfig {
7
+ privateKey: string;
8
+ network?: string;
9
+ rpcUrl?: string;
10
+ }
11
+ export declare function createLocalFacilitatorClient(config: X402FacilitatorConfig): FacilitatorClient;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * x402 local facilitator — verifies and settles EVM payments.
3
+ * Ported from protocol/src/x402/facilitator.ts.
4
+ */
5
+ import { x402Facilitator } from '@x402/core/facilitator';
6
+ import { registerExactEvmScheme } from '@x402/evm/exact/facilitator';
7
+ import { toFacilitatorEvmSigner } from '@x402/evm';
8
+ import { privateKeyToAccount } from 'viem/accounts';
9
+ import { createWalletClient, http, createPublicClient } from 'viem';
10
+ import { base, baseSepolia } from 'viem/chains';
11
+ const CHAIN_MAP = {
12
+ 'eip155:8453': base,
13
+ 'eip155:84532': baseSepolia,
14
+ };
15
+ export function createLocalFacilitatorClient(config) {
16
+ const networkStr = config.network ?? 'eip155:8453';
17
+ const chain = CHAIN_MAP[networkStr];
18
+ if (!chain)
19
+ throw new Error(`Unsupported network: ${networkStr}`);
20
+ const network = networkStr;
21
+ const pk = (config.privateKey.startsWith('0x') ? config.privateKey : `0x${config.privateKey}`);
22
+ const account = privateKeyToAccount(pk);
23
+ const walletClient = createWalletClient({
24
+ account,
25
+ chain,
26
+ transport: http(config.rpcUrl),
27
+ });
28
+ const publicClient = createPublicClient({
29
+ chain,
30
+ transport: http(config.rpcUrl),
31
+ });
32
+ const facilitatorSigner = toFacilitatorEvmSigner({
33
+ address: account.address,
34
+ readContract: (args) => publicClient.readContract(args),
35
+ verifyTypedData: (args) => publicClient.verifyTypedData(args),
36
+ writeContract: async (args) => walletClient.writeContract(args),
37
+ sendTransaction: async (args) => walletClient.sendTransaction(args),
38
+ waitForTransactionReceipt: async (args) => publicClient.waitForTransactionReceipt(args),
39
+ getCode: async (args) => publicClient.getCode(args),
40
+ });
41
+ const facilitator = new x402Facilitator();
42
+ registerExactEvmScheme(facilitator, {
43
+ signer: facilitatorSigner,
44
+ networks: network,
45
+ });
46
+ return {
47
+ verify: (payload, requirements) => facilitator.verify(payload, requirements),
48
+ settle: (payload, requirements) => facilitator.settle(payload, requirements),
49
+ getSupported: () => Promise.resolve(facilitator.getSupported()),
50
+ };
51
+ }
52
+ //# sourceMappingURL=facilitator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facilitator.js","sourceRoot":"","sources":["../../src/x402/facilitator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAahD,MAAM,SAAS,GAA0B;IACvC,aAAa,EAAE,IAAI;IACnB,cAAc,EAAE,WAAW;CAC5B,CAAC;AAEF,MAAM,UAAU,4BAA4B,CAAC,MAA6B;IACxE,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,IAAI,aAAa,CAAC;IACnD,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAC;IAElE,MAAM,OAAO,GAAG,UAAqB,CAAC;IACtC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,UAAU,EAAE,CAAQ,CAAC;IACtG,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAExC,MAAM,YAAY,GAAG,kBAAkB,CAAC;QACtC,OAAO;QACP,KAAK;QACL,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;KAC/B,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,kBAAkB,CAAC;QACtC,KAAK;QACL,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;KAC/B,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;QAC/C,OAAO,EAAE,OAAO,CAAC,OAAc;QAC/B,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,IAAuD,CAAC;QAC1G,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,IAA0D,CAAC;QACnH,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,IAAwD,CAAC;QACnH,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,IAA0D,CAAC;QACzH,yBAAyB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,yBAAyB,CAAC,IAAoE,CAAC;QACvJ,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,IAAkD,CAAC;KAClG,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;IAC1C,sBAAsB,CAAC,WAAW,EAAE;QAClC,MAAM,EAAE,iBAAiB;QACzB,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC;QAC5E,MAAM,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC;QAC5E,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,EAAuE,CAAC;KACrI,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * x402 payment-gated artifact serving.
3
+ * Adds payment middleware to Hono app for artifact content access.
4
+ * Ported from protocol/src/x402/handler.ts.
5
+ */
6
+ import type { Hono } from 'hono';
7
+ import type { Store } from '../store/store.js';
8
+ export interface X402Config {
9
+ privateKey: string;
10
+ recipientAddress: string;
11
+ pricePerArtifact?: string;
12
+ network?: string;
13
+ rpcUrl?: string;
14
+ }
15
+ export declare function addX402Routes(app: Hono, store: Store, config: X402Config): void;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * x402 payment-gated artifact serving.
3
+ * Adds payment middleware to Hono app for artifact content access.
4
+ * Ported from protocol/src/x402/handler.ts.
5
+ */
6
+ import { paymentMiddleware } from '@x402/hono';
7
+ import { x402ResourceServer } from '@x402/core/server';
8
+ import { registerExactEvmScheme } from '@x402/evm/exact/server';
9
+ import { createLocalFacilitatorClient } from './facilitator.js';
10
+ export function addX402Routes(app, store, config) {
11
+ const facilitatorClient = createLocalFacilitatorClient({
12
+ privateKey: config.privateKey,
13
+ network: config.network,
14
+ rpcUrl: config.rpcUrl,
15
+ });
16
+ const network = (config.network ?? 'eip155:8453');
17
+ const price = config.pricePerArtifact ?? '$0.001';
18
+ const resourceServer = new x402ResourceServer(facilitatorClient);
19
+ registerExactEvmScheme(resourceServer);
20
+ const routes = {
21
+ 'GET /x402/artifacts/:id/content': {
22
+ accepts: {
23
+ scheme: 'exact',
24
+ payTo: config.recipientAddress,
25
+ price,
26
+ network,
27
+ },
28
+ description: 'Access artifact content',
29
+ },
30
+ };
31
+ app.use(paymentMiddleware(routes, resourceServer));
32
+ app.get('/x402/artifacts/:id/content', async (c) => {
33
+ const id = c.req.param('id');
34
+ const content = store.getArtifactContent(id);
35
+ if (content === null)
36
+ return c.json({ error: 'Not found' }, 404);
37
+ return c.json({ content });
38
+ });
39
+ }
40
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/x402/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAUhE,MAAM,UAAU,aAAa,CAAC,GAAS,EAAE,KAAY,EAAE,MAAkB;IACvE,MAAM,iBAAiB,GAAG,4BAA4B,CAAC;QACrD,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,aAAa,CAAY,CAAC;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,IAAI,QAAQ,CAAC;IAElD,MAAM,cAAc,GAAG,IAAI,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IACjE,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG;QACb,iCAAiC,EAAE;YACjC,OAAO,EAAE;gBACP,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,MAAM,CAAC,gBAAgB;gBAC9B,KAAK;gBACL,OAAO;aACR;YACD,WAAW,EAAE,yBAAyB;SACvC;KACF,CAAC;IAEF,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAEnD,GAAG,CAAC,GAAG,CAAC,6BAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACjD,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@jinn-network/client",
3
+ "version": "0.1.0-canary.adfd078d",
4
+ "description": "Jinn protocol client — headless daemon for the restoration training loop",
5
+ "type": "module",
6
+ "packageManager": "yarn@4.13.0",
7
+ "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/Jinn-Network/mono.git",
11
+ "directory": "client"
12
+ },
13
+ "engines": {
14
+ "node": ">=20"
15
+ },
16
+ "bin": {
17
+ "jinn": "./dist/bin/jinn.js"
18
+ },
19
+ "main": "./dist/index.js",
20
+ "types": "./dist/index.d.ts",
21
+ "files": [
22
+ "dist/",
23
+ "deployments/",
24
+ "README.md",
25
+ "LICENSE"
26
+ ],
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "scripts": {
31
+ "jinn": "tsx src/bin/jinn.ts",
32
+ "build": "tsc && chmod +x dist/bin/jinn.js && node scripts/write-dist-build-meta.mjs",
33
+ "typecheck": "tsc --noEmit",
34
+ "test": "vitest run",
35
+ "test:watch": "vitest",
36
+ "prepublishOnly": "yarn build && yarn test",
37
+ "pack:smoke": "yarn pack -o jinn-client.tgz && node scripts/smoke-test-pack.mjs",
38
+ "release:operator-gate": "yarn staking && yarn e2e",
39
+ "status": "tsx scripts/status.ts",
40
+ "e2e": "tsx scripts/e2e-validate.ts",
41
+ "staking": "tsx scripts/staking-validate.ts",
42
+ "stolas": "tsx scripts/stolas-validate.ts",
43
+ "withdraw": "tsx scripts/withdraw.ts"
44
+ },
45
+ "dependencies": {
46
+ "@ethereumjs/wallet": "^10.0.0",
47
+ "@hono/node-server": "^1.19.12",
48
+ "@jinn-network/mech-client-ts": "^0.0.6",
49
+ "@modelcontextprotocol/sdk": "^1.27.1",
50
+ "@safe-global/protocol-kit": "^6.1.2",
51
+ "@safe-global/types-kit": "^3.0.0",
52
+ "@scure/bip32": "^1.7.0",
53
+ "@scure/bip39": "^1.4.0",
54
+ "@slicekit/erc8128": "^0.3.3",
55
+ "@x402/core": "^2.9.0",
56
+ "@x402/evm": "^2.9.0",
57
+ "@x402/fetch": "^2.9.0",
58
+ "@x402/hono": "^2.9.0",
59
+ "better-sqlite3": "^11.0.0",
60
+ "dotenv": "^17.4.1",
61
+ "hono": "^4.12.10",
62
+ "viem": "^2.0.0",
63
+ "zod": "^3.22.0"
64
+ },
65
+ "devDependencies": {
66
+ "@types/better-sqlite3": "^7.6.0",
67
+ "@types/node": "^20.0.0",
68
+ "tsx": "^4.0.0",
69
+ "typescript": "^5.5.0",
70
+ "vitest": "^2.0.0"
71
+ }
72
+ }