@agentlayer.tech/wallet 0.1.76 → 0.1.84
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.openclaw/extensions/agent-wallet/README.md +4 -4
- package/.openclaw/extensions/agent-wallet/dist/index.js +57 -19
- package/.openclaw/extensions/agent-wallet/index.ts +57 -19
- package/.openclaw/extensions/agent-wallet/openclaw.plugin.json +1 -1
- package/.openclaw/extensions/agent-wallet/package.json +1 -1
- package/CHANGELOG.md +19 -0
- package/VERSION +1 -1
- package/agent-wallet/agent_wallet/__init__.py +1 -1
- package/agent-wallet/agent_wallet/autonomous_permissions.py +2 -2
- package/agent-wallet/agent_wallet/autonomous_policy.py +1 -1
- package/agent-wallet/agent_wallet/config.py +3 -3
- package/agent-wallet/agent_wallet/openclaw_adapter.py +28 -26
- package/agent-wallet/agent_wallet/providers/evm_portfolio.py +2 -2
- package/agent-wallet/agent_wallet/wallet_layer/wdk_evm.py +25 -10
- package/agent-wallet/openclaw.plugin.json +1 -1
- package/agent-wallet/pyproject.toml +1 -1
- package/agent-wallet/skills/wallet-operator/SKILL.md +4 -1
- package/claude-code/plugins/agent-wallet/.claude-plugin/plugin.json +1 -1
- package/codex/plugins/agent-wallet/.codex-plugin/plugin.json +1 -1
- package/codex/plugins/agent-wallet/server.py +13 -10
- package/codex/plugins/agent-wallet/skills/wallet-operator/SKILL.md +1 -1
- package/hermes/plugins/agent_wallet/plugin.yaml +1 -1
- package/package.json +1 -1
- package/wdk-btc-wallet/package.json +1 -1
- package/wdk-evm-wallet/.env.example +6 -2
- package/wdk-evm-wallet/package.json +5 -2
- package/wdk-evm-wallet/src/config.js +48 -2
- package/wdk-evm-wallet/src/network_state.js +5 -2
- package/wdk-evm-wallet/src/wdk_evm_wallet.js +570 -63
|
@@ -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
|
|
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
|
|
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,
|
|
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
|
|
245
|
+
throw new Error("EVM testnets are no longer supported. Use ethereum, base, or robinhood.");
|
|
244
246
|
}
|
|
245
|
-
if (!
|
|
246
|
-
throw new Error("EVM network must be 'ethereum' or '
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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 execution preview for an ERC-20 or native ETH swap on ethereum, base, or robinhood. Supported paths are CLASSIC, UniswapX orders, and canonical ETH↔WETH wrap/unwrap. 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 a supported Uniswap path on ethereum, base, or robinhood: CLASSIC, UniswapX orders, or canonical ETH↔WETH wrap/unwrap. ERC-20 paths may use Permit2 EIP-712 or an UniswapX order signature. 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:
|
|
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:
|
|
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,
|
|
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
|
|
245
|
+
throw new Error("EVM testnets are no longer supported. Use ethereum, base, or robinhood.");
|
|
244
246
|
}
|
|
245
|
-
if (!
|
|
246
|
-
throw new Error("EVM network must be 'ethereum' or '
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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 execution preview for an ERC-20 or native ETH swap on ethereum, base, or robinhood. Supported paths are CLASSIC, UniswapX orders, and canonical ETH↔WETH wrap/unwrap. 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 a supported Uniswap path on ethereum, base, or robinhood: CLASSIC, UniswapX orders, or canonical ETH↔WETH wrap/unwrap. ERC-20 paths may use Permit2 EIP-712 or an UniswapX order signature. 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:
|
|
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:
|
|
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.
|
|
5
|
+
"version": "0.1.84",
|
|
6
6
|
"contracts": {
|
|
7
7
|
"tools": [
|
|
8
8
|
"agentlayer_autonomous_approve",
|
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.
|
|
1
|
+
0.1.84
|
|
@@ -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
|
|
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
|
|
|
@@ -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
|
|
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
|
|
132
|
+
f"Unsupported EVM network: {normalized}. Use ethereum, base, or robinhood."
|
|
133
133
|
)
|
|
134
134
|
return normalized
|
|
135
135
|
|