@thirdfy/agent-cli 0.3.0 → 0.4.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/CHANGELOG.md +110 -0
- package/README.md +60 -18
- package/package.json +2 -2
- package/scripts/validate-cli-contract-schemas.mjs +5 -0
- package/src/cli/errors.mjs +58 -8
- package/src/cli/manifest.mjs +54 -5
- package/src/cli/options/bootstrap.mjs +15 -3
- package/src/cli/options/chains.mjs +5 -0
- package/src/cli/options/credits.mjs +9 -0
- package/src/cli/options/data.mjs +13 -1
- package/src/cli/options/index.mjs +10 -4
- package/src/cli/options/walletControl.mjs +8 -0
- package/src/commands/bootstrap.mjs +44 -5
- package/src/commands/chat.mjs +3 -0
- package/src/commands/credits.mjs +39 -4
- package/src/commands/delegation.mjs +3 -1
- package/src/commands/discovery.mjs +156 -13
- package/src/commands/doctor.mjs +5 -2
- package/src/commands/execute.mjs +96 -3
- package/src/commands/prompt.mjs +5 -3
- package/src/commands/wallet.mjs +119 -3
- package/src/commands/walletControl.mjs +66 -0
- package/src/contracts/cli/schemas/actions.response.schema.json +45 -0
- package/src/contracts/cli/schemas/chains-non-evm.response.schema.json +76 -0
- package/src/contracts/cli/schemas/chains.response.schema.json +151 -0
- package/src/contracts/cli/schemas/error.response.schema.json +61 -0
- package/src/contracts/cli/schemas/preview.response.schema.json +179 -0
- package/src/contracts/cli/schemas/readiness.response.schema.json +94 -0
- package/src/core/args.mjs +10 -2
- package/src/core/chainRegistry.mjs +223 -1
- package/src/core/context.mjs +37 -14
- package/src/core/errorEnvelope.mjs +209 -0
- package/src/core/fundingTokenIn.mjs +24 -1
- package/src/core/http.mjs +6 -1
- package/src/core/readOnlyActions.mjs +10 -0
- package/src/core/walletExecuteChainId.mjs +25 -0
- package/src/lib/creditsUsdSummary.mjs +48 -4
- package/src/runtime/actions/actionList.mjs +87 -0
- package/src/runtime/actions/selection.mjs +17 -22
- package/src/runtime/execution/actionPreflight.mjs +50 -14
- package/src/runtime/execution/payloads.mjs +36 -28
- package/src/runtime/execution/runners.mjs +75 -21
- package/src/runtime/execution/svmLane.mjs +106 -0
- package/src/runtime/execution/walletControl.mjs +104 -0
- package/src/runtime/handlers.mjs +16 -2
- package/src/runtime/index.mjs +1 -1
- package/src/runtime/main.mjs +21 -5
- package/src/runtime/providerHints/apps.mjs +36 -0
- package/src/runtime/providerHints/catalogHint.mjs +55 -0
- package/src/runtime/providerHints/cex.mjs +130 -0
- package/src/runtime/providerHints/data.mjs +144 -0
- package/src/runtime/providerHints/dispatch.mjs +177 -0
- package/src/runtime/providerHints/dogeos.mjs +38 -0
- package/src/runtime/providerHints/earn.mjs +201 -0
- package/src/runtime/providerHints/perps.mjs +346 -0
- package/src/runtime/providerHints/prediction.mjs +128 -0
- package/src/runtime/providerHints/solana.mjs +85 -0
- package/src/runtime/providerHints/trading.mjs +78 -0
- package/src/runtime/providerHints/walletControl.mjs +39 -0
- package/src/runtime/risk/notional.mjs +59 -0
- package/src/runtime/risk/orderPreview.mjs +154 -0
- package/src/runtime/risk/riskRefusal.mjs +74 -0
- package/src/runtime/validation/actionParamsGate.mjs +2 -0
- package/src/runtime/providerHints.mjs +0 -1017
|
@@ -1,1017 +0,0 @@
|
|
|
1
|
-
import { normalizeVenueProviderId } from '../core/venueBrand.mjs';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Veranta (formerly Avantis) naming for the `avantis` / `avantis-vault` hints, static or from the
|
|
5
|
-
* capabilities manifest. Empty for every other provider.
|
|
6
|
-
*/
|
|
7
|
-
function verantaNamingFields(provider) {
|
|
8
|
-
if (provider !== 'avantis' && provider !== 'avantis-vault') return {};
|
|
9
|
-
const alias = provider === 'avantis' ? 'veranta' : 'veranta-vault';
|
|
10
|
-
return {
|
|
11
|
-
displayName: 'Veranta',
|
|
12
|
-
formerName: 'Avantis',
|
|
13
|
-
providerAliases: [alias],
|
|
14
|
-
actionNaming: `Veranta (formerly Avantis). Veranta action names (*_veranta_*) are canonical; Avantis names (*_avantis_*) still resolve. Provider id stays ${provider}; --provider ${alias} is an alias.`,
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Static and capabilities-backed provider discovery hints for CLI actions filtering.
|
|
20
|
-
*/
|
|
21
|
-
export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
|
|
22
|
-
function getTradingProviderHint(providerId) {
|
|
23
|
-
// `veranta` / `veranta-vault` resolve to the internal `avantis` / `avantis-vault` hints.
|
|
24
|
-
const provider = normalizeVenueProviderId(providerId || '');
|
|
25
|
-
const manifestHint = getCachedProviderHintFromCapabilities(provider);
|
|
26
|
-
const setupHints =
|
|
27
|
-
manifestHint?.setupHints && typeof manifestHint.setupHints === 'object' ? manifestHint.setupHints : {};
|
|
28
|
-
if (provider === 'hyperliquid') {
|
|
29
|
-
return {
|
|
30
|
-
provider,
|
|
31
|
-
category: 'leveraged_perps',
|
|
32
|
-
canonicalWriteAction: 'place_hyperliquid_perps_order',
|
|
33
|
-
readActions: [
|
|
34
|
-
'get_hyperliquid_perps_meta',
|
|
35
|
-
'get_hyperliquid_all_mids',
|
|
36
|
-
'search_hyperliquid_markets',
|
|
37
|
-
'get_hyperliquid_l2_book',
|
|
38
|
-
'get_hyperliquid_candles',
|
|
39
|
-
'get_hyperliquid_user_state',
|
|
40
|
-
'get_hyperliquid_open_orders',
|
|
41
|
-
'get_hyperliquid_funding_status',
|
|
42
|
-
'get_hyperliquid_onboarding_plan',
|
|
43
|
-
'get_hyperliquid_referral_status',
|
|
44
|
-
'get_hyperliquid_builder_fee_status',
|
|
45
|
-
'quote_hyperliquid_cctp_deposit',
|
|
46
|
-
],
|
|
47
|
-
orderManagementActions: [
|
|
48
|
-
'place_hyperliquid_perps_order',
|
|
49
|
-
'place_hyperliquid_tp_sl',
|
|
50
|
-
'cancel_hyperliquid_perps_order',
|
|
51
|
-
'update_hyperliquid_leverage',
|
|
52
|
-
'get_hyperliquid_open_orders',
|
|
53
|
-
],
|
|
54
|
-
setupActions: [
|
|
55
|
-
'get_hyperliquid_funding_status',
|
|
56
|
-
'get_hyperliquid_setup_status',
|
|
57
|
-
'get_hyperliquid_onboarding_plan',
|
|
58
|
-
'prepare_hyperliquid_onboarding',
|
|
59
|
-
'complete_hyperliquid_onboarding',
|
|
60
|
-
'quote_hyperliquid_cctp_deposit',
|
|
61
|
-
'deposit_hyperliquid_cctp',
|
|
62
|
-
'deposit_hyperliquid_bridge',
|
|
63
|
-
'transfer_hyperliquid_spot_to_perps',
|
|
64
|
-
'get_bridge_quote',
|
|
65
|
-
'execute_bridge',
|
|
66
|
-
'approve_hyperliquid_agent',
|
|
67
|
-
'get_hyperliquid_builder_fee_status',
|
|
68
|
-
'approve_hyperliquid_builder_fee',
|
|
69
|
-
'set_hyperliquid_referrer',
|
|
70
|
-
'deposit_hyperliquid_staking',
|
|
71
|
-
'claim_hyperliquid_testnet_faucet',
|
|
72
|
-
],
|
|
73
|
-
statusActions: [
|
|
74
|
-
'get_hyperliquid_funding_status',
|
|
75
|
-
'get_hyperliquid_setup_status',
|
|
76
|
-
'get_hyperliquid_builder_fee_status',
|
|
77
|
-
'get_hyperliquid_referral_status',
|
|
78
|
-
],
|
|
79
|
-
recoveryActions: [
|
|
80
|
-
'get_hyperliquid_user_state',
|
|
81
|
-
'withdraw_hyperliquid_to_arbitrum',
|
|
82
|
-
],
|
|
83
|
-
decommissionExample:
|
|
84
|
-
'get_hyperliquid_user_state -> withdraw_hyperliquid_to_arbitrum -> withdraw-to-user on execution wallet',
|
|
85
|
-
credentialType: 'hyperliquid_api_wallet',
|
|
86
|
-
credentialUx:
|
|
87
|
-
'Thirdfy manages Hyperliquid API-wallet setup for normal users. Delegated writes require encrypted privateKey-backed hyperliquid_api_wallet credentials; walletAddress-only records are rejected until Privy walletId-backed Hyperliquid signing ships.',
|
|
88
|
-
supportedFundingSourceChains: [
|
|
89
|
-
{ chainId: 8453, name: 'Base' },
|
|
90
|
-
{ chainId: 42161, name: 'Arbitrum One' },
|
|
91
|
-
{ chainId: 137, name: 'Polygon' },
|
|
92
|
-
{ chainId: 1, name: 'Ethereum' },
|
|
93
|
-
],
|
|
94
|
-
setupBlockers: [
|
|
95
|
-
'HYPERLIQUID_SOURCE_FUNDS_REQUIRED',
|
|
96
|
-
'HYPERLIQUID_API_WALLET_APPROVAL_REQUIRED',
|
|
97
|
-
'HYPERLIQUID_BUILDER_APPROVAL_REQUIRED',
|
|
98
|
-
'HYPERLIQUID_POLICY_REQUIRED',
|
|
99
|
-
'HYPERLIQUID_CREDITS_REQUIRED',
|
|
100
|
-
'HYPERLIQUID_API_WALLET_SIGNER_REQUIRED',
|
|
101
|
-
],
|
|
102
|
-
setupWarnings: [
|
|
103
|
-
'HYPERLIQUID_BUILDER_WALLET_UNFUNDED',
|
|
104
|
-
'HYPERLIQUID_API_WALLET_NOT_PROVIDED',
|
|
105
|
-
],
|
|
106
|
-
funding:
|
|
107
|
-
'Follow nextAction and nextActionParams from get_hyperliquid_funding_status. Do not invent a funding chain.',
|
|
108
|
-
laneCompatibility:
|
|
109
|
-
'Use self/BYOW only for setup signatures or source-chain funding transactions. Perps order placement is an offchain venue write and should use thirdfy, hybrid, or agent_wallet. The default solo agent_wallet path uses the managed execution wallet as the Hyperliquid master address. If margin already sits on a distinct Hyperliquid main wallet, pass that as userAddress/mainWalletAddress and pass the approved execution/API wallet as apiWalletAddress.',
|
|
110
|
-
setupExample:
|
|
111
|
-
'actions --provider hyperliquid -> get_hyperliquid_funding_status -> complete_hyperliquid_onboarding for runtime-owned setup, or get_hyperliquid_onboarding_plan/prepare_hyperliquid_onboarding for operator previews -> follow nextAction with nextActionParams -> get_hyperliquid_setup_status before place_hyperliquid_perps_order',
|
|
112
|
-
monetization:
|
|
113
|
-
'Builder monetization is active only when the API operator configured a builder address and the builder treasury has Hyperliquid margin. When active, the main wallet signs approve_hyperliquid_builder_fee once and orders attach builder fees. When the treasury is unfunded, get_hyperliquid_setup_status can return ready=true with warning HYPERLIQUID_BUILDER_WALLET_UNFUNDED, get_hyperliquid_builder_fee_status returns monetizationEnabled=false with reason BUILDER_WALLET_UNFUNDED, and place_hyperliquid_perps_order does not require builder approval.',
|
|
114
|
-
example:
|
|
115
|
-
'thirdfy-agent actions --provider hyperliquid && thirdfy-agent preflight --action place_hyperliquid_perps_order --params \'{"coin":"ETH","isBuy":true,"size":0.01,"limitPx":3500,"orderType":"market"}\'',
|
|
116
|
-
...(manifestHint || {}),
|
|
117
|
-
...setupHints,
|
|
118
|
-
provider,
|
|
119
|
-
source: manifestHint ? 'cli_capabilities_manifest' : 'static_provider_hint',
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
if (manifestHint) return manifestHint;
|
|
123
|
-
if (provider === 'trading') {
|
|
124
|
-
return {
|
|
125
|
-
provider,
|
|
126
|
-
category: 'onchain_spot',
|
|
127
|
-
canonicalWriteAction: 'swap',
|
|
128
|
-
supportedChains: [1, 10, 130, 137, 8453, 84532, 42161, 4663],
|
|
129
|
-
laneCompatibility:
|
|
130
|
-
'Kyber quote/build is live on Ethereum, Optimism, Unichain, Polygon, Base, and Arbitrum; sponsored Kyber execution is validated on Base only. Robinhood Chain (4663) uses Li.Fi Intents for spot swaps with user-pays gas. Gnosis FX uses the fx provider via CoW. Pass private: true to swap from the shielded (Bermuda) balance on a fresh burner where a Bermuda pool exists (Base Sepolia 84532 today); it fails instead of falling back to a public swap.',
|
|
131
|
-
credentialUx: 'Use normal Thirdfy login/delegation; do not use this provider for Hyperliquid, Lighter, or Polymarket.',
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
if (provider === 'lighter') {
|
|
135
|
-
return {
|
|
136
|
-
provider,
|
|
137
|
-
category: 'leveraged_perps',
|
|
138
|
-
canonicalWriteAction: 'place_lighter_perps_order',
|
|
139
|
-
readActions: [
|
|
140
|
-
'get_lighter_markets',
|
|
141
|
-
'search_lighter_markets',
|
|
142
|
-
'get_lighter_order_book',
|
|
143
|
-
'get_lighter_candles',
|
|
144
|
-
'get_lighter_funding_rates',
|
|
145
|
-
'get_lighter_account',
|
|
146
|
-
'get_lighter_positions',
|
|
147
|
-
'get_lighter_open_orders',
|
|
148
|
-
'get_lighter_pnl',
|
|
149
|
-
'get_lighter_funding_status',
|
|
150
|
-
'get_lighter_setup_status',
|
|
151
|
-
'get_lighter_onboarding_plan',
|
|
152
|
-
'get_lighter_integrator_status',
|
|
153
|
-
'get_lighter_partner_stats',
|
|
154
|
-
],
|
|
155
|
-
orderManagementActions: [
|
|
156
|
-
'place_lighter_perps_order',
|
|
157
|
-
'cancel_lighter_perps_order',
|
|
158
|
-
'modify_lighter_perps_order',
|
|
159
|
-
'update_lighter_leverage',
|
|
160
|
-
'update_lighter_margin',
|
|
161
|
-
'get_lighter_open_orders',
|
|
162
|
-
],
|
|
163
|
-
setupActions: [
|
|
164
|
-
'get_lighter_funding_status',
|
|
165
|
-
'get_lighter_setup_status',
|
|
166
|
-
'get_lighter_onboarding_plan',
|
|
167
|
-
'prepare_lighter_onboarding',
|
|
168
|
-
'complete_lighter_onboarding',
|
|
169
|
-
'create_lighter_deposit_intent',
|
|
170
|
-
'setup_lighter_api_key',
|
|
171
|
-
'create_lighter_api_key',
|
|
172
|
-
'register_lighter_api_key',
|
|
173
|
-
'approve_lighter_integrator',
|
|
174
|
-
'get_bridge_quote',
|
|
175
|
-
'execute_bridge',
|
|
176
|
-
],
|
|
177
|
-
statusActions: [
|
|
178
|
-
'get_lighter_funding_status',
|
|
179
|
-
'get_lighter_setup_status',
|
|
180
|
-
'get_lighter_integrator_status',
|
|
181
|
-
],
|
|
182
|
-
recoveryActions: [
|
|
183
|
-
'get_lighter_account',
|
|
184
|
-
'get_lighter_withdrawal_status',
|
|
185
|
-
'prepare_lighter_secure_withdrawal',
|
|
186
|
-
],
|
|
187
|
-
decommissionExample:
|
|
188
|
-
'get_lighter_account -> prepare_lighter_secure_withdrawal -> withdraw-to-user on execution wallet',
|
|
189
|
-
credentialType: 'lighter_api_key',
|
|
190
|
-
credentialUx:
|
|
191
|
-
'Delegated Lighter writes require encrypted lighter_api_key credentials: privateKey, apiKeyIndex (4-254), and accountIndex. Upsert via delegation credentials before place_lighter_perps_order.',
|
|
192
|
-
recommendedFundingChainId: 8453,
|
|
193
|
-
supportedFundingSourceChains: [
|
|
194
|
-
{ chainId: 8453, name: 'Base', path: 'native USDC -> CCTP intent -> Lighter margin (recommended)' },
|
|
195
|
-
{ chainId: 42161, name: 'Arbitrum One', path: 'Li.Fi -> Base USDC -> CCTP intent -> Lighter margin' },
|
|
196
|
-
{ chainId: 43114, name: 'Avalanche', path: 'Li.Fi -> Base USDC -> CCTP intent -> Lighter margin' },
|
|
197
|
-
{ chainId: 1, name: 'Ethereum', path: 'Priority changePubKey registration only (chainId 1)' },
|
|
198
|
-
],
|
|
199
|
-
setupBlockers: [
|
|
200
|
-
'LIGHTER_SOURCE_FUNDS_REQUIRED',
|
|
201
|
-
'LIGHTER_DEPOSIT_REQUIRED',
|
|
202
|
-
'LIGHTER_ACCOUNT_NOT_FOUND',
|
|
203
|
-
'LIGHTER_API_KEY_REGISTRATION_REQUIRED',
|
|
204
|
-
'LIGHTER_INTEGRATOR_APPROVAL_REQUIRED',
|
|
205
|
-
'LIGHTER_POLICY_REQUIRED',
|
|
206
|
-
'LIGHTER_CREDITS_REQUIRED',
|
|
207
|
-
'LIGHTER_SIGNER_NOT_CONFIGURED',
|
|
208
|
-
],
|
|
209
|
-
setupWarnings: [
|
|
210
|
-
'LIGHTER_API_KEY_NOT_PROVIDED',
|
|
211
|
-
'LIGHTER_INTEGRATOR_ACCOUNT_UNFUNDED',
|
|
212
|
-
],
|
|
213
|
-
sourceBridgeProvider: 'lifi',
|
|
214
|
-
funding:
|
|
215
|
-
'Run complete_lighter_onboarding on Base (chainId 8453) for Li.Fi, CCTP intent, and USDC transfer. When margin is credited, the API auto-switches to Ethereum API key registration on the next complete_lighter_onboarding call. Minimum CCTP deposit is 5 USDC.',
|
|
216
|
-
laneCompatibility:
|
|
217
|
-
'Use agent_wallet and repeat complete_lighter_onboarding on chainId 8453 until get_lighter_setup_status.ready is true. Perps writes use thirdfy, hybrid, or agent_wallet with a stored lighter_api_key credential. Gator covers EVM funding and setup only, not L2 orders.',
|
|
218
|
-
setupExample:
|
|
219
|
-
'actions --provider lighter -> complete_lighter_onboarding (chainId 8453, agent_wallet) -> repeat until get_lighter_setup_status.ready -> place_lighter_perps_order',
|
|
220
|
-
example:
|
|
221
|
-
'thirdfy-agent actions --provider lighter && thirdfy-agent preflight --action place_lighter_perps_order --params \'{"accountIndex":1,"apiKeyIndex":4,"marketId":0,"baseAmount":100,"price":310000,"isAsk":false,"orderType":"limit"}\'',
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
if (provider === 'avantis') {
|
|
225
|
-
return {
|
|
226
|
-
provider,
|
|
227
|
-
...verantaNamingFields(provider),
|
|
228
|
-
category: 'leveraged_perps',
|
|
229
|
-
canonicalWriteAction: 'place_veranta_perps_order',
|
|
230
|
-
readActions: [
|
|
231
|
-
'get_veranta_markets',
|
|
232
|
-
'get_veranta_pair',
|
|
233
|
-
'get_veranta_price',
|
|
234
|
-
'get_veranta_spread',
|
|
235
|
-
'get_veranta_positions',
|
|
236
|
-
'get_veranta_open_orders',
|
|
237
|
-
'get_veranta_allowance',
|
|
238
|
-
'get_veranta_delegation_status',
|
|
239
|
-
'get_veranta_funding_status',
|
|
240
|
-
'get_veranta_setup_status',
|
|
241
|
-
'get_veranta_onboarding_plan',
|
|
242
|
-
'get_veranta_builder_fee_status',
|
|
243
|
-
'get_veranta_referral_status',
|
|
244
|
-
'get_veranta_referral_stats',
|
|
245
|
-
],
|
|
246
|
-
orderManagementActions: [
|
|
247
|
-
'place_veranta_perps_order',
|
|
248
|
-
'cancel_veranta_perps_order',
|
|
249
|
-
'close_veranta_position',
|
|
250
|
-
'update_veranta_tp_sl',
|
|
251
|
-
'cancel_veranta_tp_sl',
|
|
252
|
-
'place_veranta_twap_order',
|
|
253
|
-
'close_veranta_twap_order',
|
|
254
|
-
'cancel_veranta_twap_order',
|
|
255
|
-
'place_veranta_coin_perps_order',
|
|
256
|
-
'increase_veranta_coin_position',
|
|
257
|
-
'close_veranta_coin_position',
|
|
258
|
-
'place_veranta_mm_order',
|
|
259
|
-
'cancel_veranta_mm_order',
|
|
260
|
-
'get_veranta_open_orders',
|
|
261
|
-
'get_veranta_positions',
|
|
262
|
-
],
|
|
263
|
-
setupActions: [
|
|
264
|
-
'get_veranta_funding_status',
|
|
265
|
-
'get_veranta_setup_status',
|
|
266
|
-
'get_veranta_onboarding_plan',
|
|
267
|
-
'prepare_veranta_onboarding',
|
|
268
|
-
'complete_veranta_onboarding',
|
|
269
|
-
'approve_veranta_builder_fee',
|
|
270
|
-
'revoke_veranta_builder_fee',
|
|
271
|
-
'set_veranta_referral_code',
|
|
272
|
-
'register_veranta_referral_code',
|
|
273
|
-
'claim_veranta_referral_rebate',
|
|
274
|
-
],
|
|
275
|
-
statusActions: [
|
|
276
|
-
'get_veranta_funding_status',
|
|
277
|
-
'get_veranta_setup_status',
|
|
278
|
-
'get_veranta_builder_fee_status',
|
|
279
|
-
'get_veranta_delegation_status',
|
|
280
|
-
],
|
|
281
|
-
recoveryActions: [
|
|
282
|
-
'get_veranta_positions',
|
|
283
|
-
'close_veranta_position',
|
|
284
|
-
],
|
|
285
|
-
decommissionExample:
|
|
286
|
-
'get_veranta_positions -> close_veranta_position -> withdraw-to-user on execution wallet (Base USDC)',
|
|
287
|
-
credentialType: 'avantis_delegate',
|
|
288
|
-
credentialUx:
|
|
289
|
-
'Thirdfy mints and stores the encrypted Veranta delegate. CLI callers use Thirdfy auth only. Do not paste a private key.',
|
|
290
|
-
recommendedFundingChainId: 8453,
|
|
291
|
-
supportedFundingSourceChains: [
|
|
292
|
-
{ chainId: 8453, name: 'Base', path: 'native USDC in managed execution wallet (recommended)' },
|
|
293
|
-
],
|
|
294
|
-
setupBlockers: [
|
|
295
|
-
'AVANTIS_USDC_BALANCE_REQUIRED',
|
|
296
|
-
'AVANTIS_USDC_ALLOWANCE_REQUIRED',
|
|
297
|
-
'AVANTIS_DELEGATION_REQUIRED',
|
|
298
|
-
'AVANTIS_DELEGATE_CREDENTIAL_REQUIRED',
|
|
299
|
-
],
|
|
300
|
-
setupWarnings: ['AVANTIS_BUILDER_TEMPLATE_UNWIRED'],
|
|
301
|
-
supportedChains: [8453],
|
|
302
|
-
funding:
|
|
303
|
-
'Fund the managed execution wallet on Base (8453) with native USDC. Minimum collateral follows the live catalog notional floor.',
|
|
304
|
-
laneCompatibility:
|
|
305
|
-
'Use agent_wallet for solo managed-wallet onboarding and perps writes after avantis_delegate credential is stored. Use thirdfy or hybrid for delegated capital. Thirdfy builds EIP-712 intents; the delegate credential signs batched-market submissions. Relayer is default. Builder-fee collection stays unwired until Veranta supplies a fee-enabled template.',
|
|
306
|
-
setupExample:
|
|
307
|
-
'actions --provider veranta -> get_veranta_funding_status -> complete_veranta_onboarding (agent_wallet on Base 8453) -> get_veranta_setup_status before place_veranta_perps_order. Do not call approve_veranta_builder_fee until setup status shows a wired template.',
|
|
308
|
-
example:
|
|
309
|
-
'thirdfy-agent actions --provider veranta && thirdfy-agent preflight --action place_veranta_perps_order --params \'{"pairIndex":0,"side":"long","collateralUsdc":10,"leverage":10,"orderType":"market"}\'',
|
|
310
|
-
};
|
|
311
|
-
}
|
|
312
|
-
if (provider === 'avantis-vault') {
|
|
313
|
-
return {
|
|
314
|
-
provider,
|
|
315
|
-
...verantaNamingFields(provider),
|
|
316
|
-
category: 'earn',
|
|
317
|
-
canonicalReadAction: 'get_veranta_vault_info',
|
|
318
|
-
canonicalWriteAction: 'deposit_veranta_vault',
|
|
319
|
-
readActions: ['get_veranta_vault_info', 'get_veranta_vault_position'],
|
|
320
|
-
orderManagementActions: [
|
|
321
|
-
'deposit_veranta_vault',
|
|
322
|
-
'request_veranta_vault_withdrawal',
|
|
323
|
-
'redeem_veranta_vault',
|
|
324
|
-
'claim_veranta_vault',
|
|
325
|
-
],
|
|
326
|
-
recommendedFundingChainId: 8453,
|
|
327
|
-
supportedChains: [8453],
|
|
328
|
-
funding: 'Fund the managed execution wallet on Base with native USDC before vault deposit.',
|
|
329
|
-
laneCompatibility: 'Veranta (formerly Avantis) LP vault on Base. Use agent_wallet, thirdfy, or hybrid. Relayer is default.',
|
|
330
|
-
example:
|
|
331
|
-
'thirdfy-agent actions --provider veranta-vault && thirdfy-agent run --action get_veranta_vault_info --provider veranta-vault --json',
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
if (provider === 'bitfinex') {
|
|
335
|
-
return {
|
|
336
|
-
provider,
|
|
337
|
-
category: 'cex_funding',
|
|
338
|
-
canonicalReadAction: 'get_bitfinex_funding_ticker',
|
|
339
|
-
canonicalWriteAction: 'submit_bitfinex_funding_offer',
|
|
340
|
-
readActions: [
|
|
341
|
-
'get_bitfinex_funding_ticker',
|
|
342
|
-
'get_bitfinex_funding_stats_hist',
|
|
343
|
-
'get_bitfinex_funding_book',
|
|
344
|
-
'get_bitfinex_funding_info',
|
|
345
|
-
'get_bitfinex_wallets',
|
|
346
|
-
'list_bitfinex_funding_offers',
|
|
347
|
-
'list_bitfinex_funding_credits',
|
|
348
|
-
],
|
|
349
|
-
orderManagementActions: [
|
|
350
|
-
'submit_bitfinex_funding_offer',
|
|
351
|
-
'cancel_bitfinex_funding_offer',
|
|
352
|
-
'submit_bitfinex_order',
|
|
353
|
-
'update_bitfinex_order',
|
|
354
|
-
'cancel_bitfinex_order',
|
|
355
|
-
],
|
|
356
|
-
credentialType: 'bitfinex_api_key',
|
|
357
|
-
credentialRef: 'bitfinex:funding-primary',
|
|
358
|
-
credentialUx:
|
|
359
|
-
'Save and verify Bitfinex funding credentials in EarnClaw/Thirdfy first. MCP/CLI order intents reference credentialRef only; raw keys are never sent through agentRun.',
|
|
360
|
-
laneCompatibility:
|
|
361
|
-
'Bitfinex CEX writes require thirdfy, hybrid, or agent_wallet so Thirdfy can inject stored credentials and run policy/preflight. Reads and setup discovery can be listed without raw credentials.',
|
|
362
|
-
example:
|
|
363
|
-
'thirdfy-agent actions --provider bitfinex && thirdfy-agent run --run-mode thirdfy --action submit_bitfinex_funding_offer --params \'{"symbol":"fUSD","amount":"100","rate":"0.0002","period":2,"credentialRef":"bitfinex:funding-primary"}\'',
|
|
364
|
-
};
|
|
365
|
-
}
|
|
366
|
-
if (provider === 'polymarket') {
|
|
367
|
-
return {
|
|
368
|
-
provider,
|
|
369
|
-
category: 'prediction_market',
|
|
370
|
-
canonicalWriteAction: 'place_polymarket_order',
|
|
371
|
-
readActions: [
|
|
372
|
-
'get_polymarket_tags',
|
|
373
|
-
'search_polymarket',
|
|
374
|
-
'get_polymarket_events',
|
|
375
|
-
'get_polymarket_event',
|
|
376
|
-
'get_polymarket_markets',
|
|
377
|
-
'get_polymarket_market',
|
|
378
|
-
'get_polymarket_order_book',
|
|
379
|
-
'get_polymarket_prices',
|
|
380
|
-
'get_polymarket_price_history',
|
|
381
|
-
'get_polymarket_setup_status',
|
|
382
|
-
'get_polymarket_onboarding_plan',
|
|
383
|
-
'get_polymarket_order',
|
|
384
|
-
'get_polymarket_user_orders',
|
|
385
|
-
'get_polymarket_user_positions',
|
|
386
|
-
'get_polymarket_balance_allowance',
|
|
387
|
-
'get_polymarket_bridge_supported_assets',
|
|
388
|
-
'get_polymarket_bridge_status',
|
|
389
|
-
],
|
|
390
|
-
discoveryFlow: [
|
|
391
|
-
'get_polymarket_tags or search_polymarket',
|
|
392
|
-
'get_polymarket_events active=true closed=false',
|
|
393
|
-
'get_polymarket_market or get_polymarket_markets',
|
|
394
|
-
'get_polymarket_order_book',
|
|
395
|
-
'get_polymarket_prices or get_polymarket_price_history',
|
|
396
|
-
'get_polymarket_funding_status with agentKey (check deposit pUSD + nested setup status)',
|
|
397
|
-
'when Base USDC is on execution wallet: create_polymarket_bridge_deposit then execute_polymarket_bridge_deposit with confirm=true',
|
|
398
|
-
'get_polymarket_bridge_status until pUSD lands',
|
|
399
|
-
'get_polymarket_setup_status with agentKey (check liveOrderReady + apiExecutionGeoblockReady) before place_polymarket_order',
|
|
400
|
-
],
|
|
401
|
-
orderManagementActions: [
|
|
402
|
-
'place_polymarket_order',
|
|
403
|
-
'get_polymarket_order',
|
|
404
|
-
'get_polymarket_user_orders',
|
|
405
|
-
'get_polymarket_user_positions',
|
|
406
|
-
'get_polymarket_balance_allowance',
|
|
407
|
-
'cancel_polymarket_order',
|
|
408
|
-
],
|
|
409
|
-
setupActions: [
|
|
410
|
-
'get_polymarket_setup_status',
|
|
411
|
-
'get_polymarket_onboarding_plan',
|
|
412
|
-
'create_polymarket_bridge_deposit',
|
|
413
|
-
'execute_polymarket_bridge_deposit',
|
|
414
|
-
'agent_wallet_setup:ensure_agent_wallet_deposit_wallet',
|
|
415
|
-
'agent_wallet_setup:deploy_deposit_wallet_and_set_approvals',
|
|
416
|
-
'agent_wallet_setup:create_or_derive_clob_credentials',
|
|
417
|
-
'browser_setup:add_privy_signer',
|
|
418
|
-
'browser_setup:create_or_derive_clob_credentials',
|
|
419
|
-
'browser_setup:deploy_deposit_wallet_and_set_approvals',
|
|
420
|
-
],
|
|
421
|
-
statusActions: [
|
|
422
|
-
'get_polymarket_funding_status',
|
|
423
|
-
'get_polymarket_setup_status',
|
|
424
|
-
'get_polymarket_recovery_status',
|
|
425
|
-
],
|
|
426
|
-
recoveryActions: [
|
|
427
|
-
'get_polymarket_recovery_status',
|
|
428
|
-
'create_polymarket_bridge_withdraw',
|
|
429
|
-
'execute_polymarket_bridge_withdraw',
|
|
430
|
-
'get_polymarket_bridge_status',
|
|
431
|
-
'withdraw_polymarket_collateral',
|
|
432
|
-
],
|
|
433
|
-
decommissionExample:
|
|
434
|
-
'get_polymarket_recovery_status -> create_polymarket_bridge_withdraw -> execute_polymarket_bridge_withdraw -> withdraw-to-user',
|
|
435
|
-
credentialType: 'polymarket_clob',
|
|
436
|
-
credentialUx:
|
|
437
|
-
'Autonomous agents use an agent-owned Privy wallet and Polymarket deposit wallet first: Thirdfy creates the agent wallet, deploys/approves the deposit wallet, and stores encrypted CLOB credentials once Polymarket key creation is available. User-owned browser setup remains optional for interactive capital.',
|
|
438
|
-
funding:
|
|
439
|
-
'Fund the agent-owned Polymarket deposit wallet with Polygon pUSD after deployment and approvals. If users start with Base USDC, use Polymarket official Bridge (create/execute_polymarket_bridge_deposit). Li.Fi is legacy fallback only.',
|
|
440
|
-
laneCompatibility:
|
|
441
|
-
'Use agent_wallet as the preferred autonomous-agent path. Use self only for user-owned setup/funding signatures. CLOB orders should use thirdfy, hybrid, or agent_wallet after polymarket_clob credentials are stored.',
|
|
442
|
-
setupBlockers: [
|
|
443
|
-
'POLYMARKET_DEPOSIT_WALLET_REQUIRED',
|
|
444
|
-
'POLYMARKET_CLOB_CREDENTIALS_REQUIRED',
|
|
445
|
-
'POLYMARKET_DEPOSIT_WALLET_DEPLOY_REQUIRED',
|
|
446
|
-
'POLYMARKET_DEPOSIT_WALLET_APPROVALS_REQUIRED',
|
|
447
|
-
'POLYMARKET_DEPOSIT_WALLET_PUSD_REQUIRED',
|
|
448
|
-
'POLYMARKET_CREDITS_REQUIRED',
|
|
449
|
-
'POLYMARKET_RELAYER_UNAVAILABLE',
|
|
450
|
-
'POLYMARKET_CLOB_KEY_CREATION_BLOCKED_UNTIL_POLYMARKET_FIX',
|
|
451
|
-
],
|
|
452
|
-
example:
|
|
453
|
-
'thirdfy-agent actions --provider polymarket && thirdfy-agent preflight --action place_polymarket_order --params \'{"tokenID":"...","price":0.42,"size":10,"side":"BUY"}\'',
|
|
454
|
-
};
|
|
455
|
-
}
|
|
456
|
-
if (provider === 'prediction') {
|
|
457
|
-
return {
|
|
458
|
-
provider,
|
|
459
|
-
category: 'prediction',
|
|
460
|
-
canonicalWriteAction: 'place_prediction_order',
|
|
461
|
-
readActions: [
|
|
462
|
-
'get_prediction_tags',
|
|
463
|
-
'get_prediction_markets',
|
|
464
|
-
'get_prediction_events',
|
|
465
|
-
'get_prediction_market',
|
|
466
|
-
'get_prediction_order_book',
|
|
467
|
-
'search_prediction_markets',
|
|
468
|
-
],
|
|
469
|
-
discoveryFlow: [
|
|
470
|
-
'get_prediction_tags (resolve numeric tag_id once)',
|
|
471
|
-
'get_prediction_markets with tag_id + end_date_min/end_date_max + liquidity_num_min',
|
|
472
|
-
'get_prediction_order_book when book prices are missing',
|
|
473
|
-
'place_prediction_order after setup/funding/preflight',
|
|
474
|
-
'search_prediction_markets last for human text/slug lookup only',
|
|
475
|
-
],
|
|
476
|
-
orderManagementActions: ['place_prediction_order', 'cancel_prediction_order'],
|
|
477
|
-
compatibilityProvider: 'polymarket',
|
|
478
|
-
};
|
|
479
|
-
}
|
|
480
|
-
if (provider === 'bridge') {
|
|
481
|
-
return {
|
|
482
|
-
provider,
|
|
483
|
-
category: 'bridge',
|
|
484
|
-
canonicalReadAction: 'get_bridge_quote',
|
|
485
|
-
canonicalWriteAction: 'execute_bridge',
|
|
486
|
-
readActions: ['get_bridge_quote', 'get_supported_bridge_chains', 'check_bridge_status'],
|
|
487
|
-
orderManagementActions: ['execute_bridge'],
|
|
488
|
-
supportedChains: [1, 8453, 42161, 10, 137, 56, 43114, 250, 100, 1284, 1285, 25, 288, 1088, 42220, 122, 324, 59144, 534352, 5000, 81457, 169, 4663],
|
|
489
|
-
laneCompatibility: 'Li.Fi bridge supports mainnet value movement only; testnets are not auto-mapped to mainnet.',
|
|
490
|
-
};
|
|
491
|
-
}
|
|
492
|
-
if (provider === 'earn') {
|
|
493
|
-
return {
|
|
494
|
-
provider,
|
|
495
|
-
category: 'earn',
|
|
496
|
-
canonicalReadAction: 'get_earning_opportunities',
|
|
497
|
-
canonicalWriteAction: 'deposit_earn_position',
|
|
498
|
-
readActions: [
|
|
499
|
-
'get_earning_opportunities',
|
|
500
|
-
'get_earn_opportunities',
|
|
501
|
-
'get_earn_provider',
|
|
502
|
-
'get_earn_position',
|
|
503
|
-
'get_morpho_vaults',
|
|
504
|
-
'get_aave_markets',
|
|
505
|
-
'get_aave_portfolio',
|
|
506
|
-
'get_aegis_pools',
|
|
507
|
-
'get_aegis_pool_state',
|
|
508
|
-
'get_aegis_vault_state',
|
|
509
|
-
'get_curve_pools',
|
|
510
|
-
'get-vaults-fyi-vaults',
|
|
511
|
-
'get_yield_xyz_opportunities',
|
|
512
|
-
],
|
|
513
|
-
orderManagementActions: ['deposit_earn_position', 'withdraw_earn_position', 'claim_earn_rewards'],
|
|
514
|
-
laneCompatibility:
|
|
515
|
-
'Generic earn writes use deposit_earn_position / withdraw_earn_position on normal Thirdfy policy/delegation rails; Yield.xyz incentive claims use claim_earn_rewards (no amount; optional passthrough from get_earn_position.claimableRewards). Routing selects Morpho, Aave, Curve, Vaults.fyi, or Yield.xyz adapters per provider/opportunity. With private: true (deposit_earn_position / withdraw_earn_position) the position is entered or exited from the shielded (Bermuda) USDC balance on allowlisted vaults where a Bermuda pool exists (Base Sepolia MetaMorpho today); a private withdraw without amount exits everything; otherwise it is refused, never run publicly.',
|
|
516
|
-
};
|
|
517
|
-
}
|
|
518
|
-
if (provider === 'capyfi') {
|
|
519
|
-
return {
|
|
520
|
-
provider,
|
|
521
|
-
category: 'earn',
|
|
522
|
-
canonicalReadAction: 'get_capyfi_markets',
|
|
523
|
-
canonicalWriteAction: 'deposit_earn_position',
|
|
524
|
-
readActions: ['get_capyfi_markets', 'get_earning_opportunities', 'get_earn_opportunities', 'get_earn_position'],
|
|
525
|
-
orderManagementActions: ['deposit_earn_position', 'withdraw_earn_position'],
|
|
526
|
-
supportedChains: [1, 480],
|
|
527
|
-
laneCompatibility: 'CapyFi Compound-v2 supply on Ethereum and World Chain; Gnosis pending deployment addresses.',
|
|
528
|
-
example:
|
|
529
|
-
'thirdfy-agent run --action deposit_earn_position --params \'{"providerId":"capyfi","opportunityId":"capyfi-1-usdc","amount":"100","chainId":1,"tokenAddress":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"}\'',
|
|
530
|
-
};
|
|
531
|
-
}
|
|
532
|
-
if (provider === 'fx') {
|
|
533
|
-
return {
|
|
534
|
-
provider,
|
|
535
|
-
category: 'fx',
|
|
536
|
-
canonicalReadAction: 'get_fx_supported_assets',
|
|
537
|
-
readActions: ['get_fx_supported_assets', 'quote_fx_swap', 'get_monerium_profile_status'],
|
|
538
|
-
supportedChains: [100],
|
|
539
|
-
laneCompatibility:
|
|
540
|
-
'Gnosis FX: quote_fx_swap is read-only; on-chain execution uses the trading/cow path on chain 100. Monerium IBAN flows need credentials.',
|
|
541
|
-
};
|
|
542
|
-
}
|
|
543
|
-
if (provider === 'morpho') {
|
|
544
|
-
return {
|
|
545
|
-
provider,
|
|
546
|
-
category: 'earn',
|
|
547
|
-
canonicalReadAction: 'get_morpho_vaults',
|
|
548
|
-
canonicalWriteAction: 'deposit_earn_position',
|
|
549
|
-
readActions: ['get_morpho_vaults', 'get_earn_provider', 'get_earn_position'],
|
|
550
|
-
orderManagementActions: ['deposit_earn_position', 'withdraw_earn_position'],
|
|
551
|
-
supportedChains: [8453, 4663],
|
|
552
|
-
laneCompatibility:
|
|
553
|
-
'Base MetaMorpho V1 vaults are writable (use depositPlan from discovery). Robinhood Vault V2 on 4663 is discoverable read-only until maxDeposit > 0. Deposits require ERC-20 approval before deposit_earn_position.',
|
|
554
|
-
example:
|
|
555
|
-
'thirdfy-agent run --action get_earn_opportunities --params \'{"providerId":"morpho","chainId":8453,"asset":"USDC"}\' && thirdfy-agent run --action deposit_earn_position --params \'{"providerId":"morpho","chainId":8453,"vaultAddress":"0x...","tokenAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","amount":"0.1","tokenDecimals":6}\'',
|
|
556
|
-
};
|
|
557
|
-
}
|
|
558
|
-
if (provider === 'aave') {
|
|
559
|
-
return {
|
|
560
|
-
provider,
|
|
561
|
-
category: 'earn',
|
|
562
|
-
canonicalReadAction: 'get_aave_markets',
|
|
563
|
-
canonicalWriteAction: 'deposit_earn_position',
|
|
564
|
-
readActions: [
|
|
565
|
-
'get_aave_markets',
|
|
566
|
-
'get_aave_portfolio',
|
|
567
|
-
'get_earning_opportunities',
|
|
568
|
-
'get_earn_opportunities',
|
|
569
|
-
'get_earn_position',
|
|
570
|
-
],
|
|
571
|
-
orderManagementActions: [
|
|
572
|
-
'deposit_earn_position',
|
|
573
|
-
'withdraw_earn_position',
|
|
574
|
-
'aave_borrow',
|
|
575
|
-
'aave_repay',
|
|
576
|
-
'aave_set_collateral',
|
|
577
|
-
],
|
|
578
|
-
laneCompatibility:
|
|
579
|
-
'Aave V3 supply and withdraw route through deposit_earn_position / withdraw_earn_position with providerId aave. Lending beta actions use aave_borrow, aave_repay, and aave_set_collateral with health-factor guards.',
|
|
580
|
-
example:
|
|
581
|
-
'thirdfy-agent actions --provider aave --json && thirdfy-agent run --action get_aave_markets --params \'{"chainId":8453}\'',
|
|
582
|
-
};
|
|
583
|
-
}
|
|
584
|
-
if (provider === 'aegis') {
|
|
585
|
-
return {
|
|
586
|
-
provider,
|
|
587
|
-
category: 'earn',
|
|
588
|
-
canonicalReadAction: 'get_aegis_pools',
|
|
589
|
-
canonicalWriteAction: 'deposit_aegis_lender',
|
|
590
|
-
readActions: ['get_earning_opportunities', 'get_earn_opportunities', 'get_aegis_pools', 'get_aegis_pool_state', 'get_aegis_vault_state', 'get_earn_provider'],
|
|
591
|
-
orderManagementActions: [
|
|
592
|
-
'deposit_aegis_lender',
|
|
593
|
-
'redeem_aegis_lender',
|
|
594
|
-
'open_aegis_vault_and_borrow',
|
|
595
|
-
'repay_aegis_vault',
|
|
596
|
-
'stabilize_aegis_vault',
|
|
597
|
-
],
|
|
598
|
-
supportedChains: [8453, 130],
|
|
599
|
-
laneCompatibility:
|
|
600
|
-
'Aegis reads are live on Base allowlisted pools and Unichain DFM defaults. Engine writes use AegisRouterV1 with router-only approvals and eth_call simulation; writes stay fail-closed until partner addresses, PoolKeys, Engine ABI/opcodes, and audit sign-off. Use agent_wallet / walletExecute for solo Hermes — not execute-intent.',
|
|
601
|
-
example:
|
|
602
|
-
'thirdfy-agent actions --provider aegis --chain-id 8453 --json && thirdfy-agent run --action get_aegis_pool_state --run-mode agent_wallet --params \'{"pool":"tfy-usdc","chainId":8453}\'',
|
|
603
|
-
};
|
|
604
|
-
}
|
|
605
|
-
if (provider === 'curve') {
|
|
606
|
-
return {
|
|
607
|
-
provider,
|
|
608
|
-
category: 'earn',
|
|
609
|
-
canonicalReadAction: 'get_curve_pools',
|
|
610
|
-
canonicalWriteAction: 'deposit_earn_position',
|
|
611
|
-
readActions: ['get_curve_pools', 'get_earning_opportunities', 'get_earn_opportunities', 'get_earn_provider', 'get_earn_position'],
|
|
612
|
-
orderManagementActions: ['deposit_earn_position', 'withdraw_earn_position'],
|
|
613
|
-
supportedChains: [8453],
|
|
614
|
-
laneCompatibility:
|
|
615
|
-
'Curve EVM writes are limited to the validated Base mainnet 4pool adapter; other pools remain discovery-only until per-pool calldata is validated.',
|
|
616
|
-
};
|
|
617
|
-
}
|
|
618
|
-
if (provider === 'uniswap') {
|
|
619
|
-
return {
|
|
620
|
-
provider,
|
|
621
|
-
category: 'earn',
|
|
622
|
-
canonicalReadAction: 'get_uniswap_pools',
|
|
623
|
-
canonicalWriteAction: 'mint_uniswap_position',
|
|
624
|
-
readActions: [
|
|
625
|
-
'get_uniswap_pools',
|
|
626
|
-
'get_uniswap_pool_state',
|
|
627
|
-
'get_uniswap_positions',
|
|
628
|
-
'get_uniswap_position',
|
|
629
|
-
'get_uniswap_fees',
|
|
630
|
-
'get_earning_opportunities',
|
|
631
|
-
'get_earn_opportunities',
|
|
632
|
-
],
|
|
633
|
-
orderManagementActions: [
|
|
634
|
-
'mint_uniswap_position',
|
|
635
|
-
'increase_uniswap_liquidity',
|
|
636
|
-
'decrease_uniswap_liquidity',
|
|
637
|
-
'collect_uniswap_fees',
|
|
638
|
-
'close_uniswap_position',
|
|
639
|
-
'burn_uniswap_position',
|
|
640
|
-
],
|
|
641
|
-
supportedChains: [8453, 42161, 1, 4663],
|
|
642
|
-
laneCompatibility:
|
|
643
|
-
'Uniswap LP discovery is read-first on Base v3 and vanilla v4 pools. Named mint/increase/decrease/collect/close actions replace deposit_earn_position; writes ship after Gate A discover passes.',
|
|
644
|
-
example:
|
|
645
|
-
'thirdfy-agent actions --provider uniswap --json && thirdfy-agent run --action get_uniswap_pools --params \'{"chainId":8453}\'',
|
|
646
|
-
};
|
|
647
|
-
}
|
|
648
|
-
if (provider === 'ratehopper') {
|
|
649
|
-
return {
|
|
650
|
-
provider,
|
|
651
|
-
category: 'earn',
|
|
652
|
-
canonicalReadAction: 'get_ratehopper_agents',
|
|
653
|
-
canonicalWriteAction: 'setup_ratehopper_cash_lp',
|
|
654
|
-
readActions: [
|
|
655
|
-
'get_ratehopper_agents',
|
|
656
|
-
'get_ratehopper_portfolio',
|
|
657
|
-
'get_ratehopper_logs',
|
|
658
|
-
'get_ratehopper_performance',
|
|
659
|
-
'get_ratehopper_setup_status',
|
|
660
|
-
],
|
|
661
|
-
orderManagementActions: [
|
|
662
|
-
'deploy_ratehopper_safe',
|
|
663
|
-
'enable_ratehopper_operator',
|
|
664
|
-
'setup_ratehopper_cash_lp',
|
|
665
|
-
'close_ratehopper_agent',
|
|
666
|
-
'transfer_ratehopper_to_owner',
|
|
667
|
-
],
|
|
668
|
-
supportedChains: [8453],
|
|
669
|
-
laneCompatibility:
|
|
670
|
-
'Ratehopper Managed USDC LP uses a user-owned Safe on Base. Reads need Thirdfy-hosted Partner REST access. Close and owner sweep stay blocked until the REST close-path spike is confirmed.',
|
|
671
|
-
example:
|
|
672
|
-
'thirdfy-agent actions --provider ratehopper --json && thirdfy-agent run --action get_ratehopper_agents --params \'{"chainId":8453}\'',
|
|
673
|
-
};
|
|
674
|
-
}
|
|
675
|
-
if (provider === 'vaults-fyi') {
|
|
676
|
-
return {
|
|
677
|
-
provider,
|
|
678
|
-
category: 'earn',
|
|
679
|
-
canonicalReadAction: 'get-vaults-fyi-vaults',
|
|
680
|
-
canonicalWriteAction: 'deposit_earn_position',
|
|
681
|
-
readActions: ['get-vaults-fyi-vaults', 'get_earning_opportunities', 'get_earn_opportunities', 'get_earn_provider', 'get_earn_position'],
|
|
682
|
-
orderManagementActions: ['deposit_earn_position', 'withdraw_earn_position'],
|
|
683
|
-
laneCompatibility:
|
|
684
|
-
'Vaults.fyi writes are transaction-prep first. Thirdfy validates partner payloads, chain/user context, and allowed targets before returning or submitting prepared calls.',
|
|
685
|
-
example:
|
|
686
|
-
'thirdfy-agent actions --provider vaults-fyi && thirdfy-agent preflight --action deposit_earn_position --params \'{"providerId":"vaults-fyi","opportunityId":"...","vaultAddress":"0x...","tokenAddress":"0x...","amount":"10","chainId":8453}\'',
|
|
687
|
-
};
|
|
688
|
-
}
|
|
689
|
-
if (provider === 'yield-xyz') {
|
|
690
|
-
return {
|
|
691
|
-
provider,
|
|
692
|
-
category: 'earn',
|
|
693
|
-
canonicalReadAction: 'get_yield_xyz_opportunities',
|
|
694
|
-
canonicalWriteAction: 'deposit_earn_position',
|
|
695
|
-
readActions: ['get_yield_xyz_opportunities', 'get_earning_opportunities', 'get_earn_opportunities', 'get_earn_provider', 'get_earn_position'],
|
|
696
|
-
orderManagementActions: ['deposit_earn_position', 'withdraw_earn_position', 'claim_earn_rewards'],
|
|
697
|
-
laneCompatibility:
|
|
698
|
-
'Yield.xyz writes are transaction-prep first. Always discover with get_yield_xyz_opportunities (or get_earning_opportunities) and pass the canonical opportunityId/yieldId. Thirdfy prepareDeposit calls GET /v1/yields/{yieldId} before enter/exit, then validates unsigned transactions with @yieldxyz/shield. claim_earn_rewards claims pending CLAIM_REWARDS incentives (no amount; pass optional passthrough from get_earn_position.claimableRewards). Balances omit metadata.name; use yields_get / get_earn_position enrich for display names.',
|
|
699
|
-
example:
|
|
700
|
-
'thirdfy-agent run --action get_yield_xyz_opportunities --params \'{"chainId":8453,"asset":"USDC"}\' && thirdfy-agent preflight --action deposit_earn_position --params \'{"providerId":"yield-xyz","opportunityId":"<canonical-yieldId>","tokenAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","amount":"10","chainId":8453}\'',
|
|
701
|
-
supportedChains: [1, 10, 100, 130, 137, 42220, 8453, 42161, 4663],
|
|
702
|
-
};
|
|
703
|
-
}
|
|
704
|
-
if (provider === 'hummingbot') {
|
|
705
|
-
return {
|
|
706
|
-
provider,
|
|
707
|
-
category: 'hummingbot',
|
|
708
|
-
canonicalWriteAction: 'hummingbot_executor_create',
|
|
709
|
-
readActions: [
|
|
710
|
-
'get_hummingbot_connectors',
|
|
711
|
-
'get_hummingbot_executor_schema',
|
|
712
|
-
'get_hummingbot_gateway_networks',
|
|
713
|
-
'get_hummingbot_gateway_connectors',
|
|
714
|
-
],
|
|
715
|
-
orderManagementActions: ['hummingbot_executor_create', 'hummingbot_executor_stop'],
|
|
716
|
-
setupActions: ['get_hummingbot_connectors', 'get_hummingbot_gateway_networks', 'get_hummingbot_gateway_connectors'],
|
|
717
|
-
laneCompatibility:
|
|
718
|
-
'Hummingbot executor create/stop and Gateway reads are offchain API actions. Use thirdfy, hybrid, or agent_wallet for writes; self is setup-only.',
|
|
719
|
-
example:
|
|
720
|
-
'thirdfy-agent hummingbot gateway-networks && thirdfy-agent hummingbot executor-stop --executor-id <id>',
|
|
721
|
-
};
|
|
722
|
-
}
|
|
723
|
-
if (provider === 'condor') {
|
|
724
|
-
return {
|
|
725
|
-
provider,
|
|
726
|
-
category: 'condor',
|
|
727
|
-
canonicalWriteAction: 'condor_executor_create',
|
|
728
|
-
readActions: ['get_condor_policy_status'],
|
|
729
|
-
orderManagementActions: ['condor_executor_create', 'condor_executor_stop'],
|
|
730
|
-
setupActions: ['get_condor_policy_status'],
|
|
731
|
-
laneCompatibility:
|
|
732
|
-
'Condor Pattern A reserves day notional before executor create. Use thirdfy or agent_wallet for writes; run condor preflight for governance reservation.',
|
|
733
|
-
example:
|
|
734
|
-
'thirdfy-agent condor policy-status && thirdfy-agent condor preflight --estimated-amount-usd 25 --idempotency-key <key>',
|
|
735
|
-
};
|
|
736
|
-
}
|
|
737
|
-
if (provider === 'fomo') {
|
|
738
|
-
return {
|
|
739
|
-
provider,
|
|
740
|
-
category: 'smart_money_intel',
|
|
741
|
-
canonicalReadAction: 'get_fomo_alerts',
|
|
742
|
-
readActions: [
|
|
743
|
-
'get_fomo_search',
|
|
744
|
-
'get_fomo_user',
|
|
745
|
-
'get_fomo_balances',
|
|
746
|
-
'get_fomo_leaderboard',
|
|
747
|
-
'get_fomo_alerts',
|
|
748
|
-
],
|
|
749
|
-
supportedChains: [],
|
|
750
|
-
laneCompatibility:
|
|
751
|
-
'Fomo API (fomoapi.io) uses string chain slugs (robinhood, solana, base, bsc, eth), not numeric chainId. Unofficial integration; not the Fomo consumer app. Read-only handle intel and app alerts via Thirdfy API. Resolve handles before storing watchlists. Pace calls (~1 req/s).',
|
|
752
|
-
example:
|
|
753
|
-
'thirdfy-agent run --action get_fomo_alerts --params \'{"chain":"robinhood","type":"buy","limit":5}\' --provider fomo --json',
|
|
754
|
-
};
|
|
755
|
-
}
|
|
756
|
-
if (provider === 'gmgn') {
|
|
757
|
-
return {
|
|
758
|
-
provider,
|
|
759
|
-
category: 'smart_money_intel',
|
|
760
|
-
canonicalReadAction: 'get_gmgn_kol_trades',
|
|
761
|
-
readActions: [
|
|
762
|
-
'get_gmgn_token_info',
|
|
763
|
-
'get_gmgn_token_security',
|
|
764
|
-
'get_gmgn_token_pool',
|
|
765
|
-
'get_gmgn_token_holders',
|
|
766
|
-
'get_gmgn_token_traders',
|
|
767
|
-
'get_gmgn_token_kline',
|
|
768
|
-
'get_gmgn_trending',
|
|
769
|
-
'get_gmgn_trenches',
|
|
770
|
-
'get_gmgn_hot_searches',
|
|
771
|
-
'get_gmgn_wallet_activity',
|
|
772
|
-
'get_gmgn_wallet_stats',
|
|
773
|
-
'get_gmgn_wallet_token_balance',
|
|
774
|
-
'get_gmgn_created_tokens',
|
|
775
|
-
'get_gmgn_kol_trades',
|
|
776
|
-
'get_gmgn_smartmoney_trades',
|
|
777
|
-
],
|
|
778
|
-
supportedChains: [],
|
|
779
|
-
laneCompatibility:
|
|
780
|
-
'GMGN uses string chain slugs (sol, base, bsc, eth, robinhood), not numeric chainId. Read-only KOL, smart-money, wallet, and token security evidence via Thirdfy API. Pace calls (~1 req/s).',
|
|
781
|
-
example:
|
|
782
|
-
'thirdfy-agent run --action get_gmgn_kol_trades --params \'{"chain":"sol","limit":5}\' --provider gmgn --json',
|
|
783
|
-
};
|
|
784
|
-
}
|
|
785
|
-
if (provider === 'basedbid') {
|
|
786
|
-
return {
|
|
787
|
-
provider,
|
|
788
|
-
category: 'spot',
|
|
789
|
-
canonicalReadAction: 'basedbid_get_tokens',
|
|
790
|
-
canonicalWriteAction: 'basedbid_create_lbp',
|
|
791
|
-
readActions: ['basedbid_get_tokens'],
|
|
792
|
-
orderManagementActions: [
|
|
793
|
-
'basedbid_create_lbp',
|
|
794
|
-
'basedbid_create_flash',
|
|
795
|
-
'basedbid_create_board',
|
|
796
|
-
'basedbid_buy',
|
|
797
|
-
'basedbid_sell',
|
|
798
|
-
'basedbid_claim_fees',
|
|
799
|
-
'basedbid_update_hook',
|
|
800
|
-
],
|
|
801
|
-
supportedChains: [8453, 1, 4663],
|
|
802
|
-
laneCompatibility:
|
|
803
|
-
'basedbid launchpad. Discovery is read-only. LBP and flash create, buy, and sell are write-enabled on 8453, 1, and 4663. Buy spends native ETH on the target chain. Board, fee claim, and hook writes stay fail-closed. Console uses the existing preview-then-confirm path. No extra venue credential.',
|
|
804
|
-
example:
|
|
805
|
-
'thirdfy-agent run --action basedbid_get_tokens --params \'{"chainId":8453,"limit":10}\' --provider basedbid --json',
|
|
806
|
-
};
|
|
807
|
-
}
|
|
808
|
-
if (provider === 'bermuda') {
|
|
809
|
-
return {
|
|
810
|
-
provider,
|
|
811
|
-
category: 'internal',
|
|
812
|
-
canonicalReadAction: 'get_bermuda_setup_status',
|
|
813
|
-
canonicalWriteAction: 'bermuda_deposit',
|
|
814
|
-
readActions: ['get_bermuda_setup_status', 'get_bermuda_balance'],
|
|
815
|
-
orderManagementActions: [
|
|
816
|
-
'bermuda_deposit',
|
|
817
|
-
'bermuda_transfer',
|
|
818
|
-
'bermuda_withdraw',
|
|
819
|
-
'bermuda_stealth_earn',
|
|
820
|
-
'bermuda_stealth_exit',
|
|
821
|
-
'bermuda_stealth_swap',
|
|
822
|
-
'bermuda_sweep_burners',
|
|
823
|
-
],
|
|
824
|
-
supportedChains: [84532],
|
|
825
|
-
laneCompatibility:
|
|
826
|
-
'Base Sepolia shielded accounts (USDC, WETH, MetaMorpho vault shares). Catalog is flag-gated on the API host. Deposit is sent from the execution wallet; every other write is proven and relayed, so the execution wallet never appears: transfer, withdraw, private vault entry/exit (stealth earn/exit), private swap (stealth swap, best of Thirdfy routes and Uniswap v3, fresh burner per trade) and burner sweep. The regular swap takes private: true for the same private swap. Writes are capped at 5 USD; the sweep has no cap. Private writes bill the write_private credit tier; any privacy fee is reported as privacyFee (0 at launch). Responses include privacyNotes.',
|
|
827
|
-
example:
|
|
828
|
-
'thirdfy-agent run --action get_bermuda_setup_status --params \'{"chainId":84532}\' --provider bermuda --json',
|
|
829
|
-
};
|
|
830
|
-
}
|
|
831
|
-
if (provider === 'arc') {
|
|
832
|
-
return {
|
|
833
|
-
provider,
|
|
834
|
-
category: 'internal',
|
|
835
|
-
canonicalReadAction: 'get_arc_job',
|
|
836
|
-
canonicalWriteAction: 'create_arc_job',
|
|
837
|
-
readActions: ['get_arc_job'],
|
|
838
|
-
orderManagementActions: [
|
|
839
|
-
'create_arc_job',
|
|
840
|
-
'set_arc_job_budget',
|
|
841
|
-
'fund_arc_job',
|
|
842
|
-
'submit_arc_job',
|
|
843
|
-
'complete_arc_job',
|
|
844
|
-
],
|
|
845
|
-
supportedChains: [5042002, 5042],
|
|
846
|
-
laneCompatibility:
|
|
847
|
-
'Arc ERC-8183 job escrow. Testnet 5042002 is live. Mainnet 5042 cash is ready. Jobs writes on 5042 need the API jobs contract. Use Privy agent_wallet. USDC pays gas. No Uniswap, Li.Fi, or Yield.xyz on Arc yet.',
|
|
848
|
-
example:
|
|
849
|
-
'thirdfy-agent run --action get_arc_job --params \'{"chainId":5042002,"jobId":1}\' --provider arc --json',
|
|
850
|
-
};
|
|
851
|
-
}
|
|
852
|
-
if (provider === 'nansen') {
|
|
853
|
-
return {
|
|
854
|
-
provider,
|
|
855
|
-
category: 'research_intel',
|
|
856
|
-
canonicalReadAction: 'get_nansen_perp_screener',
|
|
857
|
-
readActions: [
|
|
858
|
-
'get_nansen_perp_screener',
|
|
859
|
-
'get_nansen_position_intelligence',
|
|
860
|
-
'get_nansen_address_perp_positions',
|
|
861
|
-
'get_nansen_address_perp_trades',
|
|
862
|
-
'get_nansen_address_balances',
|
|
863
|
-
'get_nansen_address_pnl_summary',
|
|
864
|
-
'get_nansen_flow_intelligence',
|
|
865
|
-
'get_nansen_agent_fast',
|
|
866
|
-
'get_nansen_agent_expert',
|
|
867
|
-
],
|
|
868
|
-
supportedChains: [],
|
|
869
|
-
laneCompatibility:
|
|
870
|
-
'Nansen HL/TGM reads and premium research agent via Thirdfy API. JSON body params for screener/profiler calls. Fast and expert research cost more than screener reads. Pace outbound starts (~1 req/s).',
|
|
871
|
-
example:
|
|
872
|
-
'thirdfy-agent run --action get_nansen_perp_screener --params \'{"date":{"from":"2026-08-27T00:00:00.000Z","to":"2026-08-28T00:00:00.000Z"},"pagination":{"page":1,"per_page":5}}\' --provider nansen --json',
|
|
873
|
-
};
|
|
874
|
-
}
|
|
875
|
-
if (provider === 'cmc') {
|
|
876
|
-
return {
|
|
877
|
-
provider,
|
|
878
|
-
category: 'research_intel',
|
|
879
|
-
canonicalReadAction: 'get_cmc_quotes',
|
|
880
|
-
readActions: [
|
|
881
|
-
'get_cmc_search',
|
|
882
|
-
'get_cmc_quotes',
|
|
883
|
-
'get_cmc_info',
|
|
884
|
-
'get_cmc_global_metrics',
|
|
885
|
-
'get_cmc_fear_greed',
|
|
886
|
-
'get_cmc_metrics',
|
|
887
|
-
'get_cmc_technicals',
|
|
888
|
-
'get_cmc_marketcap_technicals',
|
|
889
|
-
'get_cmc_derivatives_metrics',
|
|
890
|
-
'get_cmc_news',
|
|
891
|
-
'get_cmc_search_info',
|
|
892
|
-
'get_cmc_narratives',
|
|
893
|
-
'get_cmc_upcoming_events',
|
|
894
|
-
'get_cmc_skill',
|
|
895
|
-
'get_cmc_daily_market_overview',
|
|
896
|
-
'get_cmc_btc_etf_demand',
|
|
897
|
-
'get_cmc_perp_contract_analysis',
|
|
898
|
-
'get_cmc_market_regime',
|
|
899
|
-
'get_cmc_derivatives_crowding',
|
|
900
|
-
],
|
|
901
|
-
supportedChains: [],
|
|
902
|
-
laneCompatibility:
|
|
903
|
-
'CoinMarketCap quotes, global metrics, and composed Skill Hub briefs via Thirdfy API. Skill actions may take up to 180s. Composed briefs cost more than cheap reads.',
|
|
904
|
-
example:
|
|
905
|
-
'thirdfy-agent run --action get_cmc_quotes --params \'{"symbol":"BTC","convert":"USD"}\' --provider cmc --json',
|
|
906
|
-
};
|
|
907
|
-
}
|
|
908
|
-
if (provider === 'market-data') {
|
|
909
|
-
return {
|
|
910
|
-
provider,
|
|
911
|
-
category: 'market_data',
|
|
912
|
-
canonicalReadAction: 'get_trending_tokens',
|
|
913
|
-
readActions: [
|
|
914
|
-
'get_trending_tokens',
|
|
915
|
-
'get_new_token_launches',
|
|
916
|
-
'get_token_market_data',
|
|
917
|
-
'get_chain_market_overview',
|
|
918
|
-
],
|
|
919
|
-
supportedChains: [8453, 84532, 4663],
|
|
920
|
-
laneCompatibility: 'Read-only market data via API-owned actions. Robinhood Chain uses CoinGecko Onchain network id robinhood.',
|
|
921
|
-
};
|
|
922
|
-
}
|
|
923
|
-
return null;
|
|
924
|
-
}
|
|
925
|
-
|
|
926
|
-
function getCachedProviderHintFromCapabilities(provider) {
|
|
927
|
-
const normalizedProvider = normalizeVenueProviderId(provider || '');
|
|
928
|
-
if (!normalizedProvider) return null;
|
|
929
|
-
const manifests = Array.isArray(getNegotiatedCapabilitiesCache()?.providers?.manifests)
|
|
930
|
-
? getNegotiatedCapabilitiesCache().providers.manifests
|
|
931
|
-
: [];
|
|
932
|
-
const match = manifests.find((entry) => normalizeVenueProviderId(entry?.providerId || '') === normalizedProvider);
|
|
933
|
-
if (!match) return null;
|
|
934
|
-
const canonicalWriteActions = {
|
|
935
|
-
trading: 'swap',
|
|
936
|
-
hyperliquid: 'place_hyperliquid_perps_order',
|
|
937
|
-
lighter: 'place_lighter_perps_order',
|
|
938
|
-
polymarket: 'place_polymarket_order',
|
|
939
|
-
prediction: 'place_prediction_order',
|
|
940
|
-
earn: 'deposit_earn_position',
|
|
941
|
-
morpho: 'deposit_earn_position',
|
|
942
|
-
aave: 'deposit_earn_position',
|
|
943
|
-
aegis: 'deposit_aegis_lender',
|
|
944
|
-
basedbid: 'basedbid_create_lbp',
|
|
945
|
-
bermuda: 'bermuda_deposit',
|
|
946
|
-
arc: 'create_arc_job',
|
|
947
|
-
curve: 'deposit_earn_position',
|
|
948
|
-
uniswap: 'mint_uniswap_position',
|
|
949
|
-
ratehopper: 'setup_ratehopper_cash_lp',
|
|
950
|
-
'vaults-fyi': 'deposit_earn_position',
|
|
951
|
-
'yield-xyz': 'deposit_earn_position',
|
|
952
|
-
};
|
|
953
|
-
const canonicalReadActions = {
|
|
954
|
-
earn: 'get_earning_opportunities',
|
|
955
|
-
morpho: 'get_morpho_vaults',
|
|
956
|
-
aave: 'get_aave_markets',
|
|
957
|
-
aegis: 'get_aegis_pools',
|
|
958
|
-
curve: 'get_curve_pools',
|
|
959
|
-
uniswap: 'get_uniswap_pools',
|
|
960
|
-
ratehopper: 'get_ratehopper_agents',
|
|
961
|
-
'vaults-fyi': 'get-vaults-fyi-vaults',
|
|
962
|
-
'yield-xyz': 'get_yield_xyz_opportunities',
|
|
963
|
-
'market-data': 'get_trending_tokens',
|
|
964
|
-
fomo: 'get_fomo_alerts',
|
|
965
|
-
gmgn: 'get_gmgn_kol_trades',
|
|
966
|
-
nansen: 'get_nansen_perp_screener',
|
|
967
|
-
basedbid: 'basedbid_get_tokens',
|
|
968
|
-
bermuda: 'get_bermuda_setup_status',
|
|
969
|
-
arc: 'get_arc_job',
|
|
970
|
-
cmc: 'get_cmc_quotes',
|
|
971
|
-
prediction: 'get_prediction_markets',
|
|
972
|
-
};
|
|
973
|
-
return {
|
|
974
|
-
provider: normalizedProvider,
|
|
975
|
-
category: match.category || match.domain || match.providerKind || null,
|
|
976
|
-
...(canonicalReadActions[normalizedProvider] ? { canonicalReadAction: canonicalReadActions[normalizedProvider] } : {}),
|
|
977
|
-
...(canonicalWriteActions[normalizedProvider] ? { canonicalWriteAction: canonicalWriteActions[normalizedProvider] } : {}),
|
|
978
|
-
providerKind: match.providerKind || null,
|
|
979
|
-
capabilities: Array.isArray(match.capabilities) ? match.capabilities : [],
|
|
980
|
-
supportedChains: Array.isArray(match.supportedChains) ? match.supportedChains : [],
|
|
981
|
-
custodyMode: match.custodyMode || null,
|
|
982
|
-
description: match.description || null,
|
|
983
|
-
source: 'cli_capabilities_manifest',
|
|
984
|
-
...verantaNamingFields(normalizedProvider),
|
|
985
|
-
...(match.setupHints && typeof match.setupHints === 'object' ? { setupHints: match.setupHints } : {}),
|
|
986
|
-
};
|
|
987
|
-
}
|
|
988
|
-
|
|
989
|
-
// Veranta hints carry `providerAliases`; show the public name in messages (`--provider veranta`).
|
|
990
|
-
function providerLabelForHint(providerHint) {
|
|
991
|
-
const alias = Array.isArray(providerHint?.providerAliases) ? providerHint.providerAliases[0] : null;
|
|
992
|
-
return alias || providerHint.provider;
|
|
993
|
-
}
|
|
994
|
-
|
|
995
|
-
function formatProviderAmbiguousActionHint(providerHint) {
|
|
996
|
-
if (!providerHint) return '';
|
|
997
|
-
const p = providerLabelForHint(providerHint);
|
|
998
|
-
const w = providerHint.canonicalWriteAction;
|
|
999
|
-
if (w) return ` Provider ${p} expects ${w}.`;
|
|
1000
|
-
return ` Provider ${p} did not declare a canonical write action in capabilities; run actions --provider ${p} first.`;
|
|
1001
|
-
}
|
|
1002
|
-
|
|
1003
|
-
function formatProviderUnknownActionHint(providerHint) {
|
|
1004
|
-
if (!providerHint) return '';
|
|
1005
|
-
const p = providerLabelForHint(providerHint);
|
|
1006
|
-
const w = providerHint.canonicalWriteAction;
|
|
1007
|
-
if (w) return ` Provider ${p} expects ${w}; run actions --provider ${p} first.`;
|
|
1008
|
-
return ` Provider ${p} did not declare a canonical write action in capabilities; run actions --provider ${p} first.`;
|
|
1009
|
-
}
|
|
1010
|
-
|
|
1011
|
-
return {
|
|
1012
|
-
getTradingProviderHint,
|
|
1013
|
-
getCachedProviderHintFromCapabilities,
|
|
1014
|
-
formatProviderAmbiguousActionHint,
|
|
1015
|
-
formatProviderUnknownActionHint,
|
|
1016
|
-
};
|
|
1017
|
-
}
|