@agentlayer.tech/wallet 0.1.27 → 0.1.30

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 (56) hide show
  1. package/.openclaw/extensions/agent-wallet/README.md +4 -5
  2. package/.openclaw/extensions/agent-wallet/dist/index.js +31 -31
  3. package/.openclaw/extensions/agent-wallet/index.ts +31 -31
  4. package/.openclaw/extensions/agent-wallet/openclaw.plugin.json +2 -2
  5. package/.openclaw/extensions/agent-wallet/package.json +1 -1
  6. package/CHANGELOG.md +52 -0
  7. package/README.md +9 -0
  8. package/agent-wallet/README.md +18 -22
  9. package/agent-wallet/agent_wallet/bootstrap.py +28 -12
  10. package/agent-wallet/agent_wallet/btc_user_wallets.py +2 -7
  11. package/agent-wallet/agent_wallet/config.py +99 -22
  12. package/agent-wallet/agent_wallet/evm_user_wallets.py +2 -14
  13. package/agent-wallet/agent_wallet/openclaw_adapter.py +72 -108
  14. package/agent-wallet/agent_wallet/openclaw_runtime.py +3 -12
  15. package/agent-wallet/agent_wallet/providers/kamino.py +21 -4
  16. package/agent-wallet/agent_wallet/providers/solana_rpc.py +0 -23
  17. package/agent-wallet/agent_wallet/providers/x402.py +198 -18
  18. package/agent-wallet/agent_wallet/user_wallets.py +4 -3
  19. package/agent-wallet/agent_wallet/wallet_layer/base.py +3 -3
  20. package/agent-wallet/agent_wallet/wallet_layer/factory.py +8 -5
  21. package/agent-wallet/agent_wallet/wallet_layer/solana.py +437 -44
  22. package/agent-wallet/agent_wallet/wallet_layer/wdk_btc.py +2 -8
  23. package/agent-wallet/agent_wallet/wallet_layer/wdk_evm.py +13 -13
  24. package/agent-wallet/examples/openclaw_runtime_onboarding.py +1 -1
  25. package/agent-wallet/examples/openclaw_user_wallet_example.py +1 -1
  26. package/agent-wallet/openclaw.plugin.json +1 -1
  27. package/agent-wallet/pyproject.toml +2 -1
  28. package/agent-wallet/scripts/bootstrap_openclaw_btc.py +3 -5
  29. package/agent-wallet/scripts/bootstrap_openclaw_evm.py +2 -12
  30. package/agent-wallet/scripts/build_release_bundle.py +1 -0
  31. package/agent-wallet/scripts/flash-sdk-bridge/bridge.mjs +1 -4
  32. package/agent-wallet/scripts/install_agent_wallet.py +1 -0
  33. package/agent-wallet/scripts/install_openclaw_local_config.py +4 -6
  34. package/agent-wallet/scripts/manage_openclaw_btc_wallet.py +2 -4
  35. package/agent-wallet/scripts/manage_openclaw_evm_wallet.py +2 -15
  36. package/agent-wallet/scripts/reveal_btc_seed.sh +7 -16
  37. package/agent-wallet/scripts/setup_btc_wallet.sh +7 -16
  38. package/agent-wallet/scripts/setup_evm_wallet.sh +1 -11
  39. package/agent-wallet/scripts/switch_openclaw_wallet_network.py +4 -1
  40. package/agent-wallet/skills/wallet-operator/SKILL.md +0 -1
  41. package/bin/openclaw-agent-wallet.mjs +289 -0
  42. package/claude-code/plugins/agent-wallet/.claude-plugin/plugin.json +20 -0
  43. package/claude-code/plugins/agent-wallet/.mcp.json +14 -0
  44. package/claude-code/plugins/agent-wallet/README.md +65 -0
  45. package/claude-code/plugins/agent-wallet/scripts/run_mcp.sh +34 -0
  46. package/claude-code/plugins/agent-wallet/skills/wallet-operator/SKILL.md +18 -0
  47. package/codex/plugins/agent-wallet/.codex-plugin/plugin.json +38 -0
  48. package/codex/plugins/agent-wallet/.mcp.json +15 -0
  49. package/codex/plugins/agent-wallet/README.md +39 -0
  50. package/codex/plugins/agent-wallet/scripts/run_mcp.sh +21 -0
  51. package/codex/plugins/agent-wallet/server.py +1077 -0
  52. package/codex/plugins/agent-wallet/skills/wallet-operator/SKILL.md +18 -0
  53. package/hermes/plugins/agent_wallet/schemas.py +2 -2
  54. package/hermes/plugins/agent_wallet/tools.py +17 -3
  55. package/package.json +6 -1
  56. package/setup.sh +2 -0
