Draft an Execute agent on a deployed Shield chain: when something happens on the owner's wallet, do one action with its funds, inside caps the owner signs on chain (the Shield contract). Inactive until the owner signs on the review link it returns (review_url; also proposal_id, summary, limits, fee_bps, expires_at). No API key. New Execute setup is in early access: a wallet without access no longer gets 403 execute_team_only: no proposal is stored, and the response is a Prepare agent draft for the same trigger and action instead (status 'draft', fallback.from 'execute', its own review_url). The owner activates it and signs each plan, and can join the Execute waitlist in the Signo app.
Collect: wallet; trigger; action; cap_per (most per execution); budget (lifetime, before fees; the fee comes on top); expiry_days optional, default 30. The wallet need not hold the budget yet.
Trigger: { kind: "condition", request } for a supported plain-English Execute condition, e.g. "when XETH drops 10% in 24 hours" (what the Shield cannot read, the hourly check decides); or health_factor, token_balance or price, re-checked on chain, e.g. { kind: "price", asset: "XETH", comparator: "<", value: 3000 }. Execute is not available for the app's Portfolio move trigger; boxed Pendle PT loops are notify-only today, and a recurring schedule is not an Execute trigger.
Action: transfer, swap (OKX DEX; one of min_out or max_slippage_bps), vault (ERC-4626), supply (Aave), repay_from_wallet, repay_from_collateral. Assets by symbol or address. Fee 10 bps per firing.
Enforced on chain: the Shield re-checks caps, expiry and readable triggers each firing and pulls funds via the owner's allowance; the executor key is held in Google Cloud KMS and usable only by Signo's production service. Checked hourly; one successful execution completes a trigger by default, and public drafts do not opt into repay-from-collateral continuation. The signing service allows at most two attempts for one permission in a rolling hour. A successful firing reports Goal, Done, Remaining, Reasoning and Next. Each firing is an on-chain tx; revocable on the Agents page. No keyless status read yet.
View input schema
{
"type": "object",
"properties": {
"schema_version": {
"type": "number",
"const": 2,
"description": "Always 2."
},
"wallet": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "The owner's EVM wallet; only this wallet can sign the permission on the review page. It does not need to hold the budget yet: each firing checks the balance then."
},
"chain_id": {
"type": "integer",
"description": "A deployed Shield chain id, returned by GET /api/shield/compile."
},
"action": {
"anyOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "transfer"
},
"asset": {
"type": "string",
"pattern": "^(0x[0-9a-fA-F]{40}|[A-Za-z0-9.$_-]{1,16})$",
"description": "The token: the symbol Signo uses on the selected chain (X Layer accepts USDT for USDT0), or a symbol on its token catalog (OKX on X Layer, LI.FI on Arbitrum) (a symbol several tokens share is refused with the candidates so you can pass the address), or its ERC-20 address. Symbols are names, not an allowlist; Aave actions need an Aave reserve."
},
"recipient": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "Fixed recipient; never the owner wallet itself."
}
},
"required": [
"kind",
"asset",
"recipient"
],
"additionalProperties": false,
"description": "Send the asset to one fixed recipient."
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "swap"
},
"asset": {
"$ref": "#/properties/action/anyOf/0/properties/asset"
},
"token_out": {
"$ref": "#/properties/action/anyOf/0/properties/asset"
},
"min_out": {
"type": "string",
"pattern": "^\\d{1,30}(\\.\\d{1,18})?$",
"description": "Output-token floor per execution. Give exactly one of min_out or max_slippage_bps."
},
"max_slippage_bps": {
"type": "integer",
"minimum": 50,
"maximum": 1000,
"description": "Slippage bound in basis points, 50 to 1000. Give exactly one of min_out or max_slippage_bps."
}
},
"required": [
"kind",
"asset",
"token_out"
],
"additionalProperties": false,
"description": "Swap the asset through OKX DEX into token_out."
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "vault"
},
"vault": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$"
},
"asset": {
"$ref": "#/properties/action/anyOf/0/properties/asset",
"description": "The token: the symbol Signo uses on the selected chain (X Layer accepts USDT for USDT0), or a symbol on its token catalog (OKX on X Layer, LI.FI on Arbitrum) (a symbol several tokens share is refused with the candidates so you can pass the address), or its ERC-20 address. Symbols are names, not an allowlist; Aave actions need an Aave reserve."
},
"max_slippage_bps": {
"type": "integer",
"minimum": 0,
"maximum": 1000,
"default": 0
}
},
"required": [
"kind",
"vault"
],
"additionalProperties": false,
"description": "Deposit the asset into an ERC-4626 vault."
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "supply"
},
"asset": {
"$ref": "#/properties/action/anyOf/0/properties/asset"
}
},
"required": [
"kind",
"asset"
],
"additionalProperties": false,
"description": "Supply the asset into Aave on the selected chain."
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "repay_from_wallet"
},
"asset": {
"$ref": "#/properties/action/anyOf/0/properties/asset"
}
},
"required": [
"kind",
"asset"
],
"additionalProperties": false,
"description": "Repay Aave debt in the asset from the wallet's own balance."
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "repay_from_collateral"
},
"collateral": {
"$ref": "#/properties/action/anyOf/0/properties/asset"
},
"debt": {
"$ref": "#/properties/action/anyOf/0/properties/asset"
},
"target_health_factor": {
"type": "number",
"exclusiveMinimum": 1,
"maximum": 10
},
"max_slippage_bps": {
"$ref": "#/properties/action/anyOf/1/properties/max_slippage_bps",
"description": "Slippage bound in basis points, 50 to 1000. When omitted, defaults to 100 on X Layer and 50 on Arbitrum."
}
},
"required": [
"kind",
"collateral",
"debt",
"target_health_factor"
],
"additionalProperties": false,
"description": "Repay Aave debt by swapping the collateral asset, until the health factor reaches the target."
}
],
"description": "What a firing does: transfer (to a fixed recipient), swap (through OKX DEX; exactly one of min_out or max_slippage_bps), vault (ERC-4626 deposit), supply (into Aave), repay_from_wallet (repay Aave debt from the wallet's balance), repay_from_collateral (repay Aave debt by selling collateral to a target health factor)."
},
"trigger": {
"anyOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "health_factor"
},
"comparator": {
"type": "string",
"enum": [
"<",
"<=",
">",
">="
]
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"required": [
"kind",
"comparator",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "token_balance"
},
"asset": {
"$ref": "#/properties/action/anyOf/0/properties/asset"
},
"comparator": {
"$ref": "#/properties/trigger/anyOf/0/properties/comparator"
},
"value": {
"type": "number",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"kind",
"asset",
"comparator",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "price"
},
"asset": {
"$ref": "#/properties/action/anyOf/0/properties/asset"
},
"comparator": {
"$ref": "#/properties/trigger/anyOf/0/properties/comparator"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 1000000000000,
"description": "USD price of the asset, read on chain at fire time from the Aave oracle on the selected chain (Chainlink-backed)."
}
},
"required": [
"kind",
"asset",
"comparator",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "condition"
},
"request": {
"type": "string",
"minLength": 8,
"maxLength": 2000,
"description": "A supported plain-English Execute condition: a price threshold or percent move, a lending health factor, the wallet's DeFi positions, a yield, or another measurable condition the compiler accepts. Compiled by the same compiler as the app; the part the Shield can read is pinned and re-checked on chain, the rest is decided by the hourly check. Execute is not available for the app's Portfolio move trigger; boxed Pendle PT loops are notify-only today. A recurring schedule is not an Execute trigger."
}
},
"required": [
"kind",
"request"
],
"additionalProperties": false
}
],
"description": "When it fires: a supported plain-English Execute condition (the part the Shield can read is pinned and re-checked on chain; the rest is decided by the hourly check), or one of three typed triggers the Shield reads on chain: health_factor (the wallet's Aave health factor), token_balance (the wallet's balance of an asset), price (the asset's current USD price from the Aave oracle on the selected chain, Chainlink-backed; a current price only, never a move over a window), each with a comparator and a value. Execute is not available for the app's Portfolio move trigger; boxed Pendle PT loops are notify-only today. A recurring schedule is not an Execute trigger. A crossing fires once; it re-arms when the condition goes false again."
},
"budget": {
"type": "string",
"pattern": "^\\d{1,30}(\\.\\d{1,18})?$",
"description": "Lifetime input-token budget, before fees. The Signo fee comes on top: the permission is registered with room for it, so 50 lifetime and 5 per execution allows ten full executions. The wallet does not need to hold it yet; each execution checks the balance for that execution. Must be at least cap_per, and may equal it."
},
"cap_per": {
"type": "string",
"pattern": "^\\d{1,30}(\\.\\d{1,18})?$",
"description": "Maximum input-token spend per execution, before the fee. At most budget."
},
"expiry_days": {
"type": "integer",
"minimum": 1,
"maximum": 90,
"default": 30,
"description": "Days until the permission can no longer fire, 1 to 90."
}
},
"required": [
"schema_version",
"wallet",
"chain_id",
"action",
"trigger",
"budget",
"cap_per"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}