{"operations":[{"id":"transfer.native","summary":"Move the chain's native token by transaction value.","chains":["ethereum","base","arbitrum"],"callable":"on-unless-disarmed"},{"id":"transfer.erc20","summary":"Move an ERC-20 token.","chains":["ethereum","base","arbitrum"],"callable":"on-unless-disarmed"},{"id":"deposit.pull","summary":"Draw tokens the OWNER has approved into the account. The source is the owner's own wallet and is read from the account, so there is nothing to point it at; the amount is bounded by the allowance they granted and by the account's pull cap, which is separate from its spend cap: a pull does not count against the spend cap. Use it as the FIRST step when the account is empty and the owner's wallet is not.","chains":["ethereum","base","arbitrum"],"callable":"on-unless-disarmed"},{"id":"owner.migrate_aave_v3","summary":"MOVE A LEVERAGED AAVE V3 POSITION INTO YOUR OWN NAME — collateral AND debt, in one transaction. YOU SEND IT, NOT THIS SYSTEM. Every other step here pays the account; this one pays you, and no adapter the agent drives is allowed to send anywhere but the account. So there is no intent to sign and nothing can place it on your behalf: the plan carries it in the right order, next to the position it empties, and you send it yourself.","chains":["ethereum","base","arbitrum"],"callable":"not-executed"},{"id":"owner.migrate_morpho","summary":"MOVE A LEVERAGED MORPHO POSITION INTO YOUR OWN NAME — collateral AND debt, in one transaction YOU send. The Morpho twin of owner.migrate_aave_v3.","chains":["ethereum","base","arbitrum"],"callable":"not-executed"},{"id":"hedge.buy_option","summary":"Buy an option to hedge a position. THIS SYSTEM DOES NOT PLACE IT — options trade on venues it does not reach, so this step is INSTRUCTIONS FOR THE PERSON, carried in the plan so the hedge sits in the right order beside the positions it protects.","chains":["ethereum","base","arbitrum"],"callable":"not-executed"},{"id":"hedge.open_perp","summary":"Open a perpetual futures position. THIS SYSTEM DOES NOT PLACE IT — perps trade on venues it does not reach, so this step is INSTRUCTIONS FOR THE PERSON, carried in the plan so the position sits in the right order beside what it hedges.","chains":["ethereum","base","arbitrum"],"callable":"not-executed"},{"id":"hedge.close_perp","summary":"Close a perpetual futures position. THIS SYSTEM DOES NOT PLACE IT — the position was opened somewhere it does not reach, so this step is INSTRUCTIONS FOR THE PERSON.","chains":["ethereum","base","arbitrum"],"callable":"not-executed"},{"id":"bridge.cctp","summary":"Move USDC to another chain through CCTP Fast. Settles OUT OF BAND: minutes, and the destination step must not start before the source step is final. What lands is LESS than what was sent, by at most 100 bps.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"bridge.across","summary":"Move an asset to another chain through Across. Settles OUT OF BAND: minutes, and the destination step must not start before the source step is final. What lands is LESS than what was sent, by at most 100 bps.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"swap.router","summary":"Swap through the first-party aggregating router. The route is computed off-chain and is therefore UNTRUSTED: the protection is the minimum output, not inspection of the route.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"cow.presign","summary":"ONLY WHEN SOMEBODY NAMES CoW BY NAME. Everything else that rests at a price is place_order on a saved plan, which re-arms itself after a short fill and which a later step can be written to follow. This is an outside venue settling out of band: nothing downstream can spend what it delivers and it cannot re-arm, so choosing it unasked substitutes a venue nobody picked.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"cow.cancel","summary":"Withdraw a CoW Protocol order this account pre-signed and has not filled: clears the on-chain pre-signature and the standing allowance to CoW's vault relayer, so nothing more can be filled. Moves no token. Name the order exactly as it was placed — the same sell, buy, buy_min, valid_to, partial and amount — because the adapter rebuilds the order hash from them and refuses one it never pre-signed. Works after valid_to too, which is how a lapsed order's allowance is cleared.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"loan.shift","summary":"MOVE A LEVERAGED POSITION. Sells the collateral held and buys the destination market's, keeping the loan -- or sells NOTHING when both ends take the SAME collateral token, which is how a position changes protocol without changing its pair. BOTH ENDS ARE NAMED BY CURATED MARKET, so it reaches only pairs that are listed. Moves a leveraged position from one market to another in ONE transaction, paid for by a flash loan the account never holds. Set mode to what the position should BE — neutral means the same asset is lent and borrowed, short means a true reversal — and it is refused if the destination market disagrees. Set repay_all to clear the debt EXACTLY: a fixed amount leaves the interest accrued since planning, and dust debt blocks the withdraw. Amount is the COLLATERAL to move, because that is what leaves the account.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"loan.close","summary":"CLOSE IT AND TAKE THE MONEY OUT. Ends the position: clear the debt with borrowed money, sell the collateral, repay the loan, keep the difference. THIS IS HOW AN ORDER FILLS WHEN THE ASSET TO SELL IS COLLATERAL — max_slippage_bps is the floor on that sale, so a triggered close with a floor IS a limit order on locked collateral. Set flash_market when the debt asset cannot itself be flash-borrowed. Partial: repay and sell less than all of it.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"leverage.aave_v3","summary":"LEVER AN AAVE v3 POSITION UP in one flash-loan transaction: flash-borrow the loan asset, swap it into collateral, supply that (plus any principal you add), borrow against it and repay the flash from the borrow — the account never holds the flash. The market names both tokens. The owner's LTV ceiling is the guard on the result and is not a field here; shrinking a position is deleverage.aave_v3, taking it all to cash is loan.close.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"leverage.aave_v4","summary":"Lever an AAVE v4 position up, the same shape as leverage.aave_v3 but on a v4 spoke. ETHEREUM ONLY: Aave v4 is on no other chain this system reaches. `market` is the curated PAIR (\"weth-usdc\"), never a spoke name: the spoke is the one that lists both tokens (weth-usdc lives in main, xaut-usdt in gold).","chains":["ethereum"],"callable":"always"},{"id":"leverage.morpho","summary":"Lever a MORPHO Blue position up, the same shape as leverage.aave_v3. Here Morpho is both the flash lender and where the position lives.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"deleverage.aave_v3","summary":"LEVER AN AAVE v3 POSITION DOWN in one flash-loan transaction: flash-borrow the loan asset, repay part of the debt, withdraw the freed collateral, sell it back into the loan asset and repay the flash — the position stays OPEN, just smaller. Ordinary use is PARTIAL: pass collateral_amount and the debt to repay; repay_all clears it entirely. Taking the whole position to cash is loan.close, not this.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"deleverage.aave_v4","summary":"Lever an AAVE v4 position down, the same shape as deleverage.aave_v3 but on a v4 spoke, which maxes the repay out by construction. ETHEREUM ONLY. `market` is the same curated PAIR the lever-up named, never a spoke name.","chains":["ethereum"],"callable":"always"},{"id":"deleverage.morpho","summary":"Lever a MORPHO Blue position down, the same shape as deleverage.aave_v3.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"property.buy","summary":"Buy 0xequity property tokens. The venue prices the trade from its own oracle, so the amount is a TOKEN COUNT and what a plan bounds is the currency side.","chains":["base"],"callable":"always"},{"id":"property.sell","summary":"Sell 0xequity property tokens. Requires the ACCOUNT to hold them, which it does only once enrolled — the router pulls from msg.sender.","chains":["base"],"callable":"always"},{"id":"rent.claim_own","summary":"Collect rent on property the ACCOUNT itself holds. Needs the account enrolled on 0xequity and holding property; otherwise it harvests nothing and succeeds. Mints a lock NFT rather than paying out.","chains":["base"],"callable":"always"},{"id":"rent.redeem","summary":"TURN A RENT LOCK INTO MONEY. Redeems a matured lock NFT and delivers USDC to this account -- NOT a rent token, and nothing needs selling afterwards. A later step may spend the output directly: `{\"Symbolic\": \"\u003cthis step\u003e.output\"}` with asset USDC is how rent repays a loan. The amount is the lock NFT id, not a quantity -- rent.claim_own mints one rather than paying out, and this is what turns it into tokens.","chains":["base"],"callable":"always"},{"id":"rent.harvest_delegated","summary":"Drive 0xequity's rent automation for the OWNER's holding, when the owner delegated through RentDelegatee and created rent positions. Harvests, redeems and splits across those positions. DELIVERS THIS ACCOUNT NOTHING — the rent lands in the owner's positions and the un-delegated remainder in the owner's wallet — so nothing may spend its output. Pair it with rent.claim_position, which collects this account's share. Needs the owner's one global delegatee slot pointed at RentDelegatee, which the run checks before it commits.","chains":["base"],"callable":"always"},{"id":"rent.claim_position","summary":"Collect this account's share of a rent position's harvested rent, paid in USDC and spendable by a later step exactly as rent.redeem's output is. The amount is the POSITION token id, not a quantity — the same shape as rent.redeem's lock NFT id. The recipient is not chosen here: the forwarder pays whoever the position's owner nominated, and the adapter refuses a position that pays neither this account nor its owner.","chains":["base"],"callable":"always"},{"id":"lend.supply","summary":"Supply an asset as collateral.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"lend.borrow","summary":"Borrow against supplied collateral.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"lend.repay","summary":"Repay borrowed principal to Aave. Repays an EXACT amount: interest accrues every block, so \"all\" is a number nobody signed.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"lend.withdraw","summary":"Take supplied collateral back out of Aave. Carries a loan-to-value cap because removing collateral raises the ratio on whatever debt remains.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"morpho.supply","summary":"Put up the COLLATERAL of a curated Morpho market. `asset` must be that market's collateral token — wsteth-usdc takes wstETH, not USDC — and a market is named \u003ccollateral\u003e-\u003cloan\u003e. It earns NO YIELD: collateral in Morpho backs a borrow and accrues nothing. Lending the loan token to earn the supply rate is a different call this system does not make, so a Morpho supply APY is not something a plan can take.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"morpho.borrow","summary":"Borrow the loan asset of a curated Morpho market.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"morpho.repay","summary":"Repay borrowed principal to a curated Morpho market. An amount at or above the debt clears ALL of it — repaid by shares, so no dust is left to block withdrawing the collateral — and what the repay did not need stays in the account. To close a position, size it a little over the debt (interest accrues until the step runs); below the debt it repays exactly the amount.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"aavev4.supply","summary":"Supply collateral into an Aave v4 spoke. THREE calls: approve, supply, and setUsingAsCollateral — v4 treats a supply as a deposit until it is explicitly marked as collateral. The Gold Spoke holds NATIVE XAUt, which no other venue here does.","chains":["ethereum"],"callable":"always"},{"id":"aavev4.borrow","summary":"Borrow from an Aave v4 spoke. The collateral backing it must have been enabled — aavev4.supply does that as part of its step.","chains":["ethereum"],"callable":"always"},{"id":"aavev4.repay","summary":"Repay borrowed principal to an Aave v4 spoke.","chains":["ethereum"],"callable":"always"},{"id":"aavev4.withdraw","summary":"Withdraw collateral from an Aave v4 spoke.","chains":["ethereum"],"callable":"always"},{"id":"morpho.withdraw","summary":"Withdraw collateral from a curated Morpho market.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"uni.mint","summary":"Mint a Uniswap V3 LP NFT. The recipient is the Kernel account, never a signed field. token0 and token1 are symbols; ticks are the position's range.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"uni.mint_single","summary":"Mint a Uni V3 LP from ONE token. Ticks are computed on-chain from the current tick; one of amount0/amount1 must be zero.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"uni.increase","summary":"Add liquidity to an existing Uni V3 NFT the account already owns.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"uni.decrease","summary":"Remove a fraction of a Uni V3 position's liquidity. Proceeds land on the account.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"uni.collect","summary":"Collect fees from a Uni V3 NFT onto the Kernel account.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"uni.withdraw","summary":"Burn a Uni V3 position fully and optionally swap the proceeds through the aggregation router at a signed minOut.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"uni.rebalance","summary":"Burn a Uni V3 NFT and mint a new one with signed ticks. Leftover tokens stay on the account.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"uni.split","summary":"Split one Uni V3 NFT into two new NFTs on the account, meeting at the tick you name. MAJOR BUMP FROM v1: `tick` is required and there is no default. v1 always cut at the geometric midpoint, so a range spanning an ODD number of spacings could not be split at all -- the midpoint landed between two ticks and the position manager refused it with EMPTY RETURNDATA and nothing to read. A position left by uni.reposition is one spacing wide and can never be split, because no tick lies strictly inside it.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"uni.reposition","summary":"Move a Uni V3 position to a one-spacing range around the current tick.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"uni.close_at_tick","summary":"Fully decrease a Uni V3 position if the current tick is inside a signed window.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.create_borrow","summary":"Move a Uni V3 NFT into the Revert vault and borrow USDC onto the Kernel account.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.mint_create_borrow","summary":"Mint a Uni V3 NFT, deposit it into Revert, and borrow USDC in one intent.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.borrow","summary":"Borrow more USDC against an existing Revert position. Proceeds land on the account.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.repay","summary":"Repay a Revert USDC borrow. Cap is charged on USDC; leftover is refunded like Aave repay.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.remove","summary":"Return a Uni V3 NFT from the Revert vault to the Kernel account.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.repay_withdraw","summary":"Repay Revert, remove the NFT, and burn the LP onto the Kernel account.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.collect_fees","summary":"Collect Uni fees on a Revert-levered position through the vault's own door: no flash, the loan stays open.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.add_liquidity","summary":"Increase liquidity on a Revert-levered Uni NFT inside a Morpho flash.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.remove_liquidity","summary":"Decrease a Revert-levered Uni position through the vault's own door: no flash, the vault checks the loan stays healthy.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.split","summary":"Split a Revert-levered Uni NFT into two new levered NFTs inside a flash, meeting at the tick you name. MAJOR BUMP FROM v1 for the same reason as uni.split: v1 always cut at the geometric midpoint, so an odd-span range could not be split at all.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.rebalance","summary":"Rebalance a Revert-levered Uni position to signed ticks inside a Morpho flash.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.close_levered","summary":"Close a Revert-levered Uni position: repay, burn LP, keep proceeds on the account.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.add_leverage","summary":"Increase leverage on a Revert Uni position: add the flash-loaned asset's side as liquidity, funded by a larger Revert borrow, plus the other side from the account.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.open_levered","summary":"Mint a Uni V3 NFT and open a Revert borrow against it, funded by a Morpho flash.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.reposition","summary":"Reposition a Revert-levered Uni NFT to new ticks; same flash path as rebalance.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.exit_to_aave","summary":"Move a Revert-levered Uni position onto Aave v3: repay vault, burn LP, supply both, borrow the flash.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.move_from_aave","summary":"Move Aave collateral into a Revert-levered Uni NFT, funded by a Morpho flash.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.add_from_aave","summary":"Pull Aave collateral into an existing Revert Uni NFT inside a Morpho flash.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.exit_to_aave_long","summary":"Close a Revert Uni position into an Aave LONG: supply both tokens, borrow USDC, sell WETH if needed.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.exit_to_aave_short","summary":"Close a Revert Uni position into an Aave SHORT: supply USDC, borrow WETH, sell WETH for USDC.","chains":["ethereum","base","arbitrum"],"callable":"always"},{"id":"revert.exit_to_aave_one","summary":"Close a Revert Uni position into Aave with a single collateral, swapping the other side first.","chains":["ethereum","base","arbitrum"],"callable":"always"}]}