@@ -79,7 +79,7 @@ If that runtime is not present, set `plugins.entries.agent-wallet.config.package
79
79
 
80
80
  That installs the Python backend, Node dependencies for the local BTC/EVM runtimes, patches the OpenClaw plugin config, and provisions the first encrypted per-user Solana mainnet wallet when no explicit signer is already configured. EVM readiness can still be auto-healed during normal wallet switching when the runtime has sealed local vault credentials.
81
81
 
82
- For self-hosted installs, prefer `SOLANA_RPC_URL` / `SOLANA_RPC_URLS` in local env and treat the plugin `rpcUrl` / `rpcUrls` fields as fallback only. If the local runtime exposes `ALCHEMY_API_KEY` or `HELIUS_API_KEY`, the wallet can derive the Solana RPC URL automatically for `mainnet` or `devnet`. Local env always takes precedence over `openclaw.json`.
82
+ For self-hosted installs, prefer `SOLANA_RPC_URL` / `SOLANA_RPC_URLS` in local env and treat the plugin `rpcUrl` / `rpcUrls` fields as fallback only. If the local runtime exposes `ALCHEMY_API_KEY` or `HELIUS_API_KEY`, the wallet can derive the Solana RPC URL automatically for `mainnet`. Local env always takes precedence over `openclaw.json`.
83
83
 
84
84
  Provide only `AGENT_WALLET_BOOT_KEY` to the runtime. Provision `master_key`, `approval_secret`, and any signer `private_key` into `sealed_keys.json`, not `openclaw.json`.
85
85
 
@@ -134,14 +134,13 @@ For staking specifically, the normal agent flow should be:
134
134
 
135
135
  The extension is already network-aware:
136
136
 
137
- - `plugins.entries.agent-wallet.config.network` selects `mainnet`, `devnet`, or `testnet`
138
- - each network uses a separate wallet file for the same `userId`
139
- - switching networks does not merge balances across clusters
137
+ - `plugins.entries.agent-wallet.config.network` selects `mainnet` for Solana, `bitcoin` for BTC, or the supported EVM networks
138
+ - Solana mainnet wallets keep the same per-user file layout
139
+ - switching the configured backend network does not merge balances across chains
140
140
 
141
141
  Recommended local switch helper:
142
142
 
143
143
  ```bash
144
- python agent-wallet/scripts/switch_openclaw_wallet_network.py --network devnet
145
144
  python agent-wallet/scripts/switch_openclaw_wallet_network.py --network mainnet
