@agentlayer.tech/wallet 0.1.0
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/AGENTS.md +98 -0
- package/.openclaw/extensions/agent-wallet/README.md +127 -0
- package/.openclaw/extensions/agent-wallet/index.ts +1520 -0
- package/.openclaw/extensions/agent-wallet/openclaw.plugin.json +184 -0
- package/.openclaw/extensions/agent-wallet/package.json +11 -0
- package/.openclaw/extensions/agent-wallet/skills/wallet-operator/SKILL.md +20 -0
- package/CHANGELOG.md +42 -0
- package/LICENSE +104 -0
- package/README.md +332 -0
- package/RELEASING.md +204 -0
- package/agent-wallet/.env.example +62 -0
- package/agent-wallet/AGENTS.md +129 -0
- package/agent-wallet/README.md +527 -0
- package/agent-wallet/agent_wallet/__init__.py +11 -0
- package/agent-wallet/agent_wallet/approval.py +161 -0
- package/agent-wallet/agent_wallet/bootstrap.py +178 -0
- package/agent-wallet/agent_wallet/btc_user_wallets.py +217 -0
- package/agent-wallet/agent_wallet/config.py +382 -0
- package/agent-wallet/agent_wallet/encrypted_storage.py +161 -0
- package/agent-wallet/agent_wallet/evm_user_wallets.py +370 -0
- package/agent-wallet/agent_wallet/exceptions.py +9 -0
- package/agent-wallet/agent_wallet/file_ops.py +34 -0
- package/agent-wallet/agent_wallet/http_client.py +25 -0
- package/agent-wallet/agent_wallet/models.py +66 -0
- package/agent-wallet/agent_wallet/nonce_registry.py +59 -0
- package/agent-wallet/agent_wallet/openclaw_adapter.py +5128 -0
- package/agent-wallet/agent_wallet/openclaw_cli.py +626 -0
- package/agent-wallet/agent_wallet/openclaw_runtime.py +272 -0
- package/agent-wallet/agent_wallet/plugin_bundle.py +42 -0
- package/agent-wallet/agent_wallet/providers/__init__.py +1 -0
- package/agent-wallet/agent_wallet/providers/bags.py +259 -0
- package/agent-wallet/agent_wallet/providers/evm_portfolio.py +470 -0
- package/agent-wallet/agent_wallet/providers/jupiter.py +567 -0
- package/agent-wallet/agent_wallet/providers/kamino.py +215 -0
- package/agent-wallet/agent_wallet/providers/lifi.py +277 -0
- package/agent-wallet/agent_wallet/providers/solana_rpc.py +470 -0
- package/agent-wallet/agent_wallet/providers/wdk_btc_local.py +114 -0
- package/agent-wallet/agent_wallet/providers/wdk_evm_local.py +205 -0
- package/agent-wallet/agent_wallet/sealed_keys.py +61 -0
- package/agent-wallet/agent_wallet/solana_stake.py +103 -0
- package/agent-wallet/agent_wallet/solana_tx.py +93 -0
- package/agent-wallet/agent_wallet/spending_limits.py +101 -0
- package/agent-wallet/agent_wallet/transaction_policy.py +518 -0
- package/agent-wallet/agent_wallet/user_wallets.py +355 -0
- package/agent-wallet/agent_wallet/validation.py +31 -0
- package/agent-wallet/agent_wallet/wallet_layer/__init__.py +1 -0
- package/agent-wallet/agent_wallet/wallet_layer/base.py +808 -0
- package/agent-wallet/agent_wallet/wallet_layer/base58.py +44 -0
- package/agent-wallet/agent_wallet/wallet_layer/factory.py +102 -0
- package/agent-wallet/agent_wallet/wallet_layer/solana.py +4252 -0
- package/agent-wallet/agent_wallet/wallet_layer/wdk_btc.py +272 -0
- package/agent-wallet/agent_wallet/wallet_layer/wdk_evm.py +1628 -0
- package/agent-wallet/examples/bootstrap_wallet.py +21 -0
- package/agent-wallet/examples/openclaw_runtime_onboarding.py +28 -0
- package/agent-wallet/examples/openclaw_user_wallet_example.py +31 -0
- package/agent-wallet/examples/openclaw_wallet_adapter_example.py +33 -0
- package/agent-wallet/openclaw.plugin.json +138 -0
- package/agent-wallet/pyproject.toml +31 -0
- package/agent-wallet/scripts/bootstrap_openclaw_btc.py +278 -0
- package/agent-wallet/scripts/build_release_bundle.py +188 -0
- package/agent-wallet/scripts/finalize_openclaw_local_wallet_config.py +121 -0
- package/agent-wallet/scripts/install_agent_wallet.py +505 -0
- package/agent-wallet/scripts/install_openclaw_local_config.py +226 -0
- package/agent-wallet/scripts/install_openclaw_sealed_keys.py +105 -0
- package/agent-wallet/scripts/manage_openclaw_btc_wallet.py +244 -0
- package/agent-wallet/scripts/reveal_btc_seed.sh +130 -0
- package/agent-wallet/scripts/security_utils.py +37 -0
- package/agent-wallet/scripts/setup_btc_wallet.sh +146 -0
- package/agent-wallet/scripts/switch_openclaw_wallet_network.py +106 -0
- package/agent-wallet/skills/wallet-operator/SKILL.md +128 -0
- package/bin/openclaw-agent-wallet.mjs +487 -0
- package/install-from-github.sh +134 -0
- package/package.json +61 -0
- package/setup.sh +40 -0
- package/wdk-btc-wallet/README.md +325 -0
- package/wdk-btc-wallet/bootstrap.sh +22 -0
- package/wdk-btc-wallet/package-lock.json +1839 -0
- package/wdk-btc-wallet/package.json +18 -0
- package/wdk-btc-wallet/run-local.sh +21 -0
- package/wdk-btc-wallet/src/config.js +160 -0
- package/wdk-btc-wallet/src/json.js +35 -0
- package/wdk-btc-wallet/src/local_vault.js +432 -0
- package/wdk-btc-wallet/src/network_state.js +84 -0
- package/wdk-btc-wallet/src/server.js +257 -0
- package/wdk-btc-wallet/src/wdk_btc_wallet.js +332 -0
- package/wdk-evm-wallet/README.md +183 -0
- package/wdk-evm-wallet/bootstrap.sh +8 -0
- package/wdk-evm-wallet/package-lock.json +2340 -0
- package/wdk-evm-wallet/package.json +23 -0
- package/wdk-evm-wallet/run-local.sh +12 -0
- package/wdk-evm-wallet/src/config.js +274 -0
- package/wdk-evm-wallet/src/json.js +35 -0
- package/wdk-evm-wallet/src/local_vault.js +430 -0
- package/wdk-evm-wallet/src/network_state.js +92 -0
- package/wdk-evm-wallet/src/server.js +575 -0
- package/wdk-evm-wallet/src/wdk_evm_wallet.js +4981 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Minimal base58 helpers to avoid extra runtime dependencies."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
|
|
6
|
+
_ALPHABET_INDEX = {char: index for index, char in enumerate(_ALPHABET)}
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def b58encode(raw: bytes) -> str:
|
|
10
|
+
"""Encode bytes into a base58 string."""
|
|
11
|
+
if not raw:
|
|
12
|
+
return ""
|
|
13
|
+
|
|
14
|
+
zeros = 0
|
|
15
|
+
for byte in raw:
|
|
16
|
+
if byte == 0:
|
|
17
|
+
zeros += 1
|
|
18
|
+
else:
|
|
19
|
+
break
|
|
20
|
+
|
|
21
|
+
value = int.from_bytes(raw, "big")
|
|
22
|
+
encoded = []
|
|
23
|
+
while value > 0:
|
|
24
|
+
value, remainder = divmod(value, 58)
|
|
25
|
+
encoded.append(_ALPHABET[remainder])
|
|
26
|
+
|
|
27
|
+
return ("1" * zeros) + "".join(reversed(encoded or ["1"]))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def b58decode(value: str) -> bytes:
|
|
31
|
+
"""Decode a base58 string into bytes."""
|
|
32
|
+
cleaned = value.strip()
|
|
33
|
+
if not cleaned:
|
|
34
|
+
return b""
|
|
35
|
+
|
|
36
|
+
number = 0
|
|
37
|
+
for char in cleaned:
|
|
38
|
+
if char not in _ALPHABET_INDEX:
|
|
39
|
+
raise ValueError(f"Invalid base58 character: {char!r}")
|
|
40
|
+
number = (number * 58) + _ALPHABET_INDEX[char]
|
|
41
|
+
|
|
42
|
+
decoded = number.to_bytes((number.bit_length() + 7) // 8, "big") if number else b""
|
|
43
|
+
leading_zeros = len(cleaned) - len(cleaned.lstrip("1"))
|
|
44
|
+
return (b"\x00" * leading_zeros) + decoded
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"""Factory helpers for agent wallet backends."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
from agent_wallet.bootstrap import ensure_solana_wallet_ready, ensure_wallet_pin
|
|
8
|
+
from agent_wallet.encrypted_storage import load_wallet_secret_material
|
|
9
|
+
from agent_wallet.config import (
|
|
10
|
+
resolve_runtime_solana_rpc_config,
|
|
11
|
+
resolve_runtime_solana_swap_config,
|
|
12
|
+
resolve_solana_private_key,
|
|
13
|
+
settings,
|
|
14
|
+
)
|
|
15
|
+
from agent_wallet.wallet_layer.base import AgentWalletBackend, WalletBackendError
|
|
16
|
+
from agent_wallet.wallet_layer.wdk_evm import WdkEvmLocalWalletBackend
|
|
17
|
+
from agent_wallet.wallet_layer.solana import SolanaLocalKeypairSigner, SolanaWalletBackend
|
|
18
|
+
from agent_wallet.wallet_layer.wdk_btc import WdkBtcLocalWalletBackend
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _load_keypair_material() -> str | None:
|
|
22
|
+
secret = resolve_solana_private_key()
|
|
23
|
+
if secret:
|
|
24
|
+
return secret
|
|
25
|
+
|
|
26
|
+
ensured = ensure_solana_wallet_ready()
|
|
27
|
+
keypair_path = settings.solana_agent_keypair_path.strip() or (ensured["path"] if ensured else "")
|
|
28
|
+
if not keypair_path:
|
|
29
|
+
return None
|
|
30
|
+
|
|
31
|
+
path = Path(keypair_path).expanduser()
|
|
32
|
+
if not path.exists():
|
|
33
|
+
raise WalletBackendError(
|
|
34
|
+
f"Configured Solana keypair path does not exist: {path}"
|
|
35
|
+
)
|
|
36
|
+
secret_material, _ = load_wallet_secret_material(path)
|
|
37
|
+
return secret_material.strip()
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def create_wallet_backend() -> AgentWalletBackend | None:
|
|
41
|
+
"""Build the configured wallet backend instance."""
|
|
42
|
+
backend = settings.agent_wallet_backend.strip().lower()
|
|
43
|
+
if not backend or backend == "none":
|
|
44
|
+
return None
|
|
45
|
+
|
|
46
|
+
if backend in {"solana", "solana_local", "solana-local"}:
|
|
47
|
+
secret_material = _load_keypair_material()
|
|
48
|
+
signer = (
|
|
49
|
+
SolanaLocalKeypairSigner.from_secret_material(secret_material)
|
|
50
|
+
if secret_material
|
|
51
|
+
else None
|
|
52
|
+
)
|
|
53
|
+
keypair_path = settings.solana_agent_keypair_path.strip()
|
|
54
|
+
if signer and keypair_path:
|
|
55
|
+
ensure_wallet_pin(
|
|
56
|
+
Path(keypair_path).expanduser(),
|
|
57
|
+
address=signer.address,
|
|
58
|
+
network=settings.solana_network,
|
|
59
|
+
)
|
|
60
|
+
configured_address = settings.solana_agent_public_key.strip() or None
|
|
61
|
+
rpc_config = resolve_runtime_solana_rpc_config(
|
|
62
|
+
settings.solana_network,
|
|
63
|
+
settings.solana_rpc_url,
|
|
64
|
+
settings.solana_rpc_urls,
|
|
65
|
+
)
|
|
66
|
+
swap_config = resolve_runtime_solana_swap_config(settings.solana_network)
|
|
67
|
+
return SolanaWalletBackend(
|
|
68
|
+
rpc_url=rpc_config["rpc_urls"],
|
|
69
|
+
commitment=settings.solana_commitment,
|
|
70
|
+
network=settings.solana_network,
|
|
71
|
+
signer=signer,
|
|
72
|
+
address=configured_address,
|
|
73
|
+
sign_only=settings.agent_wallet_sign_only,
|
|
74
|
+
rpc_provider_mode=str(rpc_config["mode"]),
|
|
75
|
+
rpc_provider=str(rpc_config["provider"]),
|
|
76
|
+
rpc_transport=str(rpc_config["transport"]),
|
|
77
|
+
swap_provider=str(swap_config["provider"]),
|
|
78
|
+
swap_transport=str(swap_config["transport"]),
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
if backend in {"wdk_btc_local", "wdk-btc-local", "btc_local", "btc-local"}:
|
|
82
|
+
return WdkBtcLocalWalletBackend(
|
|
83
|
+
service_url=settings.wdk_btc_service_url,
|
|
84
|
+
wallet_id=settings.wdk_btc_wallet_id,
|
|
85
|
+
network=settings.solana_network,
|
|
86
|
+
account_index=settings.wdk_btc_account_index,
|
|
87
|
+
sign_only=settings.agent_wallet_sign_only,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
if backend in {"wdk_evm_local", "wdk-evm-local", "evm_local", "evm-local"}:
|
|
91
|
+
return WdkEvmLocalWalletBackend(
|
|
92
|
+
service_url=settings.wdk_evm_service_url,
|
|
93
|
+
wallet_id=settings.wdk_evm_wallet_id,
|
|
94
|
+
network=settings.solana_network,
|
|
95
|
+
account_index=settings.wdk_evm_account_index,
|
|
96
|
+
sign_only=settings.agent_wallet_sign_only,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
raise WalletBackendError(
|
|
100
|
+
f"Unsupported agent wallet backend: {backend}. "
|
|
101
|
+
"Supported values: none, solana_local, wdk_btc_local, wdk_evm_local."
|
|
102
|
+
)
|