otto-intel-mcp 0.1.2 → 0.1.4

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.
Files changed (239) hide show
  1. package/README.md +76 -18
  2. package/dist/account-userop-policy-definition.d.ts +14 -0
  3. package/dist/account-userop-policy-definition.js +12 -0
  4. package/dist/account-userop-policy-relation.d.ts +371 -0
  5. package/dist/account-userop-policy-relation.js +87 -0
  6. package/dist/adapter/cdp-signer.d.ts +76 -9
  7. package/dist/adapter/cdp-signer.js +274 -33
  8. package/dist/adapter/evm-call-failure.d.ts +29 -0
  9. package/dist/adapter/evm-call-failure.js +109 -0
  10. package/dist/adapter/refusal.d.ts +1 -1
  11. package/dist/adapter/refusal.js +13 -0
  12. package/dist/adapter/route-simulator.d.ts +91 -0
  13. package/dist/adapter/route-simulator.js +143 -0
  14. package/dist/adapter-cdp-index.d.ts +1 -1
  15. package/dist/executable-equities.d.ts +55 -0
  16. package/dist/executable-equities.js +116 -0
  17. package/dist/executable-yield-markets.d.ts +261 -0
  18. package/dist/executable-yield-markets.js +154 -0
  19. package/dist/execution-account-gas-quote.d.ts +141 -0
  20. package/dist/execution-account-gas-quote.js +443 -0
  21. package/dist/execution-account-gas-review.d.ts +123 -0
  22. package/dist/execution-account-gas-review.js +104 -0
  23. package/dist/execution-account-gas-runtime.d.ts +33 -0
  24. package/dist/execution-account-gas-runtime.js +131 -0
  25. package/dist/execution-account-gas-view.d.ts +936 -0
  26. package/dist/execution-account-gas-view.js +56 -0
  27. package/dist/execution-config.d.ts +3 -0
  28. package/dist/execution-config.js +4 -0
  29. package/dist/execution-delegated-definition.d.ts +7 -6
  30. package/dist/execution-delegated-definition.js +13 -2
  31. package/dist/execution-delegation-admin-definition.d.ts +127 -5
  32. package/dist/execution-delegation-admin-definition.js +155 -5
  33. package/dist/execution-delegation-admin.d.ts +48 -2
  34. package/dist/execution-delegation-admin.js +422 -12
  35. package/dist/execution-delegation-cap-store.d.ts +386 -0
  36. package/dist/execution-delegation-cap-store.js +1150 -0
  37. package/dist/execution-delegation-exit-definition.d.ts +309 -0
  38. package/dist/execution-delegation-exit-definition.js +204 -0
  39. package/dist/execution-delegation-exit-store.d.ts +114 -0
  40. package/dist/execution-delegation-exit-store.js +671 -0
  41. package/dist/execution-delegation-exit.d.ts +4 -0
  42. package/dist/execution-delegation-exit.js +614 -0
  43. package/dist/execution-delegation-finality.d.ts +22 -0
  44. package/dist/execution-delegation-finality.js +90 -0
  45. package/dist/execution-delegation-operation-store.d.ts +129 -0
  46. package/dist/execution-delegation-operation-store.js +1107 -0
  47. package/dist/execution-delegation-operations-definition.d.ts +282 -0
  48. package/dist/execution-delegation-operations-definition.js +117 -0
  49. package/dist/execution-delegation-operations.d.ts +6 -0
  50. package/dist/execution-delegation-operations.js +282 -0
  51. package/dist/execution-delegation-policy.d.ts +154 -8
  52. package/dist/execution-delegation-policy.js +273 -40
  53. package/dist/execution-delegation.d.ts +51 -0
  54. package/dist/execution-delegation.js +441 -31
  55. package/dist/execution-errors.d.ts +1 -1
  56. package/dist/execution-errors.js +122 -0
  57. package/dist/execution-index.d.ts +7 -2
  58. package/dist/execution-index.js +7 -2
  59. package/dist/execution-journal-schema.d.ts +96 -0
  60. package/dist/execution-journal-schema.js +368 -0
  61. package/dist/execution-journal-tables.d.ts +14 -0
  62. package/dist/execution-journal-tables.js +227 -0
  63. package/dist/execution-policy-compatibility.d.ts +34 -0
  64. package/dist/execution-policy-compatibility.js +76 -0
  65. package/dist/execution-registration.d.ts +54 -2
  66. package/dist/execution-registration.js +151 -5
  67. package/dist/execution-sponsored-account-profile.d.ts +32 -0
  68. package/dist/execution-sponsored-account-profile.js +59 -0
  69. package/dist/execution-sponsored-account.d.ts +1519 -0
  70. package/dist/execution-sponsored-account.js +222 -0
  71. package/dist/execution-sponsored-definition.d.ts +1713 -0
  72. package/dist/execution-sponsored-definition.js +185 -0
  73. package/dist/execution-sponsored-gas-policy.d.ts +27 -0
  74. package/dist/execution-sponsored-gas-policy.js +110 -0
  75. package/dist/execution-sponsored-hosted.d.ts +3 -0
  76. package/dist/execution-sponsored-hosted.js +71 -0
  77. package/dist/execution-sponsored-index.d.ts +1322 -0
  78. package/dist/execution-sponsored-index.js +102 -0
  79. package/dist/execution-sponsored-mcp-definition.d.ts +1662 -0
  80. package/dist/execution-sponsored-mcp-definition.js +94 -0
  81. package/dist/execution-sponsored-receipt.d.ts +47 -0
  82. package/dist/execution-sponsored-receipt.js +74 -0
  83. package/dist/execution-sponsored-registration.d.ts +14 -0
  84. package/dist/execution-sponsored-registration.js +77 -0
  85. package/dist/execution-sponsored-runtime.d.ts +84 -0
  86. package/dist/execution-sponsored-runtime.js +149 -0
  87. package/dist/execution-sponsored-settlement.d.ts +15 -0
  88. package/dist/execution-sponsored-settlement.js +88 -0
  89. package/dist/execution-sponsored-store.d.ts +67 -0
  90. package/dist/execution-sponsored-store.js +517 -0
  91. package/dist/execution-sponsored-transport.d.ts +90 -0
  92. package/dist/execution-sponsored-transport.js +180 -0
  93. package/dist/execution-tool-definitions.d.ts +21 -21
  94. package/dist/execution-tool-definitions.js +0 -7
  95. package/dist/execution-tools.d.ts +53 -1
  96. package/dist/execution-tools.js +171 -13
  97. package/dist/execution-worker-guard.d.ts +28 -0
  98. package/dist/execution-worker-guard.js +124 -0
  99. package/dist/hybrid-yield-index.d.ts +10 -0
  100. package/dist/hybrid-yield-index.js +11 -0
  101. package/dist/hybrid-yield-markets.d.ts +96 -0
  102. package/dist/hybrid-yield-markets.js +124 -0
  103. package/dist/hybrid-yield.d.ts +411 -0
  104. package/dist/hybrid-yield.js +155 -0
  105. package/dist/hyperliquid-order-builder.js +4 -0
  106. package/dist/lifi-execution-client.d.ts +6 -0
  107. package/dist/lifi-execution-client.js +3 -0
  108. package/dist/lp-userop-account.d.ts +461 -0
  109. package/dist/lp-userop-account.js +417 -0
  110. package/dist/lp-userop-authority.d.ts +49 -0
  111. package/dist/lp-userop-authority.js +211 -0
  112. package/dist/lp-userop-definition.d.ts +233 -0
  113. package/dist/lp-userop-definition.js +85 -0
  114. package/dist/lp-userop-hosted.d.ts +3 -0
  115. package/dist/lp-userop-hosted.js +73 -0
  116. package/dist/lp-userop-index.d.ts +1569 -0
  117. package/dist/lp-userop-index.js +112 -0
  118. package/dist/lp-userop-mcp-definition.d.ts +1220 -0
  119. package/dist/lp-userop-mcp-definition.js +46 -0
  120. package/dist/lp-userop-operation.d.ts +1230 -0
  121. package/dist/lp-userop-operation.js +140 -0
  122. package/dist/lp-userop-registration.d.ts +14 -0
  123. package/dist/lp-userop-registration.js +70 -0
  124. package/dist/lp-userop-settlement.d.ts +89 -0
  125. package/dist/lp-userop-settlement.js +184 -0
  126. package/dist/lp-userop.d.ts +643 -0
  127. package/dist/lp-userop.js +343 -0
  128. package/dist/native-yield-account-definition.d.ts +1192 -0
  129. package/dist/native-yield-account-definition.js +232 -0
  130. package/dist/native-yield-account-gas.d.ts +58 -0
  131. package/dist/native-yield-account-gas.js +228 -0
  132. package/dist/native-yield-account-index.d.ts +23 -0
  133. package/dist/native-yield-account-index.js +28 -0
  134. package/dist/native-yield-account-policy.d.ts +168 -0
  135. package/dist/native-yield-account-policy.js +525 -0
  136. package/dist/native-yield-account-rpc.d.ts +8 -0
  137. package/dist/native-yield-account-rpc.js +128 -0
  138. package/dist/native-yield-account-runtime.d.ts +71 -0
  139. package/dist/native-yield-account-runtime.js +125 -0
  140. package/dist/native-yield-account-store.d.ts +40 -0
  141. package/dist/native-yield-account-store.js +307 -0
  142. package/dist/native-yield-account.d.ts +662 -0
  143. package/dist/native-yield-account.js +371 -0
  144. package/dist/native-yield-consent-store.d.ts +20 -0
  145. package/dist/native-yield-consent-store.js +317 -0
  146. package/dist/native-yield-definition.d.ts +288 -0
  147. package/dist/native-yield-definition.js +105 -0
  148. package/dist/native-yield-reader.d.ts +4 -0
  149. package/dist/native-yield-reader.js +137 -0
  150. package/dist/native-yield-settlement.d.ts +48 -0
  151. package/dist/native-yield-settlement.js +167 -0
  152. package/dist/native-yield-simulation.d.ts +18 -0
  153. package/dist/native-yield-simulation.js +45 -0
  154. package/dist/native-yield-userop-account.d.ts +675 -0
  155. package/dist/native-yield-userop-account.js +357 -0
  156. package/dist/native-yield-userop-authority.d.ts +214 -0
  157. package/dist/native-yield-userop-authority.js +296 -0
  158. package/dist/native-yield-userop-definition.d.ts +331 -0
  159. package/dist/native-yield-userop-definition.js +105 -0
  160. package/dist/native-yield-userop-hosted.d.ts +3 -0
  161. package/dist/native-yield-userop-hosted.js +71 -0
  162. package/dist/native-yield-userop-index.d.ts +1522 -0
  163. package/dist/native-yield-userop-index.js +142 -0
  164. package/dist/native-yield-userop-mcp-definition.d.ts +1356 -0
  165. package/dist/native-yield-userop-mcp-definition.js +50 -0
  166. package/dist/native-yield-userop-operation.d.ts +845 -0
  167. package/dist/native-yield-userop-operation.js +127 -0
  168. package/dist/native-yield-userop-policy.d.ts +23 -0
  169. package/dist/native-yield-userop-policy.js +25 -0
  170. package/dist/native-yield-userop-registration.d.ts +17 -0
  171. package/dist/native-yield-userop-registration.js +76 -0
  172. package/dist/native-yield-userop-settlement.d.ts +8 -0
  173. package/dist/native-yield-userop-settlement.js +79 -0
  174. package/dist/native-yield-userop-simulation.d.ts +18 -0
  175. package/dist/native-yield-userop-simulation.js +34 -0
  176. package/dist/native-yield-userop.d.ts +35 -0
  177. package/dist/native-yield-userop.js +156 -0
  178. package/dist/native-yield-verify.d.ts +30 -0
  179. package/dist/native-yield-verify.js +141 -0
  180. package/dist/native-yield.d.ts +17 -0
  181. package/dist/native-yield.js +119 -0
  182. package/dist/stdio-main.js +0 -0
  183. package/dist/stock-buy-definition.d.ts +338 -0
  184. package/dist/stock-buy-definition.js +127 -0
  185. package/dist/stock-buy-oracle.d.ts +8 -0
  186. package/dist/stock-buy-oracle.js +22 -0
  187. package/dist/stock-buy.d.ts +17 -0
  188. package/dist/stock-buy.js +164 -0
  189. package/dist/tool-definitions.d.ts +3 -1
  190. package/dist/tool-definitions.js +55 -2
  191. package/dist/vendor/lp-v3/lp-v3-atomic-contract.d.ts +445 -0
  192. package/dist/vendor/lp-v3/lp-v3-atomic-contract.js +90 -0
  193. package/dist/vendor/lp-v3/lp-v3-atomic-evidence.d.ts +14 -0
  194. package/dist/vendor/lp-v3/lp-v3-atomic-evidence.js +82 -0
  195. package/dist/vendor/lp-v3/lp-v3-atomic-index.d.ts +80 -0
  196. package/dist/vendor/lp-v3/lp-v3-atomic-index.js +19 -0
  197. package/dist/vendor/lp-v3/lp-v3-atomic-plan.d.ts +43 -0
  198. package/dist/vendor/lp-v3/lp-v3-atomic-plan.js +112 -0
  199. package/dist/vendor/lp-v3/lp-v3-atomic-read-contract.d.ts +312 -0
  200. package/dist/vendor/lp-v3/lp-v3-atomic-read-contract.js +41 -0
  201. package/dist/vendor/lp-v3/lp-v3-atomic-read-index.d.ts +3 -0
  202. package/dist/vendor/lp-v3/lp-v3-atomic-read-index.js +3 -0
  203. package/dist/vendor/lp-v3/lp-v3-atomic-read-rpc.d.ts +49 -0
  204. package/dist/vendor/lp-v3/lp-v3-atomic-read-rpc.js +88 -0
  205. package/dist/vendor/lp-v3/lp-v3-atomic-read.d.ts +17 -0
  206. package/dist/vendor/lp-v3/lp-v3-atomic-read.js +232 -0
  207. package/dist/vendor/lp-v3/lp-v3-atomic-settlement.d.ts +105 -0
  208. package/dist/vendor/lp-v3/lp-v3-atomic-settlement.js +162 -0
  209. package/dist/vendor/lp-v3/lp-v3-collect-protocol-contract.d.ts +606 -0
  210. package/dist/vendor/lp-v3/lp-v3-collect-protocol-contract.js +59 -0
  211. package/dist/vendor/lp-v3/lp-v3-collect-protocol-index.d.ts +168 -0
  212. package/dist/vendor/lp-v3/lp-v3-collect-protocol-index.js +23 -0
  213. package/dist/vendor/lp-v3/lp-v3-collect-protocol-observation.d.ts +32 -0
  214. package/dist/vendor/lp-v3/lp-v3-collect-protocol-observation.js +228 -0
  215. package/dist/vendor/lp-v3/lp-v3-collect-protocol-plan.d.ts +11 -0
  216. package/dist/vendor/lp-v3/lp-v3-collect-protocol-plan.js +91 -0
  217. package/dist/vendor/lp-v3/lp-v3-collect-protocol-reconcile.d.ts +9 -0
  218. package/dist/vendor/lp-v3/lp-v3-collect-protocol-reconcile.js +124 -0
  219. package/dist/vendor/lp-v3/lp-v3-contract.d.ts +538 -0
  220. package/dist/vendor/lp-v3/lp-v3-contract.js +137 -0
  221. package/dist/vendor/lp-v3/lp-v3-evidence.d.ts +25 -0
  222. package/dist/vendor/lp-v3/lp-v3-evidence.js +168 -0
  223. package/dist/vendor/lp-v3/lp-v3-plan.d.ts +22 -0
  224. package/dist/vendor/lp-v3/lp-v3-plan.js +135 -0
  225. package/dist/vendor/lp-v3/types.d.ts +131 -0
  226. package/dist/vendor/lp-v3/types.js +6 -0
  227. package/dist/vendor/lp-v3/v4-math.d.ts +18 -0
  228. package/dist/vendor/lp-v3/v4-math.js +90 -0
  229. package/dist/yield-deposit-definition.d.ts +374 -0
  230. package/dist/yield-deposit-definition.js +123 -0
  231. package/dist/yield-deposit.d.ts +16 -0
  232. package/dist/yield-deposit.js +149 -0
  233. package/dist/yield-route-semantics.d.ts +27 -0
  234. package/dist/yield-route-semantics.js +71 -0
  235. package/dist/yield-withdraw-definition.d.ts +357 -0
  236. package/dist/yield-withdraw-definition.js +90 -0
  237. package/dist/yield-withdraw.d.ts +11 -0
  238. package/dist/yield-withdraw.js +122 -0
  239. package/package.json +239 -7