146
145
  ```
147
146
 
@@ -308,13 +308,15 @@ function normalizeEvmNetwork(value) {
308
308
  eth: "ethereum",
309
309
  "eth-mainnet": "ethereum",
310
310
  "base-mainnet": "base",
311
- base_sepolia: "base-sepolia",
312
311
  };
313
312
  return aliases[normalized] || normalized;
314
313
  }
315
314
 
316
315
  function normalizeSelectableEvmNetwork(value) {
317
316
  const network = normalizeEvmNetwork(value);
317
+ if (["sepolia", "base-sepolia", "base_sepolia"].includes(network)) {
318
+ throw new Error("EVM testnets are no longer supported. Use ethereum or base.");
319
+ }
318
320
  if (!["ethereum", "base"].includes(network)) {
319
321
  throw new Error("EVM network must be 'ethereum' or 'base'.");
320
322
  }
@@ -331,8 +333,11 @@ function normalizeSolanaNetwork(value) {
331
333
  "mainnet-beta": "mainnet",
332
334
  };
333
335
  const normalized = aliases[network] || network;
334
- if (!["mainnet", "devnet", "testnet"].includes(normalized)) {
335
- throw new Error("Solana network must be mainnet, devnet, or testnet.");
336
+ if (["devnet", "testnet"].includes(normalized)) {
337
+ throw new Error("Solana devnet/testnet are no longer supported. Use mainnet.");
338
+ }
339
+ if (normalized !== "mainnet") {
340
+ throw new Error("Solana network must be mainnet.");
336
341
  }
337
342
  return normalized;
338
343
  }
@@ -347,8 +352,11 @@ function normalizeBtcNetwork(value) {
347
352
  mainnet: "bitcoin",
348
353
  };
349
354
  const normalized = aliases[network] || network;
350
- if (!["bitcoin", "testnet", "regtest"].includes(normalized)) {
351
- throw new Error("Bitcoin network must be bitcoin, testnet, or regtest.");
355
+ if (["testnet", "regtest"].includes(normalized)) {
356
+ throw new Error("Bitcoin testnet/regtest are no longer supported. Use bitcoin.");
357
+ }
358
+ if (normalized !== "bitcoin") {
359
+ throw new Error("Bitcoin network must be bitcoin.");
352
360
  }
353
361
  return normalized;
354
362
  }
@@ -399,7 +407,6 @@ function inferBackendForTool(toolName) {
399
407
  toolName === "transfer_spl_token" ||
400
408
  toolName === "sign_wallet_message" ||
401
409
  toolName === "close_empty_token_accounts" ||
402
- toolName === "request_devnet_airdrop" ||
403
410
  toolName === "get_wallet_portfolio" ||
404
411
  toolName === "get_solana_token_prices"
405
412
  ) {
@@ -956,7 +963,7 @@ const walletSessionToolDefinitions = [
956
963
  {
957
964
  name: "x402_pay_request",
958
965
  description:
959
- `Prepare or execute an x402 paid request using the active wallet backend. This milestone executes the Solana exact buyer flow and keeps EVM as prepare-only. ${OPENCLAW_EXECUTE_APPROVAL_GUIDANCE}`,
966
+ "Pay for and call an x402 endpoint using the active wallet backend. The tool probes the endpoint, validates compatibility, signs the payment, and returns the service response in one call.",
960
967
  parameters: {
961
968
  type: "object",
962
969
  properties: {
@@ -966,18 +973,9 @@ const walletSessionToolDefinitions = [
966
973
  query: { type: "object", additionalProperties: true },
967
974
  json_body: {},
968
975
  text_body: { type: "string" },
969
- mode: {
970
- type: "string",
971
- enum: ["prepare", "execute"],
972
- description: "prepare validates the payment plan; execute sends the paid retry.",
973
- },
974
976
  purpose: { type: "string" },
975
- user_intent: {
976
- type: "boolean",
977
- description: "Must be true for prepare mode.",
978
- },
979
977
  },
980
- required: ["url", "mode", "purpose"],
978
+ required: ["url", "purpose"],
981
979
  additionalProperties: false,
982
980
  },
983
981
  },
@@ -1000,7 +998,7 @@ const walletSessionToolDefinitions = [
1000
998
  },
1001
999
  network: {
1002
1000
  type: "string",
1003
- description: "Optional network for the selected wallet. Examples: mainnet, devnet, ethereum, base, bitcoin, testnet.",
1001
+ description: "Optional network for the selected wallet. Examples: mainnet, ethereum, base, bitcoin.",
1004
1002
  },
1005
1003
  },
1006
1004
  required: ["backend"],
@@ -1278,6 +1276,21 @@ const solanaToolDefinitions = [
1278
1276
  additionalProperties: false,
1279
1277
  },
1280
1278
  },
1279
+ {
1280
+ name: "get_kamino_open_positions",
1281
+ description:
1282
+ "Get all open Kamino lending positions for a Solana wallet on mainnet, aggregated across markets with loan details, reserve APYs, and rewards.",
1283
+ parameters: {
1284
+ type: "object",
1285
+ properties: {
1286
+ user: {
1287
+ type: "string",
1288
+ description: "Optional Solana wallet address override.",
1289
+ },
1290
+ },
1291
+ additionalProperties: false,
1292
+ },
1293
+ },
1281
1294
  {
1282
1295
  name: "sign_wallet_message",
1283
1296
  description: "Sign an arbitrary message with the connected wallet after explicit user confirmation in chat.",
@@ -1692,19 +1705,6 @@ const solanaToolDefinitions = [
1692
1705
  additionalProperties: false,
1693
1706
  },
1694
1707
  },
1695
- {
1696
- name: "request_devnet_airdrop",
1697
- description: "Request devnet or testnet SOL from the faucet.",
1698
- optional: true,
1699
- parameters: {
1700
- type: "object",
1701
- properties: {
1702
- amount: { type: "number" },
1703
- },
1704
- required: ["amount"],
1705
- additionalProperties: false,
1706
- },
1707
- },
1708
1708
  ];
1709
1709
 
1710
1710
  const btcToolDefinitions = [
@@ -308,13 +308,15 @@ function normalizeEvmNetwork(value) {
308
308
  eth: "ethereum",
309
309
  "eth-mainnet": "ethereum",
310
310
  "base-mainnet": "base",
311
- base_sepolia: "base-sepolia",
312
311
  };
313
312
  return aliases[normalized] || normalized;
314
313
  }
315
314
 
316
315
  function normalizeSelectableEvmNetwork(value) {
317
316
  const network = normalizeEvmNetwork(value);
317
+ if (["sepolia", "base-sepolia", "base_sepolia"].includes(network)) {
318
+ throw new Error("EVM testnets are no longer supported. Use ethereum or base.");
319
+ }
318
320
  if (!["ethereum", "base"].includes(network)) {
319
321
  throw new Error("EVM network must be 'ethereum' or 'base'.");
320
322
  }
@@ -331,8 +333,11 @@ function normalizeSolanaNetwork(value) {
331
333
  "mainnet-beta": "mainnet",
332
334
  };
333
335
  const normalized = aliases[network] || network;
334
- if (!["mainnet", "devnet", "testnet"].includes(normalized)) {
335
- throw new Error("Solana network must be mainnet, devnet, or testnet.");
336
+ if (["devnet", "testnet"].includes(normalized)) {
337
+ throw new Error("Solana devnet/testnet are no longer supported. Use mainnet.");
338
+ }
339
+ if (normalized !== "mainnet") {
340
+ throw new Error("Solana network must be mainnet.");
336
341
  }
337
342
  return normalized;
338
343
  }
@@ -347,8 +352,11 @@ function normalizeBtcNetwork(value) {
347
352
  mainnet: "bitcoin",
348
353
  };
349
354
  const normalized = aliases[network] || network;
350
- if (!["bitcoin", "testnet", "regtest"].includes(normalized)) {
351
- throw new Error("Bitcoin network must be bitcoin, testnet, or regtest.");
355
+ if (["testnet", "regtest"].includes(normalized)) {
356
+ throw new Error("Bitcoin testnet/regtest are no longer supported. Use bitcoin.");
357
+ }
358
+ if (normalized !== "bitcoin") {
359
+ throw new Error("Bitcoin network must be bitcoin.");
352
360
  }
353
361
  return normalized;
354
362
  }
@@ -399,7 +407,6 @@ function inferBackendForTool(toolName) {
399
407
  toolName === "transfer_spl_token" ||
400
408
  toolName === "sign_wallet_message" ||
401
409
  toolName === "close_empty_token_accounts" ||
402
- toolName === "request_devnet_airdrop" ||
403
410
  toolName === "get_wallet_portfolio" ||
404
411
  toolName === "get_solana_token_prices"
405
412
  ) {
@@ -956,7 +963,7 @@ const walletSessionToolDefinitions = [
956
963
  {
957
964
  name: "x402_pay_request",
958
965
  description:
959
- `Prepare or execute an x402 paid request using the active wallet backend. This milestone executes the Solana exact buyer flow and keeps EVM as prepare-only. ${OPENCLAW_EXECUTE_APPROVAL_GUIDANCE}`,
966
+ "Pay for and call an x402 endpoint using the active wallet backend. The tool probes the endpoint, validates compatibility, signs the payment, and returns the service response in one call.",
960
967
  parameters: {
961
968
  type: "object",
962
969
  properties: {
@@ -966,18 +973,9 @@ const walletSessionToolDefinitions = [
966
973
  query: { type: "object", additionalProperties: true },
967
974
  json_body: {},
968
975
  text_body: { type: "string" },
969
- mode: {
970
- type: "string",
971
- enum: ["prepare", "execute"],
972
- description: "prepare validates the payment plan; execute sends the paid retry.",
973
- },
974
976
  purpose: { type: "string" },
975
- user_intent: {
976
- type: "boolean",
977
- description: "Must be true for prepare mode.",
978
- },
979
977
  },
980
- required: ["url", "mode", "purpose"],
978
+ required: ["url", "purpose"],
981
979
  additionalProperties: false,
982
980
  },
983
981
  },
@@ -1000,7 +998,7 @@ const walletSessionToolDefinitions = [
1000
998
  },
1001
999
  network: {
1002
1000
  type: "string",
1003
- description: "Optional network for the selected wallet. Examples: mainnet, devnet, ethereum, base, bitcoin, testnet.",
1001
+ description: "Optional network for the selected wallet. Examples: mainnet, ethereum, base, bitcoin.",
1004
1002
  },
1005
1003
  },
1006
1004
  required: ["backend"],
@@ -1278,6 +1276,21 @@ const solanaToolDefinitions = [
1278
1276
  additionalProperties: false,
1279
1277
  },
1280
1278
  },
1279
+ {
1280
+ name: "get_kamino_open_positions",
1281
+ description:
1282
+ "Get all open Kamino lending positions for a Solana wallet on mainnet, aggregated across markets with loan details, reserve APYs, and rewards.",
1283
+ parameters: {
1284
+ type: "object",
1285
+ properties: {
1286
+ user: {
1287
+ type: "string",
1288
+ description: "Optional Solana wallet address override.",
1289
+ },
1290
+ },
1291
+ additionalProperties: false,
1292
+ },
1293
+ },
1281
1294
  {
1282
1295
  name: "sign_wallet_message",
1283
1296
  description: "Sign an arbitrary message with the connected wallet after explicit user confirmation in chat.",
@@ -1692,19 +1705,6 @@ const solanaToolDefinitions = [
1692
1705
  additionalProperties: false,
1693
1706
  },
1694
1707
  },
1695
- {
1696
- name: "request_devnet_airdrop",
1697
- description: "Request devnet or testnet SOL from the faucet.",
1698
- optional: true,
1699
- parameters: {
1700
- type: "object",
1701
- properties: {
1702
- amount: { type: "number" },
1703
- },
1704
- required: ["amount"],
1705
- additionalProperties: false,
1706
- },
1707
- },
1708
1708
  ];
1709
1709
 
1710
1710
  const btcToolDefinitions = [
@@ -35,6 +35,7 @@
35
35
  "get_jupiter_earn_tokens",
36
36
  "get_kamino_lend_market_reserves",
37
37
  "get_kamino_lend_markets",
38
+ "get_kamino_open_positions",
38
39
  "get_kamino_lend_user_obligations",
39
40
  "get_kamino_lend_user_rewards",
40
41
  "get_lifi_quote",
@@ -57,7 +58,6 @@
57
58
  "manage_evm_aave_position",
58
59
  "manage_evm_lido_position",
59
60
  "manage_evm_lido_withdrawal",
60
- "request_devnet_airdrop",
61
61
  "set_evm_network",
62
62
  "set_wallet_backend",
63
63
  "sign_wallet_message",
@@ -92,7 +92,7 @@
92
92
  },
93
93
  "network": {
94
94
  "type": "string",
95
- "description": "Backend network selector. Solana uses mainnet/devnet/testnet. BTC uses bitcoin/testnet/regtest. EVM uses ethereum/sepolia/base/base-sepolia."
95
+ "description": "Backend network selector. Solana uses mainnet. BTC uses bitcoin. EVM uses ethereum/base."
96
96
  },
97
97
  "wdkBtcServiceUrl": {
98
98
  "type": "string",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentlayertech/agent-wallet-plugin",
3
- "version": "0.1.27",
3
+ "version": "0.1.29",
4
4
  "description": "OpenClaw plugin bridge for the AgentLayer wallet runtime.",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN ../../../LICENSE",
package/CHANGELOG.md CHANGED
@@ -2,6 +2,58 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v0.1.30 - 2026-05-30
6
+
7
+ - Added a Claude Code plugin bridge under `claude-code/plugins/agent-wallet` so
8
+ the existing local wallet runtime can be used directly inside Claude Code
9
+ without creating a new wallet.
10
+ - The Claude Code bridge connects to the current `~/.openclaw` runtime and
11
+ reuses the same Solana, Bitcoin, and EVM wallet surface already used by
12
+ OpenClaw, Hermes, and Codex.
13
+ - Added `wallet claude-code install --yes`, which symlinks the bundled Claude
14
+ Code plugin into `~/.claude/plugins/agent-wallet` and attempts to register it
15
+ via the Claude Code CLI.
16
+ - Fixed the `smoke_install_from_github` test, which was failing because
17
+ `setup.sh` checks for the Codex plugin manifest but the test bundle never
18
+ created that path.
19
+ - Added the Claude Code plugin manifest check to `setup.sh` so bundle integrity
20
+ is validated for both the Codex and Claude Code plugin surfaces.
21
+
22
+ ## v0.1.29 - 2026-05-29
23
+
24
+ - Added a new `Codex` plugin bridge under `codex/plugins/agent-wallet` so the
25
+ existing local wallet runtime can be used directly inside Codex without
26
+ creating a second wallet.
27
+ - Kept the Codex bridge non-custodial and additive: it reuses the current
28
+ `agent-wallet` runtime, existing wallets, and the current tool surface
29
+ instead of replacing OpenClaw or Hermes.
30
+ - Added `wallet codex install --yes`, which links the bundled Codex plugin into
31
+ the standard local plugin marketplace path and can ask Codex to install the
32
+ plugin from that local marketplace.
33
+ - Added `get_kamino_open_positions`, which aggregates the wallet's Kamino
34
+ positions across markets with loan details, reserve APYs, and rewards.
35
+ - Removed Solana devnet/testnet support from the wallet runtime, host bridges,
36
+ and local helper scripts so the supported Solana surface is now mainnet-only.
37
+ - Removed EVM testnet support from the wallet runtime and host bridges so the
38
+ supported EVM surface is now `ethereum` and `base` mainnet only.
39
+ - Removed Bitcoin `testnet` and `regtest` support from the wallet runtime,
40
+ host bridges, and local helper scripts so the supported BTC surface is now
41
+ `bitcoin` mainnet only.
42
+
43
+ ## v0.1.28 - 2026-05-28
44
+
45
+ - Simplified `x402_pay_request` into a single-shot paid execution flow while
46
+ keeping `x402_preview_request` as an optional research tool.
47
+ - Hardened x402 execution with explicit payment requirement validation, longer
48
+ paid-request timeouts, structured settlement logging, and safer settlement
49
+ header parsing.
50
+ - Fixed Base x402 EVM signing by normalizing typed-data byte fields before
51
+ sending them through the local WDK signer bridge.
52
+ - Reduced x402 preview confusion in OpenClaw by exposing a payment summary
53
+ without approval-token style confirmation semantics.
54
+ - Added an early safety guard for `x402.alchemy.com` so unsupported wallet-auth
55
+ flows fail before spending funds.
56
+
5
57
  ## v0.1.27 - 2026-05-27
6
58
 
7
59
  - Improved Solana swap fallback landing by enabling Jupiter dynamic slippage
package/README.md CHANGED
@@ -16,6 +16,12 @@ For Hermes:
16
16
  npx @agentlayer.tech/wallet install --yes && npx @agentlayer.tech/wallet hermes install --yes
17
17
  ```
