Raw schema
{
"type": "object",
"properties": {
"account_address": {
"type": "string",
"description": "Arcadia account address"
},
"intents": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "compound_fees"
},
"enabled": {
"type": "boolean",
"default": true,
"description": "False disables this intent's managers instead of enabling them."
},
"position_id": {
"type": "integer",
"description": "LP position (NFT) id this intent applies to. Also used to auto-fetch position context."
},
"tokens": {
"type": "array",
"items": {
"type": "string",
"enum": [
"token0",
"token1",
"reward"
]
},
"description": "Which tokens' yield to reinvest. Omit for all yielding tokens. 'reward' only exists on a staked position whose reward token is not a pool token. Every yielding token must be assigned to either compound_fees or claim_rewards, so if you scope this to a subset you must add a claim_rewards intent covering the rest."
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "claim_rewards"
},
"enabled": {
"$ref": "#/properties/intents/items/anyOf/0/properties/enabled"
},
"position_id": {
"$ref": "#/properties/intents/items/anyOf/0/properties/position_id"
},
"config": {
"type": "object",
"properties": {
"mode": {
"type": "string",
"enum": [
"as_earned",
"convert_to"
],
"default": "as_earned",
"description": "as_earned pays out the claimed tokens as-is; convert_to swaps them to buy_token via CowSwap. Use convert_tokens to convert only some of them."
},
"destination": {
"type": "string",
"enum": [
"account",
"wallet"
],
"default": "account",
"description": "Payout target ('wallet' is the owner EOA). A wallet payout is only allowed for a pure as-earned claim: nothing converted, and every yielding token claimed. Any convert, or a claim scoped to a subset of tokens, must use 'account' because CowSwap settles there."
},
"buy_token": {
"type": "string",
"description": "ERC20 to swap into. Required whenever any token is being converted. It cannot be a token you also compound, one of the tokens being converted, or a token folded by add_to_lp."
},
"recipient": {
"type": "string",
"description": "Explicit payout address. Overrides destination when set, and is subject to the same pure-as-earned rule as a wallet payout unless it equals the account address."
},
"tokens": {
"type": "array",
"items": {
"$ref": "#/properties/intents/items/anyOf/0/properties/tokens/items"
},
"description": "Which tokens' yield to claim out. Omit for all yielding tokens. A token cannot be both claimed and compounded, and every yielding token must be assigned to one of the two."
},
"convert_tokens": {
"type": "array",
"items": {
"$ref": "#/properties/intents/items/anyOf/0/properties/tokens/items"
},
"description": "Subset of this intent's claimed tokens to swap to buy_token; the rest are claimed as-earned. Must be a subset of `tokens`. Omit to defer to mode (convert_to converts all claimed tokens, as_earned converts none). Use this for a partial convert, e.g. tokens: ['token0','reward'] with convert_tokens: ['reward'] swaps only the reward and claims token0 as-is."
}
},
"additionalProperties": false,
"default": {}
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "add_to_lp"
},
"enabled": {
"$ref": "#/properties/intents/items/anyOf/0/properties/enabled"
},
"position_id": {
"$ref": "#/properties/intents/items/anyOf/0/properties/position_id"
},
"tokens": {
"type": "array",
"items": {
"type": "string",
"enum": [
"token0",
"token1"
]
},
"description": "Which pool tokens' idle account balance to fold into the LP. Omit for both. Folding is opt-in per token, and a folded token cannot be the buy_token of a claim_rewards convert."
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "claim_merkl"
},
"enabled": {
"$ref": "#/properties/intents/items/anyOf/0/properties/enabled"
},
"position_id": {
"$ref": "#/properties/intents/items/anyOf/0/properties/position_id"
},
"config": {
"type": "object",
"properties": {
"destination": {
"type": "string",
"enum": [
"account",
"wallet"
],
"default": "account"
},
"reward_recipient": {
"type": "string",
"description": "Explicit recipient address. Overrides destination when set."
}
},
"additionalProperties": false,
"default": {}
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "rebalance"
},
"enabled": {
"$ref": "#/properties/intents/items/anyOf/0/properties/enabled"
},
"position_id": {
"$ref": "#/properties/intents/items/anyOf/0/properties/position_id"
},
"strategy": {
"anyOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "out_of_range"
},
"optimal_token0_ratio": {
"type": "integer",
"minimum": 0,
"maximum": 1000000,
"default": 500000,
"description": "Target token0 composition after a rebalance, 1e6-scaled: 500000 = 50% (balanced, the default), 750000 = 75% token0, 0 = all token1."
},
"trigger_lower_tick_ratio": {
"type": "integer",
"default": 0,
"description": "Offset from tick_lower as a fraction of the position's tick range, 1e6-scaled. This is TICK distance, not price: 50000 shifts the trigger by 5% of (tick_upper - tick_lower) ticks, which is not 5% of price. 0 = trigger exactly at the boundary. Positive (e.g. 50000) puts the trigger outside the position so price must travel further beyond the range before rebalancing. Negative (e.g. -50000) puts it inside, firing preemptively while price is still in range."
},
"trigger_upper_tick_ratio": {
"type": "integer",
"default": 0,
"description": "Same as trigger_lower_tick_ratio, for tick_upper. The two are independent, so asymmetric configs are valid (e.g. lower -50000, upper 0 rebalances early on the downside but only at the boundary on the upside)."
},
"min_rebalance_time": {
"type": "integer",
"default": 3600,
"description": "Cooldown in seconds between rebalances."
},
"max_rebalance_time": {
"type": "integer",
"default": 1000000000000,
"description": "Seconds before a rebalance is forced. Default is effectively disabled."
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "protocol_owned_liquidity"
},
"initial_range": {
"type": "integer",
"default": 200000
},
"base_range": {
"type": "integer",
"default": 50000
},
"k1": {
"type": "integer",
"default": 0
},
"k2": {
"type": "integer",
"default": 0
},
"rebalance_threshold": {
"type": "integer",
"default": 25000
},
"limit_order_withdrawal_threshold": {
"type": "integer",
"default": 50000
},
"fraction_excess_to_limit_order": {
"type": "integer",
"default": 500000
},
"deadzone": {
"type": "integer",
"default": 20000
},
"target_token0_ratio": {
"type": "integer",
"default": 500000
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "take_profit"
},
"profit_token": {
"type": "string",
"enum": [
"token0",
"token1"
],
"default": "token0"
},
"take_profit_trigger_type": {
"type": "string",
"enum": [
"",
"fixed",
"relative"
],
"default": "fixed"
},
"take_profit_trigger_threshold": {
"type": "integer",
"default": 0
},
"take_profit_reposition_mode": {
"type": "string",
"enum": [
"",
"anchor_tick",
"shift_range"
],
"default": "anchor_tick"
},
"has_reversal": {
"type": "boolean",
"default": false
},
"reversal_trigger_type": {
"type": "string",
"enum": [
"",
"fixed",
"relative"
],
"default": ""
},
"reversal_trigger_threshold": {
"type": "integer",
"default": 0
},
"reversal_reposition_mode": {
"type": "string",
"enum": [
"",
"anchor_tick",
"shift_range"
],
"default": ""
}
},
"required": [
"kind"
],
"additionalProperties": false
}
],
"default": {
"kind": "out_of_range"
},
"description": "out_of_range repositions when price leaves the range; take_profit runs on the dedicated profit-taker contract; protocol_owned_liquidity is the POL strategy."
},
"max_tolerance": {
"type": "integer",
"minimum": 0,
"maximum": 1000000000000000000,
"description": "Max price deviation (MEV/slippage cap), 1e18-scaled: 1e18 = 100%, so 5000000000000000 = 0.5% (the default) and 50000000000000000 = 5%. Omit for the pool's default. AAA pools are floored at 5%."
},
"min_liquidity_ratio": {
"type": "integer",
"minimum": 0,
"maximum": 1000000000000000000,
"description": "Min fraction of liquidity that must survive a rebalance, 1e18-scaled: 990000000000000000 = 99% (the default), i.e. at most 1% value loss. Omit for the default."
}
},
"required": [
"kind"
],
"additionalProperties": false
}
],
"description": "One user-facing automation intent."
},
"minItems": 1,
"description": "Complete desired automation state. In save mode anything omitted is disabled, so include every automation to keep. A single intent with enabled: false disables all automations."
},
"mode": {
"type": "string",
"enum": [
"save",
"preview"
],
"default": "save",
"description": "save diffs against on-chain state and returns a signable transaction that also disables anything omitted. preview resolves and validates only, returning a plan and no transaction."
},
"position_id": {
"type": "integer",
"description": "LP position (NFT) id, as listed in assets[] by read.account.info. Supply this and the backend fetches protocol, staked flag, tokens and reward tokens for you. Strongly preferred over passing the position fields by hand."
},
"protocol": {
"type": "string",
"enum": [
"slipstream_v1",
"slipstream_v2",
"slipstream_v3",
"uniswap_v3",
"uniswap_v4",
"slipstream",
"staked_slipstream",
"staked_slipstream_v2",
"staked_slipstream_v3",
"uniV3",
"uniV4"
],
"description": "Position's DEX protocol. Only needed when position_id is omitted. Accepts the dex_protocol values the read tools return (slipstream, staked_slipstream_v3, uniV3, ...), which imply is_staked, as well as the canonical slipstream_v1 / uniswap_v3 spellings."
},
"is_staked": {
"type": "boolean",
"description": "Whether the LP position is staked. Implied by a staked_* protocol value."
},
"token0": {
"type": "string",
"description": "Pool token0 address."
},
"token1": {
"type": "string",
"description": "Pool token1 address."
},
"reward_tokens": {
"type": "array",
"items": {
"type": "string"
},
"description": "Staking reward token addresses."
},
"owner": {
"type": "string",
"description": "Account owner EOA. Used to resolve wallet payout targets."
},
"chain_id": {
"type": "number",
"default": 8453,
"description": "Chain ID: 8453 (Base), 130 (Unichain), or 10 (Optimism)"
}
},
"required": [
"account_address",
"intents"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}