@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,808 @@
|
|
|
1
|
+
"""Shared primitives for agent wallet backends."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from abc import ABC, abstractmethod
|
|
6
|
+
from dataclasses import asdict, dataclass, field
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class WalletBackendError(Exception):
|
|
11
|
+
"""Wallet backend or signer error."""
|
|
12
|
+
|
|
13
|
+
def __init__(
|
|
14
|
+
self,
|
|
15
|
+
message: str,
|
|
16
|
+
*,
|
|
17
|
+
code: str | None = None,
|
|
18
|
+
details: dict[str, Any] | None = None,
|
|
19
|
+
):
|
|
20
|
+
super().__init__(message)
|
|
21
|
+
self.code = str(code).strip() if isinstance(code, str) and code.strip() else None
|
|
22
|
+
self.details = dict(details) if isinstance(details, dict) else None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass(slots=True)
|
|
26
|
+
class WalletCapabilities:
|
|
27
|
+
"""Capability summary exposed by wallet backends."""
|
|
28
|
+
|
|
29
|
+
backend: str
|
|
30
|
+
chain: str
|
|
31
|
+
custody_model: str
|
|
32
|
+
sign_only: bool
|
|
33
|
+
has_signer: bool
|
|
34
|
+
can_get_address: bool = True
|
|
35
|
+
can_get_balance: bool = True
|
|
36
|
+
can_sign_message: bool = False
|
|
37
|
+
can_sign_transaction: bool = False
|
|
38
|
+
can_send_transaction: bool = False
|
|
39
|
+
external_dependencies: list[str] = field(default_factory=list)
|
|
40
|
+
|
|
41
|
+
def to_dict(self) -> dict[str, Any]:
|
|
42
|
+
return asdict(self)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class AgentWalletBackend(ABC):
|
|
46
|
+
"""Abstract interface for chain-specific agent wallets."""
|
|
47
|
+
|
|
48
|
+
name: str
|
|
49
|
+
|
|
50
|
+
@abstractmethod
|
|
51
|
+
async def get_address(self) -> str | None:
|
|
52
|
+
"""Return the wallet address if one is configured."""
|
|
53
|
+
|
|
54
|
+
@abstractmethod
|
|
55
|
+
async def get_balance(self, address: str | None = None) -> dict[str, Any]:
|
|
56
|
+
"""Return the wallet balance for the configured or provided address."""
|
|
57
|
+
|
|
58
|
+
def with_network(self, network: str) -> "AgentWalletBackend":
|
|
59
|
+
raise WalletBackendError(f"{self.name} does not support network overrides.")
|
|
60
|
+
|
|
61
|
+
async def get_btc_transfer_history(
|
|
62
|
+
self,
|
|
63
|
+
*,
|
|
64
|
+
direction: str = "all",
|
|
65
|
+
limit: int = 10,
|
|
66
|
+
skip: int = 0,
|
|
67
|
+
) -> dict[str, Any]:
|
|
68
|
+
raise WalletBackendError(f"{self.name} does not support BTC transfer history lookup.")
|
|
69
|
+
|
|
70
|
+
async def get_btc_fee_rates(self) -> dict[str, Any]:
|
|
71
|
+
raise WalletBackendError(f"{self.name} does not support BTC fee-rate lookup.")
|
|
72
|
+
|
|
73
|
+
async def get_btc_max_spendable(
|
|
74
|
+
self,
|
|
75
|
+
*,
|
|
76
|
+
fee_rate: int | None = None,
|
|
77
|
+
) -> dict[str, Any]:
|
|
78
|
+
raise WalletBackendError(f"{self.name} does not support BTC max spendable lookup.")
|
|
79
|
+
|
|
80
|
+
async def get_evm_token_balance(self, token_address: str) -> dict[str, Any]:
|
|
81
|
+
raise WalletBackendError(f"{self.name} does not support EVM token balance lookup.")
|
|
82
|
+
|
|
83
|
+
async def get_evm_network_info(self) -> dict[str, Any]:
|
|
84
|
+
raise WalletBackendError(f"{self.name} does not support EVM network inspection.")
|
|
85
|
+
|
|
86
|
+
async def get_evm_token_metadata(self, token_address: str) -> dict[str, Any]:
|
|
87
|
+
raise WalletBackendError(f"{self.name} does not support EVM token metadata lookup.")
|
|
88
|
+
|
|
89
|
+
async def get_evm_fee_rates(self) -> dict[str, Any]:
|
|
90
|
+
raise WalletBackendError(f"{self.name} does not support EVM fee-rate lookup.")
|
|
91
|
+
|
|
92
|
+
async def get_evm_transaction_receipt(self, tx_hash: str) -> dict[str, Any]:
|
|
93
|
+
raise WalletBackendError(f"{self.name} does not support EVM transaction receipt lookup.")
|
|
94
|
+
|
|
95
|
+
async def get_evm_swap_quote(
|
|
96
|
+
self,
|
|
97
|
+
*,
|
|
98
|
+
token_in: str,
|
|
99
|
+
token_out: str,
|
|
100
|
+
amount_in_raw: str,
|
|
101
|
+
) -> dict[str, Any]:
|
|
102
|
+
raise WalletBackendError(f"{self.name} does not support EVM swap quote lookup.")
|
|
103
|
+
|
|
104
|
+
async def get_evm_aave_account(self) -> dict[str, Any]:
|
|
105
|
+
raise WalletBackendError(f"{self.name} does not support EVM Aave account lookup.")
|
|
106
|
+
|
|
107
|
+
async def get_evm_aave_reserves(self) -> dict[str, Any]:
|
|
108
|
+
raise WalletBackendError(f"{self.name} does not support EVM Aave reserve lookup.")
|
|
109
|
+
|
|
110
|
+
async def get_evm_aave_positions(self) -> dict[str, Any]:
|
|
111
|
+
raise WalletBackendError(f"{self.name} does not support EVM Aave positions lookup.")
|
|
112
|
+
|
|
113
|
+
async def get_evm_lido_overview(self) -> dict[str, Any]:
|
|
114
|
+
raise WalletBackendError(f"{self.name} does not support EVM Lido overview lookup.")
|
|
115
|
+
|
|
116
|
+
async def get_evm_lido_positions(self) -> dict[str, Any]:
|
|
117
|
+
raise WalletBackendError(f"{self.name} does not support EVM Lido positions lookup.")
|
|
118
|
+
|
|
119
|
+
async def get_evm_lido_withdrawal_requests(self) -> dict[str, Any]:
|
|
120
|
+
raise WalletBackendError(f"{self.name} does not support EVM Lido withdrawal lookup.")
|
|
121
|
+
|
|
122
|
+
async def preview_evm_aave_operation(
|
|
123
|
+
self,
|
|
124
|
+
*,
|
|
125
|
+
operation: str,
|
|
126
|
+
token_address: str,
|
|
127
|
+
amount_raw: str,
|
|
128
|
+
) -> dict[str, Any]:
|
|
129
|
+
raise WalletBackendError(f"{self.name} does not support EVM Aave previews.")
|
|
130
|
+
|
|
131
|
+
async def send_evm_aave_operation(
|
|
132
|
+
self,
|
|
133
|
+
*,
|
|
134
|
+
operation: str,
|
|
135
|
+
token_address: str,
|
|
136
|
+
amount_raw: str,
|
|
137
|
+
expected_quote_fingerprint: str | None = None,
|
|
138
|
+
) -> dict[str, Any]:
|
|
139
|
+
raise WalletBackendError(f"{self.name} does not support EVM Aave operations.")
|
|
140
|
+
|
|
141
|
+
async def preview_evm_lido_operation(
|
|
142
|
+
self,
|
|
143
|
+
*,
|
|
144
|
+
operation: str,
|
|
145
|
+
amount_raw: str,
|
|
146
|
+
) -> dict[str, Any]:
|
|
147
|
+
raise WalletBackendError(f"{self.name} does not support EVM Lido previews.")
|
|
148
|
+
|
|
149
|
+
async def send_evm_lido_operation(
|
|
150
|
+
self,
|
|
151
|
+
*,
|
|
152
|
+
operation: str,
|
|
153
|
+
amount_raw: str,
|
|
154
|
+
expected_quote_fingerprint: str | None = None,
|
|
155
|
+
) -> dict[str, Any]:
|
|
156
|
+
raise WalletBackendError(f"{self.name} does not support EVM Lido operations.")
|
|
157
|
+
|
|
158
|
+
async def preview_evm_lido_withdrawal(
|
|
159
|
+
self,
|
|
160
|
+
*,
|
|
161
|
+
operation: str,
|
|
162
|
+
amount_raw: str | None = None,
|
|
163
|
+
request_id: str | None = None,
|
|
164
|
+
) -> dict[str, Any]:
|
|
165
|
+
raise WalletBackendError(f"{self.name} does not support EVM Lido withdrawal previews.")
|
|
166
|
+
|
|
167
|
+
async def send_evm_lido_withdrawal(
|
|
168
|
+
self,
|
|
169
|
+
*,
|
|
170
|
+
operation: str,
|
|
171
|
+
amount_raw: str | None = None,
|
|
172
|
+
request_id: str | None = None,
|
|
173
|
+
expected_quote_fingerprint: str | None = None,
|
|
174
|
+
) -> dict[str, Any]:
|
|
175
|
+
raise WalletBackendError(f"{self.name} does not support EVM Lido withdrawals.")
|
|
176
|
+
|
|
177
|
+
async def preview_evm_swap(
|
|
178
|
+
self,
|
|
179
|
+
*,
|
|
180
|
+
token_in: str,
|
|
181
|
+
token_out: str,
|
|
182
|
+
amount_in_raw: str,
|
|
183
|
+
) -> dict[str, Any]:
|
|
184
|
+
raise WalletBackendError(f"{self.name} does not support EVM swap previews.")
|
|
185
|
+
|
|
186
|
+
async def send_evm_swap(
|
|
187
|
+
self,
|
|
188
|
+
*,
|
|
189
|
+
token_in: str,
|
|
190
|
+
token_out: str,
|
|
191
|
+
amount_in_raw: str,
|
|
192
|
+
expected_quote_fingerprint: str | None = None,
|
|
193
|
+
minimum_output_amount_raw: str | None = None,
|
|
194
|
+
) -> dict[str, Any]:
|
|
195
|
+
raise WalletBackendError(f"{self.name} does not support EVM swaps.")
|
|
196
|
+
|
|
197
|
+
async def preview_evm_lifi_cross_chain_swap(
|
|
198
|
+
self,
|
|
199
|
+
*,
|
|
200
|
+
token_in: str,
|
|
201
|
+
destination_chain: str,
|
|
202
|
+
output_token: str,
|
|
203
|
+
destination_address: str,
|
|
204
|
+
amount_in_raw: str,
|
|
205
|
+
slippage: float | int | None = None,
|
|
206
|
+
allow_bridges: list[str] | None = None,
|
|
207
|
+
deny_bridges: list[str] | None = None,
|
|
208
|
+
prefer_bridges: list[str] | None = None,
|
|
209
|
+
) -> dict[str, Any]:
|
|
210
|
+
raise WalletBackendError(f"{self.name} does not support EVM LI.FI cross-chain swap previews.")
|
|
211
|
+
|
|
212
|
+
async def send_evm_lifi_cross_chain_swap(
|
|
213
|
+
self,
|
|
214
|
+
*,
|
|
215
|
+
token_in: str,
|
|
216
|
+
destination_chain: str,
|
|
217
|
+
output_token: str,
|
|
218
|
+
destination_address: str,
|
|
219
|
+
amount_in_raw: str,
|
|
220
|
+
slippage: float | int | None = None,
|
|
221
|
+
allow_bridges: list[str] | None = None,
|
|
222
|
+
deny_bridges: list[str] | None = None,
|
|
223
|
+
prefer_bridges: list[str] | None = None,
|
|
224
|
+
minimum_output_amount_raw: str | None = None,
|
|
225
|
+
) -> dict[str, Any]:
|
|
226
|
+
raise WalletBackendError(f"{self.name} does not support EVM LI.FI cross-chain swaps.")
|
|
227
|
+
|
|
228
|
+
async def preview_evm_native_transfer(
|
|
229
|
+
self,
|
|
230
|
+
*,
|
|
231
|
+
recipient: str,
|
|
232
|
+
amount_wei: str,
|
|
233
|
+
) -> dict[str, Any]:
|
|
234
|
+
raise WalletBackendError(f"{self.name} does not support EVM native transfer previews.")
|
|
235
|
+
|
|
236
|
+
async def send_evm_native_transfer(
|
|
237
|
+
self,
|
|
238
|
+
*,
|
|
239
|
+
recipient: str,
|
|
240
|
+
amount_wei: str,
|
|
241
|
+
) -> dict[str, Any]:
|
|
242
|
+
raise WalletBackendError(f"{self.name} does not support EVM native transfers.")
|
|
243
|
+
|
|
244
|
+
async def preview_evm_token_transfer(
|
|
245
|
+
self,
|
|
246
|
+
*,
|
|
247
|
+
token_address: str,
|
|
248
|
+
recipient: str,
|
|
249
|
+
amount_raw: str,
|
|
250
|
+
) -> dict[str, Any]:
|
|
251
|
+
raise WalletBackendError(f"{self.name} does not support EVM token transfer previews.")
|
|
252
|
+
|
|
253
|
+
async def send_evm_token_transfer(
|
|
254
|
+
self,
|
|
255
|
+
*,
|
|
256
|
+
token_address: str,
|
|
257
|
+
recipient: str,
|
|
258
|
+
amount_raw: str,
|
|
259
|
+
) -> dict[str, Any]:
|
|
260
|
+
raise WalletBackendError(f"{self.name} does not support EVM token transfers.")
|
|
261
|
+
|
|
262
|
+
async def preview_btc_transfer(
|
|
263
|
+
self,
|
|
264
|
+
*,
|
|
265
|
+
recipient: str,
|
|
266
|
+
amount_sats: int,
|
|
267
|
+
fee_rate: int | None = None,
|
|
268
|
+
confirmation_target: int | None = None,
|
|
269
|
+
) -> dict[str, Any]:
|
|
270
|
+
raise WalletBackendError(f"{self.name} does not support BTC transfer previews.")
|
|
271
|
+
|
|
272
|
+
async def send_btc_transfer(
|
|
273
|
+
self,
|
|
274
|
+
*,
|
|
275
|
+
recipient: str,
|
|
276
|
+
amount_sats: int,
|
|
277
|
+
fee_rate: int | None = None,
|
|
278
|
+
confirmation_target: int | None = None,
|
|
279
|
+
) -> dict[str, Any]:
|
|
280
|
+
raise WalletBackendError(f"{self.name} does not support BTC transfers.")
|
|
281
|
+
|
|
282
|
+
async def get_portfolio(self, address: str | None = None) -> dict[str, Any]:
|
|
283
|
+
raise WalletBackendError(f"{self.name} does not support portfolio lookup.")
|
|
284
|
+
|
|
285
|
+
async def get_lifi_supported_chains(self) -> dict[str, Any]:
|
|
286
|
+
raise WalletBackendError(f"{self.name} does not support LI.FI chain lookup.")
|
|
287
|
+
|
|
288
|
+
async def get_lifi_quote(
|
|
289
|
+
self,
|
|
290
|
+
*,
|
|
291
|
+
from_chain: str,
|
|
292
|
+
to_chain: str,
|
|
293
|
+
from_token: str,
|
|
294
|
+
to_token: str,
|
|
295
|
+
amount_in_raw: str,
|
|
296
|
+
from_address: str | None = None,
|
|
297
|
+
to_address: str | None = None,
|
|
298
|
+
slippage: float | int | None = None,
|
|
299
|
+
allow_bridges: list[str] | None = None,
|
|
300
|
+
deny_bridges: list[str] | None = None,
|
|
301
|
+
prefer_bridges: list[str] | None = None,
|
|
302
|
+
) -> dict[str, Any]:
|
|
303
|
+
raise WalletBackendError(f"{self.name} does not support LI.FI quotes.")
|
|
304
|
+
|
|
305
|
+
async def get_lifi_transfer_status(
|
|
306
|
+
self,
|
|
307
|
+
*,
|
|
308
|
+
tx_hash: str,
|
|
309
|
+
bridge: str | None = None,
|
|
310
|
+
from_chain: str | None = None,
|
|
311
|
+
to_chain: str | None = None,
|
|
312
|
+
) -> dict[str, Any]:
|
|
313
|
+
raise WalletBackendError(f"{self.name} does not support LI.FI transfer status lookup.")
|
|
314
|
+
|
|
315
|
+
async def preview_solana_lifi_cross_chain_swap(
|
|
316
|
+
self,
|
|
317
|
+
*,
|
|
318
|
+
input_token: str,
|
|
319
|
+
destination_chain: str,
|
|
320
|
+
output_token: str,
|
|
321
|
+
destination_address: str,
|
|
322
|
+
amount_in_raw: str,
|
|
323
|
+
slippage: float | int | None = None,
|
|
324
|
+
allow_bridges: list[str] | None = None,
|
|
325
|
+
deny_bridges: list[str] | None = None,
|
|
326
|
+
prefer_bridges: list[str] | None = None,
|
|
327
|
+
) -> dict[str, Any]:
|
|
328
|
+
raise WalletBackendError(f"{self.name} does not support Solana-origin LI.FI swap previews.")
|
|
329
|
+
|
|
330
|
+
async def execute_solana_lifi_cross_chain_swap(
|
|
331
|
+
self,
|
|
332
|
+
*,
|
|
333
|
+
input_token: str,
|
|
334
|
+
destination_chain: str,
|
|
335
|
+
output_token: str,
|
|
336
|
+
destination_address: str,
|
|
337
|
+
amount_in_raw: str,
|
|
338
|
+
slippage: float | int | None = None,
|
|
339
|
+
allow_bridges: list[str] | None = None,
|
|
340
|
+
deny_bridges: list[str] | None = None,
|
|
341
|
+
prefer_bridges: list[str] | None = None,
|
|
342
|
+
minimum_output_amount_raw: str | None = None,
|
|
343
|
+
) -> dict[str, Any]:
|
|
344
|
+
raise WalletBackendError(f"{self.name} does not support Solana-origin LI.FI swaps.")
|
|
345
|
+
|
|
346
|
+
async def get_token_prices(self, mints: list[str]) -> dict[str, Any]:
|
|
347
|
+
raise WalletBackendError(f"{self.name} does not support token price lookup.")
|
|
348
|
+
|
|
349
|
+
async def get_staking_validators(
|
|
350
|
+
self,
|
|
351
|
+
limit: int = 20,
|
|
352
|
+
include_delinquent: bool = False,
|
|
353
|
+
) -> dict[str, Any]:
|
|
354
|
+
raise WalletBackendError(f"{self.name} does not support staking validator lookup.")
|
|
355
|
+
|
|
356
|
+
async def get_stake_account(self, stake_account: str) -> dict[str, Any]:
|
|
357
|
+
raise WalletBackendError(f"{self.name} does not support stake account lookup.")
|
|
358
|
+
|
|
359
|
+
async def get_jupiter_portfolio(
|
|
360
|
+
self,
|
|
361
|
+
address: str | None = None,
|
|
362
|
+
platforms: list[str] | None = None,
|
|
363
|
+
) -> dict[str, Any]:
|
|
364
|
+
raise WalletBackendError(f"{self.name} does not support Jupiter portfolio lookup.")
|
|
365
|
+
|
|
366
|
+
async def get_jupiter_portfolio_platforms(self) -> dict[str, Any]:
|
|
367
|
+
raise WalletBackendError(f"{self.name} does not support Jupiter portfolio platforms.")
|
|
368
|
+
|
|
369
|
+
async def get_jupiter_staked_jup(self, address: str | None = None) -> dict[str, Any]:
|
|
370
|
+
raise WalletBackendError(f"{self.name} does not support Jupiter staked JUP lookup.")
|
|
371
|
+
|
|
372
|
+
async def get_jupiter_earn_tokens(self) -> dict[str, Any]:
|
|
373
|
+
raise WalletBackendError(f"{self.name} does not support Jupiter Earn token lookup.")
|
|
374
|
+
|
|
375
|
+
async def get_jupiter_earn_positions(
|
|
376
|
+
self,
|
|
377
|
+
users: list[str] | None = None,
|
|
378
|
+
) -> dict[str, Any]:
|
|
379
|
+
raise WalletBackendError(f"{self.name} does not support Jupiter Earn positions.")
|
|
380
|
+
|
|
381
|
+
async def get_jupiter_earn_earnings(
|
|
382
|
+
self,
|
|
383
|
+
user: str | None = None,
|
|
384
|
+
positions: list[str] | None = None,
|
|
385
|
+
) -> dict[str, Any]:
|
|
386
|
+
raise WalletBackendError(f"{self.name} does not support Jupiter Earn earnings.")
|
|
387
|
+
|
|
388
|
+
async def get_kamino_lend_markets(self) -> dict[str, Any]:
|
|
389
|
+
raise WalletBackendError(f"{self.name} does not support Kamino market lookup.")
|
|
390
|
+
|
|
391
|
+
async def get_kamino_lend_market_reserves(self, market: str) -> dict[str, Any]:
|
|
392
|
+
raise WalletBackendError(f"{self.name} does not support Kamino reserve lookup.")
|
|
393
|
+
|
|
394
|
+
async def get_kamino_lend_user_obligations(
|
|
395
|
+
self,
|
|
396
|
+
market: str,
|
|
397
|
+
user: str | None = None,
|
|
398
|
+
) -> dict[str, Any]:
|
|
399
|
+
raise WalletBackendError(f"{self.name} does not support Kamino obligations lookup.")
|
|
400
|
+
|
|
401
|
+
async def get_kamino_lend_user_rewards(self, user: str | None = None) -> dict[str, Any]:
|
|
402
|
+
raise WalletBackendError(f"{self.name} does not support Kamino rewards lookup.")
|
|
403
|
+
|
|
404
|
+
async def preview_kamino_lend_deposit(
|
|
405
|
+
self,
|
|
406
|
+
market: str,
|
|
407
|
+
reserve: str,
|
|
408
|
+
amount_ui: str,
|
|
409
|
+
) -> dict[str, Any]:
|
|
410
|
+
raise WalletBackendError(f"{self.name} does not support Kamino deposit previews.")
|
|
411
|
+
|
|
412
|
+
async def prepare_kamino_lend_deposit(
|
|
413
|
+
self,
|
|
414
|
+
market: str,
|
|
415
|
+
reserve: str,
|
|
416
|
+
amount_ui: str,
|
|
417
|
+
) -> dict[str, Any]:
|
|
418
|
+
raise WalletBackendError(f"{self.name} does not support Kamino deposit preparation.")
|
|
419
|
+
|
|
420
|
+
async def execute_kamino_lend_deposit(
|
|
421
|
+
self,
|
|
422
|
+
market: str,
|
|
423
|
+
reserve: str,
|
|
424
|
+
amount_ui: str,
|
|
425
|
+
) -> dict[str, Any]:
|
|
426
|
+
raise WalletBackendError(f"{self.name} does not support Kamino deposits.")
|
|
427
|
+
|
|
428
|
+
async def preview_kamino_lend_withdraw(
|
|
429
|
+
self,
|
|
430
|
+
market: str,
|
|
431
|
+
reserve: str,
|
|
432
|
+
amount_ui: str,
|
|
433
|
+
) -> dict[str, Any]:
|
|
434
|
+
raise WalletBackendError(f"{self.name} does not support Kamino withdraw previews.")
|
|
435
|
+
|
|
436
|
+
async def prepare_kamino_lend_withdraw(
|
|
437
|
+
self,
|
|
438
|
+
market: str,
|
|
439
|
+
reserve: str,
|
|
440
|
+
amount_ui: str,
|
|
441
|
+
) -> dict[str, Any]:
|
|
442
|
+
raise WalletBackendError(f"{self.name} does not support Kamino withdraw preparation.")
|
|
443
|
+
|
|
444
|
+
async def execute_kamino_lend_withdraw(
|
|
445
|
+
self,
|
|
446
|
+
market: str,
|
|
447
|
+
reserve: str,
|
|
448
|
+
amount_ui: str,
|
|
449
|
+
) -> dict[str, Any]:
|
|
450
|
+
raise WalletBackendError(f"{self.name} does not support Kamino withdraws.")
|
|
451
|
+
|
|
452
|
+
async def preview_kamino_lend_borrow(
|
|
453
|
+
self,
|
|
454
|
+
market: str,
|
|
455
|
+
reserve: str,
|
|
456
|
+
amount_ui: str,
|
|
457
|
+
) -> dict[str, Any]:
|
|
458
|
+
raise WalletBackendError(f"{self.name} does not support Kamino borrow previews.")
|
|
459
|
+
|
|
460
|
+
async def prepare_kamino_lend_borrow(
|
|
461
|
+
self,
|
|
462
|
+
market: str,
|
|
463
|
+
reserve: str,
|
|
464
|
+
amount_ui: str,
|
|
465
|
+
) -> dict[str, Any]:
|
|
466
|
+
raise WalletBackendError(f"{self.name} does not support Kamino borrow preparation.")
|
|
467
|
+
|
|
468
|
+
async def execute_kamino_lend_borrow(
|
|
469
|
+
self,
|
|
470
|
+
market: str,
|
|
471
|
+
reserve: str,
|
|
472
|
+
amount_ui: str,
|
|
473
|
+
) -> dict[str, Any]:
|
|
474
|
+
raise WalletBackendError(f"{self.name} does not support Kamino borrows.")
|
|
475
|
+
|
|
476
|
+
async def preview_kamino_lend_repay(
|
|
477
|
+
self,
|
|
478
|
+
market: str,
|
|
479
|
+
reserve: str,
|
|
480
|
+
amount_ui: str,
|
|
481
|
+
) -> dict[str, Any]:
|
|
482
|
+
raise WalletBackendError(f"{self.name} does not support Kamino repay previews.")
|
|
483
|
+
|
|
484
|
+
async def prepare_kamino_lend_repay(
|
|
485
|
+
self,
|
|
486
|
+
market: str,
|
|
487
|
+
reserve: str,
|
|
488
|
+
amount_ui: str,
|
|
489
|
+
) -> dict[str, Any]:
|
|
490
|
+
raise WalletBackendError(f"{self.name} does not support Kamino repay preparation.")
|
|
491
|
+
|
|
492
|
+
async def execute_kamino_lend_repay(
|
|
493
|
+
self,
|
|
494
|
+
market: str,
|
|
495
|
+
reserve: str,
|
|
496
|
+
amount_ui: str,
|
|
497
|
+
) -> dict[str, Any]:
|
|
498
|
+
raise WalletBackendError(f"{self.name} does not support Kamino repays.")
|
|
499
|
+
|
|
500
|
+
async def preview_jupiter_earn_deposit(
|
|
501
|
+
self,
|
|
502
|
+
asset: str,
|
|
503
|
+
amount_raw: str,
|
|
504
|
+
) -> dict[str, Any]:
|
|
505
|
+
raise WalletBackendError(f"{self.name} does not support Jupiter Earn deposit previews.")
|
|
506
|
+
|
|
507
|
+
async def prepare_jupiter_earn_deposit(
|
|
508
|
+
self,
|
|
509
|
+
asset: str,
|
|
510
|
+
amount_raw: str,
|
|
511
|
+
) -> dict[str, Any]:
|
|
512
|
+
raise WalletBackendError(f"{self.name} does not support Jupiter Earn deposit preparation.")
|
|
513
|
+
|
|
514
|
+
async def execute_jupiter_earn_deposit(
|
|
515
|
+
self,
|
|
516
|
+
asset: str,
|
|
517
|
+
amount_raw: str,
|
|
518
|
+
) -> dict[str, Any]:
|
|
519
|
+
raise WalletBackendError(f"{self.name} does not support Jupiter Earn deposits.")
|
|
520
|
+
|
|
521
|
+
async def preview_jupiter_earn_withdraw(
|
|
522
|
+
self,
|
|
523
|
+
asset: str,
|
|
524
|
+
amount_raw: str,
|
|
525
|
+
) -> dict[str, Any]:
|
|
526
|
+
raise WalletBackendError(f"{self.name} does not support Jupiter Earn withdraw previews.")
|
|
527
|
+
|
|
528
|
+
async def prepare_jupiter_earn_withdraw(
|
|
529
|
+
self,
|
|
530
|
+
asset: str,
|
|
531
|
+
amount_raw: str,
|
|
532
|
+
) -> dict[str, Any]:
|
|
533
|
+
raise WalletBackendError(
|
|
534
|
+
f"{self.name} does not support Jupiter Earn withdraw preparation."
|
|
535
|
+
)
|
|
536
|
+
|
|
537
|
+
async def execute_jupiter_earn_withdraw(
|
|
538
|
+
self,
|
|
539
|
+
asset: str,
|
|
540
|
+
amount_raw: str,
|
|
541
|
+
) -> dict[str, Any]:
|
|
542
|
+
raise WalletBackendError(f"{self.name} does not support Jupiter Earn withdrawals.")
|
|
543
|
+
|
|
544
|
+
async def preview_close_empty_token_accounts(
|
|
545
|
+
self,
|
|
546
|
+
limit: int = 8,
|
|
547
|
+
) -> dict[str, Any]:
|
|
548
|
+
raise WalletBackendError(f"{self.name} does not support empty token account previews.")
|
|
549
|
+
|
|
550
|
+
async def close_empty_token_accounts(
|
|
551
|
+
self,
|
|
552
|
+
limit: int = 8,
|
|
553
|
+
) -> dict[str, Any]:
|
|
554
|
+
raise WalletBackendError(f"{self.name} does not support closing token accounts.")
|
|
555
|
+
|
|
556
|
+
@abstractmethod
|
|
557
|
+
def get_capabilities(self) -> WalletCapabilities:
|
|
558
|
+
"""Describe backend capabilities for the agent runtime."""
|
|
559
|
+
|
|
560
|
+
async def sign_message(self, message: bytes | str) -> str:
|
|
561
|
+
raise WalletBackendError(f"{self.name} does not support message signing.")
|
|
562
|
+
|
|
563
|
+
async def preview_native_transfer(
|
|
564
|
+
self,
|
|
565
|
+
recipient: str,
|
|
566
|
+
amount_native: float,
|
|
567
|
+
) -> dict[str, Any]:
|
|
568
|
+
raise WalletBackendError(f"{self.name} does not support native transfer previews.")
|
|
569
|
+
|
|
570
|
+
async def prepare_native_transfer(
|
|
571
|
+
self,
|
|
572
|
+
recipient: str,
|
|
573
|
+
amount_native: float,
|
|
574
|
+
) -> dict[str, Any]:
|
|
575
|
+
raise WalletBackendError(f"{self.name} does not support native transfer preparation.")
|
|
576
|
+
|
|
577
|
+
async def send_native_transfer(
|
|
578
|
+
self,
|
|
579
|
+
recipient: str,
|
|
580
|
+
amount_native: float,
|
|
581
|
+
) -> dict[str, Any]:
|
|
582
|
+
raise WalletBackendError(f"{self.name} does not support sending native transfers.")
|
|
583
|
+
|
|
584
|
+
async def preview_spl_transfer(
|
|
585
|
+
self,
|
|
586
|
+
recipient: str,
|
|
587
|
+
mint: str,
|
|
588
|
+
amount_ui: float,
|
|
589
|
+
decimals: int | None = None,
|
|
590
|
+
) -> dict[str, Any]:
|
|
591
|
+
raise WalletBackendError(f"{self.name} does not support SPL transfer previews.")
|
|
592
|
+
|
|
593
|
+
async def prepare_spl_transfer(
|
|
594
|
+
self,
|
|
595
|
+
recipient: str,
|
|
596
|
+
mint: str,
|
|
597
|
+
amount_ui: float,
|
|
598
|
+
decimals: int | None = None,
|
|
599
|
+
) -> dict[str, Any]:
|
|
600
|
+
raise WalletBackendError(f"{self.name} does not support SPL transfer preparation.")
|
|
601
|
+
|
|
602
|
+
async def send_spl_transfer(
|
|
603
|
+
self,
|
|
604
|
+
recipient: str,
|
|
605
|
+
mint: str,
|
|
606
|
+
amount_ui: float,
|
|
607
|
+
decimals: int | None = None,
|
|
608
|
+
) -> dict[str, Any]:
|
|
609
|
+
raise WalletBackendError(f"{self.name} does not support SPL transfers.")
|
|
610
|
+
|
|
611
|
+
async def preview_swap(
|
|
612
|
+
self,
|
|
613
|
+
input_mint: str,
|
|
614
|
+
output_mint: str,
|
|
615
|
+
amount_ui: float,
|
|
616
|
+
slippage_bps: int = 50,
|
|
617
|
+
) -> dict[str, Any]:
|
|
618
|
+
raise WalletBackendError(f"{self.name} does not support swap previews.")
|
|
619
|
+
|
|
620
|
+
async def prepare_swap(
|
|
621
|
+
self,
|
|
622
|
+
input_mint: str,
|
|
623
|
+
output_mint: str,
|
|
624
|
+
amount_ui: float,
|
|
625
|
+
slippage_bps: int = 50,
|
|
626
|
+
) -> dict[str, Any]:
|
|
627
|
+
raise WalletBackendError(f"{self.name} does not support swap preparation.")
|
|
628
|
+
|
|
629
|
+
async def prepare_swap_from_preview(
|
|
630
|
+
self,
|
|
631
|
+
preview: dict[str, Any],
|
|
632
|
+
) -> dict[str, Any]:
|
|
633
|
+
return await self.prepare_swap(
|
|
634
|
+
input_mint=str(preview["input_mint"]),
|
|
635
|
+
output_mint=str(preview["output_mint"]),
|
|
636
|
+
amount_ui=float(preview["input_amount_ui"]),
|
|
637
|
+
slippage_bps=int(preview.get("slippage_bps") or 50),
|
|
638
|
+
)
|
|
639
|
+
|
|
640
|
+
async def execute_swap(
|
|
641
|
+
self,
|
|
642
|
+
input_mint: str,
|
|
643
|
+
output_mint: str,
|
|
644
|
+
amount_ui: float,
|
|
645
|
+
slippage_bps: int = 50,
|
|
646
|
+
) -> dict[str, Any]:
|
|
647
|
+
raise WalletBackendError(f"{self.name} does not support swaps.")
|
|
648
|
+
|
|
649
|
+
async def execute_swap_from_preview(
|
|
650
|
+
self,
|
|
651
|
+
preview: dict[str, Any],
|
|
652
|
+
) -> dict[str, Any]:
|
|
653
|
+
return await self.execute_swap(
|
|
654
|
+
input_mint=str(preview["input_mint"]),
|
|
655
|
+
output_mint=str(preview["output_mint"]),
|
|
656
|
+
amount_ui=float(preview["input_amount_ui"]),
|
|
657
|
+
slippage_bps=int(preview.get("slippage_bps") or 50),
|
|
658
|
+
)
|
|
659
|
+
|
|
660
|
+
async def get_bags_claimable_positions(
|
|
661
|
+
self,
|
|
662
|
+
wallet: str | None = None,
|
|
663
|
+
) -> dict[str, Any]:
|
|
664
|
+
raise WalletBackendError(f"{self.name} does not support Bags claimable positions lookup.")
|
|
665
|
+
|
|
666
|
+
async def get_bags_fee_analytics(
|
|
667
|
+
self,
|
|
668
|
+
token_mint: str,
|
|
669
|
+
*,
|
|
670
|
+
include_claim_events: bool = False,
|
|
671
|
+
mode: str = "offset",
|
|
672
|
+
limit: int | None = None,
|
|
673
|
+
offset: int | None = None,
|
|
674
|
+
from_ts: int | None = None,
|
|
675
|
+
to_ts: int | None = None,
|
|
676
|
+
) -> dict[str, Any]:
|
|
677
|
+
raise WalletBackendError(f"{self.name} does not support Bags fee analytics lookup.")
|
|
678
|
+
|
|
679
|
+
async def preview_bags_fee_claim(self, token_mint: str) -> dict[str, Any]:
|
|
680
|
+
raise WalletBackendError(f"{self.name} does not support Bags fee claim previews.")
|
|
681
|
+
|
|
682
|
+
async def execute_bags_fee_claim(self, token_mint: str) -> dict[str, Any]:
|
|
683
|
+
raise WalletBackendError(f"{self.name} does not support Bags fee claims.")
|
|
684
|
+
|
|
685
|
+
async def execute_bags_fee_claim_from_preview(
|
|
686
|
+
self,
|
|
687
|
+
preview: dict[str, Any],
|
|
688
|
+
) -> dict[str, Any]:
|
|
689
|
+
return await self.execute_bags_fee_claim(str(preview["token_mint"]))
|
|
690
|
+
|
|
691
|
+
async def preview_bags_token_launch(
|
|
692
|
+
self,
|
|
693
|
+
*,
|
|
694
|
+
name: str,
|
|
695
|
+
symbol: str,
|
|
696
|
+
description: str,
|
|
697
|
+
base_mint: str,
|
|
698
|
+
claimers: list[str],
|
|
699
|
+
basis_points: list[int],
|
|
700
|
+
initial_buy_sol: float,
|
|
701
|
+
image_url: str | None = None,
|
|
702
|
+
website: str | None = None,
|
|
703
|
+
twitter: str | None = None,
|
|
704
|
+
telegram: str | None = None,
|
|
705
|
+
discord: str | None = None,
|
|
706
|
+
bags_config_type: int | None = None,
|
|
707
|
+
) -> dict[str, Any]:
|
|
708
|
+
raise WalletBackendError(f"{self.name} does not support Bags token launch previews.")
|
|
709
|
+
|
|
710
|
+
async def execute_bags_token_launch(
|
|
711
|
+
self,
|
|
712
|
+
*,
|
|
713
|
+
name: str,
|
|
714
|
+
symbol: str,
|
|
715
|
+
description: str,
|
|
716
|
+
base_mint: str,
|
|
717
|
+
claimers: list[str],
|
|
718
|
+
basis_points: list[int],
|
|
719
|
+
initial_buy_sol: float,
|
|
720
|
+
image_url: str | None = None,
|
|
721
|
+
website: str | None = None,
|
|
722
|
+
twitter: str | None = None,
|
|
723
|
+
telegram: str | None = None,
|
|
724
|
+
discord: str | None = None,
|
|
725
|
+
bags_config_type: int | None = None,
|
|
726
|
+
) -> dict[str, Any]:
|
|
727
|
+
raise WalletBackendError(f"{self.name} does not support Bags token launches.")
|
|
728
|
+
|
|
729
|
+
async def execute_bags_token_launch_from_preview(
|
|
730
|
+
self,
|
|
731
|
+
preview: dict[str, Any],
|
|
732
|
+
) -> dict[str, Any]:
|
|
733
|
+
return await self.execute_bags_token_launch(
|
|
734
|
+
name=str(preview["token_name"]),
|
|
735
|
+
symbol=str(preview["token_symbol"]),
|
|
736
|
+
description=str(preview["description"]),
|
|
737
|
+
base_mint=str(preview["base_mint"]),
|
|
738
|
+
claimers=list(preview["claimers"]),
|
|
739
|
+
basis_points=[int(value) for value in preview["basis_points"]],
|
|
740
|
+
initial_buy_sol=float(preview["initial_buy_sol"]),
|
|
741
|
+
image_url=preview.get("image_url"),
|
|
742
|
+
website=preview.get("website"),
|
|
743
|
+
twitter=preview.get("twitter"),
|
|
744
|
+
telegram=preview.get("telegram"),
|
|
745
|
+
discord=preview.get("discord"),
|
|
746
|
+
bags_config_type=(
|
|
747
|
+
int(preview["bags_config_type"])
|
|
748
|
+
if preview.get("bags_config_type") is not None
|
|
749
|
+
else None
|
|
750
|
+
),
|
|
751
|
+
)
|
|
752
|
+
|
|
753
|
+
async def request_testnet_airdrop(self, amount_native: float) -> dict[str, Any]:
|
|
754
|
+
raise WalletBackendError(f"{self.name} does not support testnet airdrops.")
|
|
755
|
+
|
|
756
|
+
async def preview_native_stake(
|
|
757
|
+
self,
|
|
758
|
+
vote_account: str,
|
|
759
|
+
amount_native: float,
|
|
760
|
+
) -> dict[str, Any]:
|
|
761
|
+
raise WalletBackendError(f"{self.name} does not support native staking previews.")
|
|
762
|
+
|
|
763
|
+
async def prepare_native_stake(
|
|
764
|
+
self,
|
|
765
|
+
vote_account: str,
|
|
766
|
+
amount_native: float,
|
|
767
|
+
) -> dict[str, Any]:
|
|
768
|
+
raise WalletBackendError(f"{self.name} does not support native staking preparation.")
|
|
769
|
+
|
|
770
|
+
async def execute_native_stake(
|
|
771
|
+
self,
|
|
772
|
+
vote_account: str,
|
|
773
|
+
amount_native: float,
|
|
774
|
+
) -> dict[str, Any]:
|
|
775
|
+
raise WalletBackendError(f"{self.name} does not support native staking.")
|
|
776
|
+
|
|
777
|
+
async def preview_deactivate_stake(self, stake_account: str) -> dict[str, Any]:
|
|
778
|
+
raise WalletBackendError(f"{self.name} does not support stake deactivation previews.")
|
|
779
|
+
|
|
780
|
+
async def prepare_deactivate_stake(self, stake_account: str) -> dict[str, Any]:
|
|
781
|
+
raise WalletBackendError(f"{self.name} does not support stake deactivation preparation.")
|
|
782
|
+
|
|
783
|
+
async def execute_deactivate_stake(self, stake_account: str) -> dict[str, Any]:
|
|
784
|
+
raise WalletBackendError(f"{self.name} does not support stake deactivation.")
|
|
785
|
+
|
|
786
|
+
async def preview_withdraw_stake(
|
|
787
|
+
self,
|
|
788
|
+
stake_account: str,
|
|
789
|
+
amount_native: float,
|
|
790
|
+
recipient: str | None = None,
|
|
791
|
+
) -> dict[str, Any]:
|
|
792
|
+
raise WalletBackendError(f"{self.name} does not support stake withdraw previews.")
|
|
793
|
+
|
|
794
|
+
async def prepare_withdraw_stake(
|
|
795
|
+
self,
|
|
796
|
+
stake_account: str,
|
|
797
|
+
amount_native: float,
|
|
798
|
+
recipient: str | None = None,
|
|
799
|
+
) -> dict[str, Any]:
|
|
800
|
+
raise WalletBackendError(f"{self.name} does not support stake withdraw preparation.")
|
|
801
|
+
|
|
802
|
+
async def execute_withdraw_stake(
|
|
803
|
+
self,
|
|
804
|
+
stake_account: str,
|
|
805
|
+
amount_native: float,
|
|
806
|
+
recipient: str | None = None,
|
|
807
|
+
) -> dict[str, Any]:
|
|
808
|
+
raise WalletBackendError(f"{self.name} does not support stake withdraw.")
|