18
18
 
19
+ For Codex:
20
+
21
+ ```bash
22
+ npx @agentlayer.tech/wallet install --yes && npx @agentlayer.tech/wallet codex install --yes
23
+ ```
24
+
19
25
  AgentLayer is a beta local-first wallet and finance stack for agents.
20
26
 
21
27
  The repository includes:
@@ -23,6 +29,7 @@ The repository includes:
23
29
  - `agent-wallet/` - the main wallet backend for AgentLayer
24
30
  - `.openclaw/` - the local AgentLayer bridge layer for the OpenClaw wallet integration
25
31
  - `hermes/` - optional Hermes Agent plugin bridge for the same wallet backend
32
+ - `codex/` - optional Codex plugin bridge for the same wallet backend
26
33
  - `wdk-btc-wallet/` - the local Bitcoin wallet service
27
34
  - `wdk-evm-wallet/` - the local EVM wallet service
28
35
  - `provider-gateway/` - shared provider access for Solana RPC, Bags, and related finance reads
@@ -84,6 +91,7 @@ Useful npm CLI commands:
84
91
  wallet status
85
92
  wallet doctor
86
93
  wallet hermes install --yes
94
+ wallet codex install --yes
87
95
  wallet update --yes
88
96
  wallet update --yes --dry-run
