@agentlayer.tech/wallet 0.1.75 → 0.1.77

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 (36) hide show
  1. package/.openclaw/extensions/agent-wallet/README.md +4 -4
  2. package/.openclaw/extensions/agent-wallet/dist/index.js +57 -19
  3. package/.openclaw/extensions/agent-wallet/index.ts +57 -19
  4. package/.openclaw/extensions/agent-wallet/openclaw.plugin.json +1 -1
  5. package/.openclaw/extensions/agent-wallet/package.json +1 -1
  6. package/CHANGELOG.md +19 -0
  7. package/VERSION +1 -1
  8. package/agent-wallet/AGENTS.md +1 -0
  9. package/agent-wallet/UPGRADE_COMPATIBILITY.md +36 -0
  10. package/agent-wallet/agent_wallet/__init__.py +1 -1
  11. package/agent-wallet/agent_wallet/autonomous_permissions.py +2 -2
  12. package/agent-wallet/agent_wallet/autonomous_policy.py +1 -1
  13. package/agent-wallet/agent_wallet/boot_key_recovery.py +10 -1
  14. package/agent-wallet/agent_wallet/config.py +3 -3
  15. package/agent-wallet/agent_wallet/openclaw_adapter.py +24 -24
  16. package/agent-wallet/agent_wallet/providers/evm_portfolio.py +2 -2
  17. package/agent-wallet/agent_wallet/wallet_layer/wdk_evm.py +2 -2
  18. package/agent-wallet/openclaw.plugin.json +1 -1
  19. package/agent-wallet/pyproject.toml +1 -1
  20. package/agent-wallet/skills/wallet-operator/SKILL.md +4 -1
  21. package/bin/lib/boot-key.mjs +185 -0
  22. package/bin/lib/integrations.mjs +424 -0
  23. package/bin/lib/update-transaction.mjs +235 -0
  24. package/bin/openclaw-agent-wallet.mjs +225 -520
  25. package/claude-code/plugins/agent-wallet/.claude-plugin/plugin.json +1 -1
  26. package/codex/plugins/agent-wallet/.codex-plugin/plugin.json +1 -1
  27. package/codex/plugins/agent-wallet/server.py +13 -10
  28. package/codex/plugins/agent-wallet/skills/wallet-operator/SKILL.md +1 -1
  29. package/hermes/plugins/agent_wallet/plugin.yaml +1 -1
  30. package/package.json +2 -1
  31. package/wdk-btc-wallet/package.json +1 -1
  32. package/wdk-evm-wallet/.env.example +3 -2
  33. package/wdk-evm-wallet/package.json +5 -2
  34. package/wdk-evm-wallet/src/config.js +16 -2
  35. package/wdk-evm-wallet/src/network_state.js +5 -2
  36. package/wdk-evm-wallet/src/wdk_evm_wallet.js +10 -4
@@ -14,7 +14,7 @@ It is designed so the OpenClaw agent sees a small operational wallet surface ins
14
14
  In practice this means the agent works through explicit tools for:
15
15
 
16
16
  - BTC balance, fee-rate, max-spendable, history, and transfer flows through the local `wdk-btc-wallet` backend
17
- - EVM native balance, ERC-20 balance/metadata, fee-rate, receipt, Velora swap quote/execute, Aave V3 account/reserve/position flows, and transfer flows through the local `wdk-evm-wallet` backend
17
+ - EVM native balance, ERC-20 balance/metadata, fee-rate, receipt, Velora and Uniswap swap quote/execute, Aave V3 account/reserve/position flows, and transfer flows through the local `wdk-evm-wallet` backend
18
18
  - wallet address, balances, and portfolio reads
19
19
  - native SOL and SPL token transfers
20
20
  - Jupiter swap and price lookup, including Solana swap intent execution that refreshes quotes inside user-approved limits
@@ -94,11 +94,11 @@ Important:
94
94
  - When the BTC service URL is local, that bootstrap script can also auto-start `wdk-btc-wallet` before patching OpenClaw config.
95
95
  - The EVM flow also only supports local service URLs (`127.0.0.1` / `localhost` / `::1`) and uses a bearer token loaded from `~/.openclaw/wdk-evm-wallet/local-auth-token`.
96
96
  - The installer now provisions a sealed local EVM vault password under `sealed_keys.json` by default, and host-side EVM setup helpers refresh that sealed value whenever the operator enters a new password.
97
- - The EVM tool surface is intentionally narrow: Velora swap quote/execute, Aave V3 account/reserve/position flows, native transfers, ERC-20 transfers, fee quotes, and receipt lookup only. No arbitrary calldata, standalone approvals, or generic contract execution are exposed to the agent.
97
+ - The EVM tool surface is intentionally narrow: Velora and Uniswap swap quote/execute, Aave V3 account/reserve/position flows, native transfers, ERC-20 transfers, fee quotes, and receipt lookup only. No arbitrary calldata, standalone approvals, or generic contract execution are exposed to the agent.
98
98
  - Velora swap and Aave V3 support are currently limited to `ethereum` and `base`. Test carefully because the upstream WDK protocol packages are still beta.