@@ -0,0 +1,149 @@
1
+ /**
2
+ * `otto_prepare_yield_deposit` — the constructor. See `yield-deposit-definition.ts` for WHY it is a swap.
3
+ *
4
+ * Order of operations, and what each step pins:
5
+ * 1. parse the strict input;
6
+ * 2. the registry row for `executableMarketId` (unknown → refused), the CURRENT commitment over the
7
+ * complete record must equal the caller's (else refused: the READ half served a row this server
8
+ * does not hold), and the row must be Base / USDC / MORPHO (anything else refused by name);
9
+ * 3. ONE LI.FI quote through `quoteSwap` for `USDC → row.vaultAddress` from the signing account —
10
+ * `toToken` is the row's address, never the caller's;
11
+ * 4. deposit parity: the vault's own `previewDeposit(amount)` (read through the runtime's vault reader;
12
+ * absent → refused, nothing prepared) versus the quoted shares, refused past the pinned tolerance;
13
+ * 5. the swap prepareInput with `slippage.minAmountOut` = the quote's floor, then the envelope from
14
+ * THAT quote via `prepareSwapFromQuote` — so the pair is the one `otto_submit_under_delegation`
15
+ * takes verbatim, the intent digest binds the floor, and no second quote can drift under it.
16
+ *
17
+ * Nothing here signs, submits, or touches the delegation; the cap applies at submit, to the approve amount.
18
+ */
19
+ import { getHybridYieldMarket } from './hybrid-yield-markets.js';
20
+ import { describeYieldRoute } from './yield-route-semantics.js';
21
+ import { getAddress } from 'viem';
22
+ import { getExecutableYieldMarket, getExecutableYieldMarketCommitment, } from './executable-yield-markets.js';
23
+ import { refuse } from './execution-errors.js';
24
+ import { PREPARE_SWAP_INPUT_SCHEMA } from './execution-tool-definitions.js';
25
+ import { prepareSwapFromQuote, quoteSwap, } from './execution-tools.js';
26
+ import { PREPARE_YIELD_DEPOSIT_INPUT_SCHEMA, PREPARE_YIELD_DEPOSIT_OUTPUT_SCHEMA, YIELD_DEPOSIT_PARITY_TOLERANCE_BPS, } from './yield-deposit-definition.js';
27
+ /** Steps 2: the registry row, pinned to the caller's commitment and to Base / USDC / MORPHO. */
28
+ export function resolveYieldDepositMarket(input) {
29
+ const market = getExecutableYieldMarket(input.executableMarketId);
30
+ if (!market) {
31
+ return refuse('YIELD_MARKET_UNKNOWN', `${input.executableMarketId} is not an executable yield market on this server`);
32
+ }
33
+ const current = getExecutableYieldMarketCommitment(market);
34
+ if (current !== input.registryCommitment) {
35
+ return refuse('YIELD_REGISTRY_MISMATCH', `the registry commitment presented for ${market.id} is not the current record's; re-read the market and prepare again`);
36
+ }
37
+ if (market.chainId !== 8453) {
38
+ return refuse('YIELD_MARKET_UNKNOWN', `${market.id} is not on Base mainnet (8453)`);
39
+ }
40
+ if (market.asset.symbol !== 'USDC') {
41
+ return refuse('YIELD_MARKET_UNKNOWN', `${market.id} is not a USDC market`);
42
+ }
43
+ if (market.protocol !== 'MORPHO') {
44
+ return refuse('YIELD_MARKET_UNKNOWN', `${market.id} is not an ERC-4626 Morpho vault; only Morpho markets deposit as a share-token route`);
45
+ }
46
+ return market;
47
+ }
48
+ /**
49
+ * Step 4, as a pure function: the shortfall of the quoted shares against the vault's own preview, in
50
+ * basis points of the preview (0 when the route quotes at or above the preview). Refuses past the
51
+ * pinned tolerance.
52
+ */
53
+ export function assertDepositParity(previewShares, quotedShares) {
54
+ if (previewShares <= 0n) {
55
+ return refuse('YIELD_PREVIEW_UNAVAILABLE', 'the vault previews zero shares for this deposit');
56
+ }
57
+ if (quotedShares >= previewShares)
58
+ return 0;
59
+ const shortfallBps = Number(((previewShares - quotedShares) * 10000n) / previewShares);
60
+ // EXACT, by cross-multiplication (codex gate r1 LOW): the floored bps above is for the preview only; a
61
+ // shortfall of 30.99 bps floors to 30 and must still be refused.
62
+ if ((previewShares - quotedShares) * 10000n > previewShares * BigInt(YIELD_DEPOSIT_PARITY_TOLERANCE_BPS)) {
63
+ return refuse('YIELD_DEPOSIT_PARITY', `the route quotes ${shortfallBps} bps fewer shares than the vault's own previewDeposit (tolerance ${YIELD_DEPOSIT_PARITY_TOLERANCE_BPS} bps); the deposit is not prepared`);
64
+ }
65
+ return shortfallBps;
66
+ }
67
+ /** The fee lines LI.FI attached, as it names them — read for the preview; nothing is derived from them. */
68
+ function quotedFeeLines(quote) {
69
+ const estimate = quote.estimate;
70
+ const lines = Array.isArray(estimate.feeCosts) ? estimate.feeCosts : [];
71
+ return lines.flatMap((line) => {
72
+ const l = line;
73
+ return typeof l.name === 'string' && typeof l.amountUSD === 'string'
74
+ ? [{ name: l.name, amount_usd: l.amountUSD }]
75
+ : [];
76
+ });
77
+ }
78
+ function quotedGasUsd(quote) {
79
+ const estimate = quote.estimate;
80
+ const first = Array.isArray(estimate.gasCosts) ? estimate.gasCosts[0] : undefined;
81
+ return typeof first?.amountUSD === 'string' ? first.amountUSD : undefined;
82
+ }
83
+ export async function prepareYieldDeposit(runtime, rawInput, signal) {
84
+ const input = PREPARE_YIELD_DEPOSIT_INPUT_SCHEMA.parse(rawInput);
85
+ const market = resolveYieldDepositMarket(input);
86
+ // Preparation-only curation gate. Shared identity resolution remains usable for
87
+ // withdrawal; existing signed/submitted artifacts keep their reconciliation path.
88
+ if (getHybridYieldMarket(market.id)?.curation.status === 'legacy-exit-only') {
89
+ return refuse('YIELD_DEPOSIT_UNAVAILABLE', 'This legacy vault is retained for withdrawals; choose a current market for a new deposit');
90
+ }
91
+ const reader = runtime.yieldVaultReader;
92
+ if (!reader) {
93
+ return refuse('YIELD_PREVIEW_UNAVAILABLE', 'this server has no vault reader, so deposit parity cannot be checked; nothing is prepared');
94
+ }
95
+ const vault = getAddress(market.vaultAddress);
96
+ const asset = getAddress(market.asset.address);
97
+ const amount = BigInt(input.amount);
98
+ // 3. The swap request, toToken PINNED to the registry vault. Quoted once.
99
+ const quoteInput = PREPARE_SWAP_INPUT_SCHEMA.parse({
100
+ accountProfile: input.accountProfile,
101
+ chainId: market.chainId,
102
+ fromToken: asset,
103
+ toToken: vault,
104
+ fromAmount: input.amount,
105
+ slippage: { maxBps: input.slippage.maxBps },
106
+ ...(input.client_ref ? { client_ref: input.client_ref } : {}),
107
+ });
108
+ const quote = await quoteSwap(runtime, quoteInput, signal);
109
+ const expectedShares = BigInt(quote.estimate.toAmount);
110
+ const minShares = BigInt(quote.estimate.toAmountMin);
111
+ // 4. Parity against the vault's own rate.
112
+ let previewShares;
113
+ try {
114
+ previewShares = await reader.previewDeposit(vault, amount);
115
+ }
116
+ catch {
117
+ return refuse('YIELD_PREVIEW_UNAVAILABLE', "the vault's previewDeposit could not be read, so deposit parity cannot be checked; nothing is prepared");
118
+ }
119
+ const shortfallBps = assertDepositParity(previewShares, expectedShares);
120
+ // 5. The pair: the floor goes INTO prepareInput before the envelope is built, so the intent digest binds it.
121
+ const prepareInput = PREPARE_SWAP_INPUT_SCHEMA.parse({
122
+ ...quoteInput,
123
+ slippage: { maxBps: input.slippage.maxBps, minAmountOut: minShares.toString() },
124
+ });
125
+ const envelope = prepareSwapFromQuote(runtime, prepareInput, quote);
126
+ return PREPARE_YIELD_DEPOSIT_OUTPUT_SCHEMA.parse({
127
+ envelope,
128
+ prepareInput,
129
+ preview: {
130
+ route_semantics: describeYieldRoute(quote, 'deposit', vault, market.chainId),
131
+ market_id: market.id,
132
+ venue: market.venue,
133
+ protocol: 'MORPHO',
134
+ chain_id: 8453,
135
+ vault,
136
+ asset,
137
+ amount: amount.toString(),
138
+ expected_shares: expectedShares.toString(),
139
+ min_shares: minShares.toString(),
140
+ preview_deposit_shares: previewShares.toString(),
141
+ parity_shortfall_bps: shortfallBps,
142
+ parity_tolerance_bps: YIELD_DEPOSIT_PARITY_TOLERANCE_BPS,
143
+ quoted_fees: quotedFeeLines(quote),
144
+ ...(quotedGasUsd(quote) !== undefined ? { quoted_gas_usd: quotedGasUsd(quote) } : {}),
145
+ },
146
+ registry_commitment: input.registryCommitment,
147
+ });
148
+ }
149
+ //# sourceMappingURL=yield-deposit.js.map
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Presentation evidence about a routed position trade. Provider step labels are
3
+ * declarations, not proof of protocol mint/burn. Settlement must establish that.
4
+ * This module never authorizes a target, spender, fee or destination call.
5
+ */
6
+ import { z } from 'zod';
7
+ import type { LiFiQuote } from './lifi-execution-client.js';
8
+ export declare const YIELD_ROUTE_SEMANTICS_SCHEMA: z.ZodObject<{
9
+ transport: z.ZodLiteral<"lifi">;
10
+ action: z.ZodEnum<{
11
+ deposit: "deposit";
12
+ withdraw: "withdraw";
13
+ }>;
14
+ classification: z.ZodEnum<{
15
+ "share-purchase": "share-purchase";
16
+ "share-sale": "share-sale";
17
+ "protocol-composition": "protocol-composition";
18
+ mixed: "mixed";
19
+ unclassified: "unclassified";
20
+ }>;
21
+ evidence: z.ZodLiteral<"provider-quote-steps">;
22
+ protocol_action_verified: z.ZodLiteral<false>;
23
+ tools: z.ZodArray<z.ZodString>;
24
+ }, z.core.$strict>;
25
+ export type YieldRouteSemantics = z.infer<typeof YIELD_ROUTE_SEMANTICS_SCHEMA>;
26
+ /** Inspect terminal position-changing steps, bounded and matched to exact position token/chain. */
27
+ export declare function describeYieldRoute(quote: LiFiQuote, action: 'deposit' | 'withdraw', positionToken: string, chainId: number): YieldRouteSemantics;
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Presentation evidence about a routed position trade. Provider step labels are
3
+ * declarations, not proof of protocol mint/burn. Settlement must establish that.
4
+ * This module never authorizes a target, spender, fee or destination call.
5
+ */
6
+ import { z } from 'zod';
7
+ export const YIELD_ROUTE_SEMANTICS_SCHEMA = z.object({
8
+ transport: z.literal('lifi'),
9
+ action: z.enum(['deposit', 'withdraw']),
10
+ classification: z.enum(['share-purchase', 'share-sale', 'protocol-composition', 'mixed', 'unclassified']),
11
+ evidence: z.literal('provider-quote-steps'),
12
+ protocol_action_verified: z.literal(false),
13
+ tools: z.array(z.string()),
14
+ }).strict();
15
+ function object(value) {
16
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
17
+ ? value : null;
18
+ }
19
+ /** Inspect terminal position-changing steps, bounded and matched to exact position token/chain. */
20
+ export function describeYieldRoute(quote, action, positionToken, chainId) {
21
+ const kinds = new Set();
22
+ const tools = new Set();
23
+ let unknown = false;
24
+ let count = 0;
25
+ const visit = (steps, depth) => {
26
+ if (!Array.isArray(steps) || depth > 4) {
27
+ unknown = true;
28
+ return;
29
+ }
30
+ for (const raw of steps) {
31
+ if (++count > 64) {
32
+ unknown = true;
33
+ return;
34
+ }
35
+ const step = object(raw);
36
+ if (!step) {
37
+ unknown = true;
38
+ continue;
39
+ }
40
+ if (step.type === 'fee')
41
+ continue;
42
+ if (Array.isArray(step.includedSteps) && step.includedSteps.length > 0) {
43
+ visit(step.includedSteps, depth + 1);
44
+ continue;
45
+ }
46
+ const a = object(step.action);
47
+ const token = object(action === 'deposit' ? a?.toToken : a?.fromToken);
48
+ const chain = action === 'deposit' ? a?.toChainId : a?.fromChainId;
49
+ if (typeof token?.address !== 'string' ||
50
+ token.address.toLowerCase() !== positionToken.toLowerCase() || chain !== chainId)
51
+ continue;
52
+ if (step.type !== 'swap' && step.type !== 'protocol') {
53
+ unknown = true;
54
+ continue;
55
+ }
56
+ kinds.add(step.type);
57
+ if (typeof step.tool === 'string' && /^[a-zA-Z0-9._-]{1,64}$/.test(step.tool))
58
+ tools.add(step.tool);
59
+ }
60
+ };
61
+ visit(quote.includedSteps, 0);
62
+ const classification = unknown || kinds.size === 0 ? 'unclassified'
63
+ : kinds.size > 1 ? 'mixed'
64
+ : kinds.has('protocol') ? 'protocol-composition'
65
+ : action === 'deposit' ? 'share-purchase' : 'share-sale';
66
+ return YIELD_ROUTE_SEMANTICS_SCHEMA.parse({
67
+ transport: 'lifi', action, classification, evidence: 'provider-quote-steps',
68
+ protocol_action_verified: false, tools: [...tools].sort(),
69
+ });
70
+ }
71
+ //# sourceMappingURL=yield-route-semantics.js.map
@@ -0,0 +1,357 @@
1
+ /**
2
+ * `otto_prepare_yield_withdraw` — the twin of `otto_prepare_yield_deposit` (Founder word `fence v2`,
3
+ * 2026-09-03): a delegated Yield Copilot WITHDRAW as a `otto_prepare_swap` pair whose INPUT token is the
4
+ * registry vault's share token and whose OUTPUT token is USDC, delivered to the signing account.
5
+ *
6
+ * WHY A SWAP. LI.FI routes `shares → USDC` through the diamond as a "composer" (zap-out) leg behind the same
7
+ * fenced GenericSwapV3 entry point, at redeem parity: on live quotes (2026-09-03) 0.5 gtUSDCp → 553,533 USDC
8
+ * units = the vault's own `previewRedeem` minus LI.FI's 0.25% fixed fee. The pair is submittable through
9
+ * the unchanged `otto_submit_under_delegation` path ONLY under fence v2 (the share-token approve rule) and
10
+ * ONLY for a permission minted under cap ruleset v2; the send gate values a withdraw at zero against the
11
+ * person's cap (it returns their own assets to them) and bounds it by the engine's share cap instead.
12
+ *
13
+ * WHAT THIS TOOL PINS: the input token is the registry row's `vaultAddress`, the output token is the row's
14
+ * asset (USDC), both never caller inputs; the row is the CURRENT registry record (commitment recomputed);
15
+ * REDEEM PARITY — the quoted USDC may not fall below the vault's own `previewRedeem(shares)` by more than
16
+ * `YIELD_WITHDRAW_PARITY_TOLERANCE_BPS`.
17
+ */
18
+ import { z } from 'zod';
19
+ import type { Address } from 'viem';
20
+ export declare const YIELD_WITHDRAW_TOOL_NAME: "otto_prepare_yield_withdraw";
21
+ /**
22
+ * 🔴 PINNED REDEEM-PARITY TOLERANCE, in bps of the vault's own `previewRedeem(shares)`. Same derivation as the
23
+ * deposit's: LI.FI's fixed fee-collection leg takes 0.25% of the INPUT (here: shares) before the zap-out
24
+ * (25 bps) + rounding headroom (5 bps) = 30 bps. `slippage.maxBps` bounds the on-chain floor, not this.
25
+ * A test pins this value; widening it must redden that test.
26
+ */
27
+ export declare const YIELD_WITHDRAW_PARITY_TOLERANCE_BPS: 30;
28
+ export declare const PREPARE_YIELD_WITHDRAW_INPUT_SCHEMA: z.ZodObject<{
29
+ accountProfile: z.ZodObject<{
30
+ kind: z.ZodEnum<{
31
+ eoa: "eoa";
32
+ safe: "safe";
33
+ }>;
34
+ address: z.ZodString;
35
+ chainId: z.ZodNumber;
36
+ }, z.core.$strict>;
37
+ executableMarketId: z.ZodString;
38
+ registryCommitment: z.ZodString;
39
+ shares: z.ZodString;
40
+ slippage: z.ZodObject<{
41
+ maxBps: z.ZodNumber;
42
+ }, z.core.$strict>;
43
+ client_ref: z.ZodOptional<z.ZodString>;
44
+ }, z.core.$strict>;
45
+ export type PrepareYieldWithdrawInput = z.infer<typeof PREPARE_YIELD_WITHDRAW_INPUT_SCHEMA>;
46
+ export declare const YIELD_WITHDRAW_PREVIEW_SCHEMA: z.ZodObject<{
47
+ market_id: z.ZodString;
48
+ venue: z.ZodString;
49
+ protocol: z.ZodLiteral<"MORPHO">;
50
+ chain_id: z.ZodLiteral<8453>;
51
+ vault: z.ZodString;
52
+ asset: z.ZodString;
53
+ shares: z.ZodString;
54
+ expected_assets: z.ZodString;
55
+ min_assets: z.ZodString;
56
+ preview_redeem_assets: z.ZodString;
57
+ parity_shortfall_bps: z.ZodNumber;
58
+ parity_tolerance_bps: z.ZodLiteral<30>;
59
+ quoted_fees: z.ZodArray<z.ZodObject<{
60
+ name: z.ZodString;
61
+ amount_usd: z.ZodString;
62
+ }, z.core.$strict>>;
63
+ quoted_gas_usd: z.ZodOptional<z.ZodString>;
64
+ route_semantics: z.ZodObject<{
65
+ transport: z.ZodLiteral<"lifi">;
66
+ action: z.ZodEnum<{
67
+ deposit: "deposit";
68
+ withdraw: "withdraw";
69
+ }>;
70
+ classification: z.ZodEnum<{
71
+ "share-purchase": "share-purchase";
72
+ "share-sale": "share-sale";
73
+ "protocol-composition": "protocol-composition";
74
+ mixed: "mixed";
75
+ unclassified: "unclassified";
76
+ }>;
77
+ evidence: z.ZodLiteral<"provider-quote-steps">;
78
+ protocol_action_verified: z.ZodLiteral<false>;
79
+ tools: z.ZodArray<z.ZodString>;
80
+ }, z.core.$strict>;
81
+ }, z.core.$strict>;
82
+ export declare const PREPARE_YIELD_WITHDRAW_OUTPUT_SCHEMA: z.ZodObject<{
83
+ envelope: z.ZodObject<{
84
+ schema_version: z.ZodLiteral<"1">;
85
+ artifact_id: z.ZodString;
86
+ rail: z.ZodLiteral<"lifi">;
87
+ operation: z.ZodLiteral<"swap">;
88
+ intent_digest: z.ZodString;
89
+ account_binding: z.ZodObject<{
90
+ kind: z.ZodEnum<{
91
+ eoa: "eoa";
92
+ safe: "safe";
93
+ }>;
94
+ address: z.ZodString;
95
+ chainId: z.ZodNumber;
96
+ protocol_roles: z.ZodObject<{
97
+ lifi: z.ZodObject<{
98
+ sender: z.ZodString;
99
+ receiver: z.ZodString;
100
+ }, z.core.$strict>;
101
+ }, z.core.$strict>;
102
+ }, z.core.$strict>;
103
+ required_capabilities: z.ZodArray<z.ZodEnum<{
104
+ send_evm_transaction: "send_evm_transaction";
105
+ submit_evm_batch: "submit_evm_batch";
106
+ }>>;
107
+ payload: z.ZodDiscriminatedUnion<[z.ZodObject<{
108
+ kind: z.ZodLiteral<"evm_execution_plan">;
109
+ chain_id: z.ZodNumber;
110
+ steps: z.ZodArray<z.ZodObject<{
111
+ to: z.ZodString;
112
+ value: z.ZodString;
113
+ data: z.ZodString;
114
+ kind: z.ZodEnum<{
115
+ approve: "approve";
116
+ approve_reset: "approve_reset";
117
+ call: "call";
118
+ }>;
119
+ }, z.core.$strict>>;
120
+ }, z.core.$strict>], "kind">;
121
+ fee_attribution: z.ZodObject<{
122
+ mechanism: z.ZodLiteral<"lifi_integrator_fee">;
123
+ config_version: z.ZodString;
124
+ }, z.core.$strict>;
125
+ replay_disclosure: z.ZodObject<{
126
+ artifact_role: z.ZodLiteral<"construction_aid">;
127
+ freshness_boundary: z.ZodLiteral<"valid_until">;
128
+ onchain_replay_boundary: z.ZodLiteral<"signer_account_nonce">;
129
+ tool_guarantees_single_execution: z.ZodLiteral<false>;
130
+ }, z.core.$strict>;
131
+ assertions: z.ZodArray<z.ZodObject<{
132
+ id: z.ZodString;
133
+ result: z.ZodLiteral<"passed">;
134
+ }, z.core.$strict>>;
135
+ valid_until: z.ZodString;
136
+ submission: z.ZodObject<{
137
+ method: z.ZodEnum<{
138
+ send_evm_transaction: "send_evm_transaction";
139
+ submit_evm_batch: "submit_evm_batch";
140
+ }>;
141
+ chain_id: z.ZodNumber;
142
+ artifact_id: z.ZodString;
143
+ payload_digest: z.ZodString;
144
+ artifact_digest: z.ZodString;
145
+ adapter_owned_fields: z.ZodTuple<[z.ZodLiteral<"nonce">, z.ZodLiteral<"gas">, z.ZodLiteral<"serialization">], null>;
146
+ client_ref: z.ZodOptional<z.ZodString>;
147
+ }, z.core.$strict>;
148
+ }, z.core.$strict>;
149
+ prepareInput: z.ZodObject<{
150
+ accountProfile: z.ZodObject<{
151
+ kind: z.ZodEnum<{
152
+ eoa: "eoa";
153
+ safe: "safe";
154
+ }>;
155
+ address: z.ZodString;
156
+ chainId: z.ZodNumber;
157
+ }, z.core.$strict>;
158
+ chainId: z.ZodNumber;
159
+ fromToken: z.ZodString;
160
+ toToken: z.ZodString;
161
+ fromAmount: z.ZodString;
162
+ slippage: z.ZodObject<{
163
+ maxBps: z.ZodNumber;
164
+ minAmountOut: z.ZodOptional<z.ZodString>;
165
+ }, z.core.$strict>;
166
+ client_ref: z.ZodOptional<z.ZodString>;
167
+ }, z.core.$strict>;
168
+ preview: z.ZodObject<{
169
+ market_id: z.ZodString;
170
+ venue: z.ZodString;
171
+ protocol: z.ZodLiteral<"MORPHO">;
172
+ chain_id: z.ZodLiteral<8453>;
173
+ vault: z.ZodString;
174
+ asset: z.ZodString;
175
+ shares: z.ZodString;
176
+ expected_assets: z.ZodString;
177
+ min_assets: z.ZodString;
178
+ preview_redeem_assets: z.ZodString;
179
+ parity_shortfall_bps: z.ZodNumber;
180
+ parity_tolerance_bps: z.ZodLiteral<30>;
181
+ quoted_fees: z.ZodArray<z.ZodObject<{
182
+ name: z.ZodString;
183
+ amount_usd: z.ZodString;
184
+ }, z.core.$strict>>;
185
+ quoted_gas_usd: z.ZodOptional<z.ZodString>;
186
+ route_semantics: z.ZodObject<{
187
+ transport: z.ZodLiteral<"lifi">;
188
+ action: z.ZodEnum<{
189
+ deposit: "deposit";
190
+ withdraw: "withdraw";
191
+ }>;
192
+ classification: z.ZodEnum<{
193
+ "share-purchase": "share-purchase";
194
+ "share-sale": "share-sale";
195
+ "protocol-composition": "protocol-composition";
196
+ mixed: "mixed";
197
+ unclassified: "unclassified";
198
+ }>;
199
+ evidence: z.ZodLiteral<"provider-quote-steps">;
200
+ protocol_action_verified: z.ZodLiteral<false>;
201
+ tools: z.ZodArray<z.ZodString>;
202
+ }, z.core.$strict>;
203
+ }, z.core.$strict>;
204
+ registry_commitment: z.ZodString;
205
+ }, z.core.$strict>;
206
+ export type PrepareYieldWithdrawOutput = z.infer<typeof PREPARE_YIELD_WITHDRAW_OUTPUT_SCHEMA>;
207
+ /** The vault reads both yield constructors need; production runs them over the delegation rig's public client. */
208
+ export interface YieldVaultReader {
209
+ previewDeposit(vault: Address, assets: bigint): Promise<bigint>;
210
+ previewRedeem(vault: Address, shares: bigint): Promise<bigint>;
211
+ }
212
+ export declare const YIELD_WITHDRAW_TOOL_DEFINITION: Readonly<{
213
+ name: "otto_prepare_yield_withdraw";
214
+ title: "Prepare a Yield Copilot vault withdraw (Morpho USDC on Base) as a delegable swap pair";
215
+ description: "Prepare the EXACT otto_prepare_swap pair (envelope + prepareInput) that redeems vault shares from one of the executable Morpho vaults in the Yield Copilot registry back to USDC in the signing account, as a LI.FI exit route (which may sell shares or compose a protocol redemption) whose input token is the vault's ERC-4626 share token. The vault and the asset come from the registry row named by executableMarketId and are never inputs; the caller's registryCommitment must equal the commitment recomputed over the current record. The quoted USDC is checked against the vault's own previewRedeem and refused when it falls short by more than the pinned tolerance. Returns the pair unchanged plus a preview; never signs or submits — submit the pair through otto_submit_under_delegation, which admits a withdraw only under fence v2 and a permission minted under cap ruleset v2, values it at zero against the per-swap cap (it returns the person's own assets), and bounds it by the engine's share cap.";
216
+ inputSchema: z.ZodObject<{
217
+ accountProfile: z.ZodObject<{
218
+ kind: z.ZodEnum<{
219
+ eoa: "eoa";
220
+ safe: "safe";
221
+ }>;
222
+ address: z.ZodString;
223
+ chainId: z.ZodNumber;
224
+ }, z.core.$strict>;
225
+ executableMarketId: z.ZodString;
226
+ registryCommitment: z.ZodString;
227
+ shares: z.ZodString;
228
+ slippage: z.ZodObject<{
229
+ maxBps: z.ZodNumber;
230
+ }, z.core.$strict>;
231
+ client_ref: z.ZodOptional<z.ZodString>;
232
+ }, z.core.$strict>;
233
+ outputSchema: z.ZodObject<{
234
+ envelope: z.ZodObject<{
235
+ schema_version: z.ZodLiteral<"1">;
236
+ artifact_id: z.ZodString;
237
+ rail: z.ZodLiteral<"lifi">;
238
+ operation: z.ZodLiteral<"swap">;
239
+ intent_digest: z.ZodString;
240
+ account_binding: z.ZodObject<{
241
+ kind: z.ZodEnum<{
242
+ eoa: "eoa";
243
+ safe: "safe";
244
+ }>;
245
+ address: z.ZodString;
246
+ chainId: z.ZodNumber;
247
+ protocol_roles: z.ZodObject<{
248
+ lifi: z.ZodObject<{
249
+ sender: z.ZodString;
250
+ receiver: z.ZodString;
251
+ }, z.core.$strict>;
252
+ }, z.core.$strict>;
253
+ }, z.core.$strict>;
254
+ required_capabilities: z.ZodArray<z.ZodEnum<{
255
+ send_evm_transaction: "send_evm_transaction";
256
+ submit_evm_batch: "submit_evm_batch";
257
+ }>>;
258
+ payload: z.ZodDiscriminatedUnion<[z.ZodObject<{
259
+ kind: z.ZodLiteral<"evm_execution_plan">;
260
+ chain_id: z.ZodNumber;
261
+ steps: z.ZodArray<z.ZodObject<{
262
+ to: z.ZodString;
263
+ value: z.ZodString;
264
+ data: z.ZodString;
265
+ kind: z.ZodEnum<{
266
+ approve: "approve";
267
+ approve_reset: "approve_reset";
268
+ call: "call";
269
+ }>;
270
+ }, z.core.$strict>>;
271
+ }, z.core.$strict>], "kind">;
272
+ fee_attribution: z.ZodObject<{
273
+ mechanism: z.ZodLiteral<"lifi_integrator_fee">;
274
+ config_version: z.ZodString;
275
+ }, z.core.$strict>;
276
+ replay_disclosure: z.ZodObject<{
277
+ artifact_role: z.ZodLiteral<"construction_aid">;
278
+ freshness_boundary: z.ZodLiteral<"valid_until">;
279
+ onchain_replay_boundary: z.ZodLiteral<"signer_account_nonce">;
280
+ tool_guarantees_single_execution: z.ZodLiteral<false>;
281
+ }, z.core.$strict>;
282
+ assertions: z.ZodArray<z.ZodObject<{
283
+ id: z.ZodString;
284
+ result: z.ZodLiteral<"passed">;
285
+ }, z.core.$strict>>;
286
+ valid_until: z.ZodString;
287
+ submission: z.ZodObject<{
288
+ method: z.ZodEnum<{
289
+ send_evm_transaction: "send_evm_transaction";
290
+ submit_evm_batch: "submit_evm_batch";
291
+ }>;
292
+ chain_id: z.ZodNumber;
293
+ artifact_id: z.ZodString;
294
+ payload_digest: z.ZodString;
295
+ artifact_digest: z.ZodString;
296
+ adapter_owned_fields: z.ZodTuple<[z.ZodLiteral<"nonce">, z.ZodLiteral<"gas">, z.ZodLiteral<"serialization">], null>;
297
+ client_ref: z.ZodOptional<z.ZodString>;
298
+ }, z.core.$strict>;
299
+ }, z.core.$strict>;
300
+ prepareInput: z.ZodObject<{
301
+ accountProfile: z.ZodObject<{
302
+ kind: z.ZodEnum<{
303
+ eoa: "eoa";
304
+ safe: "safe";
305
+ }>;
306
+ address: z.ZodString;
307
+ chainId: z.ZodNumber;
308
+ }, z.core.$strict>;
309
+ chainId: z.ZodNumber;
310
+ fromToken: z.ZodString;
311
+ toToken: z.ZodString;
312
+ fromAmount: z.ZodString;
313
+ slippage: z.ZodObject<{
314
+ maxBps: z.ZodNumber;
315
+ minAmountOut: z.ZodOptional<z.ZodString>;
316
+ }, z.core.$strict>;
317
+ client_ref: z.ZodOptional<z.ZodString>;
318
+ }, z.core.$strict>;
319
+ preview: z.ZodObject<{
320
+ market_id: z.ZodString;
321
+ venue: z.ZodString;
322
+ protocol: z.ZodLiteral<"MORPHO">;
323
+ chain_id: z.ZodLiteral<8453>;
324
+ vault: z.ZodString;
325
+ asset: z.ZodString;
326
+ shares: z.ZodString;
327
+ expected_assets: z.ZodString;
328
+ min_assets: z.ZodString;
329
+ preview_redeem_assets: z.ZodString;
330
+ parity_shortfall_bps: z.ZodNumber;
331
+ parity_tolerance_bps: z.ZodLiteral<30>;
332
+ quoted_fees: z.ZodArray<z.ZodObject<{
333
+ name: z.ZodString;
334
+ amount_usd: z.ZodString;
335
+ }, z.core.$strict>>;
336
+ quoted_gas_usd: z.ZodOptional<z.ZodString>;
337
+ route_semantics: z.ZodObject<{
338
+ transport: z.ZodLiteral<"lifi">;
339
+ action: z.ZodEnum<{
340
+ deposit: "deposit";
341
+ withdraw: "withdraw";
342
+ }>;
343
+ classification: z.ZodEnum<{
344
+ "share-purchase": "share-purchase";
345
+ "share-sale": "share-sale";
346
+ "protocol-composition": "protocol-composition";
347
+ mixed: "mixed";
348
+ unclassified: "unclassified";
349
+ }>;
350
+ evidence: z.ZodLiteral<"provider-quote-steps">;
351
+ protocol_action_verified: z.ZodLiteral<false>;
352
+ tools: z.ZodArray<z.ZodString>;
353
+ }, z.core.$strict>;
354
+ }, z.core.$strict>;
355
+ registry_commitment: z.ZodString;
356
+ }, z.core.$strict>;
357
+ }>;