89
97
  wallet rollback
@@ -200,6 +208,7 @@ Kamino integration gives the wallet a structured Solana lending surface:
200
208
  - `get_kamino_lend_market_reserves` - inspect reserve metrics for one Kamino market.
201
209
  - `get_kamino_lend_user_obligations` - inspect the wallet's obligations inside a Kamino market.
202
210
  - `get_kamino_lend_user_rewards` - fetch the wallet's Kamino rewards summary.
211
+ - `get_kamino_open_positions` - aggregate all open Kamino positions across markets with loan details, reserve APYs, and rewards.
203
212
  - `kamino_lend_deposit` - preview, prepare, or execute a lending deposit.
204
213
  - `kamino_lend_withdraw` - preview, prepare, or execute a lending withdrawal.
205
214
  - `kamino_lend_borrow` - preview, prepare, or execute a borrow.
@@ -26,7 +26,7 @@ It provides:
26
26
  - runtime instructions for safe wallet usage
27
27
  - a single `invoke()` method for safe dispatch
28
28
  - OpenClaw-style plugin manifest and skill bundle
29
- - explicit network-aware results so the host and agent can see `devnet` vs `mainnet`
29
+ - explicit network-aware results so the host and agent can see the active chain network
30
30
 
31
31
  ## Hermes integration
