propose_execution
Synchronously authorize one exact action under one active root.
| Field | Meaning |
|---|---|
| Side effects | Returns a signed, refused, or recovery-required result. Venue submission remains with the client. |
| Next step | Submit a signed result unchanged, stop on refusal, or follow the fault’s recovery guidance. |
Arguments
| Argument | Type | Required |
|---|---|---|
intent | object | yes |
pakt_root | string | yes |
Exact bounds, accepted values, and nested fields are in Full JSON Schema below.
Example
selectedPakt comes from get_execution_context. The order is a complete unsigned order from your venue client. This call can lead to signing. Obtain the user’s instruction before calling it; it never submits.
With an authenticated MCP client:
await client.callTool({
name: "propose_execution",
arguments: {
pakt_root: selectedPakt.pakt_root,
intent: {
kind: "prepared_hyperliquid_order",
order: {
legs: [{
asset: 0, // BTC; from list_hyperliquid_perp_markets
is_buy: true,
limit_px: "100000",
sz: "0.0001",
reduce_only: false,
order_type: { limit: { tif: "ioc" } },
}],
grouping: "na",
nonce: Date.now(), // current Unix milliseconds
vault_address: null,
// expires_after_ms omitted: Pakt sets the deadline
},
},
},
});Returns
Important fields in the decoded result; this is not a complete response schema.
| Field | Meaning |
|---|---|
status | SIGNED_NOT_SUBMITTED or REFUSED_NOT_SIGNED; recovery-required is returned as a fault. |
receipt_id | Returned with a signed or refused result. Keep it for inspection and completion. |
submission_type / submission | Signed results only: the exact venue-ready payload. Submit unchanged through the venue client. |
reason | Refused results only; can be generic and need not identify the violated constraint. Do not invent a diagnosis or route around the refusal. |
For error handling and retry rules, see Statuses and Errors.
Supported Requests
Set intent.kind to one of:
prepared_hyperliquid_order: one IOC perpetual-order batch inorder; mainnet, no vault.prepared_erc20_approval: finite USDT allowance and Ethereum transaction parameters inapproval.prepared_gateway_order: Gateway order ID and prepared Ethereum transaction inorder.
For Hyperliquid, order.legs contains between one and ten legs. Each
asset is the current venue index, limit_px and sz are canonical
positive decimal strings, and order_type.limit.tif is "ioc". Use grouping: "na"
and vault_address: null. Set nonce to the current Unix time in
milliseconds; Hyperliquid rejects nonces more than two days old or one day
ahead. Retries follow the single nonce rule in Statuses and
Errors. Omit expires_after_ms:
Pakt then sets the venue deadline to the latest instant the selected Pakt
allows, counted from its own attested decision time, so the time your agent
spends preparing the call does not consume the window. Submit the signed result
promptly. A supplied expires_after_ms must be an absolute future Unix
timestamp in milliseconds, not a duration. Spell 4470 as "4470",
not "4470.0". Passing the JSON schema alone does not establish valid venue
precision, current metadata, freshness, or a permitted order.
Gateway approval and order creation are separately authorized. Confirm a successful finite approval before obtaining and authorizing a fresh order plan.
Authorize one root-first account operation and synchronously return its proof-gated signed, decision-only allowed, refused, or recovery-required result. Services have two modes. A decision-only services Pakt returns ALLOWED_NOT_SUBMITTED or REFUSED_NOT_SUBMITTED with the original deciding_pakt_root and never signs or pays. A paying services Pakt (one with a service account) requires the merchant's payment_challenge, chooses the first offered option its rules admit, and returns SIGNED_NOT_SUBMITTED with a payment header signed from the account's payments wallet; attach that header to the merchant retry and never pay the merchant separately, or the request is paid twice. For services, provide the signed artifact's exact funding identifiers, a max_charge_usd_micro decimal STRING, exact UTF-8 body and header pairs, and a stable operation_id used unchanged as the provider idempotency key across retries. An expired durable services Allow or changed request bytes under an existing operation_id returns invalid_argument identifying the original receipt and deciding Pakt. Inspect that original decision and the provider outcome; do not retry it for execution, invent a replacement identity, or repay an uncertain operation. Category, model, history, and totals are not caller inputs. Execute the exact original operation yourself; Pakt never contacts the merchant, and for a decision-only Pakt it never signs or pays. One account may have only one proof operation in progress; account_proof_in_progress means this call started no additional proof or signature. Wait for the active operation to finish; retry an uncertain request exactly unchanged so durable replay returns its result, or refresh execution context before building a new proposal. Batch related Hyperliquid trades into one exact unsigned IOC order instead of submitting them concurrently. Hyperliquid order format: {"pakt_root":"<64 lowercase hex>","intent":{"kind":"prepared_hyperliquid_order","order":{"legs":[{"asset":0,"is_buy":true,"limit_px":"100000","sz":"0.0001","reduce_only":false,"order_type":{"limit":{"tif":"ioc"}}}],"grouping":"na","nonce":1791584222000,"vault_address":null}}}. asset is the Hyperliquid perpetual index from list_hyperliquid_perp_markets; limit_px and sz are canonical decimal strings ("4470", not "4470.0"); sz is in the base asset. Hyperliquid nonce rule: a nonce together with the order legs identifies one proposal, and the deadline is not part of it. If the outcome is unknown (lost response, timeout, internal error, or account_proof_in_progress), resend the same order unchanged: Pakt returns the stored result, including its original deadline, or decides it once. If the outcome is known and you want another attempt (refused, invalid_argument, or the signed order expired), use a fresh nonce, the current Unix time in milliseconds; a refused nonce returns the same refusal. After recovery_required, do not resend or replace the order until it is reconciled. Omit expires_after_ms: Pakt sets the venue deadline to the latest instant the selected Pakt allows, measured from its own attested decision time, so time spent preparing the call does not consume the window. Submit the signed result promptly. invalid_argument names the field or immutable operation to inspect; no authorization was released by this call. A refusal reason of ExpiryUnbounded means a supplied expires_after_ms was later than the Pakt allows; omit it on the next attempt. EVM approval and Gateway V7 order are separate requests: approve first, confirm it, then create and propose a fresh short-lived order. Each request binds and may sign only its own transaction. Pakt validates but never repairs, plans, broadcasts, or registers it. Account identity, wallet, active pakt, authenticated venue evidence, proving, and authorization remain server-owned. An unconfigured deployment fails closed with execution_not_integrated.
From tools/list, MCP protocol revision 2026-07-28.
{
"additionalProperties": false,
"properties": {
"intent": {
"oneOf": [
{
"additionalProperties": false,
"properties": {
"approval": {
"additionalProperties": false,
"properties": {
"amount": {
"maximum": 18446744073709551615,
"minimum": 1,
"type": "integer"
},
"gasLimit": {
"maximum": 18446744073709551615,
"minimum": 1,
"type": "integer"
},
"maxFeePerGas": {
"maximum": 18446744073709551615,
"minimum": 0,
"type": "integer"
},
"maxPriorityFeePerGas": {
"maximum": 18446744073709551615,
"minimum": 0,
"type": "integer"
},
"nonce": {
"maximum": 18446744073709551615,
"minimum": 0,
"type": "integer"
}
},
"required": [
"amount",
"nonce",
"gasLimit",
"maxFeePerGas",
"maxPriorityFeePerGas"
],
"type": "object"
},
"kind": {
"const": "prepared_erc20_approval"
}
},
"required": [
"kind",
"approval"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"kind": {
"const": "prepared_gateway_order"
},
"order": {
"additionalProperties": false,
"properties": {
"order_id": {
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
"type": "string"
},
"transaction": {
"additionalProperties": false,
"properties": {
"gasLimit": {
"maximum": 18446744073709551615,
"minimum": 1,
"type": "integer"
},
"maxFeePerGas": {
"maximum": 18446744073709551615,
"minimum": 0,
"type": "integer"
},
"maxPriorityFeePerGas": {
"maximum": 18446744073709551615,
"minimum": 0,
"type": "integer"
},
"nonce": {
"maximum": 18446744073709551615,
"minimum": 0,
"type": "integer"
},
"tx": {
"additionalProperties": false,
"properties": {
"chain": {
"minLength": 1,
"type": "string"
},
"data": {
"minLength": 1,
"type": "string"
},
"to": {
"minLength": 1,
"type": "string"
},
"value": {
"pattern": "^[0-9]+$",
"type": "string"
}
},
"required": [
"to",
"data",
"value",
"chain"
],
"type": "object"
}
},
"required": [
"tx",
"nonce",
"gasLimit",
"maxFeePerGas",
"maxPriorityFeePerGas"
],
"type": "object"
}
},
"required": [
"order_id",
"transaction"
],
"type": "object"
}
},
"required": [
"kind",
"order"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"kind": {
"const": "service_request"
},
"request": {
"additionalProperties": false,
"description": "Services request. Without payment_challenge it is decision-only: an allow returns ALLOWED_NOT_SUBMITTED and grants no signing or payment authority; a paying services Pakt rejects it without recording anything. With payment_challenge, a paying services Pakt signs the merchant payment from the account's payments wallet and returns the header; the agent attaches it and never pays separately. Pakt never contacts the merchant. Always retry with operation_id as the provider idempotency key; a resend of the same request and challenge returns the recorded outcome, including an enclave refusal (signer-refused).",
"properties": {
"body": {
"description": "Exact UTF-8 request body. The complete encoded request (funding identifiers, operation_id, provider, endpoint, method, body, headers, amount, pricing source and expiry) is bounded to 65531 bytes, so the body budget is what those other fields leave. Pakt commits these bytes without JSON reserialization; category and model are policy-derived, never separate caller claims.",
"type": "string"
},
"endpoint": {
"description": "Absolute printable-ASCII https URL the caller will request. It must fall under a permitted endpoint pattern of the same provider and method: identical host, path segments where `*` matches exactly one segment and a final `**` one or more, any query string, no fragment, and no empty, `.`/`..`, backslash, `;` or `%`-escaped path segment.",
"minLength": 1,
"type": "string"
},
"expires_at": {
"description": "Unix seconds. Bounded to u64::MAX / 1000 so the guest can bind it in milliseconds.",
"maximum": 18446744073709551,
"minimum": 0,
"type": "integer"
},
"funding": {
"additionalProperties": false,
"description": "Exact funding identifiers approved by the owner in the signed Pakt artifact; not caller-selected authority.",
"properties": {
"account_id": {
"minLength": 1,
"type": "string"
},
"agent_id": {
"minLength": 1,
"type": "string"
},
"budget_id": {
"minLength": 1,
"type": "string"
}
},
"required": [
"account_id",
"agent_id",
"budget_id"
],
"type": "object"
},
"headers": {
"description": "Exact ordered non-credential header pairs. Names must be unique lowercase tokens; authorization, proxy-authorization, api-key, x-api-key, cookie, set-cookie, host, and idempotency-key are forbidden. Values cannot contain CR or LF. Canonical request inputs are prover-visible; do not include secrets.",
"items": {
"items": false,
"maxItems": 2,
"minItems": 2,
"prefixItems": [
{
"pattern": "^[a-z0-9-]+$",
"type": "string"
},
{
"minLength": 1,
"type": "string"
}
],
"type": "array"
},
"maxItems": 32,
"type": "array"
},
"max_charge_usd_micro": {
"description": "Positive maximum caller-declared charge as a decimal USD micro-unit STRING, at most 340282366920938463463374607431768211455. JSON numbers are rejected. Not provider-authenticated pricing.",
"pattern": "^[0-9]+$",
"type": "string"
},
"method": {
"pattern": "^[A-Z]+$",
"type": "string"
},
"operation_id": {
"description": "Stable logical operation identity and provider idempotency key. Retry the entire original request unchanged, retaining this key.",
"minLength": 1,
"type": "string"
},
"payment_challenge": {
"description": "Optional, and required by a paying services Pakt. The merchant's exact HTTP 402 challenge: x402 `exact` (EIP-3009, or Permit2 through the x402ExactPermit2Proxy) or an MPP `evm` charge, in a pinned token on Base, Arbitrum One or Ethereum (USDC; USDT0 on Arbitrum; USDT on Ethereum through x402 Permit2 only), or an MPP `tempo` charge or session (USDC.e on Tempo 4217; pathUSD or USDC.e on testnet 42431). An MPP header offers its `evm` charges then its `tempo` charges; with tempo_session it offers its `tempo` sessions for the agent's deposit and session key instead. Only an active services Pakt with a service account can pay it; Pakt pays the first offered option whose method, token, payee, amount (equal to max_charge_usd_micro: the charge, or the session deposit or top-up), resource or realm and signing window the Pakt admits, and returns invalid_argument naming each option's reason when none is admitted, recording nothing. A Permit2 payment needs the payments wallet's one-time service_permit2_approval for the token to have been mined. A Tempo payment needs the Pakt's service-network-fees cap on its chain; a Tempo challenge that asks to sponsor the fee (methodDetails.feePayer) is refused. An allow returns SIGNED_NOT_SUBMITTED with the payment header to attach when retrying the request (for a session open, a credential template the session key completes); never pay the merchant separately.",
"oneOf": [
{
"additionalProperties": false,
"properties": {
"pay_with": {
"additionalProperties": false,
"description": "Optional. When the merchant offers several chains or tokens, consider only this one (one your active Pakt's payment-assets rule pins). Absent leaves every option Pakt can sign to the active Pakt's rules, which pay the first option they admit.",
"properties": {
"chain_id": {
"minimum": 1,
"type": "integer"
},
"token": {
"pattern": "^0x[0-9a-fA-F]{40}$",
"type": "string"
}
},
"required": [
"chain_id",
"token"
],
"type": "object"
},
"payment_required": {
"description": "The merchant's x402 v2 PAYMENT-REQUIRED header value (base64 JSON) or the 402 JSON body, unchanged.",
"minLength": 1,
"type": "string"
},
"protocol": {
"const": "x402"
}
},
"required": [
"protocol",
"payment_required"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"pay_with": {
"additionalProperties": false,
"description": "Optional. When the merchant offers several chains or tokens, consider only this one (one your active Pakt's payment-assets rule pins). Absent leaves every option Pakt can sign to the active Pakt's rules, which pay the first option they admit.",
"properties": {
"chain_id": {
"minimum": 1,
"type": "integer"
},
"token": {
"pattern": "^0x[0-9a-fA-F]{40}$",
"type": "string"
}
},
"required": [
"chain_id",
"token"
],
"type": "object"
},
"protocol": {
"const": "mpp"
},
"tempo_session": {
"additionalProperties": false,
"description": "Answer the MPP `tempo` session challenge. Without top_up Pakt opens a new TIP-1034 channel with a Pakt-chosen salt; with top_up it adds to that existing channel.",
"properties": {
"amount_atomic": {
"description": "The deposit to open the channel with, or the amount a top-up adds, in atomic token units. It is what the payments wallet puts at risk; it must equal max_charge_usd_micro. A channel's whole deposit counts as one payment to its payee under the owner's ceilings.",
"pattern": "^(0|[1-9][0-9]*)$",
"type": "string"
},
"session_key": {
"description": "Address of the session key the agent generated and holds. It becomes the channel's authorizedSigner and signs every voucher and the cooperative close; the key itself never passes through Pakt. It must not be the payments wallet.",
"pattern": "^0x[0-9a-f]{40}$",
"type": "string"
},
"top_up": {
"additionalProperties": false,
"description": "The channel exactly as the session-open result's `channel` names it (hex, either case).",
"properties": {
"expiring_nonce_hash": {
"pattern": "^0x[0-9a-f]{64}$",
"type": "string"
},
"salt": {
"pattern": "^0x[0-9a-f]{64}$",
"type": "string"
}
},
"required": [
"salt",
"expiring_nonce_hash"
],
"type": "object"
}
},
"required": [
"amount_atomic",
"session_key"
],
"type": "object"
},
"www_authenticate": {
"description": "The merchant's MPP `WWW-Authenticate: Payment ...` header value, unchanged.",
"minLength": 1,
"type": "string"
}
},
"required": [
"protocol",
"www_authenticate"
],
"type": "object"
}
]
},
"pricing": {
"additionalProperties": false,
"properties": {
"is_estimate": {
"type": "boolean"
},
"source": {
"minLength": 1,
"type": "string"
}
},
"required": [
"source",
"is_estimate"
],
"type": "object"
},
"provider": {
"minLength": 1,
"type": "string"
}
},
"required": [
"funding",
"operation_id",
"provider",
"endpoint",
"method",
"body",
"headers",
"max_charge_usd_micro",
"pricing",
"expires_at"
],
"type": "object"
}
},
"required": [
"kind",
"request"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"approval": {
"additionalProperties": false,
"description": "The payments wallet's one-time approve(Permit2 0x000000000022D473030F116dDEE9F6B43aC78BA3, amount) on one token, the prerequisite of x402 Permit2 payments (USDT on Ethereum). The spender is always Permit2; Pakt sets the nonce and fees from attested chain state within the Pakt's service-network-fees cap. The service account must allow x402-permit2. Returns SIGNED_NOT_SUBMITTED with the raw transaction for the agent to broadcast; the payments wallet pays its gas in the chain's native token.",
"properties": {
"amount": {
"description": "Allowance for Permit2 in atomic token units, \"max\" for unlimited, or \"0\" to revoke. A nonzero amount is accepted only while the token's Permit2 allowance is zero and \"0\" only while it is nonzero (USDT refuses to change between two nonzero allowances); anything else is refused before any proof.",
"pattern": "^(max|0|[1-9][0-9]*)$",
"type": "string"
},
"chain_id": {
"enum": [
1,
8453,
42161
],
"type": "integer"
},
"operation_id": {
"description": "Stable idempotency key, shared account-wide with service request and transfer operation_ids. Retrying with the same key and fields returns the same signed transaction, even after the Pakt is replaced; the same key with other fields is refused.",
"maxLength": 256,
"minLength": 1,
"type": "string"
},
"token": {
"description": "A payment token the active services Pakt lists on chain_id.",
"pattern": "^0x[0-9a-fA-F]{40}$",
"type": "string"
}
},
"required": [
"operation_id",
"chain_id",
"token",
"amount"
],
"type": "object"
},
"kind": {
"const": "service_permit2_approval"
}
},
"required": [
"kind",
"approval"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"kind": {
"const": "transfer"
},
"transfer": {
"additionalProperties": false,
"description": "A payments Pakt transfer: the payments wallet sends transferFrom(master, payee, amount) from the master the Pakt binds on chain_id (or, with return_to_master, transfer(master, amount) from its own balance). Pakt derives the nonce, fees, gas and calldata from attested chain facts; they are never inputs. An allow returns SIGNED_NOT_SUBMITTED with raw_transaction and transaction_hash; broadcast it yourself and wait until it is mined before the next transfer on the same chain. If the master's allowance or balance is too low, Pakt refuses before proving with invalid_argument naming the amounts; the owner raises the allowance with approve(payments wallet, amount) in the dashboard.",
"oneOf": [
{
"required": [
"payee"
]
},
{
"required": [
"payee_label"
]
},
{
"required": [
"return_to_master"
]
}
],
"properties": {
"amount": {
"description": "Atomic token units as a decimal STRING (USDC, USDT0 and USDT use 6 decimals: \"1000000\" is 1 token).",
"pattern": "^[1-9][0-9]*$",
"type": "string"
},
"chain_id": {
"description": "8453 Base, 42161 Arbitrum or 1 Ethereum; the Pakt must bind a master on it (payments_policy.chains from get_execution_context).",
"maximum": 18446744073709551615,
"minimum": 1,
"type": "integer"
},
"operation_id": {
"description": "Stable identity of this one transfer for the account (for example the invoice id), shared with service request and Permit2 approval operation_ids. A retry with the same operation_id and terms returns the stored signed transaction or refusal instead of signing another, even after the owner replaced the payments Pakt; the same operation_id with other terms returns invalid_argument naming the original receipt. A new transfer needs a new operation_id.",
"maxLength": 256,
"minLength": 1,
"pattern": "^[!-~]+$",
"type": "string"
},
"payee": {
"description": "A payee address listed for chain_id in payments_policy.payees.",
"pattern": "^0x[0-9a-fA-F]{40}$",
"type": "string"
},
"payee_label": {
"description": "The exact label of one listed payee on chain_id; `refill` is the account's payments wallet, so a refill moves funds from the master into the service account.",
"minLength": 1,
"type": "string"
},
"return_to_master": {
"const": true,
"description": "Send the payments wallet's own token balance back to the master bound on chain_id. Always allowed for a governed token; it does not use the master's allowance."
},
"token": {
"description": "Token contract listed in payments_policy.tokens for chain_id.",
"pattern": "^0x[0-9a-fA-F]{40}$",
"type": "string"
}
},
"required": [
"operation_id",
"chain_id",
"token",
"amount"
],
"type": "object"
}
},
"required": [
"kind",
"transfer"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"kind": {
"const": "tempo_operation"
},
"operation": {
"additionalProperties": false,
"description": "A Tempo transaction from the payments wallet that answers no merchant challenge. Pakt sets the nonce and fee from attested chain state within the Pakt's service-network-fees cap on the chain. An allow returns SIGNED_NOT_SUBMITTED with the raw 0x76 transaction; broadcast it yourself with eth_sendRawTransaction before its valid_before.",
"properties": {
"action": {
"oneOf": [
{
"additionalProperties": false,
"properties": {
"amount_atomic": {
"pattern": "^(0|[1-9][0-9]*)$",
"type": "string"
},
"kind": {
"const": "transfer"
},
"to": {
"description": "A payee the owner listed for this chain without a service binding.",
"pattern": "^0x[0-9a-f]{40}$",
"type": "string"
}
},
"required": [
"kind",
"to",
"amount_atomic"
],
"type": "object"
},
{
"additionalProperties": false,
"description": "Payer-side close of a channel this payments wallet funded: request_close starts the grace period (900 s on Tempo today); withdraw returns the deposit after it. Prefer a cooperative close signed by the session key with the merchant.",
"properties": {
"channel": {
"additionalProperties": false,
"description": "The channel exactly as the session-open result's `channel` names it (hex, either case).",
"properties": {
"authorized_signer": {
"description": "The channel's session key address.",
"pattern": "^0x[0-9a-f]{40}$",
"type": "string"
},
"expiring_nonce_hash": {
"pattern": "^0x[0-9a-f]{64}$",
"type": "string"
},
"operator": {
"description": "The channel's operator; 0x000…0 when the challenge named none.",
"pattern": "^0x[0-9a-f]{40}$",
"type": "string"
},
"payee": {
"pattern": "^0x[0-9a-f]{40}$",
"type": "string"
},
"salt": {
"pattern": "^0x[0-9a-f]{64}$",
"type": "string"
}
},
"required": [
"payee",
"operator",
"salt",
"authorized_signer",
"expiring_nonce_hash"
],
"type": "object"
},
"kind": {
"enum": [
"request_close",
"withdraw"
]
}
},
"required": [
"kind",
"channel"
],
"type": "object"
}
]
},
"chain_id": {
"enum": [
4217,
42431
]
},
"expires_at": {
"description": "Unix seconds; at most 30 s after the attested time.",
"maximum": 18446744073709551,
"minimum": 0,
"type": "integer"
},
"operation_id": {
"description": "Stable idempotency key, shared account-wide with service request, Permit2 approval and transfer operation_ids. Retrying with the same key and fields returns the same signed transaction, even after the Pakt is replaced; the same key with other fields is refused.",
"maxLength": 256,
"minLength": 1,
"type": "string"
},
"token": {
"description": "The TIP-20 token (USDC.e on Tempo); also the fee token.",
"pattern": "^0x[0-9a-f]{40}$",
"type": "string"
}
},
"required": [
"operation_id",
"chain_id",
"token",
"action",
"expires_at"
],
"type": "object"
}
},
"required": [
"kind",
"operation"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"kind": {
"const": "prepared_hyperliquid_order"
},
"order": {
"additionalProperties": false,
"properties": {
"expires_after_ms": {
"description": "Omit this field: Pakt then sets the latest venue deadline the selected Pakt allows. If supplied, it is an absolute future Unix timestamp in milliseconds (not a duration), at most the Pakt's expiry-config window after Pakt's decision time, or up to five minutes for a batch whose every leg is a venue-enforced reduce-only exit.",
"maximum": 18446744073709551615,
"minimum": 1,
"type": "integer"
},
"grouping": {
"const": "na"
},
"legs": {
"items": {
"additionalProperties": false,
"properties": {
"asset": {
"maximum": 4294967295,
"minimum": 0,
"type": "integer"
},
"is_buy": {
"type": "boolean"
},
"limit_px": {
"pattern": "^(?:[1-9][0-9]{0,29}(?:\\.[0-9]{0,7}[1-9])?|0\\.[0-9]{0,7}[1-9])$",
"type": "string"
},
"order_type": {
"additionalProperties": false,
"properties": {
"limit": {
"additionalProperties": false,
"properties": {
"tif": {
"const": "ioc"
}
},
"required": [
"tif"
],
"type": "object"
}
},
"required": [
"limit"
],
"type": "object"
},
"reduce_only": {
"type": "boolean"
},
"sz": {
"pattern": "^(?:[1-9][0-9]{0,29}(?:\\.[0-9]{0,7}[1-9])?|0\\.[0-9]{0,7}[1-9])$",
"type": "string"
}
},
"required": [
"asset",
"is_buy",
"limit_px",
"sz",
"reduce_only",
"order_type"
],
"type": "object"
},
"maxItems": 10,
"minItems": 1,
"type": "array"
},
"nonce": {
"description": "Current Unix time in milliseconds, for example 1791584222000. Hyperliquid rejects nonces more than 2 days old or 1 day ahead. Follow the Hyperliquid nonce rule in this tool's description: reuse a nonce only to fetch a lost result.",
"maximum": 18446744073709551615,
"minimum": 1,
"type": "integer"
},
"vault_address": {
"type": "null"
}
},
"required": [
"legs",
"grouping",
"nonce",
"vault_address"
],
"type": "object"
}
},
"required": [
"kind",
"order"
],
"type": "object"
}
]
},
"pakt_root": {
"maxLength": 64,
"minLength": 64,
"pattern": "^[0-9a-f]{64}$",
"type": "string"
}
},
"required": [
"pakt_root",
"intent"
],
"type": "object"
}