99
99
  - Agents can call `set_wallet_backend` to switch the active wallet for the current OpenClaw plugin session between Solana, EVM, and Bitcoin. This does not edit `openclaw.json`; plugin config remains the startup default.
100
- - EVM read and write tools accept an optional per-call `network` override for `ethereum` or `base`.
101
- - Agents can also call `set_evm_network` to select the active EVM network for the current OpenClaw plugin session. After that, EVM tools default to the selected network unless a specific call passes its own `network` value. Do not edit code, plugin config, or environment variables just to switch between Base and Ethereum.
100
+ - EVM core read and transfer tools accept an optional per-call `network` override for `ethereum`, `base`, or `robinhood`; Velora/Aave remain limited to Ethereum/Base, while Uniswap supports all three.
101
+ - Agents can also call `set_evm_network` to select the active EVM network for the current OpenClaw plugin session. After that, EVM tools default to the selected network unless a specific call passes its own `network` value. Do not edit code, plugin config, or environment variables just to switch between Base, Ethereum, and Robinhood.
102
102
  - `get_wallet_balance` returns an enriched wallet overview for Solana and EVM: native balance, discovered token balances, per-asset USD values when pricing is available, and `total_value_usd`.
103
103
  - Solana wallet overview uses Solana RPC only for balance and token-account discovery. Token prices come from Jupiter, not RPC, and internal transfer/staking checks continue to use native-only balance reads.
104
104
  - If the user needs to recover the mnemonic later, host-side reveal stays outside the agent tool surface via `agent-wallet/scripts/manage_openclaw_btc_wallet.py reveal-seed`.
@@ -18,6 +18,7 @@ const PREVIEW_BOUND_SWAP_TOOLS = new Set([
18
18
  "flash_trade_open_position",
19
19
  "flash_trade_close_position",
20
20
  ]);