32
32
 
@@ -98,6 +98,7 @@ Current safe tools:
98
98
  - `get_kamino_lend_market_reserves`
99
99
  - `get_kamino_lend_user_obligations`
100
100
  - `get_kamino_lend_user_rewards`
101
+ - `get_kamino_open_positions`
101
102
  - `jupiter_earn_deposit`
102
103
  - `jupiter_earn_withdraw`
103
104
  - `kamino_lend_deposit`
@@ -107,7 +108,6 @@ Current safe tools:
107
108
  - `close_empty_token_accounts`
108
109
  - `deactivate_solana_stake`
109
110
  - `withdraw_solana_stake`
110
- - `request_devnet_airdrop`
111
111
  - `x402_search_services`
112
112
  - `x402_get_service_details`
113
113
  - `x402_preview_request`
@@ -190,7 +190,7 @@ For production `mainnet`, prefer a dedicated RPC instead of the public Solana en
190
190
 
191
191
  - `SOLANA_RPC_URL` for one primary endpoint
192
192
  - `SOLANA_RPC_URLS` as a comma-separated ordered failover list
193
- - or just `ALCHEMY_API_KEY` / `HELIUS_API_KEY`, which auto-derive a primary Solana RPC for `mainnet` or `devnet`
193
+ - or just `ALCHEMY_API_KEY` / `HELIUS_API_KEY`, which auto-derive a primary Solana RPC for `mainnet`
194
194
 
