@botanary/agent 0.1.0-alpha.1
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 +18 -0
- package/LICENSE +21 -0
- package/README.md +123 -0
- package/dist/errors.d.ts +49 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +40 -0
- package/dist/errors.js.map +1 -0
- package/dist/exact-action.d.ts +48 -0
- package/dist/exact-action.d.ts.map +1 -0
- package/dist/exact-action.js +178 -0
- package/dist/exact-action.js.map +1 -0
- package/dist/fingerprint.d.ts +21 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +47 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/generated/routes.d.ts +68 -0
- package/dist/generated/routes.d.ts.map +1 -0
- package/dist/generated/routes.js +92 -0
- package/dist/generated/routes.js.map +1 -0
- package/dist/generated/schema.d.ts +2903 -0
- package/dist/generated/schema.d.ts.map +1 -0
- package/dist/generated/schema.js +2 -0
- package/dist/generated/schema.js.map +1 -0
- package/dist/http-path.d.ts +92 -0
- package/dist/http-path.d.ts.map +1 -0
- package/dist/http-path.js +201 -0
- package/dist/http-path.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/pairing-code.d.ts +41 -0
- package/dist/pairing-code.d.ts.map +1 -0
- package/dist/pairing-code.js +60 -0
- package/dist/pairing-code.js.map +1 -0
- package/dist/registration.d.ts +21 -0
- package/dist/registration.d.ts.map +1 -0
- package/dist/registration.js +62 -0
- package/dist/registration.js.map +1 -0
- package/dist/runtime.d.ts +203 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +559 -0
- package/dist/runtime.js.map +1 -0
- package/dist/signer.d.ts +33 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/signer.js +13 -0
- package/dist/signer.js.map +1 -0
- package/dist/transport.d.ts +13 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +135 -0
- package/dist/transport.js.map +1 -0
- package/dist/validation.d.ts +15 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +108 -0
- package/dist/validation.js.map +1 -0
- package/dist/views.d.ts +182 -0
- package/dist/views.d.ts.map +1 -0
- package/dist/views.js +2 -0
- package/dist/views.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,2903 @@
|
|
|
1
|
+
export interface paths {
|
|
2
|
+
"/agents/pair": {
|
|
3
|
+
parameters: {
|
|
4
|
+
query?: never;
|
|
5
|
+
header?: never;
|
|
6
|
+
path?: never;
|
|
7
|
+
cookie?: never;
|
|
8
|
+
};
|
|
9
|
+
get?: never;
|
|
10
|
+
put?: never;
|
|
11
|
+
/**
|
|
12
|
+
* Begin an agent pairing - the agent signs to prove it holds the key
|
|
13
|
+
* @description Public endpoint (no session required). The agent signs over `(code || timestamp)`, proving it holds the private key for the claimed public key. We verify the signature recovers to that key and hold the proof until the account owner claims it via `POST /agents/{code}/claim`.
|
|
14
|
+
* The signature is the load-bearing check: a pairing code seen over someone's shoulder is worthless on its own. **Claiming binds THE AGENT THAT SIGNED, never the person who typed the code.** That is what makes agent pairing password-free and rotation-free (design §5-41): there is no secret to write down, type into the wrong window, or rotate later.
|
|
15
|
+
* Codes are single-use and expire in minutes; the timestamp window is ±5 minutes so a captured proof cannot be replayed later. Pending pairings are in-memory coordination state (not persisted) - a backend restart loses pending pairings, which simply means the agent regenerates a code and signs again.
|
|
16
|
+
* Refused with 400 when: - The timestamp is outside the ±5-minute window (too old or too far in the future). - The signature does not recover to the claimed public key (the proof belongs to a different agent). - The signature is over a different code than the one claimed (a proof from elsewhere).
|
|
17
|
+
*/
|
|
18
|
+
post: operations["pairAgent"];
|
|
19
|
+
delete?: never;
|
|
20
|
+
options?: never;
|
|
21
|
+
head?: never;
|
|
22
|
+
patch?: never;
|
|
23
|
+
trace?: never;
|
|
24
|
+
};
|
|
25
|
+
"/agents/session/nonce": {
|
|
26
|
+
parameters: {
|
|
27
|
+
query?: never;
|
|
28
|
+
header?: never;
|
|
29
|
+
path?: never;
|
|
30
|
+
cookie?: never;
|
|
31
|
+
};
|
|
32
|
+
get?: never;
|
|
33
|
+
put?: never;
|
|
34
|
+
/**
|
|
35
|
+
* Issue a nonce for an agent to sign, to mint a session
|
|
36
|
+
* @description Public endpoint (no session required). Returns a fresh, single-use, server-issued nonce for the named agent address. The agent signs this exact nonce with its private key and exchanges the signature for a session token via `POST /agents/session`. The nonce expires after a few minutes if unused. Challenges are shared across API replicas and bind the connected agent and its authentication generation. A newer challenge for the address replaces the prior challenge.
|
|
37
|
+
*/
|
|
38
|
+
post: operations["issueAgentSessionNonce"];
|
|
39
|
+
delete?: never;
|
|
40
|
+
options?: never;
|
|
41
|
+
head?: never;
|
|
42
|
+
patch?: never;
|
|
43
|
+
trace?: never;
|
|
44
|
+
};
|
|
45
|
+
"/agents/session": {
|
|
46
|
+
parameters: {
|
|
47
|
+
query?: never;
|
|
48
|
+
header?: never;
|
|
49
|
+
path?: never;
|
|
50
|
+
cookie?: never;
|
|
51
|
+
};
|
|
52
|
+
get?: never;
|
|
53
|
+
put?: never;
|
|
54
|
+
/**
|
|
55
|
+
* Mint an agent session by signing a server-issued nonce
|
|
56
|
+
* @description Public endpoint (no session required). Exchanges a signature over the nonce from `POST /agents/session/nonce` for a short-lived bearer token (`ags_...`) that grants access to every `@AgentAllowed()` route, scoped to whichever account this agent is connected to (`POST /agents/{code}/claim`). Refused with 401 when the nonce is missing/expired, the signature does not recover to this agent's key, or the address names no LIVE connected agent (never connected, or disconnected). Key verification precedes atomic challenge consumption and hash-only session creation. Concurrent replay has one winner. Disablement invalidates sessions and earlier authentication challenges across replicas and process restarts.
|
|
57
|
+
*/
|
|
58
|
+
post: operations["mintAgentSession"];
|
|
59
|
+
delete?: never;
|
|
60
|
+
options?: never;
|
|
61
|
+
head?: never;
|
|
62
|
+
patch?: never;
|
|
63
|
+
trace?: never;
|
|
64
|
+
};
|
|
65
|
+
"/agents/me": {
|
|
66
|
+
parameters: {
|
|
67
|
+
query?: never;
|
|
68
|
+
header?: never;
|
|
69
|
+
path?: never;
|
|
70
|
+
cookie?: never;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* An agent's own question - who am I, what account, and what may I do
|
|
74
|
+
* @description Requires an agent session (`@AgentAllowed()`) - an owner session gets 404, since the question ("what can THIS agent do") has no owner-side referent. Answers three things at once: this agent's own identity (id/name/address/fingerprint/connectedAt, mirroring `ConnectedAgent`), the account it is bound to, and its live grant if one exists - including the `permissionId` a delegated spend needs, the grant's bounds (`policySet`) and plain-language sentence (`humanSummary`), and its current `status`.
|
|
75
|
+
* When the owner has granted this agent nothing yet, `grant` is `null` - an honest, explicit answer (not an error, not an empty object): the agent can still read and draft under every `@AgentAllowed()` route, and every attempt to spend is refused for lack of authority, never silently.
|
|
76
|
+
* This is a convenience read, never the check - the only boundary that counts is on-chain. An agent (or whoever built it) can use this to learn its bounds WITHOUT hitting them first, but a bug or a lie in this response changes nothing about what the agent can actually get away with.
|
|
77
|
+
*/
|
|
78
|
+
get: operations["getAgentSelf"];
|
|
79
|
+
put?: never;
|
|
80
|
+
post?: never;
|
|
81
|
+
delete?: never;
|
|
82
|
+
options?: never;
|
|
83
|
+
head?: never;
|
|
84
|
+
patch?: never;
|
|
85
|
+
trace?: never;
|
|
86
|
+
};
|
|
87
|
+
"/agents/requests": {
|
|
88
|
+
parameters: {
|
|
89
|
+
query?: never;
|
|
90
|
+
header?: never;
|
|
91
|
+
path?: never;
|
|
92
|
+
cookie?: never;
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* List agent requests for this account or agent
|
|
96
|
+
* @description The owner sees all requests for their account. An agent session sees only its own requests. Requests expire in minutes; an expired request stays in the list marked `expired` rather than vanishing.
|
|
97
|
+
*/
|
|
98
|
+
get: operations["listAgentRequests"];
|
|
99
|
+
put?: never;
|
|
100
|
+
/**
|
|
101
|
+
* Raise a request when hitting a delegation bound
|
|
102
|
+
* @description The agent has attempted an action that exceeds its delegated grant. Instead of a bare decline, it raises a request carrying WHICH bound was crossed (§6-40) - derived from the agent's live grant and the proposed calls, never a generic reason. An agent with no grant at all gets `no_policies_set`, never a guessed cap; calls this cannot decode into a token/amount/recipient get `malformed_call`, never a plausible guess. A revoked agent cannot raise requests - its session is already gone (§6-38).
|
|
103
|
+
* Refused with 400 if the proposed calls are already inside the grant - there is nothing to request, since the action can be performed directly under the delegation.
|
|
104
|
+
*/
|
|
105
|
+
post: operations["raiseAgentRequest"];
|
|
106
|
+
delete?: never;
|
|
107
|
+
options?: never;
|
|
108
|
+
head?: never;
|
|
109
|
+
patch?: never;
|
|
110
|
+
trace?: never;
|
|
111
|
+
};
|
|
112
|
+
"/balance": {
|
|
113
|
+
parameters: {
|
|
114
|
+
query?: never;
|
|
115
|
+
header?: never;
|
|
116
|
+
path?: never;
|
|
117
|
+
cookie?: never;
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* Get the unified multi-stablecoin balance (presentation-only)
|
|
121
|
+
* @description A single unified balance over the owner's own per-token holdings, with each token carrying its live peg status. **Presentation + spendability only - never pooled or custodial** (FR-S1).
|
|
122
|
+
*/
|
|
123
|
+
get: operations["getUnifiedBalance"];
|
|
124
|
+
put?: never;
|
|
125
|
+
post?: never;
|
|
126
|
+
delete?: never;
|
|
127
|
+
options?: never;
|
|
128
|
+
head?: never;
|
|
129
|
+
patch?: never;
|
|
130
|
+
trace?: never;
|
|
131
|
+
};
|
|
132
|
+
"/chains": {
|
|
133
|
+
parameters: {
|
|
134
|
+
query?: never;
|
|
135
|
+
header?: never;
|
|
136
|
+
path?: never;
|
|
137
|
+
cookie?: never;
|
|
138
|
+
};
|
|
139
|
+
/** List supported chains */
|
|
140
|
+
get: operations["listChains"];
|
|
141
|
+
put?: never;
|
|
142
|
+
post?: never;
|
|
143
|
+
delete?: never;
|
|
144
|
+
options?: never;
|
|
145
|
+
head?: never;
|
|
146
|
+
patch?: never;
|
|
147
|
+
trace?: never;
|
|
148
|
+
};
|
|
149
|
+
"/gas/methods": {
|
|
150
|
+
parameters: {
|
|
151
|
+
query?: never;
|
|
152
|
+
header?: never;
|
|
153
|
+
path?: never;
|
|
154
|
+
cookie?: never;
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* List gas methods with per-method balances (FR-8)
|
|
158
|
+
* @description Available gas methods for a chain. At least one of `chainId` (EVM) or `key` (Solana/Stellar) is required - gas availability is per-chain (USDC gas exists only on Base and Arbitrum), so a request with neither is rejected rather than answered about some default chain. If both are supplied, `key` takes priority. Every action MUST remain executable at native balance = 0 via sponsored / USDC / USDT.
|
|
159
|
+
*/
|
|
160
|
+
get: operations["listGasMethods"];
|
|
161
|
+
put?: never;
|
|
162
|
+
post?: never;
|
|
163
|
+
delete?: never;
|
|
164
|
+
options?: never;
|
|
165
|
+
head?: never;
|
|
166
|
+
patch?: never;
|
|
167
|
+
trace?: never;
|
|
168
|
+
};
|
|
169
|
+
"/account": {
|
|
170
|
+
parameters: {
|
|
171
|
+
query?: never;
|
|
172
|
+
header?: never;
|
|
173
|
+
path?: never;
|
|
174
|
+
cookie?: never;
|
|
175
|
+
};
|
|
176
|
+
/** Get the owner's smart account */
|
|
177
|
+
get: operations["getAccount"];
|
|
178
|
+
put?: never;
|
|
179
|
+
post?: never;
|
|
180
|
+
delete?: never;
|
|
181
|
+
options?: never;
|
|
182
|
+
head?: never;
|
|
183
|
+
patch?: never;
|
|
184
|
+
trace?: never;
|
|
185
|
+
};
|
|
186
|
+
"/delegations/{delegationId}/actions": {
|
|
187
|
+
parameters: {
|
|
188
|
+
query?: never;
|
|
189
|
+
header?: never;
|
|
190
|
+
path: {
|
|
191
|
+
/** @example d1 */
|
|
192
|
+
delegationId: components["parameters"]["DelegationId"];
|
|
193
|
+
};
|
|
194
|
+
cookie?: never;
|
|
195
|
+
};
|
|
196
|
+
get?: never;
|
|
197
|
+
put?: never;
|
|
198
|
+
/**
|
|
199
|
+
* Build a bounded delegated action (the binding-boundary demonstration)
|
|
200
|
+
* @description Builds an UNSIGNED Smart Sessions op - a bounded transfer performed with this delegation's **session key** (not the owner). The op runs raw Kernel `execute` under the SS validator lane; Smart Sessions re-checks it against the granted policies in its validation phase. In-scope executes; out-of-scope (wrong recipient / over the per-action or cumulative cap) is rejected pre-inclusion. The client signs the returned hash with the session key it holds and relays via `POST /userops`. The API never signs.
|
|
201
|
+
* **`@AgentAllowed()`** - this is the connected agent's own build lane (Flow 7c: an outside agent proposing a payment under its grant), the ONLY lane that builds in the session nonce key with fixed native gas a session-key signature can actually validate. An agent session may only build against the delegation that names ITS OWN address as `delegateeAddress` - naming a *different* agent's delegation id is refused with 403, not merely refused on-chain later (§6-34: "A grant names one agent, and no other can draw on it"). An owner session is unaffected: it may still build against any delegation on its own account, exactly as before.
|
|
202
|
+
*/
|
|
203
|
+
post: operations["buildDelegatedAction"];
|
|
204
|
+
delete?: never;
|
|
205
|
+
options?: never;
|
|
206
|
+
head?: never;
|
|
207
|
+
patch?: never;
|
|
208
|
+
trace?: never;
|
|
209
|
+
};
|
|
210
|
+
"/delegations/{delegationId}/actions/exact": {
|
|
211
|
+
parameters: {
|
|
212
|
+
query?: never;
|
|
213
|
+
header?: never;
|
|
214
|
+
path?: never;
|
|
215
|
+
cookie?: never;
|
|
216
|
+
};
|
|
217
|
+
get?: never;
|
|
218
|
+
put?: never;
|
|
219
|
+
/**
|
|
220
|
+
* Build an agent action using exact base units
|
|
221
|
+
* @description Requires the grant-bound agent session. The account ID, account address, chain and asset are explicit and must match the stored delegation. Native gas only. App keys and console/owner sessions are refused. On-chain capabilities remain testnet-only; this endpoint does not create a grant.
|
|
222
|
+
*/
|
|
223
|
+
post: operations["buildExactDelegatedAction"];
|
|
224
|
+
delete?: never;
|
|
225
|
+
options?: never;
|
|
226
|
+
head?: never;
|
|
227
|
+
patch?: never;
|
|
228
|
+
trace?: never;
|
|
229
|
+
};
|
|
230
|
+
"/userops": {
|
|
231
|
+
parameters: {
|
|
232
|
+
query?: never;
|
|
233
|
+
header?: never;
|
|
234
|
+
path?: never;
|
|
235
|
+
cookie?: never;
|
|
236
|
+
};
|
|
237
|
+
get?: never;
|
|
238
|
+
put?: never;
|
|
239
|
+
/**
|
|
240
|
+
* Relay a client-signed UserOp to the bundler
|
|
241
|
+
* @description The single relay boundary. Accepts a `SignedUserOp` (the client attached the owner's, or a connected agent's own session key's, signature to a previously built op) and submits it to the bundler/paymaster. Returns a receipt to poll. **This is availability, never authority** - the server cannot alter the signed op's effect, and the on-chain policy bounds it regardless.
|
|
242
|
+
* **`@AgentAllowed()`** - a connected agent relays here too, signing with its own session key (e.g. after `POST /delegations/{id}/actions`). This route never interprets or authorizes what the op DOES; it only forwards a signed payload, so opening it to an agent adds no new authority - a signature over the wrong session key fails Smart Sessions' own on-chain check exactly as an owner op signed by the wrong EOA already does.
|
|
243
|
+
*/
|
|
244
|
+
post: operations["submitUserOp"];
|
|
245
|
+
delete?: never;
|
|
246
|
+
options?: never;
|
|
247
|
+
head?: never;
|
|
248
|
+
patch?: never;
|
|
249
|
+
trace?: never;
|
|
250
|
+
};
|
|
251
|
+
"/userops/{userOpId}": {
|
|
252
|
+
parameters: {
|
|
253
|
+
query?: never;
|
|
254
|
+
header?: never;
|
|
255
|
+
path: {
|
|
256
|
+
userOpId: string;
|
|
257
|
+
};
|
|
258
|
+
cookie?: never;
|
|
259
|
+
};
|
|
260
|
+
/** Track a submitted UserOp */
|
|
261
|
+
get: operations["getUserOp"];
|
|
262
|
+
put?: never;
|
|
263
|
+
post?: never;
|
|
264
|
+
delete?: never;
|
|
265
|
+
options?: never;
|
|
266
|
+
head?: never;
|
|
267
|
+
patch?: never;
|
|
268
|
+
trace?: never;
|
|
269
|
+
};
|
|
270
|
+
"/userops/by-hash/{chainId}/{userOpHash}": {
|
|
271
|
+
parameters: {
|
|
272
|
+
query?: never;
|
|
273
|
+
header?: never;
|
|
274
|
+
path?: never;
|
|
275
|
+
cookie?: never;
|
|
276
|
+
};
|
|
277
|
+
/**
|
|
278
|
+
* Reconcile an agent operation by its original hash
|
|
279
|
+
* @description Requires the agent session that submitted the operation. A missing record does not prove that the network rejected a timed-out submission. Do not build a replacement based on a 404.
|
|
280
|
+
*/
|
|
281
|
+
get: operations["getAgentUserOpByHash"];
|
|
282
|
+
put?: never;
|
|
283
|
+
post?: never;
|
|
284
|
+
delete?: never;
|
|
285
|
+
options?: never;
|
|
286
|
+
head?: never;
|
|
287
|
+
patch?: never;
|
|
288
|
+
trace?: never;
|
|
289
|
+
};
|
|
290
|
+
"/apis/providers": {
|
|
291
|
+
parameters: {
|
|
292
|
+
query?: never;
|
|
293
|
+
header?: never;
|
|
294
|
+
path?: never;
|
|
295
|
+
cookie?: never;
|
|
296
|
+
};
|
|
297
|
+
/**
|
|
298
|
+
* Ranked, searchable, paged catalog of API providers
|
|
299
|
+
* @description Ranked, searchable, paged catalog of API providers. Ranking is by `rankScore`, the provider's busiest endpoint measured in 30-day unique payers. Every discovered provider is listed; each endpoint carries a `verification` state saying whether we measured its 402, measured that it is free, have not probed it yet, found it quoting another chain, or found it unreachable. Endpoints are NOT inlined here - fetch `/apis/providers/{providerId}` for those. `total` counts what matched before paging; `hidden` counts providers a chain or asset filter left with nothing to show, and `reasons` explains at most 50 of them (`reasonsTruncated` says when it is not all of them). Spec 2026-08-13 §9.
|
|
300
|
+
*/
|
|
301
|
+
get: operations["listApiProviders"];
|
|
302
|
+
put?: never;
|
|
303
|
+
post?: never;
|
|
304
|
+
delete?: never;
|
|
305
|
+
options?: never;
|
|
306
|
+
head?: never;
|
|
307
|
+
patch?: never;
|
|
308
|
+
trace?: never;
|
|
309
|
+
};
|
|
310
|
+
"/apis/providers/{providerId}": {
|
|
311
|
+
parameters: {
|
|
312
|
+
query?: never;
|
|
313
|
+
header?: never;
|
|
314
|
+
path?: never;
|
|
315
|
+
cookie?: never;
|
|
316
|
+
};
|
|
317
|
+
/**
|
|
318
|
+
* One provider with a page of its endpoints
|
|
319
|
+
* @description Detailed view of one provider: the same fields the list carries, plus a searchable, paged `endpoints` array and the `endpointTotal` it is a page of. One provider carries up to 965 endpoints, so this route pages as well. Each endpoint states its `verification`, its price as measured or as declared, and whether it is `payable` on that chain. Spec 2026-08-13 §9.
|
|
320
|
+
*/
|
|
321
|
+
get: operations["getApiProvider"];
|
|
322
|
+
put?: never;
|
|
323
|
+
post?: never;
|
|
324
|
+
delete?: never;
|
|
325
|
+
options?: never;
|
|
326
|
+
head?: never;
|
|
327
|
+
patch?: never;
|
|
328
|
+
trace?: never;
|
|
329
|
+
};
|
|
330
|
+
"/apis/budget": {
|
|
331
|
+
parameters: {
|
|
332
|
+
query?: never;
|
|
333
|
+
header?: never;
|
|
334
|
+
path?: never;
|
|
335
|
+
cookie?: never;
|
|
336
|
+
};
|
|
337
|
+
/**
|
|
338
|
+
* Read the current API budget and its state
|
|
339
|
+
* @description Returns remaining count, per-call max, expiry, epoch, token, max exposure, and amount spent. Spec 2026-08-13 §9.
|
|
340
|
+
*/
|
|
341
|
+
get: operations["getApiBudget"];
|
|
342
|
+
put?: never;
|
|
343
|
+
post?: never;
|
|
344
|
+
delete?: never;
|
|
345
|
+
options?: never;
|
|
346
|
+
head?: never;
|
|
347
|
+
patch?: never;
|
|
348
|
+
trace?: never;
|
|
349
|
+
};
|
|
350
|
+
"/apis/calls/requirements": {
|
|
351
|
+
parameters: {
|
|
352
|
+
query?: never;
|
|
353
|
+
header?: never;
|
|
354
|
+
path?: never;
|
|
355
|
+
cookie?: never;
|
|
356
|
+
};
|
|
357
|
+
get?: never;
|
|
358
|
+
put?: never;
|
|
359
|
+
/**
|
|
360
|
+
* Check the gate and allocate a budget index for an API call
|
|
361
|
+
* @description Runs the gate, fetches the provider's 402, allocates an index, and returns the EIP-3009 payload the agent must sign, plus everything else needed to build the ERC-1271 envelope around the signature (`authorization`, `index`, `validator` - Task 13). Returns no signature - the agent signs and passes the sig to relay. Spec 2026-08-13 §9.
|
|
362
|
+
* Task 11: a call above the agent's mandate `confirmAbove` threshold does NOT build ready to sign. `status: 'pending_approval'` is returned instead - `payload`/`requirements`/ `authorization`/`index`/`validator` are all absent, structurally, not merely empty. Poll `GET /apis/calls/requirements/{id}` for the owner's decision; once `POST /apis/calls/requirements/{id}/approve` has run, that same poll route starts returning `payload`/`authorization`/`index`/`validator` together (Task 14) - a client that only ever sees `pending_approval` here still gets everything it needs to build the signature once approved.
|
|
363
|
+
*/
|
|
364
|
+
post: operations["buildApiCallRequirements"];
|
|
365
|
+
delete?: never;
|
|
366
|
+
options?: never;
|
|
367
|
+
head?: never;
|
|
368
|
+
patch?: never;
|
|
369
|
+
trace?: never;
|
|
370
|
+
};
|
|
371
|
+
"/apis/calls/requirements/{id}": {
|
|
372
|
+
parameters: {
|
|
373
|
+
query?: never;
|
|
374
|
+
header?: never;
|
|
375
|
+
path?: never;
|
|
376
|
+
cookie?: never;
|
|
377
|
+
};
|
|
378
|
+
/**
|
|
379
|
+
* Poll a call raised above the agent's confirmAbove threshold
|
|
380
|
+
* @description Task 11. What the owner decided, if anything, about a `pending_approval` call from `buildApiCallRequirements`. `@AgentAllowed` - this is what the agent polls, since the digest was withheld at build time.
|
|
381
|
+
* THE SECURITY PROPERTY: `payload`, `authorization`, `index` and `validator` (Task 14) are present ONLY when `status: 'approved'`. `X402PaymentValidator`'s nonce is a `pure` function of public inputs and `validBefore` is the agent's own to choose, so an agent holding all four before the owner has actually approved could sign and relay to any facilitator without ever calling Botanary again - returning them any earlier would make the threshold decorative. `validator` itself is not secret - it is a public contract address - but it is withheld alongside the other three so a client never has a reason to reach for it before it also has something to sign.
|
|
382
|
+
*/
|
|
383
|
+
get: operations["getApiCallRequirementStatus"];
|
|
384
|
+
put?: never;
|
|
385
|
+
post?: never;
|
|
386
|
+
delete?: never;
|
|
387
|
+
options?: never;
|
|
388
|
+
head?: never;
|
|
389
|
+
patch?: never;
|
|
390
|
+
trace?: never;
|
|
391
|
+
};
|
|
392
|
+
"/apis/calls/relay": {
|
|
393
|
+
parameters: {
|
|
394
|
+
query?: never;
|
|
395
|
+
header?: never;
|
|
396
|
+
path?: never;
|
|
397
|
+
cookie?: never;
|
|
398
|
+
};
|
|
399
|
+
get?: never;
|
|
400
|
+
put?: never;
|
|
401
|
+
/**
|
|
402
|
+
* Relay an authorized API call with payment
|
|
403
|
+
* @description Claims the requirement durably before forwarding payment once. Returns the provider response when available, with payment status based on finalized chain evidence. A timeout or provider success does not prove settlement. Repeating the same requirement returns its stored status without forwarding again; recover with GET /apis/calls/relay/{id}. The authenticated account must own the requirement. An agent session may relay only its own requirement on that account; another agent on the same account cannot relay it. Unknown, unsubmitted expired and out-of-scope requirement IDs return the same requirement_expired decline without forwarding payment or changing another caller's state.
|
|
404
|
+
*/
|
|
405
|
+
post: operations["relayApiCall"];
|
|
406
|
+
delete?: never;
|
|
407
|
+
options?: never;
|
|
408
|
+
head?: never;
|
|
409
|
+
patch?: never;
|
|
410
|
+
trace?: never;
|
|
411
|
+
};
|
|
412
|
+
"/apis/calls/relay/{id}": {
|
|
413
|
+
parameters: {
|
|
414
|
+
query?: never;
|
|
415
|
+
header?: never;
|
|
416
|
+
path?: never;
|
|
417
|
+
cookie?: never;
|
|
418
|
+
};
|
|
419
|
+
/**
|
|
420
|
+
* Recover the same API payment without submitting again
|
|
421
|
+
* @description Reads the durable requirement, provider observation and finalized payment status. The same account and agent scope as relay applies. Submitted calls remain recoverable after their authorization expires. No provider request or signature is sent by this endpoint.
|
|
422
|
+
*/
|
|
423
|
+
get: operations["getApiCallStatus"];
|
|
424
|
+
put?: never;
|
|
425
|
+
post?: never;
|
|
426
|
+
delete?: never;
|
|
427
|
+
options?: never;
|
|
428
|
+
head?: never;
|
|
429
|
+
patch?: never;
|
|
430
|
+
trace?: never;
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
export type webhooks = Record<string, never>;
|
|
434
|
+
export interface components {
|
|
435
|
+
schemas: {
|
|
436
|
+
/** @description Request to pair a new agent. The agent signs over `(code || timestamp)` with its secp256k1 private key, proving it holds the key for the claimed public key. The signature is verified to recover to that key before the pairing proof is held (in-memory, expiring in minutes). */
|
|
437
|
+
AgentPairInput: {
|
|
438
|
+
/**
|
|
439
|
+
* @description The pairing code (format XXXXXX-XXXXXX). Identifies the agent by its signature.
|
|
440
|
+
* @example a1b2c3-d4e5f6
|
|
441
|
+
*/
|
|
442
|
+
code: string;
|
|
443
|
+
/**
|
|
444
|
+
* @description The agent's secp256k1 public key (hex, with 0x prefix).
|
|
445
|
+
* @example 0x...
|
|
446
|
+
*/
|
|
447
|
+
publicKey: string;
|
|
448
|
+
/**
|
|
449
|
+
* @description The agent's secp256k1 signature over keccak256(code || timestamp) (hex, with 0x prefix).
|
|
450
|
+
* @example 0x...
|
|
451
|
+
*/
|
|
452
|
+
signature: string;
|
|
453
|
+
/** @description Unix seconds at the time the agent signed. Used for replay protection (±5 minutes). */
|
|
454
|
+
timestamp: number;
|
|
455
|
+
/**
|
|
456
|
+
* @description OPTIONAL. The coding tool the connector reports itself to be, slugified from the MCP `clientInfo.name` it received at initialize. Travels with the signed proof, so the tool a pairing claims to be is fixed by the connector that holds the key, not by whoever claims the code.
|
|
457
|
+
* Unverified by construction - `clientInfo` is self-reported and the server cannot check it. It is stored on the resulting `ConnectedAgent.client` and shown to the owner as a quoted claim. The pattern is a whitelist because this value is displayed at the moment the owner decides what to authorize, so it may not carry markup, whitespace or direction-control characters that could dress one tool up as another.
|
|
458
|
+
* Omitted by every connector released before this field existed; those pairings still work and store null.
|
|
459
|
+
* @example claude-code
|
|
460
|
+
*/
|
|
461
|
+
client?: string;
|
|
462
|
+
/**
|
|
463
|
+
* @description OPTIONAL. The connector-side profile key behind this keypair - `<tool>` for a tool's default agent, `<tool>.<agent>` for a further one. Same unverified caveat as `client`.
|
|
464
|
+
* @example claude-code.trading
|
|
465
|
+
*/
|
|
466
|
+
profile?: string;
|
|
467
|
+
};
|
|
468
|
+
ApiError: {
|
|
469
|
+
error: {
|
|
470
|
+
/**
|
|
471
|
+
* @description Machine code - validation_error | unauthorized | forbidden | not_found | out_of_scope | conflict | internal | unavailable.
|
|
472
|
+
* @example out_of_scope
|
|
473
|
+
*/
|
|
474
|
+
code: string;
|
|
475
|
+
/** @example This action exceeds the per-action cap. */
|
|
476
|
+
message: string;
|
|
477
|
+
declineReason?: components["schemas"]["DeclineReason"] | null;
|
|
478
|
+
details?: {
|
|
479
|
+
[key: string]: unknown;
|
|
480
|
+
} | null;
|
|
481
|
+
requestId?: string | null;
|
|
482
|
+
};
|
|
483
|
+
};
|
|
484
|
+
/**
|
|
485
|
+
* @description Maps 1:1 to AgentGuard reverts (owner lane, execution phase) / Smart Sessions policy rejections (delegated lane, validation phase) / MandateExecutor reverts (delegated lane, execution phase). AgentGuard and MandateExecutor name the exact rule that failed; Smart Sessions returns only PolicyViolation, so `policy_violation` is genuinely all that is knowable there. Only the execution-phase reasons carry a transaction hash: a validation-phase rejection is dropped by the bundler before inclusion, so it has no artifact to link.
|
|
486
|
+
* @enum {string}
|
|
487
|
+
*/
|
|
488
|
+
DeclineReason: "cap_exceeded" | "per_action_exceeded" | "recipient_not_allowed" | "contract_not_allowed" | "contract_denied" | "stablecoin_not_permitted" | "expired" | "max_actions_exceeded" | "account_frozen" | "admin_call_denied" | "delegatecall_denied" | "malformed_call" | "policy_violation" | "delegation_revoked" | "paymaster_not_permitted" | "no_policies_set" | "mandate_revoked" | "venue_not_allowed" | "selector_not_allowed" | "residual_allowance" | "value_not_zero" | "chain_capability_unavailable" | "route_unavailable" | "route_spender_mismatch" | "grant_swap_not_authorised" | "slippage_exceeded" | "mandate_paused" | "venue_denied" | "value_exceeded" | "budget_exceeded" | "arg_cap_exceeded" | "arg_not_allowed" | "insufficient_fee_balance" | "rent_exempt_shortfall" | "blockhash_expired" | "blockhash_not_found" | "mint_not_supported" | "account_not_found" | "trustline_missing" | "reserve_shortfall" | "tx_expired" | "relayer_unavailable" | "bridge_route_unavailable" | "bridge_pool_depth_exceeded" | "pool_not_actionable" | "exit_capacity_exceeded" | "nothing_to_claim" | "farm_simulation_failed" | "privy_rule_blocked" | "insufficient_usdc_for_gas" | "gasless_unavailable" | "kora_cosign_rejected" | "validator_inactive" | "not_enough_approvals" | "gas_cost_exceeds_ceiling" | "action_nonce_already_used" | "unknown_signer" | "duplicate_approval" | "expiry_required" | "approval_blob_too_short" | "approval_entry_out_of_bounds" | "approval_proof_out_of_bounds" | "trailing_approval_bytes" | "unsupported_scheme" | "endpoint_disabled" | "unsupported_endpoint_method" | "request_body_not_supported" | "request_body_too_large" | "provider_unavailable_on_chain" | "provider_unverified" | "provider_unreachable" | "budget_exhausted" | "over_per_call_max" | "payment_required" | "budget_expired" | "requirement_expired" | "validator_not_installed" | "token_not_configured" | "facilitator_rejected" | "provider_rejected_request" | "apis_budget_headroom" | "apis_budget_account_rules" | "commit_not_on_chain" | "mandate_not_found" | "api_mandate_paused" | "mandate_expired" | "provider_not_in_mandate" | "endpoint_not_in_mandate" | "velocity_exceeded" | "over_mandate_per_call_max" | "mandate_budget_exceeded" | "approval_required" | "approval_declined" | "approval_timed_out" | "revoke_requires_uninstall";
|
|
489
|
+
/** @description Request a fresh nonce for an agent to sign, to mint a session (POST /agents/session). */
|
|
490
|
+
AgentSessionNonceInput: {
|
|
491
|
+
/** @description The agent's secp256k1 address (must already be a LIVE connected agent). */
|
|
492
|
+
address: components["schemas"]["Address"];
|
|
493
|
+
};
|
|
494
|
+
/**
|
|
495
|
+
* @description A 20-byte EVM address.
|
|
496
|
+
* @example 0x8f2A9c4419aD77b0392bC41D8123aa77c0Fe41D0
|
|
497
|
+
*/
|
|
498
|
+
Address: string;
|
|
499
|
+
/**
|
|
500
|
+
* @description A 32-byte hash (tx hash, userOpHash, permissionId, audit hash).
|
|
501
|
+
* @example 0x4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b4c1f9a0b2d7e8c3f1a6b0d4e2c9f7a1b
|
|
502
|
+
*/
|
|
503
|
+
Hash32: string;
|
|
504
|
+
/** @description Mint an agent session by proving possession of the private key behind `address`: sign the exact nonce issued by POST /agents/session/nonce and submit the signature here. */
|
|
505
|
+
AgentSessionInput: {
|
|
506
|
+
address: components["schemas"]["Address"];
|
|
507
|
+
/** @description The nonce returned by POST /agents/session/nonce. */
|
|
508
|
+
nonce: components["schemas"]["Hash32"];
|
|
509
|
+
/**
|
|
510
|
+
* @description The agent's secp256k1 signature over `nonce` (hex, with 0x prefix).
|
|
511
|
+
* @example 0x...
|
|
512
|
+
*/
|
|
513
|
+
signature: string;
|
|
514
|
+
};
|
|
515
|
+
/** @description A short-lived agent session token (Bearer `ags_...`), scoped to @AgentAllowed() routes. */
|
|
516
|
+
AgentSessionResponse: {
|
|
517
|
+
/**
|
|
518
|
+
* @description Opaque, revocable bearer token - never derived from the agent's key.
|
|
519
|
+
* @example ags_...
|
|
520
|
+
*/
|
|
521
|
+
token: string;
|
|
522
|
+
/** Format: date-time */
|
|
523
|
+
expiresAt: string;
|
|
524
|
+
};
|
|
525
|
+
/**
|
|
526
|
+
* @description GET /agents/me's answer to an agent's own three questions: who am I, what account am I bound to, and what may I do. `grant` is resolved by matching a Delegation's delegateeAddress against this agent's OWN address - null is a real, honest answer (this agent has been granted nothing yet, not an error and not an empty object), not a placeholder for a future field. This agent can still read and draft under every @AgentAllowed() route regardless of `grant`; every attempt to spend without one is refused for lack of authority, never silently.
|
|
527
|
+
* Whatever an agent reads here is a convenience for whoever built it - never the check. The only boundary that counts is on-chain; a bug or a lie in this response changes nothing about what the agent can actually get away with.
|
|
528
|
+
*/
|
|
529
|
+
AgentSelf: {
|
|
530
|
+
/** @description This agent's connection record ID (same as ConnectedAgent.id). */
|
|
531
|
+
id: string;
|
|
532
|
+
/** @example Claude Code */
|
|
533
|
+
name: string;
|
|
534
|
+
address: components["schemas"]["Address"];
|
|
535
|
+
/** @example a1b2c3 */
|
|
536
|
+
fingerprint: string;
|
|
537
|
+
/** Format: date-time */
|
|
538
|
+
connectedAt: string;
|
|
539
|
+
/** @description The account this agent is bound to. */
|
|
540
|
+
accountId: string;
|
|
541
|
+
/** @description That account's own on-chain address - the same string the owner sees in the account switcher, so "which account is this agent on?" is answerable without an internal id lookup. accountId above is opaque and appears nowhere in the app, which made an agent paired to a DIFFERENT login than the one the owner had open indistinguishable from a broken pairing. null only when the account row no longer exists - never fabricated. */
|
|
542
|
+
accountAddress: components["schemas"]["Address"] | null;
|
|
543
|
+
/** @description The live delegation whose delegateeAddress is this agent's own address, or null when the owner has granted this agent nothing (yet). Carries the grant's permissionId, bounds (policySet), plain-language sentence (humanSummary) and status - everything the MCP connector's spend tool needs to spend under it. */
|
|
544
|
+
grant: components["schemas"]["Delegation"] | null;
|
|
545
|
+
/** @description Whether the grant's own chain has every setup module the account needs, and which are absent. Exists so an agent learns this BEFORE it spends rather than from a reverted op: a missing executor makes every action under the grant fail identically, and no retry can change it, because installing a module is an authority change only the owner can sign. null when there is no grant (nothing to be ready for) or the check could not be completed - an honest gap, never a fabricated ready:true. */
|
|
546
|
+
accountSetup: components["schemas"]["AgentAccountSetup"] | null;
|
|
547
|
+
};
|
|
548
|
+
/**
|
|
549
|
+
* @description A scoped, revocable session-key delegation = policy set + spent-to-date.
|
|
550
|
+
* @example {
|
|
551
|
+
* "id": "d1",
|
|
552
|
+
* "permissionId": "0x1111111111111111111111111111111111111111111111111111111111111111",
|
|
553
|
+
* "name": "Uniswap",
|
|
554
|
+
* "kind": "dApp",
|
|
555
|
+
* "icon": "arrow-left-right",
|
|
556
|
+
* "delegateeAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
557
|
+
* "chain": "Arbitrum",
|
|
558
|
+
* "chainId": 42161,
|
|
559
|
+
* "status": "active",
|
|
560
|
+
* "humanSummary": "This dApp can spend up to 100 USDC in total, and may call 0x3593564c() on Universal Router and approve() on Permit2, max 50 per action, limited to 10 actions. Expires on 2026-08-03.",
|
|
561
|
+
* "policySet": {
|
|
562
|
+
* "budgets": [
|
|
563
|
+
* {
|
|
564
|
+
* "token": {
|
|
565
|
+
* "symbol": "USDC",
|
|
566
|
+
* "chainId": 42161
|
|
567
|
+
* },
|
|
568
|
+
* "amount": 100
|
|
569
|
+
* }
|
|
570
|
+
* ],
|
|
571
|
+
* "perActionMax": {
|
|
572
|
+
* "token": {
|
|
573
|
+
* "symbol": "USDC",
|
|
574
|
+
* "chainId": 42161
|
|
575
|
+
* },
|
|
576
|
+
* "amount": 50
|
|
577
|
+
* },
|
|
578
|
+
* "maxActions": 10,
|
|
579
|
+
* "recipientAllowlist": [],
|
|
580
|
+
* "allowedActions": [
|
|
581
|
+
* {
|
|
582
|
+
* "name": "Universal Router",
|
|
583
|
+
* "target": "0x66a9893cC07D91D95644AEDD05D03f95e1dBA8Af",
|
|
584
|
+
* "selectors": [
|
|
585
|
+
* "0x3593564c"
|
|
586
|
+
* ]
|
|
587
|
+
* },
|
|
588
|
+
* {
|
|
589
|
+
* "name": "Permit2",
|
|
590
|
+
* "target": "0x000000000022D473030F116dDEE9F6B43aC78BA3",
|
|
591
|
+
* "selectors": [
|
|
592
|
+
* "0x095ea7b3"
|
|
593
|
+
* ]
|
|
594
|
+
* }
|
|
595
|
+
* ],
|
|
596
|
+
* "expiresAt": "2026-08-03T00:00:00Z",
|
|
597
|
+
* "freezeGated": false
|
|
598
|
+
* },
|
|
599
|
+
* "spentToDate": [
|
|
600
|
+
* {
|
|
601
|
+
* "token": {
|
|
602
|
+
* "symbol": "USDC",
|
|
603
|
+
* "chainId": 42161
|
|
604
|
+
* },
|
|
605
|
+
* "limit": 100,
|
|
606
|
+
* "spent": 42.5,
|
|
607
|
+
* "remaining": 57.5,
|
|
608
|
+
* "expiresAt": "2026-08-03T00:00:00Z"
|
|
609
|
+
* }
|
|
610
|
+
* ]
|
|
611
|
+
* }
|
|
612
|
+
*/
|
|
613
|
+
Delegation: {
|
|
614
|
+
/** @example d1 */
|
|
615
|
+
id: string;
|
|
616
|
+
permissionId: components["schemas"]["Hash32"];
|
|
617
|
+
/**
|
|
618
|
+
* @description GRANT-ONLY, mandate-sourced only. Which mandate this grant was compiled from. Null on the legacy name-salted branch and on every non-grant kind. The chain can never tell you which mandate a permission id came from, so the row carries it - and a client that needs to correlate a grant back to its mandate MUST read this rather than matching on `name`, which is not unique within an agent.
|
|
619
|
+
* @example m_7f3a
|
|
620
|
+
*/
|
|
621
|
+
mandateId?: string | null;
|
|
622
|
+
/**
|
|
623
|
+
* @description The version of `mandateId` this grant compiled from. Always set together with `mandateId`; a row carrying one without the other is refused at build time.
|
|
624
|
+
* @example 2
|
|
625
|
+
*/
|
|
626
|
+
mandateVersion?: number | null;
|
|
627
|
+
/** @example Uniswap */
|
|
628
|
+
name: string;
|
|
629
|
+
kind: components["schemas"]["DelegationKind"];
|
|
630
|
+
/**
|
|
631
|
+
* @description Lucide icon name (design-system hint).
|
|
632
|
+
* @example arrow-left-right
|
|
633
|
+
*/
|
|
634
|
+
icon?: string | null;
|
|
635
|
+
delegateeAddress: components["schemas"]["Address"];
|
|
636
|
+
/** @example Arbitrum */
|
|
637
|
+
chain: string;
|
|
638
|
+
/** @example 42161 */
|
|
639
|
+
chainId: number;
|
|
640
|
+
status: components["schemas"]["DelegationStatus"];
|
|
641
|
+
policySet: components["schemas"]["PolicySet"];
|
|
642
|
+
/** @description One meter per budget, in the same order as policySet.budgets. */
|
|
643
|
+
spentToDate: components["schemas"]["SpendMeter"][];
|
|
644
|
+
/**
|
|
645
|
+
* @description Plain-language rendering of exactly what the encoder bound (FR-1 fidelity).
|
|
646
|
+
* @example This dApp can spend up to 100 USDC in total, max 50 per action, limited to 10 actions. Expires on 2026-08-03.
|
|
647
|
+
*/
|
|
648
|
+
humanSummary: string;
|
|
649
|
+
/** Format: date-time */
|
|
650
|
+
createdAt?: string;
|
|
651
|
+
/** Format: date-time */
|
|
652
|
+
expiresAt?: string | null;
|
|
653
|
+
/**
|
|
654
|
+
* @description Set only on the POST /delegations (enable) response, to the just-relayed enable op's id. The grant audit row is normally appended synchronously by a bounded server-side confirm, but that confirm can time out on a slow chain; poll GET /userops/{userOpId} (the same reconciler every other build->sign->relay flow already uses) to reach a terminal audit row for the grant. Absent/null on every other response that returns a Delegation - there is no op to poll there.
|
|
655
|
+
* @example op_9f2a1c
|
|
656
|
+
*/
|
|
657
|
+
userOpId?: string | null;
|
|
658
|
+
};
|
|
659
|
+
/** @enum {string} */
|
|
660
|
+
DelegationKind: "dApp" | "automation" | "recurring" | "mandate" | "grant";
|
|
661
|
+
/** @enum {string} */
|
|
662
|
+
DelegationStatus: "active" | "frozen" | "expired" | "revoked";
|
|
663
|
+
/** @description Exactly what a delegation binds on-chain via Smart Sessions. Every field here is enforced by a policy, and the plain-language summary is rendered from this and nothing else. Two absences are deliberate, both from ERC-7562 rule OP-011 (no TIMESTAMP opcode in the validation phase where session policies run): there is no per-period cap (a delegation carries a lifetime `budgets` total plus an `expiresAt`, never "100 USDC per week") and no rate limit (`maxActions` is a lifetime count, never "3 per day"). A per-period cap on the owner's OWN account is a different thing that does exist - see AccountCap. */
|
|
664
|
+
PolicySet: {
|
|
665
|
+
/** @description Total spend allowed over the delegation's life, one entry per permitted stablecoin. */
|
|
666
|
+
budgets: components["schemas"]["TokenAmount"][];
|
|
667
|
+
perActionMax?: components["schemas"]["TokenAmount"] | null;
|
|
668
|
+
/**
|
|
669
|
+
* @description Lifetime cap on the NUMBER of delegated actions (Rhinestone UsageLimitPolicy). Not a rate.
|
|
670
|
+
* @example 10
|
|
671
|
+
*/
|
|
672
|
+
maxActions?: number | null;
|
|
673
|
+
/** @description Approved recipients. Empty means genuinely unbounded - the delegatee may pay anyone. */
|
|
674
|
+
recipientAllowlist: components["schemas"]["AddressBookEntry"][];
|
|
675
|
+
/** @description The (contract, function) pairs the delegatee may call, beyond the budgeted transfers. */
|
|
676
|
+
allowedActions: components["schemas"]["ActionPermission"][];
|
|
677
|
+
/** Format: date-time */
|
|
678
|
+
expiresAt: string;
|
|
679
|
+
/** @description Whether a global account freeze also stops this delegation (AgentGuardFreezePolicy attached). */
|
|
680
|
+
freezeGated: boolean;
|
|
681
|
+
/** @description GRANT-ONLY, and ABSENT unless the grant asked to swap. Records which router/token/ceiling this grant's SECOND session action (GrantExecutor.executeUnderGrantWithAllowance) pins - the fact POST /delegations/{delegationId}/actions reads to decide whether a swap is expressible at all. A compiled session is not readable back from a permissionId, so this is the record. */
|
|
682
|
+
swapVenue?: components["schemas"]["GrantSwapVenue"];
|
|
683
|
+
};
|
|
684
|
+
TokenAmount: {
|
|
685
|
+
token: components["schemas"]["TokenRef"];
|
|
686
|
+
/** @example 50 */
|
|
687
|
+
amount: number;
|
|
688
|
+
};
|
|
689
|
+
/** @description A lightweight reference to a coin. */
|
|
690
|
+
TokenRef: {
|
|
691
|
+
/**
|
|
692
|
+
* @description PREFERRED. CAIP-19 asset ref, e.g. `eip155:8453/erc20:0x8335...`. Authoritative when present; `symbol` is advisory.
|
|
693
|
+
* @example eip155:8453/erc20:0x8335...
|
|
694
|
+
*/
|
|
695
|
+
assetRef?: string | null;
|
|
696
|
+
/**
|
|
697
|
+
* @description ADVISORY. A label a contract picked for itself - never authoritative, never resolved against.
|
|
698
|
+
* @example USDC
|
|
699
|
+
*/
|
|
700
|
+
symbol: string;
|
|
701
|
+
/** @example 42161 */
|
|
702
|
+
chainId?: number | null;
|
|
703
|
+
address?: components["schemas"]["Address"] | null;
|
|
704
|
+
};
|
|
705
|
+
/** @description A named address in the owner's book. `chainId` is OPTIONAL by design: an entry that predates the field, or one whose chain is genuinely unknown, is still a valid entry - the client renders it copy-only with no explorer link rather than guessing a network and emitting a URL that resolves nowhere. */
|
|
706
|
+
AddressBookEntry: {
|
|
707
|
+
/** @example Universal Router */
|
|
708
|
+
name?: string | null;
|
|
709
|
+
address: components["schemas"]["Address"];
|
|
710
|
+
/**
|
|
711
|
+
* @description Which chain this address is meaningful on, when known. Drives the client's explorer link.
|
|
712
|
+
* @example 8453
|
|
713
|
+
*/
|
|
714
|
+
chainId?: number | null;
|
|
715
|
+
};
|
|
716
|
+
/**
|
|
717
|
+
* @description A contract a delegation or grant may call, and (where the lane can express it) which functions on it.
|
|
718
|
+
*
|
|
719
|
+
* **In a REQUEST** (`DelegationIntent.allowedActions`) `selectors` MUST name at least one 4-byte selector, and an empty list is refused with 422. Smart Sessions binds a delegation's policies to `(actionTarget, selector)` pairs, so "any function on X" is not expressible on that lane and an allowlisted contract with no selector would grant nothing.
|
|
720
|
+
*
|
|
721
|
+
* **In a RESPONSE** an EMPTY `selectors` list is meaningful, and appears on a `kind: 'grant'` `PolicySet`. A grant binds its allowed contract as a call ARGUMENT (`ArgRuleSetPolicy`, `EQ` at the wrapper's target offset) rather than as the action target - every grant call routes through `GrantExecutor.executeUnderGrant` whatever the inner function is - so the bound genuinely is "any function on this contract", and an empty list is how that is said. The grant's own `humanSummary` names the contract either way.
|
|
722
|
+
*/
|
|
723
|
+
ActionPermission: {
|
|
724
|
+
target: components["schemas"]["Address"];
|
|
725
|
+
/** @example Universal Router */
|
|
726
|
+
name?: string | null;
|
|
727
|
+
/**
|
|
728
|
+
* @example [
|
|
729
|
+
* "0x3593564c"
|
|
730
|
+
* ]
|
|
731
|
+
*/
|
|
732
|
+
selectors: string[];
|
|
733
|
+
};
|
|
734
|
+
/**
|
|
735
|
+
* @description The venue a swap-capable grant is bound to: the ONE router the agent may be given an allowance to, the ONE token that allowance may be on, and the ceiling on it. All three are required together - a swap's tokens leave via the ROUTER's own transferFrom, in a frame whose msg.sender is the router and which no AgentGuard hook sees, so the three EQ/LTE session rules these compile to (plus the mandatory permissionId pin) are the ONLY thing bounding what may be approved, to whom, and how much. The token must be one the same grant also BUDGETS, and must not be the native asset (there is no allowance to grant on native); both are refused at build time.
|
|
736
|
+
* @example {
|
|
737
|
+
* "router": "0x111111125421cA6dc452d289314280a0f8842A65",
|
|
738
|
+
* "token": {
|
|
739
|
+
* "symbol": "USDC",
|
|
740
|
+
* "chainId": 421614
|
|
741
|
+
* },
|
|
742
|
+
* "maxAllowance": 50
|
|
743
|
+
* }
|
|
744
|
+
*/
|
|
745
|
+
GrantSwapVenue: {
|
|
746
|
+
/** @description Gets both the allowance and the routed call - the entrypoint has ONE (token, target) pair. A route quote whose approvalAddress differs from its router is declined route_spender_mismatch. */
|
|
747
|
+
router: components["schemas"]["Address"];
|
|
748
|
+
token: components["schemas"]["TokenRef"];
|
|
749
|
+
/** @description Ceiling on a single frame's allowance, in display units. */
|
|
750
|
+
maxAllowance: number;
|
|
751
|
+
};
|
|
752
|
+
/** @description A delegation's spend against one of its budgets. Budgets do not reset - they end at expiry - so there is no period/resetsAt here (unlike AccountCap, which is periodic). */
|
|
753
|
+
SpendMeter: {
|
|
754
|
+
token: components["schemas"]["TokenRef"];
|
|
755
|
+
/** @example 100 */
|
|
756
|
+
limit: number;
|
|
757
|
+
/** @example 42.5 */
|
|
758
|
+
spent: number;
|
|
759
|
+
/** @example 57.5 */
|
|
760
|
+
remaining: number;
|
|
761
|
+
/** Format: date-time */
|
|
762
|
+
expiresAt?: string | null;
|
|
763
|
+
};
|
|
764
|
+
/** @description Setup readiness for the chain an agent's grant lives on. See AgentSelf.accountSetup. */
|
|
765
|
+
AgentAccountSetup: {
|
|
766
|
+
/** @description True when nothing is missing; an agent may spend without consulting `missing`. */
|
|
767
|
+
ready: boolean;
|
|
768
|
+
/**
|
|
769
|
+
* @description Module names absent from the account, in install order. Empty exactly when ready.
|
|
770
|
+
* @example [
|
|
771
|
+
* "GrantExecutor"
|
|
772
|
+
* ]
|
|
773
|
+
*/
|
|
774
|
+
missing: string[];
|
|
775
|
+
/**
|
|
776
|
+
* @description The chain assessed - the grant's own chain, never the agent's pinned row.
|
|
777
|
+
* @example 5042002
|
|
778
|
+
*/
|
|
779
|
+
chainId: number;
|
|
780
|
+
};
|
|
781
|
+
/** @description One in-flight agent request. The agent has asked the owner to approve an action that exceeded its delegated grant. Requests expire in minutes; an expired request stays in the list marked `expired` so expiry is a recorded, visible event (D8). The owner approves it as their own action - not delegated (§5-43), so the unsigned op carries no `permissionId`. */
|
|
782
|
+
AgentRequest: {
|
|
783
|
+
/** @description The request ID. */
|
|
784
|
+
id: string;
|
|
785
|
+
/** @description The agent that raised this request. */
|
|
786
|
+
agentId: string;
|
|
787
|
+
/** @description The account this request belongs to. */
|
|
788
|
+
accountId: string;
|
|
789
|
+
/** @description The calls the agent wanted to make, exactly as proposed. */
|
|
790
|
+
calls: {
|
|
791
|
+
/**
|
|
792
|
+
* @description The target contract address.
|
|
793
|
+
* @example 0x...
|
|
794
|
+
*/
|
|
795
|
+
to: string;
|
|
796
|
+
/**
|
|
797
|
+
* @description The encoded call data (hex, with 0x prefix).
|
|
798
|
+
* @example 0x...
|
|
799
|
+
*/
|
|
800
|
+
data: string;
|
|
801
|
+
/**
|
|
802
|
+
* @description The native wei to send (decimal string). Usually '0'.
|
|
803
|
+
* @example 0
|
|
804
|
+
*/
|
|
805
|
+
value: string;
|
|
806
|
+
/**
|
|
807
|
+
* @description The chain ID where this call should execute.
|
|
808
|
+
* @example 8453
|
|
809
|
+
*/
|
|
810
|
+
chainId: number;
|
|
811
|
+
}[];
|
|
812
|
+
/**
|
|
813
|
+
* @description WHICH bound was crossed - a specific DeclineReason, never a generic failure. Specific enough for the agent to narrow what it was doing (§6-40).
|
|
814
|
+
* @example cap_exceeded
|
|
815
|
+
*/
|
|
816
|
+
declineReason: string;
|
|
817
|
+
/**
|
|
818
|
+
* @description Human-readable reason from the agent.
|
|
819
|
+
* @example Pay the invoice
|
|
820
|
+
*/
|
|
821
|
+
reason: string;
|
|
822
|
+
/**
|
|
823
|
+
* Format: date-time
|
|
824
|
+
* @description When the request was raised.
|
|
825
|
+
*/
|
|
826
|
+
raisedAt: string;
|
|
827
|
+
/**
|
|
828
|
+
* Format: date-time
|
|
829
|
+
* @description When this request expires (visible from the moment it is raised, D8). The owner cannot approve it after this time, but the request stays in the list marked `expired` rather than vanishing.
|
|
830
|
+
*/
|
|
831
|
+
expiresAt: string;
|
|
832
|
+
/**
|
|
833
|
+
* @description The request's current status. `open` = awaiting approval. `approved` = owner approved and the op was built. `expired` = past the deadline. `withdrawn` = agent gave up. Expired requests stay visible.
|
|
834
|
+
* @enum {string}
|
|
835
|
+
*/
|
|
836
|
+
status: "open" | "approved" | "expired" | "withdrawn";
|
|
837
|
+
};
|
|
838
|
+
/** @description Request to raise a pending request when an agent hits a delegation bound. The request carries the originally-proposed calls and the reason the agent is asking, plus a decline reason naming which specific bound was crossed. */
|
|
839
|
+
AgentRequestInput: {
|
|
840
|
+
/**
|
|
841
|
+
* @description A human-readable reason for the request (e.g. 'Pay the invoice').
|
|
842
|
+
* @example Pay the invoice
|
|
843
|
+
*/
|
|
844
|
+
reason: string;
|
|
845
|
+
/** @description The calls the agent wanted to make (and was declined). */
|
|
846
|
+
calls: {
|
|
847
|
+
/**
|
|
848
|
+
* @description The target contract address.
|
|
849
|
+
* @example 0x...
|
|
850
|
+
*/
|
|
851
|
+
to: string;
|
|
852
|
+
/**
|
|
853
|
+
* @description The encoded call data (hex, with 0x prefix).
|
|
854
|
+
* @example 0x...
|
|
855
|
+
*/
|
|
856
|
+
data: string;
|
|
857
|
+
/**
|
|
858
|
+
* @description The native wei to send (decimal string). Usually '0'.
|
|
859
|
+
* @example 0
|
|
860
|
+
*/
|
|
861
|
+
value: string;
|
|
862
|
+
/**
|
|
863
|
+
* @description The chain ID where this call should execute.
|
|
864
|
+
* @example 8453
|
|
865
|
+
*/
|
|
866
|
+
chainId: number;
|
|
867
|
+
}[];
|
|
868
|
+
};
|
|
869
|
+
/**
|
|
870
|
+
* @description A view over the owner's own holdings. Never pooled or custodial (FR-S1).
|
|
871
|
+
* @example {
|
|
872
|
+
* "totalFiat": 12480.06,
|
|
873
|
+
* "change24h": 2.4,
|
|
874
|
+
* "stablecoinFiat": 12235.32,
|
|
875
|
+
* "status": "ready",
|
|
876
|
+
* "asOf": "2026-07-07T09:42:00Z",
|
|
877
|
+
* "holdings": [
|
|
878
|
+
* {
|
|
879
|
+
* "assetRef": "eip155:42161/erc20:0xaf88d065e77c8cc2239327c5edb3a432268e5831",
|
|
880
|
+
* "symbol": "USDC",
|
|
881
|
+
* "amount": 6420.5,
|
|
882
|
+
* "priceUsd": 1,
|
|
883
|
+
* "fiat": 6420.5,
|
|
884
|
+
* "priceAdvisory": true
|
|
885
|
+
* },
|
|
886
|
+
* {
|
|
887
|
+
* "assetRef": "eip155:42161/erc20:0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9",
|
|
888
|
+
* "symbol": "USDT",
|
|
889
|
+
* "amount": 2100,
|
|
890
|
+
* "priceUsd": 1,
|
|
891
|
+
* "fiat": 2100,
|
|
892
|
+
* "priceAdvisory": true
|
|
893
|
+
* },
|
|
894
|
+
* {
|
|
895
|
+
* "assetRef": "eip155:42161/slip44:60",
|
|
896
|
+
* "symbol": "ETH",
|
|
897
|
+
* "amount": 0.0921,
|
|
898
|
+
* "priceUsd": 2657.3,
|
|
899
|
+
* "fiat": 244.74,
|
|
900
|
+
* "priceAdvisory": false
|
|
901
|
+
* }
|
|
902
|
+
* ],
|
|
903
|
+
* "tokens": [
|
|
904
|
+
* {
|
|
905
|
+
* "symbol": "USDC",
|
|
906
|
+
* "name": "USD Coin",
|
|
907
|
+
* "chain": "Arbitrum",
|
|
908
|
+
* "chainId": 42161,
|
|
909
|
+
* "tokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
|
|
910
|
+
* "decimals": 6,
|
|
911
|
+
* "amount": 6420.5,
|
|
912
|
+
* "fiat": 6420.5,
|
|
913
|
+
* "price": 1,
|
|
914
|
+
* "change24h": 0,
|
|
915
|
+
* "isStablecoin": true,
|
|
916
|
+
* "peg": {
|
|
917
|
+
* "symbol": "USDC",
|
|
918
|
+
* "price": 1,
|
|
919
|
+
* "target": 1,
|
|
920
|
+
* "deviationBps": 0,
|
|
921
|
+
* "status": "ok",
|
|
922
|
+
* "observedAt": "2026-07-07T09:40:00Z",
|
|
923
|
+
* "source": "chainlink"
|
|
924
|
+
* },
|
|
925
|
+
* "spendable": true,
|
|
926
|
+
* "source": "registry"
|
|
927
|
+
* },
|
|
928
|
+
* {
|
|
929
|
+
* "symbol": "USDT",
|
|
930
|
+
* "name": "Tether",
|
|
931
|
+
* "chain": "Arbitrum",
|
|
932
|
+
* "chainId": 42161,
|
|
933
|
+
* "tokenAddress": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9",
|
|
934
|
+
* "decimals": 6,
|
|
935
|
+
* "amount": 2100,
|
|
936
|
+
* "fiat": 2100.42,
|
|
937
|
+
* "price": 1.0002,
|
|
938
|
+
* "change24h": 0.01,
|
|
939
|
+
* "isStablecoin": true,
|
|
940
|
+
* "peg": {
|
|
941
|
+
* "symbol": "USDT",
|
|
942
|
+
* "price": 0.9938,
|
|
943
|
+
* "target": 1,
|
|
944
|
+
* "deviationBps": -62,
|
|
945
|
+
* "status": "watch",
|
|
946
|
+
* "observedAt": "2026-07-07T09:40:00Z",
|
|
947
|
+
* "source": "chainlink"
|
|
948
|
+
* },
|
|
949
|
+
* "spendable": true,
|
|
950
|
+
* "source": "registry"
|
|
951
|
+
* },
|
|
952
|
+
* {
|
|
953
|
+
* "symbol": "ETH",
|
|
954
|
+
* "name": "Ether",
|
|
955
|
+
* "chain": "Arbitrum",
|
|
956
|
+
* "chainId": 42161,
|
|
957
|
+
* "tokenAddress": "0x0000000000000000000000000000000000000000",
|
|
958
|
+
* "decimals": 18,
|
|
959
|
+
* "amount": 0.0921,
|
|
960
|
+
* "fiat": 244.74,
|
|
961
|
+
* "price": 2657.3,
|
|
962
|
+
* "change24h": -1.2,
|
|
963
|
+
* "isStablecoin": false,
|
|
964
|
+
* "peg": null,
|
|
965
|
+
* "spendable": true,
|
|
966
|
+
* "source": "registry"
|
|
967
|
+
* }
|
|
968
|
+
* ]
|
|
969
|
+
* }
|
|
970
|
+
*/
|
|
971
|
+
UnifiedBalance: {
|
|
972
|
+
/** @example 12480.06 */
|
|
973
|
+
totalFiat: number;
|
|
974
|
+
/**
|
|
975
|
+
* @description 24h change, percent.
|
|
976
|
+
* @example 2.4
|
|
977
|
+
*/
|
|
978
|
+
change24h: number;
|
|
979
|
+
/**
|
|
980
|
+
* @description The unified stablecoin figure (excludes non-stable assets like ETH).
|
|
981
|
+
* @example 12235.32
|
|
982
|
+
*/
|
|
983
|
+
stablecoinFiat: number;
|
|
984
|
+
/** @description Every priced holding across every chain family (EVM, Solana and Stellar alike), each in the one ValuedHolding shape - the row ValuationService.value() produces, the exact function GET /balance and GET /balance/history both call so the headline total and the chart's last point can never disagree. Always present (`[]` when empty), mirroring the three sidecar arrays below. The portfolio-history redesign's Task 21 wires this response up; tokens/ solanaTokens/stellarTokens are DEPRECATED in its favor and kept, unchanged, only until the frontend cuts over to it. */
|
|
985
|
+
holdings: components["schemas"]["ValuedHolding"][];
|
|
986
|
+
/**
|
|
987
|
+
* @deprecated
|
|
988
|
+
* @description DEPRECATED - superseded by holdings. Kept, unchanged, until the frontend cuts over (portfolio-history redesign Task 22).
|
|
989
|
+
*/
|
|
990
|
+
tokens: components["schemas"]["TokenBalance"][];
|
|
991
|
+
/**
|
|
992
|
+
* @deprecated
|
|
993
|
+
* @description DEPRECATED - superseded by holdings. Solana holdings. Always present (`[]` when empty) so a consumer never distinguishes "no Solana holdings" from "this build does not serve Solana". `totalFiat`, `stablecoinFiat` and `change24h` INCLUDE these rows.
|
|
994
|
+
*/
|
|
995
|
+
solanaTokens: components["schemas"]["SolanaTokenBalance"][];
|
|
996
|
+
/**
|
|
997
|
+
* @deprecated
|
|
998
|
+
* @description DEPRECATED - superseded by holdings. Stellar holdings. Always present (`[]` when empty), mirroring `solanaTokens` exactly. UNLIKE `solanaTokens`, each row carries no `fiat`/`price` field at all (no dedicated Stellar price port). `totalFiat`/`stablecoinFiat`/`change24h` are summed from `holdings[]` (chain-agnostic), so a Stellar trustline whose symbol is a recognized stablecoin (USDC/USDT) DOES contribute via the same $1 peg-advisory rule any other chain's stablecoin uses; an asset with no such recognition and no price observation (native XLM, today) still contributes nothing.
|
|
999
|
+
*/
|
|
1000
|
+
stellarTokens: components["schemas"]["StellarTokenBalance"][];
|
|
1001
|
+
/**
|
|
1002
|
+
* @description The account's backfill/health state (portfolio-history redesign, Task 21 fix round 1). `building` means the background sweep has not reached this account yet (no sync state, or a sync state with no ledger rows behind it) - `holdings` may be empty and `totalFiat` may read 0, and this is NOT a confirmed zero balance: a client MUST treat a `building` response as unknown, never render it as a real $0. At the moment this redesign first ships, EVERY existing account starts in `building` - the background sweep has never run in production before this cutover - so this is not a rare edge case for launch day, it is the expected state for the whole account population until the sweep catches up. `degraded` means the account has ledger data, but at least one of its chains' background sync is unhealthy right now - `holdings`/`totalFiat` still reflect whatever WAS last successfully synced for every chain, never blanked over one bad chain. `ready` means every chain's last sync succeeded.
|
|
1003
|
+
* @example ready
|
|
1004
|
+
* @enum {string}
|
|
1005
|
+
*/
|
|
1006
|
+
status: "ready" | "building" | "degraded";
|
|
1007
|
+
/** Format: date-time */
|
|
1008
|
+
asOf: string;
|
|
1009
|
+
};
|
|
1010
|
+
/** @description One priced holding, chain-agnostic (EVM/Solana/Stellar alike) - the exact row shape ValuationService.value() produces (src/modules/portfolio/valuation.service.ts), shared verbatim by GET /balance's headline total and GET /balance/history's chart bucket-by-bucket, so the two are structurally incapable of disagreeing. UnifiedBalance.holdings wiring lands in the portfolio-history redesign's Task 21. */
|
|
1011
|
+
ValuedHolding: {
|
|
1012
|
+
/**
|
|
1013
|
+
* @description CAIP-19 asset reference, e.g. `eip155:8453/erc20:0x8335...` for an ERC-20, or `eip155:8453/slip44:60` for that chain's native coin. The address segment of an erc20 reference is always lowercased.
|
|
1014
|
+
* @example eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913
|
|
1015
|
+
*/
|
|
1016
|
+
assetRef: string;
|
|
1017
|
+
/** @example USDC */
|
|
1018
|
+
symbol: string;
|
|
1019
|
+
/**
|
|
1020
|
+
* @description Display amount, decimal-formatted from the underlying base-unit balance.
|
|
1021
|
+
* @example 6420.5
|
|
1022
|
+
*/
|
|
1023
|
+
amount: number;
|
|
1024
|
+
/**
|
|
1025
|
+
* @description The price this holding was valued at - an observed price when priceAdvisory is false, or the $1 stablecoin TARGET when priceAdvisory is true. 0 when unresolvable (never fabricated).
|
|
1026
|
+
* @example 1
|
|
1027
|
+
*/
|
|
1028
|
+
priceUsd: number;
|
|
1029
|
+
/**
|
|
1030
|
+
* @description amount × priceUsd, rounded to 2dp.
|
|
1031
|
+
* @example 6420.5
|
|
1032
|
+
*/
|
|
1033
|
+
fiat: number;
|
|
1034
|
+
/** @description True only for a stablecoin with no observed price currently in force: priceUsd is then the $1 peg TARGET, not an observation - FR-9's honesty signal, telling a reader the number is a target rather than confirmation the asset is actually on peg, even mid-depeg. False in every other case, including a real observed price (stablecoin or not) and an unresolvable price (priceUsd: 0). Today this is the ONLY path ever taken for a stablecoin: no peg-observation source feeds PriceSeries yet (see the portfolio-history redesign design doc's §4 - DepegObservation exists in the schema but nothing writes it), so in practice every stablecoin prices at exactly $1.00 with priceAdvisory true even mid-depeg. An accepted fidelity limitation, not a hidden one. */
|
|
1035
|
+
priceAdvisory: boolean;
|
|
1036
|
+
};
|
|
1037
|
+
/** @description One held token, presentation-shaped (amount/fiat/price are display values) - EXCEPT amountRaw, which is not: it carries the exact base-unit balance, so this schema is no longer purely presentational and does not carry the x-presentation-only flag the other balance schemas do. Still never pooled or custodial (FR-S1) - only the "presentation-only" framing was inaccurate, never the custody guarantee. */
|
|
1038
|
+
TokenBalance: {
|
|
1039
|
+
/**
|
|
1040
|
+
* @description CAIP-19 asset ref, e.g. `eip155:42161/erc20:0x...`. Authoritative identifier for the token.
|
|
1041
|
+
* @example eip155:42161/erc20:0xFF970A61A04b1cA14834A43f5dE4533eBDDB5F86
|
|
1042
|
+
*/
|
|
1043
|
+
assetRef?: string;
|
|
1044
|
+
/** @example USDC */
|
|
1045
|
+
symbol: string;
|
|
1046
|
+
/** @example USD Coin */
|
|
1047
|
+
name: string;
|
|
1048
|
+
/** @example Arbitrum */
|
|
1049
|
+
chain: string;
|
|
1050
|
+
/** @example 42161 */
|
|
1051
|
+
chainId: number;
|
|
1052
|
+
tokenAddress: components["schemas"]["Address"];
|
|
1053
|
+
/** @example 6 */
|
|
1054
|
+
decimals: number;
|
|
1055
|
+
/** @example 6420.5 */
|
|
1056
|
+
amount: number;
|
|
1057
|
+
/** @example 6420.5 */
|
|
1058
|
+
fiat: number;
|
|
1059
|
+
/** @example 1 */
|
|
1060
|
+
price: number;
|
|
1061
|
+
/** @example 0 */
|
|
1062
|
+
change24h: number;
|
|
1063
|
+
isStablecoin: boolean;
|
|
1064
|
+
peg?: components["schemas"]["PegStatus"] | null;
|
|
1065
|
+
/** @description Whether Send/Grant can build against this token today - it has an adapter entry (see `GET /adapters`) for this chain + symbol, or it is native ETH. A displayable token (`registry ∪ discovered ∪ imported`) is not necessarily spendable. */
|
|
1066
|
+
spendable: boolean;
|
|
1067
|
+
/**
|
|
1068
|
+
* @description Which feed produced this row. `registry` is the curated, priced set; `discovered` is best-effort on-chain auto-discovery; `imported` is a token the owner added by hand.
|
|
1069
|
+
* @enum {string}
|
|
1070
|
+
*/
|
|
1071
|
+
source: "registry" | "discovered" | "imported";
|
|
1072
|
+
/** @description Coarse spam signal, set only on `discovered` rows with no price and an unrecognized symbol. Never set on `registry`/`imported` rows. A flag only - it never blocks display. */
|
|
1073
|
+
unrecognized?: boolean;
|
|
1074
|
+
/**
|
|
1075
|
+
* @description Virtuals launchpad stage, present only for recognized agent tokens.
|
|
1076
|
+
* @enum {string}
|
|
1077
|
+
*/
|
|
1078
|
+
graduationStatus?: "sentient" | "prototype" | "unknown";
|
|
1079
|
+
/** @description True when the price source confirmed this is a real (Virtuals) token. */
|
|
1080
|
+
recognized?: boolean;
|
|
1081
|
+
/** @description Fully-diluted valuation in USD when reported; never fabricated. */
|
|
1082
|
+
fdvUsd?: number | null;
|
|
1083
|
+
/**
|
|
1084
|
+
* @description The exact base-unit magnitude backing amount, as a decimal string - e.g. "1500500001" for a 6-decimal token whose true on-chain balance is 1500.500001, alongside amount: 1500.5 (2dp-rounded for display). Copied straight from the on-chain bigint read (bigint.toString()) - never a decimal-string parse and never a Number round-trip - so it carries no rounding beyond whatever the chain itself reported. This is the truth anchor the portfolio-history redesign's balance projection reads: re-deriving base units by multiplying amount back out would replay display rounding into that projection. Only ever set on a REAL on-chain read; omitted, never fabricated, on a fake-mode seeded row.
|
|
1085
|
+
* @example 1500500001
|
|
1086
|
+
*/
|
|
1087
|
+
amountRaw?: string;
|
|
1088
|
+
};
|
|
1089
|
+
/** @description Peg observation for one stablecoin. Visibility-only in v1. */
|
|
1090
|
+
PegStatus: {
|
|
1091
|
+
/** @example USDT */
|
|
1092
|
+
symbol: string;
|
|
1093
|
+
/**
|
|
1094
|
+
* @description Null iff status = unknown - never defaulted to 1, which would read as "on peg".
|
|
1095
|
+
* @example 0.9938
|
|
1096
|
+
*/
|
|
1097
|
+
price: number | null;
|
|
1098
|
+
/** @example 1 */
|
|
1099
|
+
target: number;
|
|
1100
|
+
/**
|
|
1101
|
+
* @description Signed basis points from target. Null iff status = unknown.
|
|
1102
|
+
* @example -62
|
|
1103
|
+
*/
|
|
1104
|
+
deviationBps: number | null;
|
|
1105
|
+
status: components["schemas"]["PegStatusLevel"];
|
|
1106
|
+
/** Format: date-time */
|
|
1107
|
+
observedAt: string;
|
|
1108
|
+
/** @example chainlink */
|
|
1109
|
+
source?: string | null;
|
|
1110
|
+
/**
|
|
1111
|
+
* @description Why the peg could not be observed. Set iff status = unknown.
|
|
1112
|
+
* @example Chainlink oracle unavailable
|
|
1113
|
+
*/
|
|
1114
|
+
unavailableReason?: string | null;
|
|
1115
|
+
};
|
|
1116
|
+
/**
|
|
1117
|
+
* @description `unknown` is not cosmetic: FR-9 forbids *silently* holding a depegged asset, so an unobservable peg reads as "we don't know" (price/deviationBps null, unavailableReason set), never as "on peg".
|
|
1118
|
+
* @enum {string}
|
|
1119
|
+
*/
|
|
1120
|
+
PegStatusLevel: "ok" | "watch" | "depegged" | "unknown";
|
|
1121
|
+
/** @description One Solana holding. Deliberately parallel to `TokenBalance` rather than a variant of it: `TokenBalance` requires `chainId` and a 0x `tokenAddress`, and loosening either would make two Solana rows compare equal on chainId. */
|
|
1122
|
+
SolanaTokenBalance: {
|
|
1123
|
+
/** @example SOL */
|
|
1124
|
+
symbol: string;
|
|
1125
|
+
/** @example SOL */
|
|
1126
|
+
name: string;
|
|
1127
|
+
/** @example Solana Devnet */
|
|
1128
|
+
chain: string;
|
|
1129
|
+
/** @example solana-devnet */
|
|
1130
|
+
key: string;
|
|
1131
|
+
/** @description The SPL mint, or null for native SOL, which genuinely has no mint. */
|
|
1132
|
+
mint: components["schemas"]["SolanaAddress"] | null;
|
|
1133
|
+
/** @example 9 */
|
|
1134
|
+
decimals: number;
|
|
1135
|
+
amount: number;
|
|
1136
|
+
fiat: number;
|
|
1137
|
+
price: number;
|
|
1138
|
+
change24h: number;
|
|
1139
|
+
isStablecoin: boolean;
|
|
1140
|
+
peg?: components["schemas"]["PegStatus"] | null;
|
|
1141
|
+
/** @description Always false in this build - the Solana send path does not exist yet. */
|
|
1142
|
+
spendable: boolean;
|
|
1143
|
+
/** @enum {string} */
|
|
1144
|
+
source: "registry" | "discovered";
|
|
1145
|
+
};
|
|
1146
|
+
/**
|
|
1147
|
+
* @description A Solana address (base58-encoded Ed25519 public key, 32-44 characters). DELIBERATELY separate from `Address` rather than widening it: `Address`'s `^0x[a-fA-F0-9]{40}$` pattern is enforced on ~12 DTOs, and widening it to accept base58 would silently weaken every one of them.
|
|
1148
|
+
* @example 9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM
|
|
1149
|
+
*/
|
|
1150
|
+
SolanaAddress: string;
|
|
1151
|
+
/** @description One Stellar balance row - native XLM or a trustline asset. Deliberately a RAW shape, unlike `SolanaTokenBalance`: there is no Stellar price port yet, so this carries no `amount`/`fiat`/ `price` - only what the RPC actually observed. */
|
|
1152
|
+
StellarTokenBalance: {
|
|
1153
|
+
/** @example XLM */
|
|
1154
|
+
symbol: string;
|
|
1155
|
+
/** @description The trustline asset's issuer account, or null for native XLM, which genuinely has none. */
|
|
1156
|
+
issuer: components["schemas"]["StellarAddress"] | null;
|
|
1157
|
+
/**
|
|
1158
|
+
* @description The raw on-chain balance as a decimal string (bigint-safe transport) - never a number, which would lose precision.
|
|
1159
|
+
* @example 1000.0000000
|
|
1160
|
+
*/
|
|
1161
|
+
rawAmount: string;
|
|
1162
|
+
/** @example 7 */
|
|
1163
|
+
decimals: number;
|
|
1164
|
+
/**
|
|
1165
|
+
* @description The chain KEY this row was read from ('stellar' or 'stellar-testnet'), mirroring `SolanaTokenBalance.key`. Distinguishes otherwise-identical XLM/trustline rows held on both Stellar networks.
|
|
1166
|
+
* @example stellar
|
|
1167
|
+
*/
|
|
1168
|
+
key: string;
|
|
1169
|
+
};
|
|
1170
|
+
/**
|
|
1171
|
+
* @description A Stellar account address (StrKey-encoded Ed25519 public key, starts with `G`, 56 characters). DELIBERATELY separate from `Address` and `SolanaAddress` - never widen either existing schema to accept this format.
|
|
1172
|
+
* @example GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H
|
|
1173
|
+
*/
|
|
1174
|
+
StellarAddress: string;
|
|
1175
|
+
/** @description A reference chain. `tier`/`explorerUrl`/`blockscoutUrl`/`gasTokens` are populated by `GET /chains` (Plan 3 Task 5) - the same schema used unenriched elsewhere (`SessionContext.chains`, `ReceiveInfo.chains`) may omit them. */
|
|
1176
|
+
Chain: {
|
|
1177
|
+
/** @example Arbitrum */
|
|
1178
|
+
name: string;
|
|
1179
|
+
/**
|
|
1180
|
+
* @description The EVM chainId. `null` on a non-EVM chain (Solana) - the same answer `LaunchpadToken.chainId` gives for a Solana launchpad token. Use `key` to address a chain across namespaces.
|
|
1181
|
+
* @example 42161
|
|
1182
|
+
*/
|
|
1183
|
+
chainId: number | null;
|
|
1184
|
+
/**
|
|
1185
|
+
* @description CAIP-2 chain reference (e.g. eip155:84532, solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1, stellar:testnet). The namespace-agnostic identity for this chain - unlike chainId, which is null for every non-EVM chain. Clients scoping a request by chain (GET /balance/history's chainRefs, GET /balance's focusChainRef) MUST send this value, not a key or a name.
|
|
1186
|
+
* @example eip155:84532
|
|
1187
|
+
*/
|
|
1188
|
+
chainRef: string;
|
|
1189
|
+
/**
|
|
1190
|
+
* @description Which address/transaction family this chain belongs to. `eip155` is every EVM chain. `solana` is the SVM lane. `stellar` is the Stellar lane - StrKey `G...` addresses, transactions relayed via `POST /stellar/transactions` (a later phase). Clients MUST branch on this to pick an address format and a send path.
|
|
1191
|
+
* @example eip155
|
|
1192
|
+
* @enum {string}
|
|
1193
|
+
*/
|
|
1194
|
+
namespace: "eip155" | "solana" | "stellar";
|
|
1195
|
+
/**
|
|
1196
|
+
* @description The canonical identifier for this chain across both namespaces. For an EVM chain this is the stringified `chainId` ("8453"); for Solana it is a slug ("solana", "solana-devnet").
|
|
1197
|
+
* @example 8453
|
|
1198
|
+
*/
|
|
1199
|
+
key: string;
|
|
1200
|
+
/** @example arb */
|
|
1201
|
+
shortName?: string | null;
|
|
1202
|
+
/** @example false */
|
|
1203
|
+
testnet: boolean;
|
|
1204
|
+
/** @example ETH */
|
|
1205
|
+
nativeSymbol?: string | null;
|
|
1206
|
+
/**
|
|
1207
|
+
* @description `botanary` iff AgentGuard is deployed (delegation/freeze/rules available); `basic` iff the chain has a bundler but no AgentGuard (send only, no delegation); `watch` otherwise (balances/reads only). From `GET /chains` only.
|
|
1208
|
+
* @example botanary
|
|
1209
|
+
* @enum {string}
|
|
1210
|
+
*/
|
|
1211
|
+
tier?: "watch" | "basic" | "botanary";
|
|
1212
|
+
/**
|
|
1213
|
+
* @description Block-explorer link base for this chain (currently always Blockscout). From `GET /chains` only.
|
|
1214
|
+
* @example https://base-sepolia.blockscout.com
|
|
1215
|
+
*/
|
|
1216
|
+
explorerUrl?: string;
|
|
1217
|
+
/**
|
|
1218
|
+
* @description The Blockscout instance base URL for this chain. From `GET /chains` only.
|
|
1219
|
+
* @example https://base-sepolia.blockscout.com
|
|
1220
|
+
*/
|
|
1221
|
+
blockscoutUrl?: string;
|
|
1222
|
+
/**
|
|
1223
|
+
* @description Assets that can pay this chain's gas - `native` always, `+USDC` where Circle Paymaster gas is available. From `GET /chains` only.
|
|
1224
|
+
* @example [
|
|
1225
|
+
* "native",
|
|
1226
|
+
* "USDC"
|
|
1227
|
+
* ]
|
|
1228
|
+
*/
|
|
1229
|
+
gasTokens?: string[];
|
|
1230
|
+
/**
|
|
1231
|
+
* @description The ERC-20 identity address for a chain whose NATIVE asset is itself a token (Arc: gas is USDC), for DISPLAY/verification only - e.g. a token detail view's "Contract" field and block-explorer link for that chain's native balance row, which otherwise carries the `0x0` native sentinel (not a real, explorer-verifiable contract). `null` on every other chain, and `null` here too on a token-native chain whose ERC-20 address is unverified. Balances are never read or deduped through this address - only through the native sentinel. From `GET /chains` only.
|
|
1232
|
+
* @example 0x3600000000000000000000000000000000000000
|
|
1233
|
+
*/
|
|
1234
|
+
nativeErc20Address?: string | null;
|
|
1235
|
+
};
|
|
1236
|
+
/** @description How an owner may pay a network fee (FR-8). `usdc` is the default: FR-8 promises that no action requires holding a native gas token, and an owner who has only ever received stablecoins holds none. Choosing it makes `POST /money/send/build` return a `gasPermit`. */
|
|
1237
|
+
GasMethod: {
|
|
1238
|
+
method: components["schemas"]["GasMethodName"];
|
|
1239
|
+
/** @example Sponsored */
|
|
1240
|
+
label: string;
|
|
1241
|
+
/** @description What the BOUND backend adapter can build - not what a given client can carry to a mined transaction. `usdt` is false in real mode: its Permit2 leg is a seam, not an implementation. */
|
|
1242
|
+
available: boolean;
|
|
1243
|
+
token?: components["schemas"]["TokenRef"] | null;
|
|
1244
|
+
balance?: number | null;
|
|
1245
|
+
balanceFiat?: number | null;
|
|
1246
|
+
isDefault: boolean;
|
|
1247
|
+
/** @example Pay the network fee in USDC. No ETH needed. */
|
|
1248
|
+
note?: string | null;
|
|
1249
|
+
/**
|
|
1250
|
+
* @description What one send is expected to cost with this method, denominated in this method's own `token` - so a client can reserve the fee before there is an op to price. A MAX/"send everything" control MUST subtract this from the balance when `token` is the asset being sent, or it composes a transfer whose fee has nowhere to come from.
|
|
1251
|
+
* An ESTIMATE. The authority on affordability is the build (`POST /money/send/build`), which prices the real UserOp and refuses with exact numbers rather than returning a signable op that cannot settle. `native` is priced from the chain's own `maxFeePerGas` and includes the account's deployment while it is still counterfactual. `null` means not estimable here (a paymaster whose spread this endpoint cannot read) - reserve nothing and let the build be the judge. `sponsored` is `0`: nothing leaves the account.
|
|
1252
|
+
* @example 0.0009
|
|
1253
|
+
*/
|
|
1254
|
+
estimatedFee?: number | null;
|
|
1255
|
+
};
|
|
1256
|
+
/** @enum {string} */
|
|
1257
|
+
GasMethodName: "sponsored" | "usdc" | "usdt" | "native";
|
|
1258
|
+
Account: {
|
|
1259
|
+
/** @example acct_01H8 */
|
|
1260
|
+
id: string;
|
|
1261
|
+
/** @example Main account */
|
|
1262
|
+
label: string;
|
|
1263
|
+
address: components["schemas"]["Address"];
|
|
1264
|
+
/** @description The address this account was previously stored as on this chain if it required migration to a new address. Null means the address has never changed on this chain, which is the normal case. */
|
|
1265
|
+
supersededAddress?: string | null;
|
|
1266
|
+
/** @example Smart account */
|
|
1267
|
+
type: string;
|
|
1268
|
+
deploymentStatus: components["schemas"]["AccountDeploymentStatus"];
|
|
1269
|
+
/**
|
|
1270
|
+
* @description `null` on a non-EVM account (Solana). Use `key` to identify the chain. On a collapsed `GET /accounts` entry this is the CANONICAL row's home chain, NOT the only chain the account exists on - the address is the same on every EVM chain, and `chains[]` enumerates the ones it has rows on.
|
|
1271
|
+
* @example 42161
|
|
1272
|
+
*/
|
|
1273
|
+
chainId: number | null;
|
|
1274
|
+
/**
|
|
1275
|
+
* @description The chain key this account belongs to ("8453", "solana", "solana-devnet").
|
|
1276
|
+
* @example 8453
|
|
1277
|
+
*/
|
|
1278
|
+
key?: string;
|
|
1279
|
+
/**
|
|
1280
|
+
* @example eip155
|
|
1281
|
+
* @enum {string}
|
|
1282
|
+
*/
|
|
1283
|
+
namespace?: "eip155" | "solana" | "stellar";
|
|
1284
|
+
/** @description `null` when this account has NO smart account - a plain Solana wallet, where the key and the money share an address. On EVM this is absent, because the account itself IS the smart account. Present-and-null is the seam that lets a program vault be added later additively. */
|
|
1285
|
+
smartAccount?: Record<string, never> | null;
|
|
1286
|
+
signerAddress: components["schemas"]["Address"];
|
|
1287
|
+
/** @description Account-level kill-switch state. On a collapsed `GET /accounts` entry, `true` when AT LEAST ONE of `chains[]` is frozen - AgentGuard is deployed per chain, so the flag is per chain underneath; which chain is frozen, and the id to unfreeze it with, are in `chains[]`. Required, because every account this API serves today is an EVM account (`address` is 0x-typed) and every one of them has a kill-switch. A chain with no kill-switch mechanism will OMIT this rather than send `false` - `false` would read as "not frozen" when it means "freeze does not exist here" - and will be expressed as its own arm of a `oneOf` discriminated on `namespace`, not by relaxing this list. */
|
|
1288
|
+
frozen: boolean;
|
|
1289
|
+
/**
|
|
1290
|
+
* @description The CREATE2 factory salt this account was derived at. 0 is the first ("Main") account.
|
|
1291
|
+
* @example 0
|
|
1292
|
+
*/
|
|
1293
|
+
index: number;
|
|
1294
|
+
/** @description Presentation-only. A hidden account is NOT deleted: it remains on-chain, remains bounded by AgentGuard, and its delegations remain revocable. Hiding only removes it from the picker. */
|
|
1295
|
+
hidden: boolean;
|
|
1296
|
+
/**
|
|
1297
|
+
* @description What this account is for. Absent on an older/legacy account row - treat as "primary". "acp_spending" marks the dedicated, capped account a bounded ACP hire pays from.
|
|
1298
|
+
* @example primary
|
|
1299
|
+
* @enum {string}
|
|
1300
|
+
*/
|
|
1301
|
+
purpose?: "primary" | "acp_spending";
|
|
1302
|
+
/** Format: date-time */
|
|
1303
|
+
createdAt?: string;
|
|
1304
|
+
/**
|
|
1305
|
+
* @description This account's own unified-balance total (fiat). Present only on `GET /accounts` rows - absent on every other Account-shaped response (`GET /account`, `POST /accounts`, `PATCH /accounts/:id`, …).
|
|
1306
|
+
* @example 8765.66
|
|
1307
|
+
*/
|
|
1308
|
+
totalFiat?: number;
|
|
1309
|
+
/** @description Every chain this ONE logical account exists on, one entry per backing row. Present only where an Account is a COLLAPSED group - `GET /accounts` rows and the `PATCH /accounts/:id` response - and absent everywhere else (`GET /account`, `POST /accounts`, …), which return a single chain's row and mean it. Its presence is what says "this is the account, not one chain of it". The entries carry the per-chain truth the collapsed fields can only summarise: `deploymentStatus` and `frozen` genuinely differ per chain, and `accountId` is what an inherently per-chain operation (`POST /account/freeze` and `/unfreeze`, `POST /accounts/{id}/tokens`) must be given to target one specific chain. */
|
|
1310
|
+
chains?: components["schemas"]["AccountChain"][];
|
|
1311
|
+
};
|
|
1312
|
+
/** @enum {string} */
|
|
1313
|
+
AccountDeploymentStatus: "counterfactual" | "deployed";
|
|
1314
|
+
/** @description One chain a logical account exists on. NOT a separate account: every entry shares the owner's `address`, `label` and `index` - the same counterfactual Kernel account, whose deployment state is per-chain. */
|
|
1315
|
+
AccountChain: {
|
|
1316
|
+
/** @example 84532 */
|
|
1317
|
+
chainId: number;
|
|
1318
|
+
/**
|
|
1319
|
+
* @description The backing row's id, for endpoints that act on ONE chain. The group's own `id` is the canonical row's id and appears here too.
|
|
1320
|
+
* @example acct_01H8
|
|
1321
|
+
*/
|
|
1322
|
+
accountId: string;
|
|
1323
|
+
deploymentStatus: components["schemas"]["AccountDeploymentStatus"];
|
|
1324
|
+
/** @description This chain's own kill-switch state - AgentGuard is deployed per chain, so an account can be frozen on one chain and live on another. */
|
|
1325
|
+
frozen: boolean;
|
|
1326
|
+
/**
|
|
1327
|
+
* @description Whether this chain carries BotanaryPolicyValidator at all - i.e. whether signers and signing policies could EVER work here, independent of anything about this account.
|
|
1328
|
+
*
|
|
1329
|
+
* A CLIENT CANNOT DERIVE THIS. `chainTier` is no substitute: it keys off `agentGuard`, a different contract, so a `basic`-tier chain and a validator-carrying one are indistinguishable through it. Shipping without this field meant the signing-policy network selector offered - and defaulted to - chains where the feature is permanently impossible.
|
|
1330
|
+
*
|
|
1331
|
+
* Deliberately about the CHAIN, not the account. `installed`/`migrationEligible` (GET /account/policies) answer "can THIS account use it here", a different and later question. A chain that is `false` here can never become usable; one that is `true` but not yet installed only needs a step, and must stay offered so the owner can take it.
|
|
1332
|
+
*/
|
|
1333
|
+
authorityCore: boolean;
|
|
1334
|
+
};
|
|
1335
|
+
/** @description TWO shapes, discriminated by `action`. Omitting `action` is a TRANSFER - `recipient` and `amount` required, unchanged since the route's first shape. Which token it moves is named by `token` (a contract address or CAIP-19 asset ref - Task A11) or, for callers that predate that field, the LEGACY `tokenSymbol` (by symbol); both are optional when the delegation budgets exactly one token. `action: swap` is the swap shape: it requires `tokenIn`, `tokenOut` and `amountIn`, ignores `recipient`/`amount`/`token`/`tokenSymbol`, and is GRANT-ONLY. A swap is refused `grant_swap_not_authorised` unless the grant was built with a `swapVenue` AND the route agrees with the router, token and allowance ceiling that venue pins; and `route_spender_mismatch` when the route's approval spender and router are different addresses (a grant approves exactly the contract it calls, so such a route is not expressible). */
|
|
1336
|
+
DelegatedActionInput: {
|
|
1337
|
+
/**
|
|
1338
|
+
* @description Which shape this body is. Omitted → transfer.
|
|
1339
|
+
* @enum {string}
|
|
1340
|
+
*/
|
|
1341
|
+
action?: "transfer" | "swap";
|
|
1342
|
+
/** @description TRANSFER shape, required there. The transfer recipient (re-checked against the delegation's allowlist on-chain). */
|
|
1343
|
+
recipient: string;
|
|
1344
|
+
/** @description TRANSFER shape, required there. Amount in the delegation's stablecoin (re-checked against per-action + cumulative caps). */
|
|
1345
|
+
amount: number;
|
|
1346
|
+
/**
|
|
1347
|
+
* @description TRANSFER shape. Which budgeted token to move, by contract address or CAIP-19 asset ref - NEVER a symbol. Same pattern and same rule as `CliSendIntent.token` (see that field's own description): a symbol is a label a contract chose for itself, and this route will not guess which one a caller meant. Optional when the delegation budgets exactly one token (defaults to it); when it budgets more than one, name it explicitly here or in `tokenSymbol` below, or the build is refused rather than silently picking the first budgeted token. Whenever named, must be one of the tokens this delegation actually budgets, or the build declines `stablecoin_not_permitted`.
|
|
1348
|
+
* @example 0x036CbD53842c5426634e7929541eC2318f3dCF7e
|
|
1349
|
+
*/
|
|
1350
|
+
token?: string;
|
|
1351
|
+
/** @description TRANSFER shape. LEGACY - the pre-Task-A11 way to name a budgeted token, BY SYMBOL (e.g. "USDC"). Kept only for callers that predate `token` above; prefer `token`, since a symbol is a label a contract chose for itself and two contracts on one chain can share one. Also matched against the delegation's budgeted assetRefs and declined `stablecoin_not_permitted` when it names an unbudgeted token. */
|
|
1352
|
+
tokenSymbol?: string;
|
|
1353
|
+
/** @description SWAP shape, required there. The token being SOLD, by symbol. Must be the one token this grant's swapVenue pins. */
|
|
1354
|
+
tokenIn?: string;
|
|
1355
|
+
/** @description SWAP shape, required there. The token being BOUGHT, by symbol. Unbounded by the grant - what the account receives increases its holdings, and a grant meters only what leaves. */
|
|
1356
|
+
tokenOut?: string;
|
|
1357
|
+
/** @description SWAP shape, required there. How much of tokenIn to sell, in display units. Must be at or under the venue's maxAllowance. */
|
|
1358
|
+
amountIn?: number;
|
|
1359
|
+
/** @description SWAP shape. Slippage tolerance for the route quote. Defaults to 50 bps. */
|
|
1360
|
+
maxSlippageBps?: number;
|
|
1361
|
+
};
|
|
1362
|
+
/** @description A built (unsigned) op ready for the owner to sign, with the hash to sign + context. */
|
|
1363
|
+
UserOpBuild: {
|
|
1364
|
+
intentType: components["schemas"]["IntentType"];
|
|
1365
|
+
userOp: components["schemas"]["UnsignedUserOp"];
|
|
1366
|
+
userOpHash: components["schemas"]["Hash32"];
|
|
1367
|
+
humanSummary?: string | null;
|
|
1368
|
+
simulation?: components["schemas"]["Simulation"] | null;
|
|
1369
|
+
/** @description Present for swaps whose route supplies exact output amounts; never derived from rounded display amounts. */
|
|
1370
|
+
swapQuote?: components["schemas"]["SwapExecutionQuote"];
|
|
1371
|
+
/** @description Freeze/revoke/withdraw-to-safety - instant, never gated on native gas (FR-2/FR-8). */
|
|
1372
|
+
riskReducing: boolean;
|
|
1373
|
+
instant: boolean;
|
|
1374
|
+
/** @description Pre-wired to the sponsored / revoke-only paymaster. */
|
|
1375
|
+
gasless: boolean;
|
|
1376
|
+
/** @description Set only when the send chose to pay its fee in USDC. When present, `userOpHash` above is stale - the client attaches `paymasterData` and recomputes it. See GasPermit. */
|
|
1377
|
+
gasPermit?: components["schemas"]["GasPermit"] | null;
|
|
1378
|
+
/** @description Set only when the send chose to pay its fee in USDT and the account's on-chain allowance needed raising. INFORMATIONAL: `calls` are already batched into `userOp.callData`, so - unlike `gasPermit` - no second signature is required and `userOpHash` above remains the hash to sign. */
|
|
1379
|
+
usdtApproval?: components["schemas"]["UsdtApproval"] | null;
|
|
1380
|
+
/** @description Present ONLY for `intentType: farm_deposit` / `farm_withdraw` - live exit constraints for the target pool, probed after the op is built and never cached, so what the owner sees is what the chain says at signing time. Absent (not merely null) for every other intentType. */
|
|
1381
|
+
exit?: components["schemas"]["ExitTerms"] | null;
|
|
1382
|
+
/** @description Present for `intentType: farm_deposit` / `farm_withdraw` / `farm_claim` (Plan 5 Task 4/7 extends this to the claim build), alongside `exit` above where applicable - the verbs this pool's adapter implements for this account, from the same live probe (design spec §7). Absent for every other intentType, and optional here so this addition is non-breaking for clients that predate it. */
|
|
1383
|
+
verbs?: components["schemas"]["VerbAvailability"][];
|
|
1384
|
+
/** @description Present ONLY for `intentType: farm_claim` (Plan 5 Task 4/7) - the reward rows this build read from the SAME probe used to decide whether to build at all, so a client can show what was actually claimed without a second round trip. Absent (not merely `[]`) for every other intentType, including `farm_deposit`/`farm_withdraw` - see `ClaimableReward` for the absence-vs-empty distinction this field itself carries when it IS present. */
|
|
1385
|
+
claimable?: components["schemas"]["ClaimableReward"][];
|
|
1386
|
+
/** @description Present ONLY for the seven v1-authority-core `intentType`s (`policy_set`, `policy_remove`, `signer_add`, `signer_remove`, `guardians_set`, `condition_set_member_set`, `signers_recover`) - what this op costs, both today and once it lands. Absent for every other intentType. */
|
|
1387
|
+
securityPricing?: components["schemas"]["SecurityPricing"] | null;
|
|
1388
|
+
/** @description Present ONLY for `intentType: signers_recover` (Flow 9). Every ACTIVE policy whose `approvals` requirement is clamped down by this signer-set rotation - empty (never absent) when none is affected. Absent for every other intentType. See `PolicyImpact` for exactly what this does and does not capture. */
|
|
1389
|
+
policyImpact?: components["schemas"]["PolicyImpact"][] | null;
|
|
1390
|
+
/** @description Present ONLY for `intentType: signers_recover`, always `true` there - `recover` unconditionally deletes the account's guardian set as part of the same call, regardless of `newSigners`/ `newThreshold`. A structured twin of the same fact already stated in `humanSummary`. Absent for every other intentType. */
|
|
1391
|
+
guardiansCleared?: boolean | null;
|
|
1392
|
+
};
|
|
1393
|
+
/** @enum {string} */
|
|
1394
|
+
IntentType: "send" | "swap" | "delegation_enable" | "delegation_freeze" | "delegation_unfreeze" | "delegation_revoke" | "account_freeze" | "account_unfreeze" | "rules_update" | "guardian_add" | "guardian_remove" | "account_deploy" | "account_fund" | "panic_install" | "panic_freeze" | "delegated_action" | "device_add" | "device_remove" | "device_threshold" | "managed_deposit" | "agent_deposit" | "farm_deposit" | "farm_withdraw" | "farm_claim" | "pay_sh_topup" | "policy_set" | "policy_remove" | "signer_add" | "signer_remove" | "signer_threshold" | "guardians_set" | "condition_set_member_set" | "signers_recover" | "action_announce" | "authority_migration_op_a" | "authority_migration_op_b" | "trust_anchor_set" | "apis_budget_commit" | "apis_budget_revoke";
|
|
1395
|
+
/** @description ERC-4337 (EntryPoint v0.7) UserOp with an empty signature. The owner signs `userOpHash` (returned alongside in the build envelope) client-side against their Privy embedded wallet. The backend builds and later relays it - it never signs. */
|
|
1396
|
+
UnsignedUserOp: {
|
|
1397
|
+
sender: components["schemas"]["Address"];
|
|
1398
|
+
/**
|
|
1399
|
+
* @description uint256 as a decimal/hex string.
|
|
1400
|
+
* @example 0
|
|
1401
|
+
*/
|
|
1402
|
+
nonce: string;
|
|
1403
|
+
factory?: components["schemas"]["Address"] | null;
|
|
1404
|
+
factoryData?: components["schemas"]["Hex"] | null;
|
|
1405
|
+
callData: components["schemas"]["Hex"];
|
|
1406
|
+
/** @example 200000 */
|
|
1407
|
+
callGasLimit: string;
|
|
1408
|
+
/** @example 150000 */
|
|
1409
|
+
verificationGasLimit: string;
|
|
1410
|
+
/** @example 50000 */
|
|
1411
|
+
preVerificationGas: string;
|
|
1412
|
+
/** @example 1000000000 */
|
|
1413
|
+
maxFeePerGas: string;
|
|
1414
|
+
/** @example 1000000000 */
|
|
1415
|
+
maxPriorityFeePerGas: string;
|
|
1416
|
+
paymaster?: components["schemas"]["Address"] | null;
|
|
1417
|
+
paymasterVerificationGasLimit?: string | null;
|
|
1418
|
+
paymasterPostOpGasLimit?: string | null;
|
|
1419
|
+
paymasterData?: components["schemas"]["Hex"] | null;
|
|
1420
|
+
signature: components["schemas"]["Hex"];
|
|
1421
|
+
entryPoint: components["schemas"]["Address"];
|
|
1422
|
+
/** @example 42161 */
|
|
1423
|
+
chainId: number;
|
|
1424
|
+
};
|
|
1425
|
+
/**
|
|
1426
|
+
* @description Arbitrary-length hex byte string (calldata, paymaster data, signature).
|
|
1427
|
+
* @example 0x
|
|
1428
|
+
*/
|
|
1429
|
+
Hex: string;
|
|
1430
|
+
/** @description Advisory pre-flight (FR-4). The on-chain hook re-asserts. */
|
|
1431
|
+
Simulation: {
|
|
1432
|
+
id: string;
|
|
1433
|
+
intentType: components["schemas"]["IntentType"];
|
|
1434
|
+
willSucceed: boolean;
|
|
1435
|
+
declineReason?: components["schemas"]["DeclineReason"] | null;
|
|
1436
|
+
amountIn?: components["schemas"]["TokenAmount"] | null;
|
|
1437
|
+
amountOut?: components["schemas"]["TokenAmount"] | null;
|
|
1438
|
+
/** @example 1.08 */
|
|
1439
|
+
rate?: number | null;
|
|
1440
|
+
/** @example USDC → EURC via Uniswap v3 */
|
|
1441
|
+
route?: string | null;
|
|
1442
|
+
/** @example 30 */
|
|
1443
|
+
slippageBps?: number | null;
|
|
1444
|
+
fees: components["schemas"]["TokenAmount"][];
|
|
1445
|
+
gas: components["schemas"]["GasEstimate"];
|
|
1446
|
+
warnings: string[];
|
|
1447
|
+
/** Format: date-time */
|
|
1448
|
+
expiresAt?: string | null;
|
|
1449
|
+
};
|
|
1450
|
+
GasEstimate: {
|
|
1451
|
+
method: components["schemas"]["GasMethodName"];
|
|
1452
|
+
cost?: components["schemas"]["TokenAmount"] | null;
|
|
1453
|
+
sponsored: boolean;
|
|
1454
|
+
};
|
|
1455
|
+
/** @description Exact quote amounts in integer base units, associated with this unsigned swap build. These are estimates for review and subsequent financial-effect reconciliation. This object alone does not prove that the router calldata enforces a minimum or that execution settled. */
|
|
1456
|
+
SwapExecutionQuote: {
|
|
1457
|
+
chainId: number;
|
|
1458
|
+
toChainId: number;
|
|
1459
|
+
accountAddress: components["schemas"]["Address"];
|
|
1460
|
+
/** @description Input token address, or the zero address for native currency. */
|
|
1461
|
+
inputAsset: components["schemas"]["Address"];
|
|
1462
|
+
/** @description Output token address, or the zero address for native currency. */
|
|
1463
|
+
outputAsset: components["schemas"]["Address"];
|
|
1464
|
+
/** @description Exact input amount, at most uint256 max. */
|
|
1465
|
+
amountInRaw: string;
|
|
1466
|
+
/** @description Estimated output amount, at most uint256 max. */
|
|
1467
|
+
estimatedOutRaw: string;
|
|
1468
|
+
/** @description Quoted minimum output, no greater than estimatedOutRaw. */
|
|
1469
|
+
minimumOutRaw: string;
|
|
1470
|
+
};
|
|
1471
|
+
/**
|
|
1472
|
+
* @description Present only when `gasMethod: usdc`. Everything the client needs to let the Circle Paymaster take this op's network fee in USDC, and nothing it could compute for itself.
|
|
1473
|
+
*
|
|
1474
|
+
* The paymaster is paid through a USDC EIP-2612 permit whose `owner` is the SMART ACCOUNT, so USDC verifies it via ERC-1271 and the owner signs a Kernel-wrapped digest rather than the permit's own EIP-712 hash. The backend reads the chain and computes that digest. **It holds no key and produces no signature** - a hash is not an authorization.
|
|
1475
|
+
*
|
|
1476
|
+
* The permit is independent of the UserOp, while `paymasterData` is hashed INTO the userOpHash. The order is therefore forced, and **`UserOpBuild.userOpHash` is NOT the hash to sign when this object is present**: sign `permitDigest`, assemble `paymasterData` as `abi.encodePacked(uint8 0, token, permitAmount, signaturePrefix ‖ permitSignature)`, RECOMPUTE the userOpHash over the completed op, sign that, then relay. Two owner signatures per USDC-gassed op; USDC's permit nonce increments on use, so a permit is single-shot and cannot be cached.
|
|
1477
|
+
*
|
|
1478
|
+
* Every field of the permit is returned, not just the digest, so a client can rebuild the digest and refuse to sign one it did not derive.
|
|
1479
|
+
*/
|
|
1480
|
+
GasPermit: {
|
|
1481
|
+
paymaster: components["schemas"]["Address"];
|
|
1482
|
+
token: components["schemas"]["Address"];
|
|
1483
|
+
/**
|
|
1484
|
+
* @description The token's on-chain `name()` - part of its EIP-712 domain. Differs per chain.
|
|
1485
|
+
* @example USD Coin
|
|
1486
|
+
*/
|
|
1487
|
+
tokenName: string;
|
|
1488
|
+
/** @example 2 */
|
|
1489
|
+
tokenVersion: string;
|
|
1490
|
+
/**
|
|
1491
|
+
* @description The account version whose ERC-1271 wrapper produced `permitDigest`.
|
|
1492
|
+
* @example 0.3.3
|
|
1493
|
+
*/
|
|
1494
|
+
kernelVersion: string;
|
|
1495
|
+
/**
|
|
1496
|
+
* @description The permit's `value`, in the token's base units. MUST equal the amount encoded into `paymasterData`; the two are checked against each other on-chain.
|
|
1497
|
+
* @example 212142
|
|
1498
|
+
*/
|
|
1499
|
+
permitAmount: string;
|
|
1500
|
+
/** @example 2 */
|
|
1501
|
+
permitNonce: string;
|
|
1502
|
+
/** @description uint256 max - a permit is spent by its nonce, not by time. */
|
|
1503
|
+
permitDeadline: string;
|
|
1504
|
+
permitDigest: components["schemas"]["Hash32"];
|
|
1505
|
+
/** @description Prepend to the owner's 65-byte signature - Kernel's ERC-1271 envelope (`0x01 ‖ rootValidator`). */
|
|
1506
|
+
signaturePrefix: components["schemas"]["Hex"];
|
|
1507
|
+
/**
|
|
1508
|
+
* @description The USDC the paymaster pulls up front in the validation phase, refunding the unused part in postOp. The account must hold this on top of the amount it is sending.
|
|
1509
|
+
* @example 0.031296
|
|
1510
|
+
*/
|
|
1511
|
+
estimatedFee: number;
|
|
1512
|
+
};
|
|
1513
|
+
/** @description The one-time on-chain USDT allowance Pimlico's ERC-20 paymaster needs before it can pull its fee. Present only when `gasMethod: usdt` AND the account's current on-chain `USDT.allowance(account, paymaster)` is insufficient - omitted once approved. USDT has no EIP-2612 permit: `calls` are already batched into `UserOpBuild.userOp.callData`, so there is no digest and no second signature. INFORMATIONAL only - render it, but never collect a second signature. */
|
|
1514
|
+
UsdtApproval: {
|
|
1515
|
+
/** @description USDT on this chain - also every `calls[i].to`. */
|
|
1516
|
+
token: components["schemas"]["Address"];
|
|
1517
|
+
/** @description The Pimlico ERC-20 paymaster being granted the allowance - matches `userOp.paymaster`. */
|
|
1518
|
+
paymaster: components["schemas"]["Address"];
|
|
1519
|
+
/** @description The amount being approved, in USDT base units (a large, persistent allowance). */
|
|
1520
|
+
amount: string;
|
|
1521
|
+
/** @description Unsigned calls, already batched into the op the owner signs once. */
|
|
1522
|
+
calls: components["schemas"]["UsdtApprovalCall"][];
|
|
1523
|
+
};
|
|
1524
|
+
/** @description One unsigned ERC-20 call, ready to batch into the account's own execution ahead of its intended action (Kernel v3.3 `execute`, batch mode). Not a signed leg - see `UsdtApproval`. */
|
|
1525
|
+
UsdtApprovalCall: {
|
|
1526
|
+
to: components["schemas"]["Address"];
|
|
1527
|
+
data: components["schemas"]["Hex"];
|
|
1528
|
+
/** @description Always `"0"` - an ERC-20 `approve` carries no native value. */
|
|
1529
|
+
value: string;
|
|
1530
|
+
};
|
|
1531
|
+
/** @description Live exit constraints, probed at read time and NEVER cached. ERC-4626 does not guarantee an owner can leave: `maxWithdraw`/`maxRedeem` exist in the standard precisely because a vault can cap exits behind a notice period, a withdrawal queue, or simply pay out only what is currently liquid. All amounts are base-unit decimal strings, never numbers - a vault's TVL overflows float64 precision. */
|
|
1532
|
+
ExitTerms: {
|
|
1533
|
+
/** @description The underlying actually sitting in the vault/reserve right now, base units - ACCOUNT-INDEPENDENT, and the one honest pre-deposit signal: `maxWithdraw` is 0 and meaningless before the account holds any shares. */
|
|
1534
|
+
liquidAssets: string;
|
|
1535
|
+
/** @description The account's own live `maxWithdraw`, base units - what `POST /farm/withdraw/build` enforces against. Null when no account was in scope for the probe (`GET /farm/pools/{id}/terms`, asked before any deposit exists) - never a false zero standing in for "unknown". */
|
|
1536
|
+
maxWithdrawAssets: string | null;
|
|
1537
|
+
/** @description Same null convention as `maxWithdrawAssets`, share-denominated. */
|
|
1538
|
+
maxRedeemShares: string | null;
|
|
1539
|
+
/** @description True only when the account's WHOLE position can be withdrawn right now. Null under the same no-account-in-scope condition as `maxWithdrawAssets`. */
|
|
1540
|
+
fullExitAvailable: boolean | null;
|
|
1541
|
+
/**
|
|
1542
|
+
* Format: date-time
|
|
1543
|
+
* @description When this probe ran. Never cached - always "now", not a stale sync timestamp.
|
|
1544
|
+
*/
|
|
1545
|
+
probedAt: string;
|
|
1546
|
+
};
|
|
1547
|
+
/**
|
|
1548
|
+
* @description Whether an account can perform ONE verb against a pool RIGHT NOW, discovered from live chain state (design spec §7) rather than an editorial table. Two things the field names alone do not convey:
|
|
1549
|
+
*
|
|
1550
|
+
* ABSENCE of a verb from the containing `verbs` array is meaningful, and DIFFERENT from an entry present with `available: false`. Absence means this adapter has NO CLAIM PATH at all for this pool - e.g. `claim` on any pool but Aave-v3 (EVM) or Kamino (Solana). An entry present with `available: false` means the verb IS implemented but is closed right now, with `reason` saying why - for `claim` specifically, `nothing_accrued` (a reward program exists, proven zero accrued) or `rewards_unreadable` (the accrual read itself failed - never reported as a zero, see `ClaimableReward`). Clients depend on this distinction - do not conflate the two.
|
|
1551
|
+
*
|
|
1552
|
+
* `max: null` means NO PROVEN BOUND, never "unlimited" - a client must not render `null` as a Max amount.
|
|
1553
|
+
*/
|
|
1554
|
+
VerbAvailability: {
|
|
1555
|
+
verb: components["schemas"]["PoolVerb"];
|
|
1556
|
+
available: boolean;
|
|
1557
|
+
/** @description Upper bound in the asset's base units, when the adapter can PROVE one. `null` means no proven bound - see the schema description above. */
|
|
1558
|
+
max: string | null;
|
|
1559
|
+
/** @description Machine-readable why-not. Always `null` when `available` is true. */
|
|
1560
|
+
reason: string | null;
|
|
1561
|
+
};
|
|
1562
|
+
/**
|
|
1563
|
+
* @description One action a pool's adapter can attempt against a live pool (design spec §7): `deposit`, `withdraw`, or `claim`. As of Plan 5, `claim` is a REAL verb two adapters emit: the EVM Aave-v3 adapter (`class: lending`, reading `DEFAULT_INCENTIVES_CONTROLLER`) and the Solana Kamino adapter (`class: kamino-lend`, reading a farm's `UserState`). Every other adapter (ERC-4626, Compound v3, Marinade, Solend, Jito) still never emits it - see `VerbAvailability`'s own description for what that absence means versus a present-but-closed entry.
|
|
1564
|
+
* @enum {string}
|
|
1565
|
+
*/
|
|
1566
|
+
PoolVerb: "deposit" | "withdraw" | "claim";
|
|
1567
|
+
/**
|
|
1568
|
+
* @description One accrued reward-token row (design spec §9, Plan 5). Reward tokens are frequently NOT the pool's own asset (e.g. ARB or GHO accrued on an Aave USDC reserve) - `token`/`symbol`/`decimals` describe the REWARD, not the pool.
|
|
1569
|
+
*
|
|
1570
|
+
* Two things a client cannot infer from the field names alone, and must not conflate:
|
|
1571
|
+
*
|
|
1572
|
+
* `claimable: []` on a probe response with NO `claim` entry in that same response's `verbs` means this adapter has NO CLAIM PATH for this pool at all - never fabricate a row to fill the gap.
|
|
1573
|
+
*
|
|
1574
|
+
* A `claim` entry present in `verbs` with `available: false` means claimable IN PRINCIPLE, not right now, and `verbs[].reason` says why - `claimable` itself may still be `[]` in that case (nothing accrued, a PROVEN zero - see `nothing_accrued`) or may carry a nonzero row alongside an `available: false` entry caused by something else entirely (e.g. the reward could not be priced - pricing never gates availability, see `usdValue` below).
|
|
1575
|
+
*/
|
|
1576
|
+
ClaimableReward: {
|
|
1577
|
+
/**
|
|
1578
|
+
* @description The reward token's contract address (EVM) or mint (Solana) - never the pool's own asset.
|
|
1579
|
+
* @example 0x912CE59144191C1204E64559FE8253a0e49E6548
|
|
1580
|
+
*/
|
|
1581
|
+
token: string;
|
|
1582
|
+
/** @description Accrued amount in the reward token's own base units, base-unit decimal string like every other on-chain amount in this API. NEVER a fabricated zero standing in for "the read failed" - see the schema description above. */
|
|
1583
|
+
amount: string;
|
|
1584
|
+
/** @description Null when the reward token's symbol could not be resolved. */
|
|
1585
|
+
symbol: string | null;
|
|
1586
|
+
/** @description Null when the reward token's decimals could not be resolved. */
|
|
1587
|
+
decimals: number | null;
|
|
1588
|
+
/** @description Best-effort USD value of `amount`, priced through the existing oracle/market-data port (Plan 5 Task 5). `null` when the price is missing, stale, the source is unreachable, or `decimals` above is itself `null` (no honest way to scale `amount` into a human figure to price). DISPLAY ONLY: a missing price must NEVER suppress the `claim` verb or drop a row from `claimable` - a claimable reward with no price is still claimable. No "guaranteed" or APY language applies to this figure. */
|
|
1589
|
+
usdValue: number | null;
|
|
1590
|
+
};
|
|
1591
|
+
/** @description What a policy/signer/guardian/condition-set change costs. `before` is `securityThresholdOf` as it stood BEFORE this change - the number of approvals the returned op itself needs - so tightening a send-policy from 2 to 3 costs 2, and loosening it from 3 back to 2 costs 3. `after` is what `securityThresholdOf` becomes once this change lands, so the UI can show the new cost before the owner commits. */
|
|
1592
|
+
SecurityPricing: {
|
|
1593
|
+
before: number;
|
|
1594
|
+
after: number;
|
|
1595
|
+
};
|
|
1596
|
+
/**
|
|
1597
|
+
* @description One ACTIVE policy whose required approval COUNT no longer fits a `signers_recover` rotation (Flow 9 - flows doc §5 test 30 / §3.6.1: "any policy that no longer fits comes down with them - shown before it takes effect"). `approvalsAfter` is always `<= approvalsBefore` (a rotation can only ever shrink what fits) and always `>= 1` (an active policy is never silently zeroed by this preview - `recover` can never leave an account with zero signers).
|
|
1598
|
+
* DELIBERATELY NARROWER THAN "everything recover changes about this policy". Every ACTIVE policy is ALSO repointed to the WHOLE new signer set, regardless of whether it appears here - a policy that named one specific person becomes satisfiable by any of the new signers. That repoint is unconditional and already stated in the build's `humanSummary`; this list surfaces only the policies whose required NUMBER of approvals actually drops.
|
|
1599
|
+
*/
|
|
1600
|
+
PolicyImpact: {
|
|
1601
|
+
slot: number;
|
|
1602
|
+
approvalsBefore: number;
|
|
1603
|
+
approvalsAfter: number;
|
|
1604
|
+
};
|
|
1605
|
+
ExactDelegatedActionInput: {
|
|
1606
|
+
accountId: string;
|
|
1607
|
+
accountAddress: string;
|
|
1608
|
+
chainId: number;
|
|
1609
|
+
/** @enum {string} */
|
|
1610
|
+
action: "transfer" | "swap";
|
|
1611
|
+
tokenAddress: string;
|
|
1612
|
+
/** @description Positive integer base units. Maximum uint256; never converted through a floating-point amount for encoding or route requests. */
|
|
1613
|
+
amount: string;
|
|
1614
|
+
recipient?: string;
|
|
1615
|
+
tokenOutAddress?: string;
|
|
1616
|
+
/** @description Defaults to 50 basis points for swaps. Omit for transfers. */
|
|
1617
|
+
maxSlippageBps?: number;
|
|
1618
|
+
} & ({
|
|
1619
|
+
/** @constant */
|
|
1620
|
+
action: "transfer";
|
|
1621
|
+
recipient: string;
|
|
1622
|
+
} | {
|
|
1623
|
+
/** @constant */
|
|
1624
|
+
action: "swap";
|
|
1625
|
+
tokenOutAddress: string;
|
|
1626
|
+
});
|
|
1627
|
+
ExactDelegatedActionBuild: components["schemas"]["UserOpBuild"] & {
|
|
1628
|
+
execution: components["schemas"]["ExactDelegatedExecution"];
|
|
1629
|
+
};
|
|
1630
|
+
ExactDelegatedExecution: {
|
|
1631
|
+
delegationId: string;
|
|
1632
|
+
permissionId: string;
|
|
1633
|
+
accountId: string;
|
|
1634
|
+
accountAddress: string;
|
|
1635
|
+
chainId: number;
|
|
1636
|
+
/** @enum {string} */
|
|
1637
|
+
action: "transfer" | "swap";
|
|
1638
|
+
tokenAddress: string;
|
|
1639
|
+
/** @description Positive integer base units. Maximum uint256; never converted through a floating-point amount for encoding or route requests. */
|
|
1640
|
+
amount: string;
|
|
1641
|
+
recipient?: string;
|
|
1642
|
+
tokenOutAddress?: string;
|
|
1643
|
+
/** @description Defaults to 50 basis points for swaps. Omit for transfers. */
|
|
1644
|
+
maxSlippageBps?: number;
|
|
1645
|
+
/** @constant */
|
|
1646
|
+
gasMethod: "native";
|
|
1647
|
+
};
|
|
1648
|
+
/** @description A previously built op with the owner's client-side signature attached, for relay. */
|
|
1649
|
+
SignedUserOp: {
|
|
1650
|
+
userOp: components["schemas"]["UnsignedUserOp"];
|
|
1651
|
+
userOpHash: components["schemas"]["Hash32"];
|
|
1652
|
+
intentType: components["schemas"]["IntentType"];
|
|
1653
|
+
/** @description Owner-browser-only durable approval context. Never accepted from an agent or platform credential. */
|
|
1654
|
+
hostedOperation?: components["schemas"]["HostedOperationContext"];
|
|
1655
|
+
};
|
|
1656
|
+
HostedOperationContext: {
|
|
1657
|
+
operationId: string;
|
|
1658
|
+
attemptId: string;
|
|
1659
|
+
};
|
|
1660
|
+
UserOpReceipt: {
|
|
1661
|
+
/** @example op_01H8 */
|
|
1662
|
+
id: string;
|
|
1663
|
+
userOpHash: components["schemas"]["Hash32"];
|
|
1664
|
+
status: components["schemas"]["UserOpStatus"];
|
|
1665
|
+
txHash?: components["schemas"]["Hash32"] | null;
|
|
1666
|
+
/** Format: date-time */
|
|
1667
|
+
submittedAt: string;
|
|
1668
|
+
error?: string | null;
|
|
1669
|
+
};
|
|
1670
|
+
/** @enum {string} */
|
|
1671
|
+
UserOpStatus: "pending" | "included" | "failed";
|
|
1672
|
+
/** @description One page of the ranked provider catalog, with the total it is a page of. */
|
|
1673
|
+
ApiProviderList: {
|
|
1674
|
+
/** @description This page, ranked by `rankScore` descending then `id` ascending. */
|
|
1675
|
+
providers: components["schemas"]["ApiProviderListItem"][];
|
|
1676
|
+
/** @description Providers matching the filters BEFORE paging. */
|
|
1677
|
+
total: number;
|
|
1678
|
+
/** @description EXACT count of providers withheld. Never capped - the number is the honest part. Since spec 2026-08-26 §12 this is usually the LARGE number: the catalog returns only providers a paid call could complete against, so a provider that has never been measured on this chain is withheld with `provider_unverified`, and most of the catalog is in that state. */
|
|
1679
|
+
hidden: number;
|
|
1680
|
+
/** @description Why providers were hidden, mapped from providerId. Capped at 50 entries, because a chain filter over ~1,498 providers would otherwise staple tens of kilobytes of explanation to a 50-row page. */
|
|
1681
|
+
reasons: {
|
|
1682
|
+
[key: string]: string;
|
|
1683
|
+
};
|
|
1684
|
+
/** @description True when `reasons` was cut short of `hidden`. A cap the caller cannot see is a cap that lies, so the cut is reported rather than left for the map and the count to disagree about. */
|
|
1685
|
+
reasonsTruncated: boolean;
|
|
1686
|
+
/** @description How much of the catalog in scope has actually been MEASURED. Not decoration: the catalog returns only what a paid call could complete against, and the large majority of endpoints have never been probed - so a short or empty page is usually a measurement gap rather than a broken catalog, and this is what lets a surface say which. */
|
|
1687
|
+
coverage: {
|
|
1688
|
+
/** @description Endpoint rows in scope carrying at least one probe on a chain in scope. Intersected with the live catalog, so a probe that outlived the endpoint it measured cannot inflate it. */
|
|
1689
|
+
probedEndpoints: number;
|
|
1690
|
+
/** @description Endpoint rows in scope. Never less than `probedEndpoints`. */
|
|
1691
|
+
totalEndpoints: number;
|
|
1692
|
+
};
|
|
1693
|
+
};
|
|
1694
|
+
/** @description One row of the catalog grid. Deliberately carries NO `endpoints` array - at ~14,000 endpoints across ~1,498 providers, one of them with 965 endpoints of its own, inlining them makes the list a multi-megabyte response to render a grid that shows a count. `GET /apis/providers/{providerId}` serves the endpoints, a page at a time. */
|
|
1695
|
+
ApiProviderListItem: {
|
|
1696
|
+
id: string;
|
|
1697
|
+
name: string;
|
|
1698
|
+
/** @description Grouping the surface filters on, e.g. search, market-data, onchain-analytics. */
|
|
1699
|
+
category: string;
|
|
1700
|
+
/** @description The provider's human documentation page, WITHHELD once a sync has checked it and found it dead. A 200 is not enough to keep it: `arkham.io/docs` answers 200 with a parked "domain for sale" page, so the check also requires a real page title. Null here therefore means "no docs link to offer", never "not checked yet", and the surface renders no button. */
|
|
1701
|
+
docsUrl: string | null;
|
|
1702
|
+
/** @description The provider's own OpenAPI document, where a sync found one. It is both the source of that provider's `openapi` endpoint rows and the fallback the detail page links as "API reference" when there is no live `docsUrl`. A machine document, not a written guide, and labelled as such wherever it is rendered. */
|
|
1703
|
+
openapiUrl: string | null;
|
|
1704
|
+
baseUrl: string;
|
|
1705
|
+
/** @description Owner has blocked this provider for EVERY agent on this account, whatever their mandates say. Absent state is `false` - a catalog of ~36,000 endpoints is not something an owner opts into one at a time. A convenience filter and a kill-switch, never an authority bound: what binds money is `ApiMandate` plus the on-chain envelope. Was `enabled` (inverted) until spec 2026-08-30 §3.2. */
|
|
1706
|
+
blocked: boolean;
|
|
1707
|
+
/** @description Sorted unique set of chains this provider's listed endpoints sit on. This CAN be the whole supported set: an endpoint that has never been probed and declares no chain of its own is evidence-free, so with no chain filter it lists on every supported chain. That is what "we do not know where this runs" looks like, not a claim that the provider is live everywhere. */
|
|
1708
|
+
chains: number[];
|
|
1709
|
+
/** @description True for the hand-maintained catalog; false for discovery-index entries. Also the list's first sort key, and the surface renders it as a "Verified" badge against "Community" - a curated entry is one a human checked, where a discovered one is self-reported. */
|
|
1710
|
+
curated: boolean;
|
|
1711
|
+
/** @description Responses are synthetic. Must remain visible to agents, not only to humans. */
|
|
1712
|
+
simulated: boolean;
|
|
1713
|
+
/** @description The provider's own mark, hosted by the provider: the icon it registered with the discovery index if it has one, otherwise the icon its own website serves, resolved once at sync time. Null when neither exists, and the surface falls back to a monogram rather than inventing one. */
|
|
1714
|
+
iconUrl: string | null;
|
|
1715
|
+
description: string | null;
|
|
1716
|
+
/** @description DISTINCT endpoints matching the filters, not listing rows - an endpoint listed on two chains is still one endpoint. */
|
|
1717
|
+
endpointCount: number;
|
|
1718
|
+
/** @description Distinct endpoints we have actually MEASURED - a 402 we parsed, or a 200 proving the endpoint is free. Never exceeds `endpointCount`. */
|
|
1719
|
+
verifiedCount: number;
|
|
1720
|
+
/** @description The provider's busiest endpoint in 30-day unique payers. The list's sort key. */
|
|
1721
|
+
rankScore: number;
|
|
1722
|
+
/** @description Cheapest price across this provider's listed endpoints, in atomic token units. Null when no endpoint carries a usable price. */
|
|
1723
|
+
minPriceUnits: string | null;
|
|
1724
|
+
/** @description Dearest price across this provider's listed endpoints, in atomic token units. */
|
|
1725
|
+
maxPriceUnits: string | null;
|
|
1726
|
+
};
|
|
1727
|
+
/** @description One provider: every field of `ApiProviderListItem`, plus one page of its endpoints and the `endpointTotal` that page is a page of. */
|
|
1728
|
+
ApiProviderDetail: components["schemas"]["ApiProviderListItem"] & {
|
|
1729
|
+
/** @description One page of endpoints, busiest first. One endpoint listed on two chains appears once per chain, each row with its own price and payability. */
|
|
1730
|
+
endpoints: components["schemas"]["ApiEndpointSummary"][];
|
|
1731
|
+
/** @description Endpoints matching the filters BEFORE paging - what `endpoints` is a page of. */
|
|
1732
|
+
endpointTotal: number;
|
|
1733
|
+
/** @description Where this provider is available, when the family being viewed is not it. A family view drops every listing measured as selling elsewhere, so this is what tells an owner on Testnet that the provider is available on Mainnet at all. Built from the other family's OWN probes - distinct endpoints measured `verified` or `free` there - never inferred from the rows dropped here, because a probe records THAT a provider quoted elsewhere and not WHERE. Null when no `net` was requested and null at a count of zero, so a client renders the pointer only when there is something to point at. */
|
|
1734
|
+
otherFamily?: {
|
|
1735
|
+
/**
|
|
1736
|
+
* @description The family the endpoints below were measured on. Never the family being viewed.
|
|
1737
|
+
* @enum {string}
|
|
1738
|
+
*/
|
|
1739
|
+
net: "mainnet" | "testnet";
|
|
1740
|
+
/** @description Distinct endpoints measured available in that family - `verified` or `free`, so this counts reachability and not sales. */
|
|
1741
|
+
endpointCount: number;
|
|
1742
|
+
} | null;
|
|
1743
|
+
};
|
|
1744
|
+
/** @description One endpoint under a provider, on one chain. */
|
|
1745
|
+
ApiEndpointSummary: {
|
|
1746
|
+
id: string;
|
|
1747
|
+
path: string;
|
|
1748
|
+
/** @enum {string} */
|
|
1749
|
+
method: "GET" | "POST" | "HEAD" | "PUT" | "PATCH" | "DELETE";
|
|
1750
|
+
summary: string;
|
|
1751
|
+
/** @description Owner has blocked this endpoint for every agent on this account. Resolved: true when EITHER this endpoint or its provider is blocked. Absent state is `false`. Was `enabled` (inverted) until spec 2026-08-30 §3.2. */
|
|
1752
|
+
blocked: boolean;
|
|
1753
|
+
/** @description The chain this endpoint is listed on. Endpoints of one provider may differ. */
|
|
1754
|
+
chainId: number;
|
|
1755
|
+
/** @description Price in atomic token units - measured where `verification` is `verified`, otherwise the provider's own declaration. Null on a `free` endpoint and wherever no usable figure exists; never a fabricated zero. */
|
|
1756
|
+
priceUnits: string | null;
|
|
1757
|
+
asset: string | null;
|
|
1758
|
+
/** @description Whether a paid call to this row could succeed at all. True only when an x402PaymentValidator is deployed on this endpoint's chain, the endpoint's `method` is one the paid lane can settle (GET or POST), `verification` is not `free`, AND `verification` is `verified` - that is, a probe has actually MEASURED a settleable 402 here. Never a policy decision - see `blocked` for that. The measured clause is spec 2026-08-26 §12: without it a never-probed row and a measured-failing row both read as payable, which offers a call the proxy would decline. */
|
|
1759
|
+
payable: boolean;
|
|
1760
|
+
/** @description Which of them, when `payable` is false. Reported in the order the proxy itself checks them, so the reason named is the one a caller would actually hit: `chain_capability_unavailable` (no validator on this chain - the only one a caller can act on, so it leads), `unsupported_endpoint_method` (the discovery index publishes all six verbs; the paid lane settles only GET and POST, and will not issue a stranger's DELETE to discover its price), `no_payment_required` (we measured a 200; there is nothing to settle), `provider_unverified` (never probed on this chain, so we cannot say a paid call would complete - the ORDINARY case, since most endpoints have never been probed), `provider_unreachable` (the last probe genuinely failed) or `provider_unavailable_on_chain` (measured as quoting elsewhere). */
|
|
1761
|
+
unpayableReason: string | null;
|
|
1762
|
+
/**
|
|
1763
|
+
* @description What we MEASURED, never a gate. `verified` - a probe returned a 402 quoting this chain. `free` - a probe returned 200. `declared` - not probed yet, so price and asset are the provider's own claim. `other_chain` - the provider answered with a valid 402 but quoted payment on a DIFFERENT chain, so there is nothing to settle against here; it is reachable and is not a failure. A listing in this state is dropped from every family-scoped and chain-filtered response before a client ever sees it, so the value is retained in this enum only for backward compatibility and no longer appears on a returned row. `unreachable` - the last probe genuinely failed (a non-402 status, an unparseable challenge, a timeout); still listed, so a vanished provider has an explanation rather than silently disappearing. `other_chain` was carved OUT of `unreachable`: 650 of 1,510 stored probes are that case, and reporting a live provider as unreachable because it sells on mainnet is a false claim about a third party.
|
|
1764
|
+
* @enum {string}
|
|
1765
|
+
*/
|
|
1766
|
+
verification: "verified" | "free" | "declared" | "unreachable" | "other_chain";
|
|
1767
|
+
/** @description 30-day unique payers, from the discovery index. A ranking signal only, never a gate. */
|
|
1768
|
+
uniquePayers: number;
|
|
1769
|
+
/** @description The provider's own OpenAPI OPERATION for this endpoint - `parameters` plus the JSON Schema at `requestBody.content['application/json'].schema` - matched by path and method from a document the SITE pass already fetched. NULL means the provider publishes no OpenAPI document, the sync has not read it yet, or the matched operation exceeded the size this catalog is willing to store (half a schema is worse than none). A NULL HERE MEANS THE CALLING AGENT IS GUESSING AT THE REQUEST SHAPE - there is no way to tell "no schema published" from "not fetched yet" apart from this field alone, and `call_api` pays before the provider gets a chance to reject a malformed body. */
|
|
1770
|
+
requestSchema: {
|
|
1771
|
+
parameters?: unknown[];
|
|
1772
|
+
requestBody?: unknown;
|
|
1773
|
+
} | null;
|
|
1774
|
+
};
|
|
1775
|
+
/** @description The current API budget state for an agent on a chain. */
|
|
1776
|
+
ApiBudget: {
|
|
1777
|
+
agentId: string;
|
|
1778
|
+
chainId: number;
|
|
1779
|
+
/** @description Unused indices below count. */
|
|
1780
|
+
remaining: number;
|
|
1781
|
+
/** @description Maximum value per call in token units. */
|
|
1782
|
+
perCallMax: string;
|
|
1783
|
+
/** Format: date-time */
|
|
1784
|
+
expiresAt: string;
|
|
1785
|
+
epoch: number;
|
|
1786
|
+
/** @description The ERC-20 token address. */
|
|
1787
|
+
token: string;
|
|
1788
|
+
/** @description Maximum value exposure in token units. */
|
|
1789
|
+
maxExposure: string;
|
|
1790
|
+
/** @description Amount already spent in token units. */
|
|
1791
|
+
spent: string;
|
|
1792
|
+
};
|
|
1793
|
+
/** @description The disjoint outcomes of `buildApiCallRequirements` - see each branch's own description. A `oneOf` discriminated on the literal `status` value (mirrors the `kind`-discriminated intent union on `POST /delegations/build`), so a client can never read `payload`/`authorization`/ `index`/`validator` off a response that carries none of them. */
|
|
1794
|
+
ApiCallRequirements: components["schemas"]["ApiCallRequirementsReady"] | components["schemas"]["ApiCallRequirementsPending"];
|
|
1795
|
+
/** @description `buildApiCallRequirements`'s ready branch - carries the EIP-3009 payload to sign, plus everything else a client needs to build the ERC-1271 envelope around its signature. For a Kernel account (the only kind this product ever creates) the relay signature is `0x01 || validator || abi.encode(agentKey, authorization, index, rawSig)`: `index` is a stateful server-side reservation with no formula a caller could reproduce, `authorization.validBefore` is stamped off the server's clock, and `validator` is returned rather than hardcoded because deployment addresses are nonce-shifted between chains - the same address is `agentGuard` on one chain and something else on another. */
|
|
1796
|
+
ApiCallRequirementsReady: {
|
|
1797
|
+
requirementId: string;
|
|
1798
|
+
/**
|
|
1799
|
+
* @description discriminator enum property added by openapi-typescript
|
|
1800
|
+
* @enum {string}
|
|
1801
|
+
*/
|
|
1802
|
+
status: "ready";
|
|
1803
|
+
/** @description The EIP-3009 digest to sign. */
|
|
1804
|
+
payload: string;
|
|
1805
|
+
/** @description The provider's own quoted payment schemes (the x402 `accepts` array), echoed so a client can show what it is about to pay for without re-challenging. */
|
|
1806
|
+
requirements: {
|
|
1807
|
+
[key: string]: unknown;
|
|
1808
|
+
}[];
|
|
1809
|
+
/** @description The EIP-3009 authorization the payload digests. */
|
|
1810
|
+
authorization: components["schemas"]["X402Authorization"];
|
|
1811
|
+
/** @description The reserved authorization index. */
|
|
1812
|
+
index: number;
|
|
1813
|
+
/** @description The `X402PaymentValidator` address on this chain - bytes 1 to 20 of the Kernel ERC-1271 envelope a client must build around its signature. */
|
|
1814
|
+
validator: string;
|
|
1815
|
+
};
|
|
1816
|
+
/** @description The exact EIP-3009 `TransferWithAuthorization` tuple `payload` digests. Building the Kernel- prefixed ERC-1271 signature envelope needs this verbatim - see `X402ProxyService.buildRequirements`'s own doc comment in the BE source for the byte layout. */
|
|
1817
|
+
X402Authorization: {
|
|
1818
|
+
/** @description The owner's account address. */
|
|
1819
|
+
from: string;
|
|
1820
|
+
/** @description The provider's `payTo` address. */
|
|
1821
|
+
to: string;
|
|
1822
|
+
/** @description Base units, decimal string - the wire format, not a bigint. */
|
|
1823
|
+
value: string;
|
|
1824
|
+
/** @description Unix seconds, decimal string. Always '0' today. */
|
|
1825
|
+
validAfter: string;
|
|
1826
|
+
/** @description Unix seconds, decimal string - timestamped off the BACKEND's clock at build time, never the caller's, and bounded by the provider's own stated timeout. */
|
|
1827
|
+
validBefore: string;
|
|
1828
|
+
/** @description 32 bytes, hex. Read live from `X402PaymentValidator.authorizationNonce` for this exact (epoch, index) - never generated by the backend. */
|
|
1829
|
+
nonce: string;
|
|
1830
|
+
};
|
|
1831
|
+
/** @description `buildApiCallRequirements`'s pending branch (Task 11) - the quoted call crossed the agent's mandate `confirmAbove` threshold, so nothing sign-able was built. THE SECURITY PROPERTY: `payload`, `authorization`, `index` and `validator` are not merely empty here, they are not declared on this branch at all - `X402PaymentValidator._authorizationNonce` is a `pure` function of public inputs and the agent chooses its own `validBefore`, so an agent holding `(authorization, index, payload)` could sign and settle through any facilitator without ever calling Botanary again, which would make the confirmation threshold decorative. Poll `GET /apis/calls/requirements/{id}` for the owner's decision. */
|
|
1832
|
+
ApiCallRequirementsPending: {
|
|
1833
|
+
requirementId: string;
|
|
1834
|
+
/**
|
|
1835
|
+
* @description discriminator enum property added by openapi-typescript
|
|
1836
|
+
* @enum {string}
|
|
1837
|
+
*/
|
|
1838
|
+
status: "pending_approval";
|
|
1839
|
+
/** @description The raised request's own id (equal to `requirementId`). */
|
|
1840
|
+
approvalId: string;
|
|
1841
|
+
/**
|
|
1842
|
+
* Format: date-time
|
|
1843
|
+
* @description When this pending approval closes unanswered - the same instant `requirementId` itself expires.
|
|
1844
|
+
*/
|
|
1845
|
+
expiresAt: string;
|
|
1846
|
+
};
|
|
1847
|
+
/** @description `GET /apis/calls/requirements/{id}` (Task 11) - what the owner decided, if anything, about a call raised above the agent's `confirmAbove` threshold. See that route's own description for THE SECURITY PROPERTY this schema encodes: `payload`/`authorization`/`index`/`validator` (Task 14) present only when `status: 'approved'`. */
|
|
1848
|
+
ApiCallRequirementStatus: {
|
|
1849
|
+
/** @enum {string} */
|
|
1850
|
+
status: "pending" | "approved" | "declined" | "expired";
|
|
1851
|
+
/** @description The EIP-3009 digest to sign. Present only when status is 'approved'. */
|
|
1852
|
+
payload?: string;
|
|
1853
|
+
authorization?: components["schemas"]["X402Authorization"];
|
|
1854
|
+
/** @description The reserved authorization index. Present only when status is 'approved'. */
|
|
1855
|
+
index?: number;
|
|
1856
|
+
/** @description The `X402PaymentValidator` address on this requirement's chain - bytes 1 to 20 of the Kernel ERC-1271 envelope a client builds around the signature. Present only when status is 'approved', same as the three fields above. */
|
|
1857
|
+
validator?: string;
|
|
1858
|
+
};
|
|
1859
|
+
/** @description Recoverable payment status. Submitted means the provider may have received the authorization; never create another paid call to recover it. Settled means finalized chain evidence proves payment. The provider may still have refused the requested service; inspect providerStatus. */
|
|
1860
|
+
ApiCallResult: {
|
|
1861
|
+
requirementId: string;
|
|
1862
|
+
/** @enum {string} */
|
|
1863
|
+
status: "ready" | "pending_approval" | "submitted" | "settled" | "declined";
|
|
1864
|
+
/** @enum {string} */
|
|
1865
|
+
paymentStatus: "not_submitted" | "pending" | "settled" | "not_settled";
|
|
1866
|
+
/** @description True if the provider or chain evidence is simulated. */
|
|
1867
|
+
simulated: boolean;
|
|
1868
|
+
/** @description The provider HTTP status, when a response was recorded. It is not payment proof. */
|
|
1869
|
+
providerStatus?: number;
|
|
1870
|
+
/** @description The provider response body, when available. May be any JSON value. */
|
|
1871
|
+
response?: unknown;
|
|
1872
|
+
/** @description Verified finalized transaction hash. Provider hints are not exposed as proof. */
|
|
1873
|
+
txHash?: string;
|
|
1874
|
+
facilitatorReason?: string;
|
|
1875
|
+
/** @description Signing material is present only for an unsubmitted requirement with any required owner approval satisfied. */
|
|
1876
|
+
ready?: {
|
|
1877
|
+
payload: string;
|
|
1878
|
+
authorization: components["schemas"]["X402Authorization"];
|
|
1879
|
+
index: number;
|
|
1880
|
+
validator: string;
|
|
1881
|
+
};
|
|
1882
|
+
};
|
|
1883
|
+
DeveloperAgentChallenge: {
|
|
1884
|
+
id: string;
|
|
1885
|
+
appId: string;
|
|
1886
|
+
/** @enum {string} */
|
|
1887
|
+
environment: "test" | "live";
|
|
1888
|
+
address: string;
|
|
1889
|
+
publicKey: string;
|
|
1890
|
+
message: string;
|
|
1891
|
+
/** Format: date-time */
|
|
1892
|
+
expiresAt: string;
|
|
1893
|
+
};
|
|
1894
|
+
DeveloperAgentRegistration: {
|
|
1895
|
+
id: string;
|
|
1896
|
+
appId: string;
|
|
1897
|
+
/** @enum {string} */
|
|
1898
|
+
environment: "test" | "live";
|
|
1899
|
+
name: string;
|
|
1900
|
+
publicKey: string;
|
|
1901
|
+
address: string;
|
|
1902
|
+
fingerprint: string;
|
|
1903
|
+
/** Format: date-time */
|
|
1904
|
+
createdAt: string;
|
|
1905
|
+
/** Format: date-time */
|
|
1906
|
+
disabledAt: string | null;
|
|
1907
|
+
/** @enum {string} */
|
|
1908
|
+
apiAccess: "awaiting_connection" | "active" | "disabled" | "app_disabled" | "key_revoked" | "connection_revoked" | "unavailable";
|
|
1909
|
+
/** @enum {string} */
|
|
1910
|
+
grantStatus: "none" | "pending" | "active" | "paused" | "expired" | "revoked" | "unknown";
|
|
1911
|
+
/** @description Durable grants attributed to this exact registration, including strict observed chain state when available. */
|
|
1912
|
+
grants?: components["schemas"]["PublicGrant"][];
|
|
1913
|
+
connectionId: string | null;
|
|
1914
|
+
};
|
|
1915
|
+
PublicGrant: {
|
|
1916
|
+
id: string;
|
|
1917
|
+
appId: string;
|
|
1918
|
+
/** @enum {string} */
|
|
1919
|
+
environment: "test" | "live";
|
|
1920
|
+
connectionId: string;
|
|
1921
|
+
registrationId: string;
|
|
1922
|
+
agentId: string;
|
|
1923
|
+
accountId: string;
|
|
1924
|
+
accountAddress: components["schemas"]["Address"];
|
|
1925
|
+
agentAddress: components["schemas"]["Address"];
|
|
1926
|
+
/** @enum {integer} */
|
|
1927
|
+
chainId: 84532;
|
|
1928
|
+
name: string;
|
|
1929
|
+
version: number;
|
|
1930
|
+
permissionId: string;
|
|
1931
|
+
grantExecutor: components["schemas"]["Address"];
|
|
1932
|
+
policy: components["schemas"]["PublicGrantPolicy"];
|
|
1933
|
+
compiled: components["schemas"]["PublicGrantCompiled"];
|
|
1934
|
+
/** @enum {string} */
|
|
1935
|
+
apiAccess: "active" | "awaiting_connection" | "connection_revoked" | "key_revoked" | "disabled" | "app_disabled" | "unavailable";
|
|
1936
|
+
chainState: components["schemas"]["PublicGrantChainState"];
|
|
1937
|
+
createOperationId: string;
|
|
1938
|
+
/** Format: uri */
|
|
1939
|
+
createApprovalUrl: string;
|
|
1940
|
+
/** @enum {string} */
|
|
1941
|
+
createStatus: "awaiting_approval" | "submitted" | "confirmed" | "failed" | "canceled" | "expired" | "unresolved";
|
|
1942
|
+
revokeOperationId: string | null;
|
|
1943
|
+
/** Format: uri */
|
|
1944
|
+
revokeApprovalUrl: string | null;
|
|
1945
|
+
/** @enum {string|null} */
|
|
1946
|
+
revokeStatus: "awaiting_approval" | "submitted" | "confirmed" | "failed" | "canceled" | "expired" | "unresolved" | null;
|
|
1947
|
+
/** Format: date-time */
|
|
1948
|
+
createdAt: string;
|
|
1949
|
+
/** Format: date-time */
|
|
1950
|
+
updatedAt: string;
|
|
1951
|
+
};
|
|
1952
|
+
PublicGrantPolicy: {
|
|
1953
|
+
budgets: {
|
|
1954
|
+
assetRef: string;
|
|
1955
|
+
token: components["schemas"]["Address"];
|
|
1956
|
+
decimals: number;
|
|
1957
|
+
amountRaw: string;
|
|
1958
|
+
}[];
|
|
1959
|
+
perActionMaxRaw: string | null;
|
|
1960
|
+
recipients: components["schemas"]["Address"][];
|
|
1961
|
+
allowedContract: components["schemas"]["Address"] | null;
|
|
1962
|
+
deniedContracts: components["schemas"]["Address"][];
|
|
1963
|
+
venues: components["schemas"]["Address"][];
|
|
1964
|
+
conditions: components["schemas"]["PublicGrantCondition"][];
|
|
1965
|
+
maxActions: number | null;
|
|
1966
|
+
rate: {
|
|
1967
|
+
assetRef: string;
|
|
1968
|
+
token: components["schemas"]["Address"];
|
|
1969
|
+
limitRaw: string;
|
|
1970
|
+
periodSeconds: number;
|
|
1971
|
+
} | null;
|
|
1972
|
+
swapVenue: {
|
|
1973
|
+
router: components["schemas"]["Address"];
|
|
1974
|
+
assetRef: string;
|
|
1975
|
+
token: components["schemas"]["Address"];
|
|
1976
|
+
maxAllowanceRaw: string;
|
|
1977
|
+
} | null;
|
|
1978
|
+
/** Format: date-time */
|
|
1979
|
+
expiresAt: string;
|
|
1980
|
+
};
|
|
1981
|
+
PublicGrantCondition: {
|
|
1982
|
+
/** @enum {string} */
|
|
1983
|
+
field: "class" | "token" | "amount" | "total_value" | "recipient" | "target" | "selector" | "arg" | "call_count";
|
|
1984
|
+
/** @enum {string} */
|
|
1985
|
+
op: "eq" | "neq" | "gte" | "lte" | "in_set" | "not_in_set";
|
|
1986
|
+
argOffset: number;
|
|
1987
|
+
value: string;
|
|
1988
|
+
};
|
|
1989
|
+
PublicGrantCompiled: {
|
|
1990
|
+
enableCallData: string;
|
|
1991
|
+
configCalls: components["schemas"]["PublicGrantConfigurationCall"][];
|
|
1992
|
+
/** @description Ordered account-global AgentGuard calls, including any transition from allow-all to an explicit token set. */
|
|
1993
|
+
accountGlobalConfigurationCalls: components["schemas"]["PublicGrantConfigurationCall"][];
|
|
1994
|
+
};
|
|
1995
|
+
PublicGrantConfigurationCall: {
|
|
1996
|
+
to: components["schemas"]["Address"];
|
|
1997
|
+
valueRaw: string;
|
|
1998
|
+
data: string;
|
|
1999
|
+
};
|
|
2000
|
+
PublicGrantChainState: {
|
|
2001
|
+
/** @enum {string} */
|
|
2002
|
+
status: "unknown" | "active" | "paused" | "expired" | "revoked";
|
|
2003
|
+
/** @enum {string|null} */
|
|
2004
|
+
reason: "not_observed" | "inconsistent_limits" | "observation_unavailable" | null;
|
|
2005
|
+
observedAt?: components["schemas"]["ConnectionOperationChainPoint"];
|
|
2006
|
+
remaining?: components["schemas"]["PublicGrantRemaining"][];
|
|
2007
|
+
};
|
|
2008
|
+
ConnectionOperationChainPoint: {
|
|
2009
|
+
blockNumber: string;
|
|
2010
|
+
blockHash: string;
|
|
2011
|
+
};
|
|
2012
|
+
PublicGrantRemaining: {
|
|
2013
|
+
token: components["schemas"]["Address"];
|
|
2014
|
+
limitRaw: string;
|
|
2015
|
+
spentRaw: string;
|
|
2016
|
+
remainingRaw: string;
|
|
2017
|
+
};
|
|
2018
|
+
DeveloperAgentChallengeInput: {
|
|
2019
|
+
name: string;
|
|
2020
|
+
publicKey: string;
|
|
2021
|
+
};
|
|
2022
|
+
DeveloperAgentRegistrationInput: {
|
|
2023
|
+
challengeId: string;
|
|
2024
|
+
signature: string;
|
|
2025
|
+
};
|
|
2026
|
+
};
|
|
2027
|
+
responses: {
|
|
2028
|
+
/** @description Malformed request. */
|
|
2029
|
+
BadRequest: {
|
|
2030
|
+
headers: {
|
|
2031
|
+
[name: string]: unknown;
|
|
2032
|
+
};
|
|
2033
|
+
content: {
|
|
2034
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2035
|
+
};
|
|
2036
|
+
};
|
|
2037
|
+
/** @description Missing or invalid session token. */
|
|
2038
|
+
Unauthorized: {
|
|
2039
|
+
headers: {
|
|
2040
|
+
[name: string]: unknown;
|
|
2041
|
+
};
|
|
2042
|
+
content: {
|
|
2043
|
+
/**
|
|
2044
|
+
* @example {
|
|
2045
|
+
* "error": {
|
|
2046
|
+
* "code": "unauthorized",
|
|
2047
|
+
* "message": "Session token missing or expired."
|
|
2048
|
+
* }
|
|
2049
|
+
* }
|
|
2050
|
+
*/
|
|
2051
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2052
|
+
};
|
|
2053
|
+
};
|
|
2054
|
+
/** @description Access denied. */
|
|
2055
|
+
Forbidden: {
|
|
2056
|
+
headers: {
|
|
2057
|
+
[name: string]: unknown;
|
|
2058
|
+
};
|
|
2059
|
+
content: {
|
|
2060
|
+
/**
|
|
2061
|
+
* @example {
|
|
2062
|
+
* "error": {
|
|
2063
|
+
* "code": "forbidden",
|
|
2064
|
+
* "message": "Access denied."
|
|
2065
|
+
* }
|
|
2066
|
+
* }
|
|
2067
|
+
*/
|
|
2068
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2069
|
+
};
|
|
2070
|
+
};
|
|
2071
|
+
/** @description Resource not found. */
|
|
2072
|
+
NotFound: {
|
|
2073
|
+
headers: {
|
|
2074
|
+
[name: string]: unknown;
|
|
2075
|
+
};
|
|
2076
|
+
content: {
|
|
2077
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2078
|
+
};
|
|
2079
|
+
};
|
|
2080
|
+
/** @description The intent is out of scope for the account rules or delegation policy. Carries the same decline-reason vocabulary the on-chain revert would produce. */
|
|
2081
|
+
PolicyDeclined: {
|
|
2082
|
+
headers: {
|
|
2083
|
+
[name: string]: unknown;
|
|
2084
|
+
};
|
|
2085
|
+
content: {
|
|
2086
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2087
|
+
};
|
|
2088
|
+
};
|
|
2089
|
+
/** @description This surface is turned off by an operator kill-switch (e.g. `PAY_SH_ENABLED=false`). Unlike NotImplemented, this IS transient: the same request will succeed once the flag is flipped back, with no other state to reconcile. */
|
|
2090
|
+
ServiceUnavailable: {
|
|
2091
|
+
headers: {
|
|
2092
|
+
[name: string]: unknown;
|
|
2093
|
+
};
|
|
2094
|
+
content: {
|
|
2095
|
+
/**
|
|
2096
|
+
* @example {
|
|
2097
|
+
* "error": {
|
|
2098
|
+
* "code": "unavailable",
|
|
2099
|
+
* "message": "pay.sh is temporarily disabled."
|
|
2100
|
+
* }
|
|
2101
|
+
* }
|
|
2102
|
+
*/
|
|
2103
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2104
|
+
};
|
|
2105
|
+
};
|
|
2106
|
+
};
|
|
2107
|
+
parameters: {
|
|
2108
|
+
/** @example d1 */
|
|
2109
|
+
DelegationId: string;
|
|
2110
|
+
};
|
|
2111
|
+
requestBodies: never;
|
|
2112
|
+
headers: never;
|
|
2113
|
+
pathItems: never;
|
|
2114
|
+
}
|
|
2115
|
+
export type $defs = Record<string, never>;
|
|
2116
|
+
export interface operations {
|
|
2117
|
+
pairAgent: {
|
|
2118
|
+
parameters: {
|
|
2119
|
+
query?: never;
|
|
2120
|
+
header?: never;
|
|
2121
|
+
path?: never;
|
|
2122
|
+
cookie?: never;
|
|
2123
|
+
};
|
|
2124
|
+
requestBody: {
|
|
2125
|
+
content: {
|
|
2126
|
+
"application/json": components["schemas"]["AgentPairInput"];
|
|
2127
|
+
};
|
|
2128
|
+
};
|
|
2129
|
+
responses: {
|
|
2130
|
+
/** @description Pairing initiated - the code is now active for claiming. */
|
|
2131
|
+
200: {
|
|
2132
|
+
headers: {
|
|
2133
|
+
[name: string]: unknown;
|
|
2134
|
+
};
|
|
2135
|
+
content: {
|
|
2136
|
+
"application/json": {
|
|
2137
|
+
/** @example a1b2c3-d4e5f6 */
|
|
2138
|
+
code: string;
|
|
2139
|
+
};
|
|
2140
|
+
};
|
|
2141
|
+
};
|
|
2142
|
+
400: components["responses"]["BadRequest"];
|
|
2143
|
+
};
|
|
2144
|
+
};
|
|
2145
|
+
issueAgentSessionNonce: {
|
|
2146
|
+
parameters: {
|
|
2147
|
+
query?: never;
|
|
2148
|
+
header?: never;
|
|
2149
|
+
path?: never;
|
|
2150
|
+
cookie?: never;
|
|
2151
|
+
};
|
|
2152
|
+
requestBody: {
|
|
2153
|
+
content: {
|
|
2154
|
+
"application/json": components["schemas"]["AgentSessionNonceInput"];
|
|
2155
|
+
};
|
|
2156
|
+
};
|
|
2157
|
+
responses: {
|
|
2158
|
+
/** @description A fresh nonce to sign. */
|
|
2159
|
+
200: {
|
|
2160
|
+
headers: {
|
|
2161
|
+
[name: string]: unknown;
|
|
2162
|
+
};
|
|
2163
|
+
content: {
|
|
2164
|
+
"application/json": {
|
|
2165
|
+
nonce: components["schemas"]["Hash32"];
|
|
2166
|
+
};
|
|
2167
|
+
};
|
|
2168
|
+
};
|
|
2169
|
+
};
|
|
2170
|
+
};
|
|
2171
|
+
mintAgentSession: {
|
|
2172
|
+
parameters: {
|
|
2173
|
+
query?: never;
|
|
2174
|
+
header?: never;
|
|
2175
|
+
path?: never;
|
|
2176
|
+
cookie?: never;
|
|
2177
|
+
};
|
|
2178
|
+
requestBody: {
|
|
2179
|
+
content: {
|
|
2180
|
+
"application/json": components["schemas"]["AgentSessionInput"];
|
|
2181
|
+
};
|
|
2182
|
+
};
|
|
2183
|
+
responses: {
|
|
2184
|
+
/** @description A fresh agent session token. */
|
|
2185
|
+
200: {
|
|
2186
|
+
headers: {
|
|
2187
|
+
[name: string]: unknown;
|
|
2188
|
+
};
|
|
2189
|
+
content: {
|
|
2190
|
+
"application/json": components["schemas"]["AgentSessionResponse"];
|
|
2191
|
+
};
|
|
2192
|
+
};
|
|
2193
|
+
401: components["responses"]["Unauthorized"];
|
|
2194
|
+
};
|
|
2195
|
+
};
|
|
2196
|
+
getAgentSelf: {
|
|
2197
|
+
parameters: {
|
|
2198
|
+
query?: never;
|
|
2199
|
+
header?: never;
|
|
2200
|
+
path?: never;
|
|
2201
|
+
cookie?: never;
|
|
2202
|
+
};
|
|
2203
|
+
requestBody?: never;
|
|
2204
|
+
responses: {
|
|
2205
|
+
/** @description This agent's identity, account, and (if any) live grant. */
|
|
2206
|
+
200: {
|
|
2207
|
+
headers: {
|
|
2208
|
+
[name: string]: unknown;
|
|
2209
|
+
};
|
|
2210
|
+
content: {
|
|
2211
|
+
"application/json": components["schemas"]["AgentSelf"];
|
|
2212
|
+
};
|
|
2213
|
+
};
|
|
2214
|
+
401: components["responses"]["Unauthorized"];
|
|
2215
|
+
403: components["responses"]["Forbidden"];
|
|
2216
|
+
404: components["responses"]["NotFound"];
|
|
2217
|
+
};
|
|
2218
|
+
};
|
|
2219
|
+
listAgentRequests: {
|
|
2220
|
+
parameters: {
|
|
2221
|
+
query?: {
|
|
2222
|
+
/** @description Specific account ID (owner only). Defaults to primary. */
|
|
2223
|
+
accountId?: string;
|
|
2224
|
+
};
|
|
2225
|
+
header?: never;
|
|
2226
|
+
path?: never;
|
|
2227
|
+
cookie?: never;
|
|
2228
|
+
};
|
|
2229
|
+
requestBody?: never;
|
|
2230
|
+
responses: {
|
|
2231
|
+
/** @description Array of agent requests (may be empty). */
|
|
2232
|
+
200: {
|
|
2233
|
+
headers: {
|
|
2234
|
+
[name: string]: unknown;
|
|
2235
|
+
};
|
|
2236
|
+
content: {
|
|
2237
|
+
"application/json": components["schemas"]["AgentRequest"][];
|
|
2238
|
+
};
|
|
2239
|
+
};
|
|
2240
|
+
401: components["responses"]["Unauthorized"];
|
|
2241
|
+
404: components["responses"]["NotFound"];
|
|
2242
|
+
};
|
|
2243
|
+
};
|
|
2244
|
+
raiseAgentRequest: {
|
|
2245
|
+
parameters: {
|
|
2246
|
+
query?: never;
|
|
2247
|
+
header?: never;
|
|
2248
|
+
path?: never;
|
|
2249
|
+
cookie?: never;
|
|
2250
|
+
};
|
|
2251
|
+
requestBody: {
|
|
2252
|
+
content: {
|
|
2253
|
+
"application/json": components["schemas"]["AgentRequestInput"];
|
|
2254
|
+
};
|
|
2255
|
+
};
|
|
2256
|
+
responses: {
|
|
2257
|
+
/** @description The request has been raised. */
|
|
2258
|
+
200: {
|
|
2259
|
+
headers: {
|
|
2260
|
+
[name: string]: unknown;
|
|
2261
|
+
};
|
|
2262
|
+
content: {
|
|
2263
|
+
"application/json": components["schemas"]["AgentRequest"];
|
|
2264
|
+
};
|
|
2265
|
+
};
|
|
2266
|
+
400: components["responses"]["BadRequest"];
|
|
2267
|
+
401: components["responses"]["Unauthorized"];
|
|
2268
|
+
403: components["responses"]["Forbidden"];
|
|
2269
|
+
404: components["responses"]["NotFound"];
|
|
2270
|
+
};
|
|
2271
|
+
};
|
|
2272
|
+
getUnifiedBalance: {
|
|
2273
|
+
parameters: {
|
|
2274
|
+
query?: {
|
|
2275
|
+
/** @description Scope the read to this specific account of the caller's (must belong to the authenticated signer - a foreign or unknown id is rejected, never silently ignored). Omitted defaults to the signer's lowest-visible-index account. */
|
|
2276
|
+
accountId?: string;
|
|
2277
|
+
/**
|
|
2278
|
+
* @description The chain the caller is currently viewing, as a CAIP-2 ref. A hint only: it promotes that chain to the front of this account's next background refresh so a first-ever deposit on an otherwise-untouched chain appears promptly. Never affects the response body. Forgiving - an unrecognized value is ignored, never a 400.
|
|
2279
|
+
* @example solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1
|
|
2280
|
+
*/
|
|
2281
|
+
focusChainRef?: string;
|
|
2282
|
+
};
|
|
2283
|
+
header?: never;
|
|
2284
|
+
path?: never;
|
|
2285
|
+
cookie?: never;
|
|
2286
|
+
};
|
|
2287
|
+
requestBody?: never;
|
|
2288
|
+
responses: {
|
|
2289
|
+
/** @description The unified balance. */
|
|
2290
|
+
200: {
|
|
2291
|
+
headers: {
|
|
2292
|
+
[name: string]: unknown;
|
|
2293
|
+
};
|
|
2294
|
+
content: {
|
|
2295
|
+
"application/json": components["schemas"]["UnifiedBalance"];
|
|
2296
|
+
};
|
|
2297
|
+
};
|
|
2298
|
+
401: components["responses"]["Unauthorized"];
|
|
2299
|
+
404: components["responses"]["NotFound"];
|
|
2300
|
+
};
|
|
2301
|
+
};
|
|
2302
|
+
listChains: {
|
|
2303
|
+
parameters: {
|
|
2304
|
+
query?: never;
|
|
2305
|
+
header?: never;
|
|
2306
|
+
path?: never;
|
|
2307
|
+
cookie?: never;
|
|
2308
|
+
};
|
|
2309
|
+
requestBody?: never;
|
|
2310
|
+
responses: {
|
|
2311
|
+
/** @description Supported chains. */
|
|
2312
|
+
200: {
|
|
2313
|
+
headers: {
|
|
2314
|
+
[name: string]: unknown;
|
|
2315
|
+
};
|
|
2316
|
+
content: {
|
|
2317
|
+
"application/json": components["schemas"]["Chain"][];
|
|
2318
|
+
};
|
|
2319
|
+
};
|
|
2320
|
+
401: components["responses"]["Unauthorized"];
|
|
2321
|
+
};
|
|
2322
|
+
};
|
|
2323
|
+
listGasMethods: {
|
|
2324
|
+
parameters: {
|
|
2325
|
+
query?: {
|
|
2326
|
+
/** @description Scope the per-method balances to this specific account of the caller's (must belong to the authenticated signer - a foreign or unknown id is rejected, never silently ignored). Omitted defaults to the signer's lowest-visible-index account. */
|
|
2327
|
+
accountId?: string;
|
|
2328
|
+
/** @description Compute gas-method availability for this specific EVM chain. A basic-tier chain (a bundler but no Circle Paymaster - e.g. Robinhood) reports USDC/USDT gas as unavailable and native gas as the default. At least one of `chainId`/`key` is REQUIRED; a request with neither is a 400. If both are supplied, `key` takes priority and this is ignored. */
|
|
2329
|
+
chainId?: number;
|
|
2330
|
+
/**
|
|
2331
|
+
* @description Compute gas-method availability for this specific Stellar chain KEY instead of an EVM `chainId` (Stellar is key-keyed, not chainId-keyed). When present, returns Stellar's `native` (always) and `usdc` (only when the hosted gasless relayer - design doc §2 - is healthy) rows, in place of the EVM chainId-keyed path.
|
|
2332
|
+
* @example stellar-testnet
|
|
2333
|
+
*/
|
|
2334
|
+
key?: string;
|
|
2335
|
+
};
|
|
2336
|
+
header?: never;
|
|
2337
|
+
path?: never;
|
|
2338
|
+
cookie?: never;
|
|
2339
|
+
};
|
|
2340
|
+
requestBody?: never;
|
|
2341
|
+
responses: {
|
|
2342
|
+
/** @description Gas methods. */
|
|
2343
|
+
200: {
|
|
2344
|
+
headers: {
|
|
2345
|
+
[name: string]: unknown;
|
|
2346
|
+
};
|
|
2347
|
+
content: {
|
|
2348
|
+
"application/json": components["schemas"]["GasMethod"][];
|
|
2349
|
+
};
|
|
2350
|
+
};
|
|
2351
|
+
400: components["responses"]["BadRequest"];
|
|
2352
|
+
401: components["responses"]["Unauthorized"];
|
|
2353
|
+
404: components["responses"]["NotFound"];
|
|
2354
|
+
};
|
|
2355
|
+
};
|
|
2356
|
+
getAccount: {
|
|
2357
|
+
parameters: {
|
|
2358
|
+
query?: {
|
|
2359
|
+
/** @description When present, returns the address that is actually usable on this chain, deriving and persisting a counterfactual record for it if the account has never touched it. Omitted keeps the chain-blind default (whichever row is deployed, or the lowest index). */
|
|
2360
|
+
chainId?: number;
|
|
2361
|
+
};
|
|
2362
|
+
header?: never;
|
|
2363
|
+
path?: never;
|
|
2364
|
+
cookie?: never;
|
|
2365
|
+
};
|
|
2366
|
+
requestBody?: never;
|
|
2367
|
+
responses: {
|
|
2368
|
+
/** @description The account. */
|
|
2369
|
+
200: {
|
|
2370
|
+
headers: {
|
|
2371
|
+
[name: string]: unknown;
|
|
2372
|
+
};
|
|
2373
|
+
content: {
|
|
2374
|
+
"application/json": components["schemas"]["Account"];
|
|
2375
|
+
};
|
|
2376
|
+
};
|
|
2377
|
+
401: components["responses"]["Unauthorized"];
|
|
2378
|
+
404: components["responses"]["NotFound"];
|
|
2379
|
+
};
|
|
2380
|
+
};
|
|
2381
|
+
buildDelegatedAction: {
|
|
2382
|
+
parameters: {
|
|
2383
|
+
query?: never;
|
|
2384
|
+
header?: never;
|
|
2385
|
+
path: {
|
|
2386
|
+
/** @example d1 */
|
|
2387
|
+
delegationId: components["parameters"]["DelegationId"];
|
|
2388
|
+
};
|
|
2389
|
+
cookie?: never;
|
|
2390
|
+
};
|
|
2391
|
+
requestBody: {
|
|
2392
|
+
content: {
|
|
2393
|
+
"application/json": components["schemas"]["DelegatedActionInput"];
|
|
2394
|
+
};
|
|
2395
|
+
};
|
|
2396
|
+
responses: {
|
|
2397
|
+
/** @description Unsigned delegated-action op (session-key-signed). */
|
|
2398
|
+
200: {
|
|
2399
|
+
headers: {
|
|
2400
|
+
[name: string]: unknown;
|
|
2401
|
+
};
|
|
2402
|
+
content: {
|
|
2403
|
+
"application/json": components["schemas"]["UserOpBuild"];
|
|
2404
|
+
};
|
|
2405
|
+
};
|
|
2406
|
+
401: components["responses"]["Unauthorized"];
|
|
2407
|
+
403: components["responses"]["Forbidden"];
|
|
2408
|
+
404: components["responses"]["NotFound"];
|
|
2409
|
+
422: components["responses"]["BadRequest"];
|
|
2410
|
+
};
|
|
2411
|
+
};
|
|
2412
|
+
buildExactDelegatedAction: {
|
|
2413
|
+
parameters: {
|
|
2414
|
+
query?: never;
|
|
2415
|
+
header?: never;
|
|
2416
|
+
path: {
|
|
2417
|
+
delegationId: string;
|
|
2418
|
+
};
|
|
2419
|
+
cookie?: never;
|
|
2420
|
+
};
|
|
2421
|
+
requestBody: {
|
|
2422
|
+
content: {
|
|
2423
|
+
"application/json": components["schemas"]["ExactDelegatedActionInput"];
|
|
2424
|
+
};
|
|
2425
|
+
};
|
|
2426
|
+
responses: {
|
|
2427
|
+
/** @description Unsigned agent operation bound to the explicit execution context. */
|
|
2428
|
+
200: {
|
|
2429
|
+
headers: {
|
|
2430
|
+
[name: string]: unknown;
|
|
2431
|
+
};
|
|
2432
|
+
content: {
|
|
2433
|
+
"application/json": components["schemas"]["ExactDelegatedActionBuild"];
|
|
2434
|
+
};
|
|
2435
|
+
};
|
|
2436
|
+
/** @description Request refused or unavailable; no signature is produced by the API. */
|
|
2437
|
+
400: {
|
|
2438
|
+
headers: {
|
|
2439
|
+
[name: string]: unknown;
|
|
2440
|
+
};
|
|
2441
|
+
content: {
|
|
2442
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2443
|
+
};
|
|
2444
|
+
};
|
|
2445
|
+
/** @description Request refused or unavailable; no signature is produced by the API. */
|
|
2446
|
+
401: {
|
|
2447
|
+
headers: {
|
|
2448
|
+
[name: string]: unknown;
|
|
2449
|
+
};
|
|
2450
|
+
content: {
|
|
2451
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2452
|
+
};
|
|
2453
|
+
};
|
|
2454
|
+
/** @description Request refused or unavailable; no signature is produced by the API. */
|
|
2455
|
+
403: {
|
|
2456
|
+
headers: {
|
|
2457
|
+
[name: string]: unknown;
|
|
2458
|
+
};
|
|
2459
|
+
content: {
|
|
2460
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2461
|
+
};
|
|
2462
|
+
};
|
|
2463
|
+
/** @description Request refused or unavailable; no signature is produced by the API. */
|
|
2464
|
+
404: {
|
|
2465
|
+
headers: {
|
|
2466
|
+
[name: string]: unknown;
|
|
2467
|
+
};
|
|
2468
|
+
content: {
|
|
2469
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2470
|
+
};
|
|
2471
|
+
};
|
|
2472
|
+
/** @description Request refused or unavailable; no signature is produced by the API. */
|
|
2473
|
+
409: {
|
|
2474
|
+
headers: {
|
|
2475
|
+
[name: string]: unknown;
|
|
2476
|
+
};
|
|
2477
|
+
content: {
|
|
2478
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2479
|
+
};
|
|
2480
|
+
};
|
|
2481
|
+
/** @description Request refused or unavailable; no signature is produced by the API. */
|
|
2482
|
+
422: {
|
|
2483
|
+
headers: {
|
|
2484
|
+
[name: string]: unknown;
|
|
2485
|
+
};
|
|
2486
|
+
content: {
|
|
2487
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2488
|
+
};
|
|
2489
|
+
};
|
|
2490
|
+
/** @description Request refused or unavailable; no signature is produced by the API. */
|
|
2491
|
+
429: {
|
|
2492
|
+
headers: {
|
|
2493
|
+
[name: string]: unknown;
|
|
2494
|
+
};
|
|
2495
|
+
content: {
|
|
2496
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2497
|
+
};
|
|
2498
|
+
};
|
|
2499
|
+
/** @description Request refused or unavailable; no signature is produced by the API. */
|
|
2500
|
+
500: {
|
|
2501
|
+
headers: {
|
|
2502
|
+
[name: string]: unknown;
|
|
2503
|
+
};
|
|
2504
|
+
content: {
|
|
2505
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2506
|
+
};
|
|
2507
|
+
};
|
|
2508
|
+
/** @description Request refused or unavailable; no signature is produced by the API. */
|
|
2509
|
+
503: {
|
|
2510
|
+
headers: {
|
|
2511
|
+
[name: string]: unknown;
|
|
2512
|
+
};
|
|
2513
|
+
content: {
|
|
2514
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2515
|
+
};
|
|
2516
|
+
};
|
|
2517
|
+
};
|
|
2518
|
+
};
|
|
2519
|
+
submitUserOp: {
|
|
2520
|
+
parameters: {
|
|
2521
|
+
query?: never;
|
|
2522
|
+
header?: never;
|
|
2523
|
+
path?: never;
|
|
2524
|
+
cookie?: never;
|
|
2525
|
+
};
|
|
2526
|
+
requestBody: {
|
|
2527
|
+
content: {
|
|
2528
|
+
"application/json": components["schemas"]["SignedUserOp"];
|
|
2529
|
+
};
|
|
2530
|
+
};
|
|
2531
|
+
responses: {
|
|
2532
|
+
/** @description Accepted for relay. */
|
|
2533
|
+
202: {
|
|
2534
|
+
headers: {
|
|
2535
|
+
[name: string]: unknown;
|
|
2536
|
+
};
|
|
2537
|
+
content: {
|
|
2538
|
+
"application/json": components["schemas"]["UserOpReceipt"];
|
|
2539
|
+
};
|
|
2540
|
+
};
|
|
2541
|
+
400: components["responses"]["BadRequest"];
|
|
2542
|
+
401: components["responses"]["Unauthorized"];
|
|
2543
|
+
/** @description Hosted operation requires the authenticated owner browser. */
|
|
2544
|
+
403: {
|
|
2545
|
+
headers: {
|
|
2546
|
+
[name: string]: unknown;
|
|
2547
|
+
};
|
|
2548
|
+
content: {
|
|
2549
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2550
|
+
};
|
|
2551
|
+
};
|
|
2552
|
+
/** @description Hosted submission is already in progress or its review changed. Resume the durable operation ID. */
|
|
2553
|
+
409: {
|
|
2554
|
+
headers: {
|
|
2555
|
+
[name: string]: unknown;
|
|
2556
|
+
};
|
|
2557
|
+
content: {
|
|
2558
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2559
|
+
};
|
|
2560
|
+
};
|
|
2561
|
+
422: components["responses"]["PolicyDeclined"];
|
|
2562
|
+
};
|
|
2563
|
+
};
|
|
2564
|
+
getUserOp: {
|
|
2565
|
+
parameters: {
|
|
2566
|
+
query?: never;
|
|
2567
|
+
header?: never;
|
|
2568
|
+
path: {
|
|
2569
|
+
userOpId: string;
|
|
2570
|
+
};
|
|
2571
|
+
cookie?: never;
|
|
2572
|
+
};
|
|
2573
|
+
requestBody?: never;
|
|
2574
|
+
responses: {
|
|
2575
|
+
/** @description The UserOp receipt / status. */
|
|
2576
|
+
200: {
|
|
2577
|
+
headers: {
|
|
2578
|
+
[name: string]: unknown;
|
|
2579
|
+
};
|
|
2580
|
+
content: {
|
|
2581
|
+
"application/json": components["schemas"]["UserOpReceipt"];
|
|
2582
|
+
};
|
|
2583
|
+
};
|
|
2584
|
+
401: components["responses"]["Unauthorized"];
|
|
2585
|
+
404: components["responses"]["NotFound"];
|
|
2586
|
+
};
|
|
2587
|
+
};
|
|
2588
|
+
getAgentUserOpByHash: {
|
|
2589
|
+
parameters: {
|
|
2590
|
+
query?: never;
|
|
2591
|
+
header?: never;
|
|
2592
|
+
path: {
|
|
2593
|
+
chainId: number;
|
|
2594
|
+
userOpHash: string;
|
|
2595
|
+
};
|
|
2596
|
+
cookie?: never;
|
|
2597
|
+
};
|
|
2598
|
+
requestBody?: never;
|
|
2599
|
+
responses: {
|
|
2600
|
+
/** @description The recorded operation and its current settlement status. */
|
|
2601
|
+
200: {
|
|
2602
|
+
headers: {
|
|
2603
|
+
[name: string]: unknown;
|
|
2604
|
+
};
|
|
2605
|
+
content: {
|
|
2606
|
+
"application/json": components["schemas"]["UserOpReceipt"];
|
|
2607
|
+
};
|
|
2608
|
+
};
|
|
2609
|
+
/** @description Receipt lookup refused, unknown or unavailable. */
|
|
2610
|
+
400: {
|
|
2611
|
+
headers: {
|
|
2612
|
+
[name: string]: unknown;
|
|
2613
|
+
};
|
|
2614
|
+
content: {
|
|
2615
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2616
|
+
};
|
|
2617
|
+
};
|
|
2618
|
+
/** @description Receipt lookup refused, unknown or unavailable. */
|
|
2619
|
+
401: {
|
|
2620
|
+
headers: {
|
|
2621
|
+
[name: string]: unknown;
|
|
2622
|
+
};
|
|
2623
|
+
content: {
|
|
2624
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2625
|
+
};
|
|
2626
|
+
};
|
|
2627
|
+
/** @description Receipt lookup refused, unknown or unavailable. */
|
|
2628
|
+
403: {
|
|
2629
|
+
headers: {
|
|
2630
|
+
[name: string]: unknown;
|
|
2631
|
+
};
|
|
2632
|
+
content: {
|
|
2633
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2634
|
+
};
|
|
2635
|
+
};
|
|
2636
|
+
/** @description Receipt lookup refused, unknown or unavailable. */
|
|
2637
|
+
404: {
|
|
2638
|
+
headers: {
|
|
2639
|
+
[name: string]: unknown;
|
|
2640
|
+
};
|
|
2641
|
+
content: {
|
|
2642
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2643
|
+
};
|
|
2644
|
+
};
|
|
2645
|
+
/** @description Receipt lookup refused, unknown or unavailable. */
|
|
2646
|
+
429: {
|
|
2647
|
+
headers: {
|
|
2648
|
+
[name: string]: unknown;
|
|
2649
|
+
};
|
|
2650
|
+
content: {
|
|
2651
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2652
|
+
};
|
|
2653
|
+
};
|
|
2654
|
+
/** @description Receipt lookup refused, unknown or unavailable. */
|
|
2655
|
+
500: {
|
|
2656
|
+
headers: {
|
|
2657
|
+
[name: string]: unknown;
|
|
2658
|
+
};
|
|
2659
|
+
content: {
|
|
2660
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2661
|
+
};
|
|
2662
|
+
};
|
|
2663
|
+
/** @description Receipt lookup refused, unknown or unavailable. */
|
|
2664
|
+
503: {
|
|
2665
|
+
headers: {
|
|
2666
|
+
[name: string]: unknown;
|
|
2667
|
+
};
|
|
2668
|
+
content: {
|
|
2669
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2670
|
+
};
|
|
2671
|
+
};
|
|
2672
|
+
};
|
|
2673
|
+
};
|
|
2674
|
+
listApiProviders: {
|
|
2675
|
+
parameters: {
|
|
2676
|
+
query?: {
|
|
2677
|
+
/** @description The chain to filter by. Only providers with an endpoint listed on this chain are included. Omitted, every chain the catalog knows is returned instead. */
|
|
2678
|
+
chainId?: number;
|
|
2679
|
+
/** @description Optional asset address. If provided, further filters to providers quoting this specific asset on the chain. Bounded like the other free-text filters - an EVM address is 42 characters, a Solana mint at most 44. */
|
|
2680
|
+
asset?: string;
|
|
2681
|
+
/** @description Case-insensitive substring over a provider's id, name, category and description. Applied server-side, and to the hidden set as well as the shown one, so `hidden` answers the question the search asked rather than one about the whole catalog. */
|
|
2682
|
+
q?: string;
|
|
2683
|
+
/** @description Page size. Out of range is refused, never clamped. */
|
|
2684
|
+
limit?: number;
|
|
2685
|
+
/** @description Rows to skip. The order is total (`curated` first, then `rankScore` descending, then `id` ascending), so paging can neither duplicate nor drop a provider. The curated tier leads because it is the only tier anyone has reviewed; `rankScore` measures traffic, not trust. */
|
|
2686
|
+
offset?: number;
|
|
2687
|
+
};
|
|
2688
|
+
header?: never;
|
|
2689
|
+
path?: never;
|
|
2690
|
+
cookie?: never;
|
|
2691
|
+
};
|
|
2692
|
+
requestBody?: never;
|
|
2693
|
+
responses: {
|
|
2694
|
+
/** @description One page of the ranked catalog, with the total it is a page of. */
|
|
2695
|
+
200: {
|
|
2696
|
+
headers: {
|
|
2697
|
+
[name: string]: unknown;
|
|
2698
|
+
};
|
|
2699
|
+
content: {
|
|
2700
|
+
"application/json": components["schemas"]["ApiProviderList"];
|
|
2701
|
+
};
|
|
2702
|
+
};
|
|
2703
|
+
400: components["responses"]["BadRequest"];
|
|
2704
|
+
401: components["responses"]["Unauthorized"];
|
|
2705
|
+
503: components["responses"]["ServiceUnavailable"];
|
|
2706
|
+
};
|
|
2707
|
+
};
|
|
2708
|
+
getApiProvider: {
|
|
2709
|
+
parameters: {
|
|
2710
|
+
query?: {
|
|
2711
|
+
/** @description The chain to FILTER endpoints by. Only endpoints with measured or declared evidence for this chain are included. Omitted, every chain the catalog knows is included, so an endpoint with no measured or declared chain lists once per supported chain. */
|
|
2712
|
+
chainId?: number;
|
|
2713
|
+
/** @description Which network family to VIEW this provider on - a view scope, not a filter, and NOT a synonym for `chainId`. It narrows the chains considered to that family without asking an evidence question, so an endpoint that declares no chain still lists once, unmeasured, instead of disappearing. This is what makes a Testnet/Mainnet toggle possible on a provider whose endpoints declare no chain, which is every curated provider in the catalog. Sending both is accepted and `chainId` wins, being the stricter of the two. */
|
|
2714
|
+
net?: "mainnet" | "testnet";
|
|
2715
|
+
/** @description Case-insensitive substring over an endpoint's path, summary and method. */
|
|
2716
|
+
q?: string;
|
|
2717
|
+
/** @description Page size. Out of range is refused, never clamped. */
|
|
2718
|
+
limit?: number;
|
|
2719
|
+
/** @description Endpoints to skip. The order is total (`uniquePayers` descending, then path, chainId, id), so paging can neither duplicate nor drop a row. */
|
|
2720
|
+
offset?: number;
|
|
2721
|
+
};
|
|
2722
|
+
header?: never;
|
|
2723
|
+
path: {
|
|
2724
|
+
providerId: string;
|
|
2725
|
+
};
|
|
2726
|
+
cookie?: never;
|
|
2727
|
+
};
|
|
2728
|
+
requestBody?: never;
|
|
2729
|
+
responses: {
|
|
2730
|
+
/** @description The provider, with one page of its endpoints. */
|
|
2731
|
+
200: {
|
|
2732
|
+
headers: {
|
|
2733
|
+
[name: string]: unknown;
|
|
2734
|
+
};
|
|
2735
|
+
content: {
|
|
2736
|
+
"application/json": components["schemas"]["ApiProviderDetail"];
|
|
2737
|
+
};
|
|
2738
|
+
};
|
|
2739
|
+
400: components["responses"]["BadRequest"];
|
|
2740
|
+
401: components["responses"]["Unauthorized"];
|
|
2741
|
+
503: components["responses"]["ServiceUnavailable"];
|
|
2742
|
+
};
|
|
2743
|
+
};
|
|
2744
|
+
getApiBudget: {
|
|
2745
|
+
parameters: {
|
|
2746
|
+
query: {
|
|
2747
|
+
chainId: number;
|
|
2748
|
+
agentId: string;
|
|
2749
|
+
};
|
|
2750
|
+
header?: never;
|
|
2751
|
+
path?: never;
|
|
2752
|
+
cookie?: never;
|
|
2753
|
+
};
|
|
2754
|
+
requestBody?: never;
|
|
2755
|
+
responses: {
|
|
2756
|
+
/** @description The current budget state. */
|
|
2757
|
+
200: {
|
|
2758
|
+
headers: {
|
|
2759
|
+
[name: string]: unknown;
|
|
2760
|
+
};
|
|
2761
|
+
content: {
|
|
2762
|
+
"application/json": components["schemas"]["ApiBudget"];
|
|
2763
|
+
};
|
|
2764
|
+
};
|
|
2765
|
+
400: components["responses"]["BadRequest"];
|
|
2766
|
+
401: components["responses"]["Unauthorized"];
|
|
2767
|
+
503: components["responses"]["ServiceUnavailable"];
|
|
2768
|
+
};
|
|
2769
|
+
};
|
|
2770
|
+
buildApiCallRequirements: {
|
|
2771
|
+
parameters: {
|
|
2772
|
+
query?: never;
|
|
2773
|
+
header?: never;
|
|
2774
|
+
path?: never;
|
|
2775
|
+
cookie?: never;
|
|
2776
|
+
};
|
|
2777
|
+
requestBody: {
|
|
2778
|
+
content: {
|
|
2779
|
+
"application/json": {
|
|
2780
|
+
chainId: number;
|
|
2781
|
+
providerId: string;
|
|
2782
|
+
endpointId: string;
|
|
2783
|
+
agentId: string;
|
|
2784
|
+
/**
|
|
2785
|
+
* Format: uri
|
|
2786
|
+
* @description Full URL of the endpoint to call, query parameters included. A GET endpoint's parameters belong here - it is the only place they can go.
|
|
2787
|
+
*/
|
|
2788
|
+
url: string;
|
|
2789
|
+
/** @description Raw request body for a POST endpoint, forwarded to the provider byte for byte and never parsed, reshaped or logged by Botanary - it may carry the caller's own credentials for that provider. Send it as a string (JSON endpoints: the serialised JSON), not an object. The body a price is quoted for is the body that gets paid for: it is captured with the 402 challenge and replayed at relay, so it cannot be changed after the quote. Supplying one for a GET endpoint is declined (`request_body_not_supported`). Size limit: **32768 UTF-8 BYTES**, measured on the wire - not characters. The `maxLength: 32768` above is JSON Schema's own rule and counts CHARACTERS, so it is a necessary bound but not the whole one: a string under 32768 characters can still be up to four times that in UTF-8, and the server declines it with `request_body_too_large`. Size the body in bytes, not in `String.length`. */
|
|
2790
|
+
body?: string;
|
|
2791
|
+
};
|
|
2792
|
+
};
|
|
2793
|
+
};
|
|
2794
|
+
responses: {
|
|
2795
|
+
/** @description The EIP-3009 authorization payload. */
|
|
2796
|
+
200: {
|
|
2797
|
+
headers: {
|
|
2798
|
+
[name: string]: unknown;
|
|
2799
|
+
};
|
|
2800
|
+
content: {
|
|
2801
|
+
"application/json": components["schemas"]["ApiCallRequirements"];
|
|
2802
|
+
};
|
|
2803
|
+
};
|
|
2804
|
+
400: components["responses"]["BadRequest"];
|
|
2805
|
+
401: components["responses"]["Unauthorized"];
|
|
2806
|
+
503: components["responses"]["ServiceUnavailable"];
|
|
2807
|
+
};
|
|
2808
|
+
};
|
|
2809
|
+
getApiCallRequirementStatus: {
|
|
2810
|
+
parameters: {
|
|
2811
|
+
query?: never;
|
|
2812
|
+
header?: never;
|
|
2813
|
+
path: {
|
|
2814
|
+
/** @description The requirement id from `buildApiCallRequirements`. */
|
|
2815
|
+
id: string;
|
|
2816
|
+
};
|
|
2817
|
+
cookie?: never;
|
|
2818
|
+
};
|
|
2819
|
+
requestBody?: never;
|
|
2820
|
+
responses: {
|
|
2821
|
+
/** @description The current status, and the signing material once (and only once) approved. */
|
|
2822
|
+
200: {
|
|
2823
|
+
headers: {
|
|
2824
|
+
[name: string]: unknown;
|
|
2825
|
+
};
|
|
2826
|
+
content: {
|
|
2827
|
+
"application/json": components["schemas"]["ApiCallRequirementStatus"];
|
|
2828
|
+
};
|
|
2829
|
+
};
|
|
2830
|
+
400: components["responses"]["BadRequest"];
|
|
2831
|
+
401: components["responses"]["Unauthorized"];
|
|
2832
|
+
/** @description No such id, it does not belong to this account, or it belongs to a different agent - the same refusal for all three, since which one is true is not information this route may leak. */
|
|
2833
|
+
404: {
|
|
2834
|
+
headers: {
|
|
2835
|
+
[name: string]: unknown;
|
|
2836
|
+
};
|
|
2837
|
+
content: {
|
|
2838
|
+
"application/json": components["schemas"]["ApiError"];
|
|
2839
|
+
};
|
|
2840
|
+
};
|
|
2841
|
+
503: components["responses"]["ServiceUnavailable"];
|
|
2842
|
+
};
|
|
2843
|
+
};
|
|
2844
|
+
relayApiCall: {
|
|
2845
|
+
parameters: {
|
|
2846
|
+
query?: never;
|
|
2847
|
+
header?: never;
|
|
2848
|
+
path?: never;
|
|
2849
|
+
cookie?: never;
|
|
2850
|
+
};
|
|
2851
|
+
requestBody: {
|
|
2852
|
+
content: {
|
|
2853
|
+
"application/json": {
|
|
2854
|
+
/** @description The ID returned by buildApiCallRequirements. */
|
|
2855
|
+
requirementId: string;
|
|
2856
|
+
/** @description The agent's signature of the EIP-3009 payload. */
|
|
2857
|
+
signature: string;
|
|
2858
|
+
};
|
|
2859
|
+
};
|
|
2860
|
+
};
|
|
2861
|
+
responses: {
|
|
2862
|
+
/** @description The provider's response, marked simulated or real. */
|
|
2863
|
+
200: {
|
|
2864
|
+
headers: {
|
|
2865
|
+
[name: string]: unknown;
|
|
2866
|
+
};
|
|
2867
|
+
content: {
|
|
2868
|
+
"application/json": components["schemas"]["ApiCallResult"];
|
|
2869
|
+
};
|
|
2870
|
+
};
|
|
2871
|
+
400: components["responses"]["BadRequest"];
|
|
2872
|
+
401: components["responses"]["Unauthorized"];
|
|
2873
|
+
422: components["responses"]["PolicyDeclined"];
|
|
2874
|
+
503: components["responses"]["ServiceUnavailable"];
|
|
2875
|
+
};
|
|
2876
|
+
};
|
|
2877
|
+
getApiCallStatus: {
|
|
2878
|
+
parameters: {
|
|
2879
|
+
query?: never;
|
|
2880
|
+
header?: never;
|
|
2881
|
+
path: {
|
|
2882
|
+
id: string;
|
|
2883
|
+
};
|
|
2884
|
+
cookie?: never;
|
|
2885
|
+
};
|
|
2886
|
+
requestBody?: never;
|
|
2887
|
+
responses: {
|
|
2888
|
+
/** @description Durable status, with signing material only while ready and authorized. */
|
|
2889
|
+
200: {
|
|
2890
|
+
headers: {
|
|
2891
|
+
[name: string]: unknown;
|
|
2892
|
+
};
|
|
2893
|
+
content: {
|
|
2894
|
+
"application/json": components["schemas"]["ApiCallResult"];
|
|
2895
|
+
};
|
|
2896
|
+
};
|
|
2897
|
+
401: components["responses"]["Unauthorized"];
|
|
2898
|
+
422: components["responses"]["PolicyDeclined"];
|
|
2899
|
+
503: components["responses"]["ServiceUnavailable"];
|
|
2900
|
+
};
|
|
2901
|
+
};
|
|
2902
|
+
}
|
|
2903
|
+
//# sourceMappingURL=schema.d.ts.map
|