@agentlayer.tech/wallet 0.1.28 → 0.1.32
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 +5 -7
- package/.openclaw/extensions/agent-wallet/dist/index.js +35 -360
- package/.openclaw/extensions/agent-wallet/index.ts +35 -360
- package/.openclaw/extensions/agent-wallet/openclaw.plugin.json +2 -45
- package/.openclaw/extensions/agent-wallet/package.json +1 -1
- package/.openclaw/extensions/agent-wallet/skills/wallet-operator/SKILL.md +1 -3
- package/CHANGELOG.md +73 -0
- package/README.md +4 -0
- package/agent-wallet/.env.example +0 -12
- package/agent-wallet/README.md +18 -57
- package/agent-wallet/agent_wallet/bootstrap.py +28 -12
- package/agent-wallet/agent_wallet/btc_user_wallets.py +33 -7
- package/agent-wallet/agent_wallet/config.py +110 -29
- package/agent-wallet/agent_wallet/evm_user_wallets.py +4 -14
- package/agent-wallet/agent_wallet/openclaw_adapter.py +29 -687
- package/agent-wallet/agent_wallet/openclaw_cli.py +0 -7
- package/agent-wallet/agent_wallet/openclaw_runtime.py +3 -12
- package/agent-wallet/agent_wallet/providers/evm_portfolio.py +18 -42
- package/agent-wallet/agent_wallet/providers/jupiter.py +1 -307
- package/agent-wallet/agent_wallet/providers/kamino.py +21 -4
- package/agent-wallet/agent_wallet/providers/solana_rpc.py +0 -23
- package/agent-wallet/agent_wallet/providers/wdk_btc_local.py +31 -3
- package/agent-wallet/agent_wallet/providers/wdk_evm_local.py +37 -3
- package/agent-wallet/agent_wallet/providers/x402.py +4 -9
- package/agent-wallet/agent_wallet/transaction_policy.py +0 -262
- package/agent-wallet/agent_wallet/user_wallets.py +4 -3
- package/agent-wallet/agent_wallet/wallet_layer/base.py +3 -103
- package/agent-wallet/agent_wallet/wallet_layer/factory.py +8 -5
- package/agent-wallet/agent_wallet/wallet_layer/solana.py +453 -1177
- package/agent-wallet/agent_wallet/wallet_layer/wdk_btc.py +2 -8
- package/agent-wallet/agent_wallet/wallet_layer/wdk_evm.py +2 -12
- package/agent-wallet/examples/openclaw_runtime_onboarding.py +1 -1
- package/agent-wallet/examples/openclaw_user_wallet_example.py +1 -1
- package/agent-wallet/openclaw.plugin.json +1 -5
- package/agent-wallet/pyproject.toml +2 -1
- package/agent-wallet/scripts/bootstrap_openclaw_btc.py +3 -5
- package/agent-wallet/scripts/bootstrap_openclaw_evm.py +2 -12
- package/agent-wallet/scripts/build_release_bundle.py +1 -0
- package/agent-wallet/scripts/flash-sdk-bridge/bridge.mjs +1 -4
- package/agent-wallet/scripts/install_agent_wallet.py +114 -6
- package/agent-wallet/scripts/install_openclaw_local_config.py +10 -10
- package/agent-wallet/scripts/manage_openclaw_btc_wallet.py +2 -4
- package/agent-wallet/scripts/manage_openclaw_evm_wallet.py +2 -15
- package/agent-wallet/scripts/reveal_btc_seed.sh +7 -16
- package/agent-wallet/scripts/setup_btc_wallet.sh +7 -16
- package/agent-wallet/scripts/setup_evm_wallet.sh +1 -11
- package/agent-wallet/scripts/switch_openclaw_wallet_network.py +4 -1
- package/agent-wallet/skills/wallet-operator/SKILL.md +1 -6
- package/bin/openclaw-agent-wallet.mjs +356 -0
- package/claude-code/plugins/agent-wallet/.claude-plugin/plugin.json +20 -0
- package/claude-code/plugins/agent-wallet/.mcp.json +14 -0
- package/claude-code/plugins/agent-wallet/README.md +65 -0
- package/claude-code/plugins/agent-wallet/scripts/run_mcp.sh +39 -0
- package/claude-code/plugins/agent-wallet/skills/wallet-operator/SKILL.md +18 -0
- package/codex/plugins/agent-wallet/.codex-plugin/plugin.json +38 -0
- package/codex/plugins/agent-wallet/.mcp.json +15 -0
- package/codex/plugins/agent-wallet/README.md +39 -0
- package/codex/plugins/agent-wallet/scripts/run_mcp.sh +21 -0
- package/codex/plugins/agent-wallet/server.py +961 -0
- package/codex/plugins/agent-wallet/skills/wallet-operator/SKILL.md +18 -0
- package/hermes/plugins/agent_wallet/schemas.py +2 -2
- package/hermes/plugins/agent_wallet/tools.py +18 -4
- package/package.json +6 -1
- package/setup.sh +2 -0
- package/wdk-btc-wallet/src/local_vault.js +45 -68
- package/wdk-btc-wallet/src/server.js +1 -0
- package/wdk-evm-wallet/README.md +4 -3
- package/wdk-evm-wallet/src/config.js +15 -0
- package/wdk-evm-wallet/src/local_vault.js +45 -68
- package/wdk-evm-wallet/src/server.js +1 -0
- package/agent-wallet/agent_wallet/providers/houdini.py +0 -539
|
@@ -9,7 +9,7 @@ import logging
|
|
|
9
9
|
from typing import Any
|
|
10
10
|
from urllib.parse import parse_qsl, urlencode, urlsplit, urlunsplit
|
|
11
11
|
|
|
12
|
-
from agent_wallet.config import resolve_solana_rpc_url
|
|
12
|
+
from agent_wallet.config import normalize_solana_network, resolve_solana_rpc_url
|
|
13
13
|
from agent_wallet.exceptions import ProviderError
|
|
14
14
|
from agent_wallet.http_client import get_client
|
|
15
15
|
from agent_wallet.wallet_layer.base import AgentWalletBackend
|
|
@@ -19,13 +19,10 @@ AGENTIC_MARKET_API_BASE_URL = "https://api.agentic.market/v1"
|
|
|
19
19
|
X402_EXECUTE_TIMEOUT_SECONDS = 45.0
|
|
20
20
|
SOLANA_CAIP_BY_NETWORK = {
|
|
21
21
|
"mainnet": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
|
|
22
|
-
"devnet": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
|
|
23
22
|
}
|
|
24
23
|
EVM_CAIP_BY_NETWORK = {
|
|
25
24
|
"ethereum": "eip155:1",
|
|
26
25
|
"base": "eip155:8453",
|
|
27
|
-
"sepolia": "eip155:11155111",
|
|
28
|
-
"base-sepolia": "eip155:84532",
|
|
29
26
|
}
|
|
30
27
|
_USDC_IDENTIFIERS = {
|
|
31
28
|
"usdc",
|
|
@@ -63,7 +60,7 @@ def _backend_solana_sdk_rpc_url(backend: AgentWalletBackend) -> str | None:
|
|
|
63
60
|
if primary.startswith(("http://", "https://")):
|
|
64
61
|
return primary
|
|
65
62
|
network = _backend_network(backend)
|
|
66
|
-
fallback = resolve_solana_rpc_url(network or "mainnet", "")
|
|
63
|
+
fallback = resolve_solana_rpc_url(normalize_solana_network(network or "mainnet"), "")
|
|
67
64
|
return _trim(fallback) or None
|
|
68
65
|
|
|
69
66
|
|
|
@@ -361,7 +358,7 @@ def _wallet_caip_networks(backend: AgentWalletBackend) -> list[str]:
|
|
|
361
358
|
def _solana_exact_execution_supported(backend: AgentWalletBackend) -> bool:
|
|
362
359
|
return (
|
|
363
360
|
_backend_chain(backend) == "solana"
|
|
364
|
-
and _backend_network(backend)
|
|
361
|
+
and _backend_network(backend) == "mainnet"
|
|
365
362
|
and getattr(backend, "signer", None) is not None
|
|
366
363
|
)
|
|
367
364
|
|
|
@@ -369,7 +366,7 @@ def _solana_exact_execution_supported(backend: AgentWalletBackend) -> bool:
|
|
|
369
366
|
def _evm_exact_execution_supported(backend: AgentWalletBackend) -> bool:
|
|
370
367
|
return (
|
|
371
368
|
_backend_chain(backend) == "evm"
|
|
372
|
-
and _backend_network(backend)
|
|
369
|
+
and _backend_network(backend) == "base"
|
|
373
370
|
and callable(getattr(backend, "sign_x402_evm_exact_typed_data", None))
|
|
374
371
|
)
|
|
375
372
|
|
|
@@ -388,9 +385,7 @@ def _wallet_x402_support_summary(backend: AgentWalletBackend) -> dict[str, Any]:
|
|
|
388
385
|
supported_networks = _wallet_caip_networks(backend)
|
|
389
386
|
planned_execution_networks = {
|
|
390
387
|
"eip155:8453",
|
|
391
|
-
"eip155:84532",
|
|
392
388
|
"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
|
|
393
|
-
"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
|
|
394
389
|
}
|
|
395
390
|
execution_modes: list[str] = []
|
|
396
391
|
if _solana_exact_execution_supported(backend):
|
|
@@ -406,230 +406,6 @@ def verify_provider_swap_simulation_result(
|
|
|
406
406
|
}
|
|
407
407
|
|
|
408
408
|
|
|
409
|
-
def verify_provider_houdini_transaction(
|
|
410
|
-
message: Any,
|
|
411
|
-
*,
|
|
412
|
-
wallet_address: str,
|
|
413
|
-
deposit_address: str,
|
|
414
|
-
amount_raw: int,
|
|
415
|
-
is_native_input: bool,
|
|
416
|
-
token_mint: str | None = None,
|
|
417
|
-
loaded_addresses: list[str] | None = None,
|
|
418
|
-
) -> dict[str, Any]:
|
|
419
|
-
binding = _assert_basic_wallet_binding(
|
|
420
|
-
message,
|
|
421
|
-
wallet_address=wallet_address,
|
|
422
|
-
loaded_addresses=loaded_addresses,
|
|
423
|
-
)
|
|
424
|
-
keys = binding["account_keys"]
|
|
425
|
-
program_ids = _program_ids(message, loaded_addresses)
|
|
426
|
-
unknown_program_ids = _assert_program_allowlist(
|
|
427
|
-
program_ids,
|
|
428
|
-
allowed_programs=CORE_PROGRAM_IDS,
|
|
429
|
-
label="Houdini private swap funding",
|
|
430
|
-
reject_unknown=False,
|
|
431
|
-
)
|
|
432
|
-
|
|
433
|
-
matched_native_lamports = 0
|
|
434
|
-
matched_token_amount = 0
|
|
435
|
-
parsed_transfers: list[dict[str, Any]] = []
|
|
436
|
-
|
|
437
|
-
for instruction in _compiled_instructions(message):
|
|
438
|
-
instruction_accounts = _instruction_account_keys(
|
|
439
|
-
message,
|
|
440
|
-
instruction,
|
|
441
|
-
loaded_addresses=loaded_addresses,
|
|
442
|
-
)
|
|
443
|
-
data = _instruction_data_bytes(instruction)
|
|
444
|
-
program_id_index = int(getattr(instruction, "program_id_index", -1))
|
|
445
|
-
if program_id_index < 0 or program_id_index >= len(keys):
|
|
446
|
-
raise WalletBackendError("Provider transaction contains an invalid program id index.")
|
|
447
|
-
program_id = _account_keys(message, loaded_addresses)[program_id_index]
|
|
448
|
-
|
|
449
|
-
if (
|
|
450
|
-
is_native_input
|
|
451
|
-
and program_id == SYSTEM_PROGRAM_ID
|
|
452
|
-
and len(data) >= 12
|
|
453
|
-
and len(instruction_accounts) >= 2
|
|
454
|
-
):
|
|
455
|
-
instruction_type = struct.unpack_from("<I", data, 0)[0]
|
|
456
|
-
if instruction_type == 2:
|
|
457
|
-
lamports = struct.unpack_from("<Q", data, 4)[0]
|
|
458
|
-
recipient = instruction_accounts[1]
|
|
459
|
-
parsed_transfers.append(
|
|
460
|
-
{
|
|
461
|
-
"program_id": program_id,
|
|
462
|
-
"recipient": recipient,
|
|
463
|
-
"amount_raw": str(lamports),
|
|
464
|
-
"kind": "system-transfer",
|
|
465
|
-
}
|
|
466
|
-
)
|
|
467
|
-
if recipient == deposit_address:
|
|
468
|
-
matched_native_lamports += lamports
|
|
469
|
-
continue
|
|
470
|
-
|
|
471
|
-
if program_id not in {TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID} or len(instruction_accounts) < 2:
|
|
472
|
-
continue
|
|
473
|
-
|
|
474
|
-
if not data:
|
|
475
|
-
continue
|
|
476
|
-
instruction_tag = data[0]
|
|
477
|
-
if instruction_tag == 3 and len(data) >= 9 and len(instruction_accounts) >= 2:
|
|
478
|
-
token_amount = struct.unpack_from("<Q", data, 1)[0]
|
|
479
|
-
recipient = instruction_accounts[1]
|
|
480
|
-
parsed_transfers.append(
|
|
481
|
-
{
|
|
482
|
-
"program_id": program_id,
|
|
483
|
-
"recipient": recipient,
|
|
484
|
-
"amount_raw": str(token_amount),
|
|
485
|
-
"kind": "spl-transfer",
|
|
486
|
-
"mint": None,
|
|
487
|
-
}
|
|
488
|
-
)
|
|
489
|
-
if not is_native_input and recipient == deposit_address:
|
|
490
|
-
matched_token_amount += token_amount
|
|
491
|
-
continue
|
|
492
|
-
|
|
493
|
-
if instruction_tag == 12 and len(data) >= 10 and len(instruction_accounts) >= 3:
|
|
494
|
-
token_amount = struct.unpack_from("<Q", data, 1)[0]
|
|
495
|
-
mint = instruction_accounts[1]
|
|
496
|
-
recipient = instruction_accounts[2]
|
|
497
|
-
parsed_transfers.append(
|
|
498
|
-
{
|
|
499
|
-
"program_id": program_id,
|
|
500
|
-
"recipient": recipient,
|
|
501
|
-
"amount_raw": str(token_amount),
|
|
502
|
-
"kind": "spl-transfer-checked",
|
|
503
|
-
"mint": mint,
|
|
504
|
-
}
|
|
505
|
-
)
|
|
506
|
-
if (
|
|
507
|
-
not is_native_input
|
|
508
|
-
and recipient == deposit_address
|
|
509
|
-
and (token_mint is None or mint == token_mint)
|
|
510
|
-
):
|
|
511
|
-
matched_token_amount += token_amount
|
|
512
|
-
|
|
513
|
-
if is_native_input:
|
|
514
|
-
if matched_native_lamports != amount_raw:
|
|
515
|
-
raise WalletBackendError(
|
|
516
|
-
"Houdini funding transaction does not transfer the approved native SOL amount to the expected deposit address."
|
|
517
|
-
)
|
|
518
|
-
else:
|
|
519
|
-
if matched_token_amount != amount_raw:
|
|
520
|
-
raise WalletBackendError(
|
|
521
|
-
"Houdini funding transaction does not transfer the approved SPL token amount to the expected deposit address."
|
|
522
|
-
)
|
|
523
|
-
|
|
524
|
-
return {
|
|
525
|
-
"wallet_address": wallet_address,
|
|
526
|
-
"fee_payer": binding["fee_payer"],
|
|
527
|
-
"required_signer_keys": binding["required_signer_keys"],
|
|
528
|
-
"required_signature_count": binding["required_signature_count"],
|
|
529
|
-
"wallet_signer_index": binding["wallet_signer_index"],
|
|
530
|
-
"sponsored_fee_payer": binding["sponsored_fee_payer"],
|
|
531
|
-
"program_ids": program_ids,
|
|
532
|
-
"unknown_program_ids": unknown_program_ids,
|
|
533
|
-
"non_core_program_ids": [pid for pid in program_ids if pid not in CORE_PROGRAM_IDS],
|
|
534
|
-
"account_key_count": len(keys),
|
|
535
|
-
"instruction_count": len(_compiled_instructions(message)),
|
|
536
|
-
"deposit_address": deposit_address,
|
|
537
|
-
"amount_raw": str(amount_raw),
|
|
538
|
-
"is_native_input": is_native_input,
|
|
539
|
-
"token_mint": token_mint,
|
|
540
|
-
"parsed_transfers": parsed_transfers,
|
|
541
|
-
"verified": True,
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
def verify_provider_houdini_simulation_result(
|
|
546
|
-
simulation_value: dict[str, Any],
|
|
547
|
-
*,
|
|
548
|
-
wallet_address: str,
|
|
549
|
-
wallet_account_index: int | None,
|
|
550
|
-
is_native_input: bool,
|
|
551
|
-
token_mint: str | None,
|
|
552
|
-
amount_raw: int,
|
|
553
|
-
native_sol_extra_spend_allowance_lamports: int = (
|
|
554
|
-
DEFAULT_NATIVE_SOL_EXTRA_SPEND_ALLOWANCE_LAMPORTS
|
|
555
|
-
),
|
|
556
|
-
) -> dict[str, Any]:
|
|
557
|
-
if not isinstance(simulation_value, dict):
|
|
558
|
-
raise WalletBackendError(
|
|
559
|
-
"Houdini funding transaction simulation returned an unexpected payload.",
|
|
560
|
-
code="transaction_simulation_invalid",
|
|
561
|
-
)
|
|
562
|
-
|
|
563
|
-
if simulation_value.get("err") is not None:
|
|
564
|
-
raise WalletBackendError(
|
|
565
|
-
"Houdini funding transaction simulation failed.",
|
|
566
|
-
code="transaction_simulation_failed",
|
|
567
|
-
details={"simulation": simulation_value},
|
|
568
|
-
)
|
|
569
|
-
|
|
570
|
-
token_deltas = _wallet_token_deltas_by_mint(
|
|
571
|
-
simulation_value,
|
|
572
|
-
wallet_address=wallet_address,
|
|
573
|
-
)
|
|
574
|
-
native_delta = _native_lamport_delta(
|
|
575
|
-
simulation_value,
|
|
576
|
-
wallet_account_index=wallet_account_index,
|
|
577
|
-
)
|
|
578
|
-
warnings: list[str] = []
|
|
579
|
-
enforced_checks: list[str] = ["simulation_err_is_none"]
|
|
580
|
-
|
|
581
|
-
if is_native_input:
|
|
582
|
-
if native_delta is None:
|
|
583
|
-
warnings.append("native_input_delta_unavailable")
|
|
584
|
-
else:
|
|
585
|
-
max_spend = max(amount_raw, 0) + max(native_sol_extra_spend_allowance_lamports, 0)
|
|
586
|
-
if -native_delta > max_spend:
|
|
587
|
-
raise WalletBackendError(
|
|
588
|
-
"Houdini funding transaction simulation spends more native SOL than approved.",
|
|
589
|
-
code="houdini_simulation_overspend",
|
|
590
|
-
details={
|
|
591
|
-
"approved_input_amount_raw": str(amount_raw),
|
|
592
|
-
"native_delta_lamports": str(native_delta),
|
|
593
|
-
"allowed_extra_lamports": str(
|
|
594
|
-
native_sol_extra_spend_allowance_lamports
|
|
595
|
-
),
|
|
596
|
-
},
|
|
597
|
-
)
|
|
598
|
-
enforced_checks.append("native_input_spend_within_approved_amount")
|
|
599
|
-
else:
|
|
600
|
-
if not token_mint:
|
|
601
|
-
raise WalletBackendError("token_mint is required for SPL Houdini simulation checks.")
|
|
602
|
-
input_delta = token_deltas.get(token_mint)
|
|
603
|
-
if input_delta is None:
|
|
604
|
-
warnings.append("token_input_delta_unavailable")
|
|
605
|
-
elif -input_delta > amount_raw:
|
|
606
|
-
raise WalletBackendError(
|
|
607
|
-
"Houdini funding transaction simulation spends more SPL token than approved.",
|
|
608
|
-
code="houdini_simulation_overspend",
|
|
609
|
-
details={
|
|
610
|
-
"token_mint": token_mint,
|
|
611
|
-
"approved_input_amount_raw": str(amount_raw),
|
|
612
|
-
"input_delta_raw": str(input_delta),
|
|
613
|
-
},
|
|
614
|
-
)
|
|
615
|
-
else:
|
|
616
|
-
enforced_checks.append("token_input_spend_within_approved_amount")
|
|
617
|
-
|
|
618
|
-
return {
|
|
619
|
-
"verified": True,
|
|
620
|
-
"simulation_err": None,
|
|
621
|
-
"wallet_address": wallet_address,
|
|
622
|
-
"wallet_account_index": wallet_account_index,
|
|
623
|
-
"token_mint": token_mint,
|
|
624
|
-
"amount_raw": str(amount_raw),
|
|
625
|
-
"is_native_input": is_native_input,
|
|
626
|
-
"token_deltas": {mint: str(delta) for mint, delta in sorted(token_deltas.items())},
|
|
627
|
-
"native_delta_lamports": str(native_delta) if native_delta is not None else None,
|
|
628
|
-
"enforced_checks": enforced_checks,
|
|
629
|
-
"warnings": warnings,
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
|
|
633
409
|
def verify_provider_bags_transaction(
|
|
634
410
|
message: Any,
|
|
635
411
|
*,
|
|
@@ -673,44 +449,6 @@ def verify_provider_bags_transaction(
|
|
|
673
449
|
}
|
|
674
450
|
|
|
675
451
|
|
|
676
|
-
def verify_provider_lend_transaction(
|
|
677
|
-
message: Any,
|
|
678
|
-
*,
|
|
679
|
-
wallet_address: str,
|
|
680
|
-
asset_mint: str,
|
|
681
|
-
action: str,
|
|
682
|
-
) -> dict[str, Any]:
|
|
683
|
-
binding = _assert_basic_wallet_binding(message, wallet_address=wallet_address)
|
|
684
|
-
keys = binding["account_keys"]
|
|
685
|
-
if asset_mint not in keys:
|
|
686
|
-
raise WalletBackendError(
|
|
687
|
-
f"{action} transaction does not reference the expected asset mint."
|
|
688
|
-
)
|
|
689
|
-
program_ids = _program_ids(message)
|
|
690
|
-
unknown_program_ids = _assert_program_allowlist(
|
|
691
|
-
program_ids,
|
|
692
|
-
allowed_programs=CORE_PROGRAM_IDS,
|
|
693
|
-
label=action,
|
|
694
|
-
reject_unknown=False,
|
|
695
|
-
)
|
|
696
|
-
return {
|
|
697
|
-
"wallet_address": wallet_address,
|
|
698
|
-
"fee_payer": binding["fee_payer"],
|
|
699
|
-
"required_signer_keys": binding["required_signer_keys"],
|
|
700
|
-
"required_signature_count": binding["required_signature_count"],
|
|
701
|
-
"wallet_signer_index": binding["wallet_signer_index"],
|
|
702
|
-
"sponsored_fee_payer": binding["sponsored_fee_payer"],
|
|
703
|
-
"program_ids": program_ids,
|
|
704
|
-
"unknown_program_ids": unknown_program_ids,
|
|
705
|
-
"non_core_program_ids": [pid for pid in program_ids if pid not in CORE_PROGRAM_IDS],
|
|
706
|
-
"account_key_count": len(keys),
|
|
707
|
-
"instruction_count": len(_compiled_instructions(message)),
|
|
708
|
-
"asset_mint": asset_mint,
|
|
709
|
-
"action": action,
|
|
710
|
-
"verified": True,
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
|
|
714
452
|
def verify_provider_kamino_lend_transaction(
|
|
715
453
|
message: Any,
|
|
716
454
|
*,
|
|
@@ -14,6 +14,7 @@ from agent_wallet.bootstrap import (
|
|
|
14
14
|
)
|
|
15
15
|
from agent_wallet.config import (
|
|
16
16
|
allow_plaintext_user_wallet_migration,
|
|
17
|
+
normalize_solana_network,
|
|
17
18
|
resolve_openclaw_home,
|
|
18
19
|
resolve_runtime_solana_rpc_config,
|
|
19
20
|
resolve_runtime_solana_swap_config,
|
|
@@ -46,13 +47,13 @@ def normalize_user_id(user_id: str) -> str:
|
|
|
46
47
|
|
|
47
48
|
def resolve_user_wallet_path(user_id: str, network: str | None = None) -> Path:
|
|
48
49
|
"""Resolve the wallet file path for a given OpenClaw user."""
|
|
49
|
-
effective_network = (network or settings.solana_network)
|
|
50
|
+
effective_network = normalize_solana_network(network or settings.solana_network)
|
|
50
51
|
user_dir = resolve_openclaw_home() / "users" / normalize_user_id(user_id) / "wallets"
|
|
51
52
|
return user_dir / f"solana-{effective_network}-agent.json"
|
|
52
53
|
|
|
53
54
|
|
|
54
55
|
def _user_wallet_metadata(user_id: str, address: str, network: str | None = None) -> dict[str, str]:
|
|
55
|
-
effective_network = (network or settings.solana_network)
|
|
56
|
+
effective_network = normalize_solana_network(network or settings.solana_network)
|
|
56
57
|
return {
|
|
57
58
|
"address": address,
|
|
58
59
|
"user_id": user_id,
|
|
@@ -61,7 +62,7 @@ def _user_wallet_metadata(user_id: str, address: str, network: str | None = None
|
|
|
61
62
|
|
|
62
63
|
|
|
63
64
|
def _resolve_effective_network(network: str | None = None) -> str:
|
|
64
|
-
return (network or settings.solana_network)
|
|
65
|
+
return normalize_solana_network(network or settings.solana_network)
|
|
65
66
|
|
|
66
67
|
|
|
67
68
|
def _resolve_user_wallet_master_key(
|
|
@@ -328,46 +328,6 @@ class AgentWalletBackend(ABC):
|
|
|
328
328
|
) -> dict[str, Any]:
|
|
329
329
|
raise WalletBackendError(f"{self.name} does not support Solana-origin LI.FI swap previews.")
|
|
330
330
|
|
|
331
|
-
async def preview_solana_private_swap(
|
|
332
|
-
self,
|
|
333
|
-
*,
|
|
334
|
-
input_token: str,
|
|
335
|
-
output_token: str,
|
|
336
|
-
destination_address: str,
|
|
337
|
-
amount_ui: float,
|
|
338
|
-
use_xmr: bool = False,
|
|
339
|
-
) -> dict[str, Any]:
|
|
340
|
-
raise WalletBackendError(f"{self.name} does not support Solana private swap previews.")
|
|
341
|
-
|
|
342
|
-
async def execute_solana_private_swap(
|
|
343
|
-
self,
|
|
344
|
-
*,
|
|
345
|
-
input_token: str,
|
|
346
|
-
output_token: str,
|
|
347
|
-
destination_address: str,
|
|
348
|
-
amount_ui: float,
|
|
349
|
-
use_xmr: bool = False,
|
|
350
|
-
approved_preview: dict[str, Any] | None = None,
|
|
351
|
-
existing_order: dict[str, Any] | None = None,
|
|
352
|
-
) -> dict[str, Any]:
|
|
353
|
-
raise WalletBackendError(f"{self.name} does not support Solana private swaps.")
|
|
354
|
-
|
|
355
|
-
async def get_solana_private_swap_status(
|
|
356
|
-
self,
|
|
357
|
-
*,
|
|
358
|
-
multi_id: str | None = None,
|
|
359
|
-
houdini_id: str | None = None,
|
|
360
|
-
) -> dict[str, Any]:
|
|
361
|
-
raise WalletBackendError(f"{self.name} does not support Solana private swap status lookup.")
|
|
362
|
-
|
|
363
|
-
async def continue_solana_private_swap(
|
|
364
|
-
self,
|
|
365
|
-
*,
|
|
366
|
-
approved_preview: dict[str, Any],
|
|
367
|
-
existing_order: dict[str, Any],
|
|
368
|
-
) -> dict[str, Any]:
|
|
369
|
-
raise WalletBackendError(f"{self.name} does not support continuing Solana private swaps.")
|
|
370
|
-
|
|
371
331
|
async def execute_solana_lifi_cross_chain_swap(
|
|
372
332
|
self,
|
|
373
333
|
*,
|
|
@@ -410,22 +370,6 @@ class AgentWalletBackend(ABC):
|
|
|
410
370
|
async def get_jupiter_staked_jup(self, address: str | None = None) -> dict[str, Any]:
|
|
411
371
|
raise WalletBackendError(f"{self.name} does not support Jupiter staked JUP lookup.")
|
|
412
372
|
|
|
413
|
-
async def get_jupiter_earn_tokens(self) -> dict[str, Any]:
|
|
414
|
-
raise WalletBackendError(f"{self.name} does not support Jupiter Earn token lookup.")
|
|
415
|
-
|
|
416
|
-
async def get_jupiter_earn_positions(
|
|
417
|
-
self,
|
|
418
|
-
users: list[str] | None = None,
|
|
419
|
-
) -> dict[str, Any]:
|
|
420
|
-
raise WalletBackendError(f"{self.name} does not support Jupiter Earn positions.")
|
|
421
|
-
|
|
422
|
-
async def get_jupiter_earn_earnings(
|
|
423
|
-
self,
|
|
424
|
-
user: str | None = None,
|
|
425
|
-
positions: list[str] | None = None,
|
|
426
|
-
) -> dict[str, Any]:
|
|
427
|
-
raise WalletBackendError(f"{self.name} does not support Jupiter Earn earnings.")
|
|
428
|
-
|
|
429
373
|
async def get_flash_trade_markets(
|
|
430
374
|
self,
|
|
431
375
|
pool_name: str | None = None,
|
|
@@ -520,6 +464,9 @@ class AgentWalletBackend(ABC):
|
|
|
520
464
|
async def get_kamino_lend_user_rewards(self, user: str | None = None) -> dict[str, Any]:
|
|
521
465
|
raise WalletBackendError(f"{self.name} does not support Kamino rewards lookup.")
|
|
522
466
|
|
|
467
|
+
async def get_kamino_open_positions(self, user: str | None = None) -> dict[str, Any]:
|
|
468
|
+
raise WalletBackendError(f"{self.name} does not support Kamino open position lookup.")
|
|
469
|
+
|
|
523
470
|
async def preview_kamino_lend_deposit(
|
|
524
471
|
self,
|
|
525
472
|
market: str,
|
|
@@ -636,50 +583,6 @@ class AgentWalletBackend(ABC):
|
|
|
636
583
|
) -> dict[str, Any]:
|
|
637
584
|
raise WalletBackendError(f"{self.name} does not support Kamino repays.")
|
|
638
585
|
|
|
639
|
-
async def preview_jupiter_earn_deposit(
|
|
640
|
-
self,
|
|
641
|
-
asset: str,
|
|
642
|
-
amount_raw: str,
|
|
643
|
-
) -> dict[str, Any]:
|
|
644
|
-
raise WalletBackendError(f"{self.name} does not support Jupiter Earn deposit previews.")
|
|
645
|
-
|
|
646
|
-
async def prepare_jupiter_earn_deposit(
|
|
647
|
-
self,
|
|
648
|
-
asset: str,
|
|
649
|
-
amount_raw: str,
|
|
650
|
-
) -> dict[str, Any]:
|
|
651
|
-
raise WalletBackendError(f"{self.name} does not support Jupiter Earn deposit preparation.")
|
|
652
|
-
|
|
653
|
-
async def execute_jupiter_earn_deposit(
|
|
654
|
-
self,
|
|
655
|
-
asset: str,
|
|
656
|
-
amount_raw: str,
|
|
657
|
-
) -> dict[str, Any]:
|
|
658
|
-
raise WalletBackendError(f"{self.name} does not support Jupiter Earn deposits.")
|
|
659
|
-
|
|
660
|
-
async def preview_jupiter_earn_withdraw(
|
|
661
|
-
self,
|
|
662
|
-
asset: str,
|
|
663
|
-
amount_raw: str,
|
|
664
|
-
) -> dict[str, Any]:
|
|
665
|
-
raise WalletBackendError(f"{self.name} does not support Jupiter Earn withdraw previews.")
|
|
666
|
-
|
|
667
|
-
async def prepare_jupiter_earn_withdraw(
|
|
668
|
-
self,
|
|
669
|
-
asset: str,
|
|
670
|
-
amount_raw: str,
|
|
671
|
-
) -> dict[str, Any]:
|
|
672
|
-
raise WalletBackendError(
|
|
673
|
-
f"{self.name} does not support Jupiter Earn withdraw preparation."
|
|
674
|
-
)
|
|
675
|
-
|
|
676
|
-
async def execute_jupiter_earn_withdraw(
|
|
677
|
-
self,
|
|
678
|
-
asset: str,
|
|
679
|
-
amount_raw: str,
|
|
680
|
-
) -> dict[str, Any]:
|
|
681
|
-
raise WalletBackendError(f"{self.name} does not support Jupiter Earn withdrawals.")
|
|
682
|
-
|
|
683
586
|
async def preview_close_empty_token_accounts(
|
|
684
587
|
self,
|
|
685
588
|
limit: int = 8,
|
|
@@ -994,9 +897,6 @@ class AgentWalletBackend(ABC):
|
|
|
994
897
|
),
|
|
995
898
|
)
|
|
996
899
|
|
|
997
|
-
async def request_testnet_airdrop(self, amount_native: float) -> dict[str, Any]:
|
|
998
|
-
raise WalletBackendError(f"{self.name} does not support testnet airdrops.")
|
|
999
|
-
|
|
1000
900
|
async def preview_native_stake(
|
|
1001
901
|
self,
|
|
1002
902
|
vote_account: str,
|
|
@@ -7,6 +7,8 @@ from pathlib import Path
|
|
|
7
7
|
from agent_wallet.bootstrap import ensure_solana_wallet_ready, ensure_wallet_pin
|
|
8
8
|
from agent_wallet.encrypted_storage import load_wallet_secret_material
|
|
9
9
|
from agent_wallet.config import (
|
|
10
|
+
normalize_btc_network,
|
|
11
|
+
normalize_solana_network,
|
|
10
12
|
resolve_runtime_solana_rpc_config,
|
|
11
13
|
resolve_runtime_solana_swap_config,
|
|
12
14
|
resolve_solana_private_key,
|
|
@@ -44,6 +46,7 @@ def create_wallet_backend() -> AgentWalletBackend | None:
|
|
|
44
46
|
return None
|
|
45
47
|
|
|
46
48
|
if backend in {"solana", "solana_local", "solana-local"}:
|
|
49
|
+
solana_network = normalize_solana_network(settings.solana_network)
|
|
47
50
|
secret_material = _load_keypair_material()
|
|
48
51
|
signer = (
|
|
49
52
|
SolanaLocalKeypairSigner.from_secret_material(secret_material)
|
|
@@ -55,19 +58,19 @@ def create_wallet_backend() -> AgentWalletBackend | None:
|
|
|
55
58
|
ensure_wallet_pin(
|
|
56
59
|
Path(keypair_path).expanduser(),
|
|
57
60
|
address=signer.address,
|
|
58
|
-
network=
|
|
61
|
+
network=solana_network,
|
|
59
62
|
)
|
|
60
63
|
configured_address = settings.solana_agent_public_key.strip() or None
|
|
61
64
|
rpc_config = resolve_runtime_solana_rpc_config(
|
|
62
|
-
|
|
65
|
+
solana_network,
|
|
63
66
|
settings.solana_rpc_url,
|
|
64
67
|
settings.solana_rpc_urls,
|
|
65
68
|
)
|
|
66
|
-
swap_config = resolve_runtime_solana_swap_config(
|
|
69
|
+
swap_config = resolve_runtime_solana_swap_config(solana_network)
|
|
67
70
|
return SolanaWalletBackend(
|
|
68
71
|
rpc_url=rpc_config["rpc_urls"],
|
|
69
72
|
commitment=settings.solana_commitment,
|
|
70
|
-
network=
|
|
73
|
+
network=solana_network,
|
|
71
74
|
signer=signer,
|
|
72
75
|
address=configured_address,
|
|
73
76
|
sign_only=settings.agent_wallet_sign_only,
|
|
@@ -82,7 +85,7 @@ def create_wallet_backend() -> AgentWalletBackend | None:
|
|
|
82
85
|
return WdkBtcLocalWalletBackend(
|
|
83
86
|
service_url=settings.wdk_btc_service_url,
|
|
84
87
|
wallet_id=settings.wdk_btc_wallet_id,
|
|
85
|
-
network=settings.solana_network,
|
|
88
|
+
network=normalize_btc_network(settings.solana_network),
|
|
86
89
|
account_index=settings.wdk_btc_account_index,
|
|
87
90
|
sign_only=settings.agent_wallet_sign_only,
|
|
88
91
|
)
|