195
195
  Production recommendation: treat RPC as deployment-owned config, not wallet logic. Runtime env wins over `openclaw.json` plugin config, so keep `Alchemy/Helius/QuickNode` endpoints in deployment secrets or service env and use plugin `rpcUrl` / `rpcUrls` only as local fallback.
196
196
 
@@ -277,9 +277,7 @@ export AGENT_WALLET_BOOT_KEY='paste-generated-secret-here'
277
277
  In that mode, `agent-wallet` will auto-resolve:
278
278
 
279
279
  - `mainnet` -> `https://solana-mainnet.g.alchemy.com/v2/<ALCHEMY_API_KEY>`
280
- - `devnet` -> `https://solana-devnet.g.alchemy.com/v2/<ALCHEMY_API_KEY>`
281
280
  - `mainnet` -> `https://mainnet.helius-rpc.com/?api-key=<HELIUS_API_KEY>`
282
- - `devnet` -> `https://devnet.helius-rpc.com/?api-key=<HELIUS_API_KEY>`
283
281
 
284
282
  and still append the official Solana endpoint as fallback.
285
283
 
@@ -317,7 +315,7 @@ printf '%s\n' 'your-local-btc-password' | \
317
315
  python -m agent_wallet.openclaw_cli btc-wallet-create \
318
316
  --user-id alice@example.com \
319
317
  --password-stdin \
320
- --config-json '{"backend":"wdk_btc_local","network":"testnet","wdkBtcServiceUrl":"http://127.0.0.1:8080"}'
318
+ --config-json '{"backend":"wdk_btc_local","network":"bitcoin","wdkBtcServiceUrl":"http://127.0.0.1:8080"}'
321
319
  ```
322
320
 
323
321
  If you want a friendlier host-shell flow, use:
@@ -325,7 +323,7 @@ If you want a friendlier host-shell flow, use:
325
323
  ```bash
326
324
  python scripts/manage_openclaw_btc_wallet.py setup \
327
325
  --user-id alice@example.com \
328
- --network testnet \
326
+ --network bitcoin \
329
327
  --service-url http://127.0.0.1:8080
330
328
  ```
331
329
 
@@ -340,11 +338,11 @@ If you want a true one-command OpenClaw bootstrap, use:
340
338
  ```bash
341
339
  python agent-wallet/scripts/bootstrap_openclaw_btc.py \
342
340
  --user-id alice@example.com \
343
- --network testnet \
341
+ --network bitcoin \
344
342
  --service-url http://127.0.0.1:8080
345
343
  ```
346
344
 
347
- For BTC mainnet, use the same bootstrap with `--network mainnet`. The script normalizes that to `bitcoin` in plugin config automatically.
345
+ You can also pass `--network mainnet`; the bootstrap normalizes that alias to `bitcoin`.
348
346
 
349
347
  For the simplest host-side UX, use the shell wrapper instead:
350
348
 
@@ -356,7 +354,7 @@ That is the intended "agent/host installs, user only enters password" entrypoint
356
354
 
357
355
  - the script wraps the full BTC bootstrap
358
356
  - it auto-starts the local `wdk-btc-wallet` service for localhost URLs if needed
359
- - it asks for `user-id` and shows a small `mainnet / testnet / regtest` menu if you did not pass them as args or env
357
+ - it asks for `user-id` and defaults BTC network to `mainnet` if you did not pass it explicitly
360
358
  - it prompts for the BTC wallet password interactively unless you explicitly pass `--password-stdin`
361
359
  - it prefers `/tmp/agent-wallet-venv/bin/python`, then `agent-wallet/.venv/bin/python`, and only then falls back to system `python3`
362
360
  - it creates or unlocks the BTC wallet binding and patches local OpenClaw config in one pass
@@ -407,7 +405,7 @@ For the local EVM backend (`backend=wdk_evm_local`), the lifecycle mirrors the B
407
405
  - `agent-wallet` talks to it through a local bearer token loaded from `~/.openclaw/wdk-evm-wallet/local-auth-token`
408
406
  - `agent-wallet` stores only a per-user EVM wallet binding under `~/.openclaw/users/<normalized-user-id>/wallets/evm-<network>-agent.json`
409
407
  - the runtime can auto-create missing EVM bindings or auto-unlock the local vault during ordinary OpenClaw switching/tool calls when `sealed_keys.json` contains `wdk_evm_wallet_password`
410
- - supported EVM networks are `ethereum`, `sepolia`, `base`, and `base-sepolia`
408
+ - supported EVM networks are `ethereum` and `base`
411
409
  - OpenClaw-facing EVM tools accept an optional per-call `network` override for `ethereum` or `base`, so the agent can switch between the two mainnet EVM paths without editing host config
412
410
  - EVM `get_wallet_balance` now returns an enriched portfolio-style payload with native balance, discovered ERC-20 balances, and USD values when token discovery and pricing are available
413
411
  - if a requested EVM network binding is missing, `agent-wallet` auto-binds it from the same local wallet when there is exactly one reusable EVM wallet for that user or when `wdkEvmWalletId` is provided explicitly
@@ -430,7 +428,7 @@ That wrapper:
430
428
  - defaults to `http://127.0.0.1:8081`