21
+ const EVM_CORE_NETWORKS = ["ethereum", "base", "robinhood"];
21
22
  const AUTONOMOUS_BASE_SWAP_TOOLS = new Set([
22
23
  "swap_evm_tokens",
23
24
  "swap_evm_uniswap_tokens",
@@ -202,6 +203,7 @@ function normalizeWalletBackend(value) {
202
203
  ethereum: "wdk_evm_local",
203
204
  eth: "wdk_evm_local",
204
205
  base: "wdk_evm_local",
206
+ robinhood: "wdk_evm_local",
205
207
  wdk_evm_local: "wdk_evm_local",
206
208
  "wdk-evm-local": "wdk_evm_local",
207
209
  evm_local: "wdk_evm_local",
@@ -215,7 +217,7 @@ function normalizeWalletBackend(value) {
215
217
  };
216
218
  const backend = aliases[normalized] || normalized;
217
219
  if (!["solana_local", "wdk_evm_local", "wdk_btc_local"].includes(backend)) {
218
- throw new Error("Wallet backend must be solana, evm, base, ethereum, btc, or bitcoin.");
220
+ throw new Error("Wallet backend must be solana, evm, ethereum, base, robinhood, btc, or bitcoin.");
219
221
  }
220
222
  return backend;
221
223
  }
@@ -240,10 +242,10 @@ function normalizeEvmNetwork(value) {
240
242
  function normalizeSelectableEvmNetwork(value) {
241
243
  const network = normalizeEvmNetwork(value);
242
244
  if (["sepolia", "base-sepolia", "base_sepolia"].includes(network)) {
243
- throw new Error("EVM testnets are no longer supported. Use ethereum or base.");
245
+ throw new Error("EVM testnets are no longer supported. Use ethereum, base, or robinhood.");
244
246
  }
245
- if (!["ethereum", "base"].includes(network)) {
246
- throw new Error("EVM network must be 'ethereum' or 'base'.");
247
+ if (!EVM_CORE_NETWORKS.includes(network)) {
248
+ throw new Error("EVM network must be 'ethereum', 'base', or 'robinhood'.");
247
249
  }
248
250
  return network;
249
251
  }
@@ -289,7 +291,7 @@ function normalizeBtcNetwork(value) {
289
291
  function defaultSelectableEvmNetwork(api) {
290
292
  const config = resolvePluginConfig(api);
291
293
  const configured = normalizeEvmNetwork(config.network || process.env.WDK_EVM_NETWORK);
292
- return ["ethereum", "base"].includes(configured) ? configured : null;
294
+ return EVM_CORE_NETWORKS.includes(configured) ? configured : null;
293
295
  }
294
296
 
295
297
  function defaultSolanaNetwork(api) {
@@ -841,12 +843,12 @@ const walletSessionToolDefinitions = [
841
843
  properties: {
842
844
  backend: {
843
845
  type: "string",
844
- enum: ["solana", "sol", "evm", "ethereum", "base", "bitcoin", "btc"],
846
+ enum: ["solana", "sol", "evm", "ethereum", "base", "robinhood", "bitcoin", "btc"],
845
847
  description: "Wallet backend or common alias to make active.",
846
848
  },
847
849
  network: {
848
850
  type: "string",
849
- description: "Optional network for the selected wallet. Examples: mainnet, ethereum, base, bitcoin.",
851
+ description: "Optional network for the selected wallet. Examples: mainnet, ethereum, base, robinhood, bitcoin.",
850
852
  },
851
853
  },
852
854
  required: ["backend"],
@@ -1537,7 +1539,7 @@ const evmToolDefinitions = [
1537
1539
  properties: {
1538
1540
  network: {
1539
1541
  type: "string",
1540
- enum: ["ethereum", "base"],
1542
+ enum: EVM_CORE_NETWORKS,
1541
1543
  description: "Optional EVM network override for this request.",
1542
1544
  },
1543
1545
  },
@@ -1552,7 +1554,7 @@ const evmToolDefinitions = [
1552
1554
  properties: {
1553
1555
  network: {
1554
1556
  type: "string",
1555
- enum: ["ethereum", "base"],
1557
+ enum: EVM_CORE_NETWORKS,
1556
1558
  description: "Optional EVM network override for this request.",
1557
1559
  },
1558
1560
  },
@@ -1571,7 +1573,7 @@ const evmToolDefinitions = [
1571
1573
  },
1572
1574
  network: {
1573
1575
  type: "string",
1574
- enum: ["ethereum", "base"],
1576
+ enum: EVM_CORE_NETWORKS,
1575
1577
  description: "Optional EVM network override for this request.",
1576
1578
  },
1577
1579
  },
@@ -1628,7 +1630,7 @@ const evmToolDefinitions = [
1628
1630
  properties: {
1629
1631
  network: {
1630
1632
  type: "string",
1631
- enum: ["ethereum", "base"],
1633
+ enum: EVM_CORE_NETWORKS,
1632
1634
  },
1633
1635
  },
1634
1636
  additionalProperties: false,
@@ -1637,13 +1639,13 @@ const evmToolDefinitions = [
1637
1639
  {
1638
1640
  name: "set_evm_network",
1639
1641
  description:
1640
- "Select the active EVM network for subsequent wallet tool calls in this OpenClaw plugin session. Use this to switch between ethereum and base instead of editing code or plugin configuration.",
1642
+ "Select the active EVM network for subsequent wallet tool calls in this OpenClaw plugin session. Use this to switch between ethereum, base, and robinhood instead of editing code or plugin configuration.",
1641
1643
  parameters: {
1642
1644
  type: "object",
1643
1645
  properties: {
1644
1646
  network: {
1645
1647
  type: "string",
1646
- enum: ["ethereum", "base"],
1648
+ enum: EVM_CORE_NETWORKS,
1647
1649
  description: "EVM network to make active for subsequent calls.",
1648
1650
  },
1649
1651
  },
@@ -1658,7 +1660,7 @@ const evmToolDefinitions = [
1658
1660
  type: "object",
1659
1661
  properties: {
1660
1662
  token_address: { type: "string" },
1661
- network: { type: "string", enum: ["ethereum", "base"] },
1663
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
1662
1664
  },
1663
1665
  required: ["token_address"],
1664
1666
  additionalProperties: false,
@@ -1671,7 +1673,7 @@ const evmToolDefinitions = [
1671
1673
  type: "object",
1672
1674
  properties: {
1673
1675
  token_address: { type: "string" },
1674
- network: { type: "string", enum: ["ethereum", "base"] },
1676
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
1675
1677
  },
1676
1678
  required: ["token_address"],
1677
1679
  additionalProperties: false,
@@ -1683,7 +1685,7 @@ const evmToolDefinitions = [
1683
1685
  parameters: {
1684
1686
  type: "object",
1685
1687
  properties: {
1686
- network: { type: "string", enum: ["ethereum", "base"] },
1688
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
1687
1689
  },
1688
1690
  additionalProperties: false,
1689
1691
  },
@@ -1695,7 +1697,7 @@ const evmToolDefinitions = [
1695
1697
  type: "object",
1696
1698
  properties: {
1697
1699
  tx_hash: { type: "string" },
1698
- network: { type: "string", enum: ["ethereum", "base"] },
1700
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
1699
1701
  },
1700
1702
  required: ["tx_hash"],
1701
1703
  additionalProperties: false,
@@ -1959,6 +1961,42 @@ const evmToolDefinitions = [
1959
1961
  additionalProperties: false,
1960
1962
  },
1961
1963
  },
1964
+ {
1965
+ name: "get_uniswap_swap_quote",
1966
+ description: "Get a read-only Uniswap Trading API quote (CLASSIC routing) for an ERC-20 or native ETH swap on ethereum, base, or robinhood. This does not approve, sign, or execute a swap.",
1967
+ parameters: {
1968
+ type: "object",
1969
+ properties: {
1970
+ token_in: { type: "string" },
1971
+ token_out: { type: "string" },
1972
+ amount_in_raw: { type: "string" },
1973
+ slippage_bps: { type: "integer" },
1974
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
1975
+ },
1976
+ required: ["token_in", "token_out", "amount_in_raw"],
1977
+ additionalProperties: false,
1978
+ },
1979
+ },
1980
+ {
1981
+ name: "swap_evm_uniswap_tokens",
1982
+ description: "Preview, prepare, or execute an ERC-20 or native ETH swap through the Uniswap Trading API (CLASSIC routing) on ethereum, base, or robinhood. ERC-20 inputs use Permit2 EIP-712 signing automatically. Preview or prepare first. After the user explicitly confirms the shown summary in chat, call execute; the OpenClaw plugin handles the internal execution authorization automatically.",
1983
+ optional: true,
1984
+ parameters: {
1985
+ type: "object",
1986
+ properties: {
1987
+ token_in: { type: "string" },
1988
+ token_out: { type: "string" },
1989
+ amount_in_raw: { type: "string" },
1990
+ slippage_bps: { type: "integer" },
1991
+ mode: { type: "string", enum: ["preview", "prepare", "execute"] },
1992
+ purpose: { type: "string" },
1993
+ user_intent: { type: "boolean" },
1994
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
1995
+ },
1996
+ required: ["token_in", "token_out", "amount_in_raw", "mode", "purpose"],
1997
+ additionalProperties: false,
1998
+ },
1999
+ },
1962
2000
  {
1963
2001
  name: "swap_evm_lifi_cross_chain_tokens",
1964
2002
  description: "Preview, prepare, or execute an EVM-origin cross-chain swap through LI.FI. This currently supports ethereum/base as the source network and ethereum/base/solana as the destination chain. Preview or prepare first. After the user explicitly confirms the shown summary in chat, call execute; the OpenClaw plugin handles the internal execution authorization automatically.",
@@ -2004,7 +2042,7 @@ const evmToolDefinitions = [
2004
2042
  mode: { type: "string", enum: ["preview", "prepare", "execute"] },
2005
2043
  purpose: { type: "string" },
2006
2044
  user_intent: { type: "boolean" },
2007
- network: { type: "string", enum: ["ethereum", "base"] },
2045
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
2008
2046
  },
2009
2047
  required: ["recipient", "amount_wei", "mode", "purpose"],
2010
2048
  additionalProperties: false,
@@ -2023,7 +2061,7 @@ const evmToolDefinitions = [
2023
2061
  mode: { type: "string", enum: ["preview", "prepare", "execute"] },
2024
2062
  purpose: { type: "string" },
2025
2063
  user_intent: { type: "boolean" },
2026
- network: { type: "string", enum: ["ethereum", "base"] },
2064
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
2027
2065
  },
2028
2066
  required: ["token_address", "recipient", "amount_raw", "mode", "purpose"],
2029
2067
  additionalProperties: false,
@@ -18,6 +18,7 @@ const PREVIEW_BOUND_SWAP_TOOLS = new Set([
18
18
  "flash_trade_open_position",
19
19
  "flash_trade_close_position",
20
20
  ]);
21
+ const EVM_CORE_NETWORKS = ["ethereum", "base", "robinhood"];
21
22
  const AUTONOMOUS_BASE_SWAP_TOOLS = new Set([
22
23
  "swap_evm_tokens",
23
24
  "swap_evm_uniswap_tokens",
@@ -202,6 +203,7 @@ function normalizeWalletBackend(value) {
202
203
  ethereum: "wdk_evm_local",
203
204
  eth: "wdk_evm_local",
204
205
  base: "wdk_evm_local",
206
+ robinhood: "wdk_evm_local",
205
207
  wdk_evm_local: "wdk_evm_local",
206
208
  "wdk-evm-local": "wdk_evm_local",
207
209
  evm_local: "wdk_evm_local",
@@ -215,7 +217,7 @@ function normalizeWalletBackend(value) {
215
217
  };
216
218
  const backend = aliases[normalized] || normalized;
217
219
  if (!["solana_local", "wdk_evm_local", "wdk_btc_local"].includes(backend)) {
218
- throw new Error("Wallet backend must be solana, evm, base, ethereum, btc, or bitcoin.");
220
+ throw new Error("Wallet backend must be solana, evm, ethereum, base, robinhood, btc, or bitcoin.");
219
221
  }
220
222
  return backend;
221
223
  }
@@ -240,10 +242,10 @@ function normalizeEvmNetwork(value) {
240
242
  function normalizeSelectableEvmNetwork(value) {
241
243
  const network = normalizeEvmNetwork(value);
242
244
  if (["sepolia", "base-sepolia", "base_sepolia"].includes(network)) {
243
- throw new Error("EVM testnets are no longer supported. Use ethereum or base.");
245
+ throw new Error("EVM testnets are no longer supported. Use ethereum, base, or robinhood.");
244
246
  }
245
- if (!["ethereum", "base"].includes(network)) {
246
- throw new Error("EVM network must be 'ethereum' or 'base'.");
247
+ if (!EVM_CORE_NETWORKS.includes(network)) {
248
+ throw new Error("EVM network must be 'ethereum', 'base', or 'robinhood'.");
247
249
  }
248
250
  return network;
249
251
  }
@@ -289,7 +291,7 @@ function normalizeBtcNetwork(value) {
289
291
  function defaultSelectableEvmNetwork(api) {
290
292
  const config = resolvePluginConfig(api);
291
293
  const configured = normalizeEvmNetwork(config.network || process.env.WDK_EVM_NETWORK);
292
- return ["ethereum", "base"].includes(configured) ? configured : null;
294
+ return EVM_CORE_NETWORKS.includes(configured) ? configured : null;
293
295
  }
294
296
 
295
297
  function defaultSolanaNetwork(api) {
@@ -841,12 +843,12 @@ const walletSessionToolDefinitions = [
841
843
  properties: {
842
844
  backend: {
843
845
  type: "string",
844
- enum: ["solana", "sol", "evm", "ethereum", "base", "bitcoin", "btc"],
846
+ enum: ["solana", "sol", "evm", "ethereum", "base", "robinhood", "bitcoin", "btc"],
845
847
  description: "Wallet backend or common alias to make active.",
846
848
  },
847
849
  network: {
848
850
  type: "string",
849
- description: "Optional network for the selected wallet. Examples: mainnet, ethereum, base, bitcoin.",
851
+ description: "Optional network for the selected wallet. Examples: mainnet, ethereum, base, robinhood, bitcoin.",
850
852
  },
851
853
  },
852
854
  required: ["backend"],
@@ -1537,7 +1539,7 @@ const evmToolDefinitions = [
1537
1539
  properties: {
1538
1540
  network: {
1539
1541
  type: "string",
1540
- enum: ["ethereum", "base"],
1542
+ enum: EVM_CORE_NETWORKS,
1541
1543
  description: "Optional EVM network override for this request.",
1542
1544
  },
1543
1545
  },
@@ -1552,7 +1554,7 @@ const evmToolDefinitions = [
1552
1554
  properties: {
1553
1555
  network: {
1554
1556
  type: "string",
1555
- enum: ["ethereum", "base"],
1557
+ enum: EVM_CORE_NETWORKS,
1556
1558
  description: "Optional EVM network override for this request.",
1557
1559
  },
1558
1560
  },
@@ -1571,7 +1573,7 @@ const evmToolDefinitions = [
1571
1573
  },
1572
1574
  network: {
1573
1575
  type: "string",
1574
- enum: ["ethereum", "base"],
1576
+ enum: EVM_CORE_NETWORKS,
1575
1577
  description: "Optional EVM network override for this request.",
1576
1578
  },
1577
1579
  },
@@ -1628,7 +1630,7 @@ const evmToolDefinitions = [
1628
1630
  properties: {
1629
1631
  network: {
1630
1632
  type: "string",
1631
- enum: ["ethereum", "base"],
1633
+ enum: EVM_CORE_NETWORKS,
1632
1634
  },
1633
1635
  },
1634
1636
  additionalProperties: false,
@@ -1637,13 +1639,13 @@ const evmToolDefinitions = [
1637
1639
  {
1638
1640
  name: "set_evm_network",
1639
1641
  description:
1640
- "Select the active EVM network for subsequent wallet tool calls in this OpenClaw plugin session. Use this to switch between ethereum and base instead of editing code or plugin configuration.",
1642
+ "Select the active EVM network for subsequent wallet tool calls in this OpenClaw plugin session. Use this to switch between ethereum, base, and robinhood instead of editing code or plugin configuration.",
1641
1643
  parameters: {
1642
1644
  type: "object",
1643
1645
  properties: {
1644
1646
  network: {
1645
1647
  type: "string",
1646
- enum: ["ethereum", "base"],
1648
+ enum: EVM_CORE_NETWORKS,
1647
1649
  description: "EVM network to make active for subsequent calls.",
1648
1650
  },
1649
1651
  },
@@ -1658,7 +1660,7 @@ const evmToolDefinitions = [
1658
1660
  type: "object",
1659
1661
  properties: {
1660
1662
  token_address: { type: "string" },
1661
- network: { type: "string", enum: ["ethereum", "base"] },
1663
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
1662
1664
  },
1663
1665
  required: ["token_address"],
1664
1666
  additionalProperties: false,
@@ -1671,7 +1673,7 @@ const evmToolDefinitions = [
1671
1673
  type: "object",
1672
1674
  properties: {
1673
1675
  token_address: { type: "string" },
1674
- network: { type: "string", enum: ["ethereum", "base"] },
1676
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
1675
1677
  },
1676
1678
  required: ["token_address"],
1677
1679
  additionalProperties: false,
@@ -1683,7 +1685,7 @@ const evmToolDefinitions = [
1683
1685
  parameters: {
1684
1686
  type: "object",
1685
1687
  properties: {
1686
- network: { type: "string", enum: ["ethereum", "base"] },
1688
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
1687
1689
  },
1688
1690
  additionalProperties: false,
1689
1691
  },
@@ -1695,7 +1697,7 @@ const evmToolDefinitions = [
1695
1697
  type: "object",
1696
1698
  properties: {
1697
1699
  tx_hash: { type: "string" },
1698
- network: { type: "string", enum: ["ethereum", "base"] },
1700
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
1699
1701
  },
1700
1702
  required: ["tx_hash"],
1701
1703
  additionalProperties: false,
@@ -1959,6 +1961,42 @@ const evmToolDefinitions = [
1959
1961
  additionalProperties: false,
1960
1962
  },
1961
1963
  },
1964
+ {
1965
+ name: "get_uniswap_swap_quote",
1966
+ description: "Get a read-only Uniswap Trading API quote (CLASSIC routing) for an ERC-20 or native ETH swap on ethereum, base, or robinhood. This does not approve, sign, or execute a swap.",
1967
+ parameters: {
1968
+ type: "object",
1969
+ properties: {
1970
+ token_in: { type: "string" },
1971
+ token_out: { type: "string" },
1972
+ amount_in_raw: { type: "string" },
1973
+ slippage_bps: { type: "integer" },
1974
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
1975
+ },
1976
+ required: ["token_in", "token_out", "amount_in_raw"],
1977
+ additionalProperties: false,
1978
+ },
1979
+ },
1980
+ {
1981
+ name: "swap_evm_uniswap_tokens",
1982
+ description: "Preview, prepare, or execute an ERC-20 or native ETH swap through the Uniswap Trading API (CLASSIC routing) on ethereum, base, or robinhood. ERC-20 inputs use Permit2 EIP-712 signing automatically. Preview or prepare first. After the user explicitly confirms the shown summary in chat, call execute; the OpenClaw plugin handles the internal execution authorization automatically.",
1983
+ optional: true,
1984
+ parameters: {
1985
+ type: "object",
1986
+ properties: {
1987
+ token_in: { type: "string" },
1988
+ token_out: { type: "string" },
1989
+ amount_in_raw: { type: "string" },
1990
+ slippage_bps: { type: "integer" },
1991
+ mode: { type: "string", enum: ["preview", "prepare", "execute"] },
1992
+ purpose: { type: "string" },
1993
+ user_intent: { type: "boolean" },
1994
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
1995
+ },
1996
+ required: ["token_in", "token_out", "amount_in_raw", "mode", "purpose"],
1997
+ additionalProperties: false,
1998
+ },
1999
+ },
1962
2000
  {
1963
2001
  name: "swap_evm_lifi_cross_chain_tokens",
1964
2002
  description: "Preview, prepare, or execute an EVM-origin cross-chain swap through LI.FI. This currently supports ethereum/base as the source network and ethereum/base/solana as the destination chain. Preview or prepare first. After the user explicitly confirms the shown summary in chat, call execute; the OpenClaw plugin handles the internal execution authorization automatically.",
@@ -2004,7 +2042,7 @@ const evmToolDefinitions = [
2004
2042
  mode: { type: "string", enum: ["preview", "prepare", "execute"] },
2005
2043
  purpose: { type: "string" },
2006
2044
  user_intent: { type: "boolean" },
2007
- network: { type: "string", enum: ["ethereum", "base"] },
2045
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
2008
2046
  },
2009
2047
  required: ["recipient", "amount_wei", "mode", "purpose"],
2010
2048
  additionalProperties: false,
@@ -2023,7 +2061,7 @@ const evmToolDefinitions = [
2023
2061
  mode: { type: "string", enum: ["preview", "prepare", "execute"] },
2024
2062
  purpose: { type: "string" },
2025
2063
  user_intent: { type: "boolean" },
2026
- network: { type: "string", enum: ["ethereum", "base"] },
2064
+ network: { type: "string", enum: EVM_CORE_NETWORKS },
2027
2065
  },
2028
2066
  required: ["token_address", "recipient", "amount_raw", "mode", "purpose"],
2029
2067
  additionalProperties: false,
@@ -2,7 +2,7 @@
2
2
  "id": "agent-wallet",
3
3
  "name": "Agent Wallet",
4
4
  "description": "Official OpenClaw plugin bridge for the agent-wallet backends, including Solana, local BTC, and local EVM.",
5
- "version": "0.1.75",
5
+ "version": "0.1.77",
6
6
  "contracts": {
7
7
  "tools": [
8
8
  "agentlayer_autonomous_approve",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentlayertech/agent-wallet-plugin",
3
- "version": "0.1.75",
3
+ "version": "0.1.77",
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,25 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v0.1.77 - 2026-07-13
6
+
7
+ - Added Robinhood Chain mainnet (`chainId` 4663) to the local EVM wallet,
8
+ provider gateway, OpenClaw extension, and Codex bridge. The existing EVM
9
+ wallet address can now be selected with `set_evm_network=robinhood` or the
10
+ `robinhood` wallet alias.
11
+
12
+ - Added Robinhood support to native/ERC-20 balance reads, fee estimates,
13
+ transfers, receipts, portfolio token discovery through the gateway, and
14
+ mainnet confirmation safeguards.
15
+
16
+ - Added Uniswap Trading API CLASSIC quote and swap support on Robinhood,
17
+ including the Robinhood Universal Router allow-list and cross-network router
18
+ rejection coverage.
19
+
20
+ - Kept unsupported Robinhood protocol surfaces intentionally unavailable:
21
+ LI.FI routes, Velora, Aave, Morpho, and Lido remain limited to their
22
+ previously supported networks.
23
+
5
24
  ## v0.1.75 - 2026-07-11
6
25
 
7
26
  - Added a persistent, non-secret ownership registry for OpenClaw, Hermes,
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.75
1
+ 0.1.77
@@ -89,6 +89,7 @@ These instructions apply to the entire `agent-wallet/` tree.
89
89
  - installer scripts and README examples
90
90
  - When changing approval or signing behavior, update the runtime, adapter, CLI bridge, and smoke tests together.
91
91
  - If a change affects the OpenClaw bridge, update the TypeScript extension and the Python contract in the same change set.
92
+ - Preserve the direct-upgrade floor and legacy removal policy documented in `UPGRADE_COMPATIBILITY.md`.
92
93
 
93
94
  ### Coding style
94
95
  - Follow existing Python style and type-hint usage.
@@ -0,0 +1,36 @@
1
+ # Upgrade Compatibility
2
+
3
+ The wallet installer supports direct upgrades from older production releases.
4
+ Compatibility code is removed according to the minimum supported source
5
+ version, not according to elapsed time or a fixed number of releases.
6
+
7
+ ## Supported Floor
8
+
9
+ The current regression floor is `0.1.53`. CI must keep a direct upgrade fixture
10
+ at that floor until the project explicitly raises it in release documentation.
11
+
12
+ Raising the floor requires all of the following:
13
+
14
+ - a documented migration path for users below the new floor
15
+ - upgrade fixtures for the new floor and the latest stable release
16
+ - support and telemetry evidence that the retired path is no longer material
17
+ - a release note naming the removed compatibility behavior
18
+
19
+ ## Compatibility Paths
20
+
21
+ | Path | Purpose | Removal condition |
22
+ |---|---|---|
23
+ | JavaScript boot-key fallback | Updates runtimes that predate the verified Python installer resolver. | The supported floor includes `resolve_boot_key_for_installer`, and direct-upgrade fixtures no longer require the fallback. |
24
+ | Directory runtime-pointer migration | Converts pre-versioned `current/` directories into release entries. | The supported floor guarantees symlink-based runtime pointers. |
25
+ | Hermes legacy adoption | Recognizes an AgentLayer plugin installed before the ownership registry. | The supported floor guarantees an `integrations.json` Hermes ownership entry. |
26
+ | Codex legacy adoption | Recognizes a matching local marketplace registration and AgentLayer manifest. | The supported floor guarantees an `integrations.json` Codex ownership entry. |
27
+ | Claude Code legacy adoption | Recognizes the AgentLayer marketplace and plugin manifest before registry ownership. | The supported floor guarantees an `integrations.json` Claude Code ownership entry. |
28
+
29
+ ## Safety Rules
30
+
31
+ - Legacy adoption requires independent registration and manifest evidence.
32
+ - Unknown or externally managed integrations are never adopted automatically.
33
+ - Compatibility paths must not weaken boot-key, sealed-state, approval, or
34
+ signing validation.
35
+ - Every retained path needs a direct-upgrade smoke test or an explicit fixture
36
+ showing why it remains necessary.
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Keep in sync with package.json, pyproject.toml, and the npm installer version.
4
4
  # scripts/check_release_version.mjs enforces this on release.
5
- __version__ = "0.1.75"
5
+ __version__ = "0.1.77"
6
6
 
7
7
  __all__ = [
8
8
  "config",
@@ -23,7 +23,7 @@ BASE_SWAP_NETWORK = "base"
23
23
  BASE_SWAP_TOOLS = frozenset({"swap_evm_tokens", "swap_evm_uniswap_tokens"})
24
24
  BASE_SWAP_ISSUER = "autonomous-permission:base-swaps"
25
25
  DEFI_TOOLS_SCOPE = "defi_tools"
26
- DEFI_TOOLS_NETWORKS = frozenset({"base", "ethereum"})
26
+ DEFI_TOOLS_NETWORKS = frozenset({"base", "ethereum", "robinhood"})
27
27
  DEFI_TOOLS = frozenset(
28
28
  {
29
29
  "manage_evm_aave_position",
@@ -219,7 +219,7 @@ def authorize_defi_tool(*, tool_name: str, network: str, summary: dict[str, Any]
219
219
  if str(tool_name) not in DEFI_TOOLS:
220
220
  raise WalletBackendError("Autonomous DeFi permission only covers supported EVM DeFi tools.")
221
221
  if normalized_network not in DEFI_TOOLS_NETWORKS:
222
- raise WalletBackendError("Autonomous DeFi permission only applies on ethereum or base.")
222
+ raise WalletBackendError("Autonomous DeFi permission only applies on ethereum, base, or robinhood.")
223
223
  if not is_defi_tools_approved():
224
224
  raise WalletBackendError(
225
225
  "Autonomous execution is not enabled. Ask the user to run "
@@ -46,7 +46,7 @@ AUTONOMOUS_ISSUER = "autonomous-policy"
46
46
 
47
47
  #: Networks treated as "real money" and therefore gated behind
48
48
  #: ``allow_mainnet`` regardless of the per-tool allow-list.
49
- MAINNET_NETWORKS = frozenset({"mainnet", "mainnet-beta", "ethereum", "base", "arbitrum", "optimism", "polygon"})
49
+ MAINNET_NETWORKS = frozenset({"mainnet", "mainnet-beta", "ethereum", "base", "robinhood", "arbitrum", "optimism", "polygon"})
50
50
 
51
51
  TokenIssuer = Callable[..., str]
52
52
 
@@ -29,10 +29,19 @@ def export_boot_key() -> str:
29
29
 
30
30
 
31
31
  def import_boot_key(value: str) -> dict:
32
- """Write a recorded boot key into the OS keystore and verify the read-back."""
32
+ """Validate and write a recorded boot key, then verify the read-back."""
33
33
  key = str(value or "").strip()
34
34
  if not key:
35
35
  raise WalletBackendError("A non-empty boot key is required for import.")
36
+ from agent_wallet.sealed_keys import resolve_sealed_keys_path, unseal_keys
37
+
38
+ if resolve_sealed_keys_path().exists():
39
+ try:
40
+ unseal_keys(key)
41
+ except Exception as exc:
42
+ raise WalletBackendError(
43
+ "The supplied boot key does not unlock the existing sealed wallet state."
44
+ ) from exc
36
45
  store = resolve_keystore()
37
46
  store.set(BOOT_KEY_ITEM, key)
38
47
  if store.get(BOOT_KEY_ITEM) != key:
@@ -123,13 +123,13 @@ def normalize_evm_network(network: str | None) -> str:
123
123
  from agent_wallet.wallet_layer.base import WalletBackendError
124
124
 
125
125
  raise WalletBackendError(
126
- "EVM testnets are no longer supported by agent-wallet. Use ethereum or base."
126
+ "EVM testnets are no longer supported by agent-wallet. Use ethereum, base, or robinhood."
127
127
  )
128
- if normalized not in {"ethereum", "base"}:
128
+ if normalized not in {"ethereum", "base", "robinhood"}:
129
129
  from agent_wallet.wallet_layer.base import WalletBackendError
130
130
 
131
131
  raise WalletBackendError(
132
- f"Unsupported EVM network: {normalized}. Use ethereum or base."
132
+ f"Unsupported EVM network: {normalized}. Use ethereum, base, or robinhood."
133
133
  )
134
134
  return normalized
135
135