431
429
  - can auto-start `wdk-evm-wallet/run-local.sh` if the local service is not already healthy
432
430
  - creates or unlocks the local EVM wallet binding
433
- - also binds the paired EVM network by default: `ethereum <-> base`, `sepolia <-> base-sepolia`
431
+ - also binds the paired EVM network by default: `ethereum <-> base`
434
432
  - stores the entered EVM vault password into `sealed_keys.json` when `AGENT_WALLET_BOOT_KEY` is available, so later OpenClaw wallet switching can auto-raise the EVM backend without another password prompt
435
433
  - patches OpenClaw config to `backend=wdk_evm_local`
436
434
 
@@ -441,7 +439,7 @@ printf '%s\n' 'your-local-evm-password' | \
441
439
  python -m agent_wallet.openclaw_cli evm-wallet-create \
442
440
  --user-id alice@example.com \
443
441
  --password-stdin \
444
- --config-json '{"backend":"wdk_evm_local","network":"sepolia","wdkEvmServiceUrl":"http://127.0.0.1:8081"}'
442
+ --config-json '{"backend":"wdk_evm_local","network":"ethereum","wdkEvmServiceUrl":"http://127.0.0.1:8081"}'
445
443
  ```
446
444
 
447
445
  After that, `onboard` and `invoke` can use the bound EVM wallet by `user_id` without manually passing `wdkEvmWalletId` every time.
@@ -500,14 +498,13 @@ This keeps wallet creation and custody in the host/runtime layer while the agent
500
498
 
501
499
  The wallet backend is already network-scoped:
502
500
 
503
- - `devnet` and `mainnet` use different wallet files
504
- - per-user wallets are stored as `solana-<network>-agent.json`
505
- - switching networks does not mix balances or stake accounts across clusters
501
+ - Solana stays on `mainnet`
502
+ - per-user Solana wallets continue to use `solana-mainnet-agent.json`
503
+ - switching BTC or EVM networks does not mix balances across chains
506
504
 
507
505
  For a local OpenClaw install, use:
508
506
 
509
507
  ```bash
510
- python agent-wallet/scripts/switch_openclaw_wallet_network.py --network devnet
511
508
  python agent-wallet/scripts/switch_openclaw_wallet_network.py --network mainnet
512
509
  ```
513
510
 
@@ -570,7 +567,7 @@ Operational notes:
570
567
 
571
568
  - this path uses Solana RPC and the Stake Program directly, without third-party DeFi APIs
572
569
  - stake creation allocates a new stake account controlled by the connected wallet as staker and withdrawer
573
- - preview and prepare were live-checked on devnet against a real wallet context
570
+ - preview and prepare were live-checked against a real wallet context
574
571
 
575
572
  ## Official OpenClaw plugin
576
573
 
@@ -612,13 +609,13 @@ Public-safe helper scripts are available in `agent-wallet/scripts/`:
612
609
  Both scripts now use generic defaults instead of hardcoded local usernames or paths. Sensitive secrets must be supplied via protected environment variables, not config JSON or CLI arguments.
613
610
  When `~/.openclaw/agent-wallet-runtime/current` exists, the config installer now prefers that trusted runtime path over a workspace checkout for the plugin manifest, package root, and Python bridge launcher.
614
611
 
615
- Recommended devnet setup:
612
+ Recommended Solana mainnet setup:
616
613
 
617
614
  ```bash
618
615
  AGENT_WALLET_BACKEND=solana_local
619
616
  AGENT_WALLET_BOOT_KEY=change-this-in-production
620
- SOLANA_NETWORK=devnet
621
- SOLANA_RPC_URLS=https://api.devnet.solana.com
617
+ SOLANA_NETWORK=mainnet
618
+ SOLANA_RPC_URLS=https://api.mainnet-beta.solana.com
622
619
  SOLANA_AUTO_CREATE_WALLET=true
623
620
  AGENT_WALLET_SIGN_ONLY=false
624
621
  ```
@@ -641,4 +638,3 @@ The package now supports:
641
638
  - Jupiter-based swap preview and execution on mainnet
642
639
  - compact swap `fee_summary` in preview/prepare/execute, including known network fees and route fee bps when Jupiter provides them
643
640
  - zero-balance token account cleanup
644
- - devnet/testnet faucet airdrop