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,185 @@
1
+ import { ACCOUNT_GAS_FAILURE_SCHEMA } from './execution-account-gas-view.js';
2
+ import { ACCOUNT_GAS_REVIEW_SCHEMA } from './execution-account-gas-review.js';
3
+ import { SPONSORED_LP_USEROP_POLICY_RELATION_SCHEMA } from './account-userop-policy-definition.js';
4
+ import { createHash } from 'node:crypto';
5
+ import { encodeFunctionData, getAddress, parseAbi } from 'viem';
6
+ import { z } from 'zod';
7
+ import { EXECUTION_ARTIFACT_SCHEMA } from './execution-index.js';
8
+ import { defaultAdapterPolicy, verifySwapEnvelope } from './adapter/verify.js';
9
+ export const SPONSORED_CHAIN_SCHEMA = z.union([z.literal(1), z.literal(8453), z.literal(42161), z.literal(10), z.literal(137)]);
10
+ const address = z.string().regex(/^0x[0-9a-fA-F]{40}$/).transform((value, context) => {
11
+ try {
12
+ return getAddress(value);
13
+ }
14
+ catch {
15
+ context.addIssue({ code: 'custom', message: 'Invalid account address' });
16
+ return z.NEVER;
17
+ }
18
+ });
19
+ const erc20OutputAddress = address.refine(value => ![
20
+ '0x0000000000000000000000000000000000000000',
21
+ '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
22
+ ].includes(value.toLowerCase()), 'Sponsored swaps require ERC20 output; native currency output is unsupported');
23
+ const hash = z.string().regex(/^0x[0-9a-fA-F]{64}$/);
24
+ const digest = z.string().regex(/^[0-9a-f]{64}$/);
25
+ const atomic = z.string().regex(/^(0|[1-9][0-9]*)$/).refine(v => /^(0|[1-9][0-9]*)$/.test(v) && BigInt(v) < 2n ** 256n);
26
+ const positiveAtomic = atomic.refine(v => /^(0|[1-9][0-9]*)$/.test(v) && BigInt(v) > 0n);
27
+ const time = z.number().int().positive().safe();
28
+ export const SPONSORED_USDC = Object.freeze({
29
+ 1: getAddress('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'),
30
+ 8453: getAddress('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'),
31
+ 42161: getAddress('0xaf88d065e77c8cC2239327C5EDb3A432268e5831'),
32
+ 10: getAddress('0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85'),
33
+ 137: getAddress('0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359'),
34
+ });
35
+ /** Source-reviewed same-address account profile; ownership is derived from the authenticated account. */
36
+ export const SPONSORED_NATIVE_USEROP_PROFILE_SCHEMA = z.object({
37
+ implementation: address, implementationCodeHash: hash,
38
+ delegateBatchAbi: z.literal('coinbase-executeBatch-v1'), delegateBatchReviewDigest: digest,
39
+ entryPointVersion: z.literal('0.6'),
40
+ ownerProfile: z.object({ kind: z.literal('sole-eoa-owner'), nextOwnerIndex: z.literal('1'),
41
+ ownerCount: z.literal('1'), requireAccountAsOwner: z.literal(true), spendPermissionsEnabled: z.literal(false) }).strict(),
42
+ }).strict();
43
+ export const SPONSORED_NATIVE_USEROP_POLICY_RELATION_SCHEMA = z.object({
44
+ nativeActivationCommitment: z.string().regex(/^sha256:[0-9a-f]{64}$/),
45
+ nativeRulesDigest: digest, compiledFullPolicyDigest: digest, relationReviewEvidenceDigest: digest,
46
+ compiler: z.literal('legacy-v2-native-enduser-userop-v1'),
47
+ }).strict();
48
+ export const SPONSORED_CHAIN_TERMS_SCHEMA = z.object({
49
+ chainId: SPONSORED_CHAIN_SCHEMA,
50
+ delegate: address, delegateCodeHash: hash,
51
+ nativeYieldUserOpProfile: SPONSORED_NATIVE_USEROP_PROFILE_SCHEMA.optional(),
52
+ entryPoint: address, entryPointCodeHash: hash,
53
+ paymaster: address, paymasterCodeHash: hash,
54
+ /** Reviewed standard ERC20 semantics are required for transfer-event settlement. */
55
+ reviewedOutputTokens: z.array(z.object({ address: erc20OutputAddress, codeHash: hash,
56
+ reviewEvidenceDigest: digest }).strict()).min(1).max(32)
57
+ .refine(tokens => new Set(tokens.map(token => token.address)).size === tokens.length),
58
+ sponsorshipPolicyId: z.string().regex(/^[a-zA-Z0-9_-]{1,128}$/),
59
+ /** Source-reviewed feed for advisory gas-price display; the provider enforces the USD subsidy cap. */
60
+ nativeGasUsdFeed: z.object({ address, decimals: z.number().int().min(0).max(18),
61
+ maxAgeSeconds: z.number().int().min(1).max(86400) }).strict().optional(),
62
+ maxGasCostWei: positiveAtomic, maxTotalGasCostWei: positiveAtomic, maxUserGasCostWei: positiveAtomic,
63
+ }).strict().refine(v => BigInt(v.maxGasCostWei) <= BigInt(v.maxUserGasCostWei) &&
64
+ BigInt(v.maxUserGasCostWei) <= BigInt(v.maxTotalGasCostWei), 'Sponsorship budgets must contain the per-operation reservation');
65
+ export const SPONSORED_ACTIVATION_SCHEMA = z.object({
66
+ version: z.literal(1), id: z.string().regex(/^[a-zA-Z0-9_-]{8,100}$/),
67
+ mode: z.enum(['enabled', 'recovery-only']),
68
+ projectId: z.string().uuid(), policyId: z.string().min(1).max(200), policyName: z.string().min(1).max(50),
69
+ policyRulesDigest: digest,
70
+ /** Exact reviewed evidence for the end-user UserOp policy and provider's global/per-user/per-op limits. */
71
+ providerEnforcementEvidenceDigest: digest,
72
+ nativeYieldUserOpPolicyRelation: SPONSORED_NATIVE_USEROP_POLICY_RELATION_SCHEMA.optional(),
73
+ lpUserOpPolicyRelation: SPONSORED_LP_USEROP_POLICY_RELATION_SCHEMA.optional(),
74
+ approvedAtMs: time, expiresAtMs: time,
75
+ maxSwapUsdc: z.number().int().min(1).max(5000),
76
+ /** Enables explicit payer reviews with estimated user-paid gas; no new wallet authority. */
77
+ gasPaymentReviewEnabled: z.literal(true).optional(),
78
+ /** A balance snapshot admits only these designated test accounts; it is not a guaranteed fee cap. */
79
+ userPaidGasPilot: z.array(z.object({ account: address, chainId: SPONSORED_CHAIN_SCHEMA,
80
+ maximumObservedExposureWei: positiveAtomic }).strict()).min(1).max(10).optional(),
81
+ chains: z.array(SPONSORED_CHAIN_TERMS_SCHEMA).min(1).max(5),
82
+ }).strict().refine(v => v.expiresAtMs > v.approvedAtMs && new Set(v.chains.map(c => c.chainId)).size === v.chains.length);
83
+ /** Source-reviewed activation only. No environment toggle or caller-supplied approval can populate this. */
84
+ export const SPONSORED_ACCOUNT_ACTIVATIONS = Object.freeze([]);
85
+ /** A native-only compiler grants no swap authority. Additional combined policy compilers require source review. */
86
+ export function sponsoredActivationSupports(activation, capability) {
87
+ if (capability === 'lp-collect-userop')
88
+ return !!activation.nativeYieldUserOpPolicyRelation && !!activation.lpUserOpPolicyRelation;
89
+ if (capability === 'native-yield-userop')
90
+ return !!activation.nativeYieldUserOpPolicyRelation;
91
+ return !activation.nativeYieldUserOpPolicyRelation && !activation.lpUserOpPolicyRelation;
92
+ }
93
+ export function sponsoredActivationAvailability(activations, nowMs, capability = 'swap') {
94
+ const activation = activations.length === 1 ? activations[0] : undefined;
95
+ const current = !!activation && Number.isSafeInteger(nowMs) &&
96
+ activation.approvedAtMs <= nowMs && activation.expiresAtMs > nowMs;
97
+ const supports = !!activation && sponsoredActivationSupports(activation, capability);
98
+ return { configured: !!activation, executionEnabled: current && supports && activation.mode === 'enabled',
99
+ ...(!activation ? { reason: 'SPONSOR_ACTIVATION_UNCONFIGURED' }
100
+ : !supports ? { reason: 'SPONSOR_CAPABILITY_UNAVAILABLE' }
101
+ : !current ? { reason: 'SPONSOR_ACTIVATION_UNAVAILABLE' }
102
+ : activation.mode !== 'enabled' ? { reason: 'SPONSOR_RECOVERY_ONLY' } : {}) };
103
+ }
104
+ export const SPONSORED_INTENT_SCHEMA = z.object({ fromToken: address, toToken: erc20OutputAddress,
105
+ fromAmount: positiveAtomic, minAmountOut: positiveAtomic }).strict();
106
+ export const SPONSORED_PREPARE_INPUT = z.object({ accessToken: z.string().min(1).max(16384), account: address,
107
+ chainId: SPONSORED_CHAIN_SCHEMA, envelope: EXECUTION_ARTIFACT_SCHEMA, intent: SPONSORED_INTENT_SCHEMA,
108
+ prepareInput: z.unknown().optional() }).strict();
109
+ export const SPONSORED_READ_INPUT = z.object({ accessToken: z.string().min(1).max(16384),
110
+ operationId: z.string().regex(/^sp_[a-f0-9-]{36}$/) }).strict();
111
+ export const SPONSORED_GAS_REVIEW_INPUT = SPONSORED_READ_INPUT.extend({ reviewCommitment: digest,
112
+ preference: z.enum(['auto', 'sponsor', 'account']) }).strict();
113
+ export const SPONSORED_SUBMIT_INPUT = SPONSORED_READ_INPUT.extend({ reviewCommitment: digest }).strict();
114
+ export const SPONSORED_AUTHORITY_SCHEMA = z.object({ userId: z.string().regex(/^[a-zA-Z0-9-]{1,100}$/),
115
+ account: address, mintKey: z.string().min(1).max(200), grantExpiresAt: z.string().datetime(),
116
+ revokeGeneration: z.number().int().nonnegative().safe(), capVersion: z.literal(2),
117
+ perSwapCapUsd: z.number().int().min(1).max(5000), activationDigest: digest, policyRulesDigest: digest,
118
+ }).strict();
119
+ export const SPONSORED_CONTEXT_SCHEMA = z.object({
120
+ account: address, chainId: SPONSORED_CHAIN_SCHEMA, envelope: EXECUTION_ARTIFACT_SCHEMA,
121
+ intent: SPONSORED_INTENT_SCHEMA, prepareInput: z.unknown().optional(),
122
+ authority: SPONSORED_AUTHORITY_SCHEMA, activation: SPONSORED_ACTIVATION_SCHEMA,
123
+ reviewedAtMs: time, validUntilMs: time,
124
+ }).strict();
125
+ export const SPONSORED_STORED_REQUEST_SCHEMA = z.object({
126
+ userId: z.string().regex(/^[a-zA-Z0-9-]{1,100}$/), account: address, chainId: SPONSORED_CHAIN_SCHEMA,
127
+ idempotencyKey: z.string().uuid(), path: z.string().min(1).max(400), body: z.string().max(1_000_000), digest,
128
+ }).strict();
129
+ export const SPONSORED_RECEIPT_SCHEMA = z.object({ chainId: SPONSORED_CHAIN_SCHEMA, account: address,
130
+ userOpHash: hash, transactionHash: hash, blockHash: hash, blockNumber: atomic, nonce: atomic,
131
+ paymaster: address, actualGasCostWei: positiveAtomic, actualGasUsed: positiveAtomic,
132
+ status: z.enum(['success', 'reverted']) }).strict();
133
+ export const SPONSORED_SETTLEMENT_SCHEMA = z.object({ inputToken: address, outputToken: address,
134
+ inputDebited: positiveAtomic, outputReceived: positiveAtomic, ottoFeeReceived: atomic,
135
+ allowanceAfter: z.literal('0'), userOpHash: hash, transactionHash: hash,
136
+ }).strict();
137
+ export const SPONSORED_OPERATION_SCHEMA = z.object({ version: z.literal(1),
138
+ operationId: z.string().regex(/^sp_[a-f0-9-]{36}$/), userId: z.string().regex(/^[a-zA-Z0-9-]{1,100}$/),
139
+ context: SPONSORED_CONTEXT_SCHEMA, gasReview: ACCOUNT_GAS_REVIEW_SCHEMA.optional(), gasReviewFailure: ACCOUNT_GAS_FAILURE_SCHEMA.optional(), reviewCommitment: digest, reviewConsumed: z.boolean(),
140
+ state: z.enum(['review', 'active', 'unknown', 'submitted', 'completed', 'failed']),
141
+ createdAtMs: time, updatedAtMs: time, handoffAttempted: z.boolean(),
142
+ request: SPONSORED_STORED_REQUEST_SCHEMA.optional(), userOpHash: hash.optional(), transactionHash: hash.optional(),
143
+ receipt: SPONSORED_RECEIPT_SCHEMA.optional(), settlement: SPONSORED_SETTLEMENT_SCHEMA.optional(),
144
+ /** A proven provider cap breach stops the whole activation/chain; it is not terminal settlement. */
145
+ gasCapBreach: SPONSORED_RECEIPT_SCHEMA.optional(),
146
+ failureCode: z.string().regex(/^[A-Z0-9_]{1,100}$/).optional(),
147
+ }).strict();
148
+ export function sponsoredDigest(value) {
149
+ return createHash('sha256').update(JSON.stringify(value)).digest('hex');
150
+ }
151
+ export function sponsoredReviewCommitment(operationId, context, gasReview) {
152
+ if (gasReview)
153
+ return sponsoredDigest({ domain: 'otto-account-gas-review-v1', operationId, context, gasReview });
154
+ return sponsoredDigest({ domain: 'otto-sponsored-review-v1', operationId, context });
155
+ }
156
+ export function sponsoredPlan(context, fresh = false, nowMs = Date.now()) {
157
+ if (!sponsoredActivationSupports(context.activation, 'swap'))
158
+ throw new Error('SPONSOR_CAPABILITY_UNAVAILABLE');
159
+ sponsoredOutputToken(context.activation, context.chainId, context.intent.toToken);
160
+ return verifySwapEnvelope(context.envelope, {
161
+ profile: { kind: 'eoa', address: context.account, chainId: context.chainId },
162
+ intent: { ...context.intent, fromAmount: BigInt(context.intent.fromAmount), minAmountOut: BigInt(context.intent.minAmountOut) },
163
+ capabilities: ['send_evm_transaction', 'submit_evm_batch'], policy: defaultAdapterPolicy(context.chainId),
164
+ nowMs: fresh ? nowMs : context.reviewedAtMs, ...(context.prepareInput !== undefined ? { prepareInput: context.prepareInput } : {}),
165
+ });
166
+ }
167
+ export function sponsoredCalls(plan) {
168
+ return [...plan.steps.map(step => ({ to: step.to.toLowerCase(), data: step.data.toLowerCase(), value: step.value.toString() })),
169
+ { to: plan.token.toLowerCase(), data: encodeFunctionData({
170
+ abi: parseAbi(['function approve(address spender,uint256 value) returns(bool)']), functionName: 'approve', args: [plan.spender, 0n],
171
+ }).toLowerCase(), value: '0' }];
172
+ }
173
+ export function sponsoredChainTerms(activation, chainId) {
174
+ const terms = activation.chains.find(c => c.chainId === chainId);
175
+ if (!terms)
176
+ throw new Error('SPONSOR_CHAIN_UNAVAILABLE');
177
+ return terms;
178
+ }
179
+ export function sponsoredOutputToken(activation, chainId, token) {
180
+ const reviewed = sponsoredChainTerms(activation, chainId).reviewedOutputTokens.find(output => output.address === getAddress(token));
181
+ if (!reviewed)
182
+ throw new Error('SPONSOR_OUTPUT_TOKEN_UNREVIEWED');
183
+ return reviewed;
184
+ }
185
+ //# sourceMappingURL=execution-sponsored-definition.js.map
@@ -0,0 +1,27 @@
1
+ export declare const SPONSORED_INITIAL_GAS_CAP_USD_MICROS = 100000;
2
+ export declare const SPONSORED_GAS_POLICY_MAX_AGE_MS = 15000;
3
+ export type SponsoredGasPolicyErrorCode = 'SPONSOR_GAS_POLICY_UNAVAILABLE' | 'SPONSOR_GAS_POLICY_INVALID' | 'SPONSOR_GAS_POLICY_INACTIVE' | 'SPONSOR_GAS_POLICY_STALE';
4
+ export declare class SponsoredGasPolicyError extends Error {
5
+ readonly code: SponsoredGasPolicyErrorCode;
6
+ constructor(code: SponsoredGasPolicyErrorCode);
7
+ }
8
+ export interface SponsoredGasPolicyProvider {
9
+ readonly chainId: number;
10
+ readonly paymasterUrl: string;
11
+ readonly sponsorshipPolicyId: string;
12
+ }
13
+ /** Safe to expose or record: contains no endpoint, API key or upstream response body. */
14
+ export interface SponsoredGasPolicyProof {
15
+ readonly chainId: number;
16
+ readonly sponsorshipPolicyId: string;
17
+ readonly maximumGasCostUsdMicros: number;
18
+ /** Freshness starts before the read, so request latency cannot extend its lifetime. */
19
+ readonly checkedAtMs: number;
20
+ readonly validUntilMs: number;
21
+ }
22
+ export declare function assertSponsoredGasPolicyCurrent(proof: SponsoredGasPolicyProof, nowMs: number): void;
23
+ export declare function readSponsoredGasPolicy(provider: SponsoredGasPolicyProvider, options?: {
24
+ readonly fetch?: typeof fetch;
25
+ readonly now?: () => number;
26
+ readonly monotonic?: () => number;
27
+ }): Promise<Readonly<SponsoredGasPolicyProof>>;
@@ -0,0 +1,110 @@
1
+ /** Provider-enforced initial network-gas policy. Third-party service charges are separate.
2
+ * A readback is fresh configuration evidence, not an immutable provider authorization.
3
+ */
4
+ import { z } from 'zod';
5
+ export const SPONSORED_INITIAL_GAS_CAP_USD_MICROS = 100_000;
6
+ export const SPONSORED_GAS_POLICY_MAX_AGE_MS = 15_000;
7
+ const POLICY_TIMEOUT_MS = 10_000;
8
+ const policyId = z.string().regex(/^[a-zA-Z0-9_-]{1,128}$/);
9
+ const timestamp = z.string().datetime({ offset: true });
10
+ const policySchema = z.object({
11
+ id: policyId,
12
+ policy_status: z.enum(['active', 'inactive', 'deleted']),
13
+ start_time: timestamp.nullable(),
14
+ end_time: timestamp.nullable(),
15
+ chain_ids: z.object({ allowlist: z.array(z.number().int().positive().safe()).length(1) }),
16
+ limits: z.object({ user_operation: z.object({ user_operation_spending: z.object({
17
+ amount: z.number().int().min(1).max(SPONSORED_INITIAL_GAS_CAP_USD_MICROS / 10_000), currency: z.literal('USD'),
18
+ }) }) }),
19
+ });
20
+ export class SponsoredGasPolicyError extends Error {
21
+ code;
22
+ constructor(code) {
23
+ super(code);
24
+ this.code = code;
25
+ this.name = 'SponsoredGasPolicyError';
26
+ }
27
+ }
28
+ const proofClocks = new WeakMap();
29
+ function effectiveTime(clock, wallMs) {
30
+ const elapsed = clock.monotonic() - clock.startMonotonicMs;
31
+ if (!Number.isSafeInteger(wallMs) || wallMs < clock.startWallMs || !Number.isFinite(elapsed) || elapsed < 0)
32
+ return refuse('SPONSOR_GAS_POLICY_STALE');
33
+ return Math.max(wallMs, clock.startWallMs + Math.ceil(elapsed));
34
+ }
35
+ function refuse(code) { throw new SponsoredGasPolicyError(code); }
36
+ function policyReadUrl(provider) {
37
+ try {
38
+ if (!Number.isSafeInteger(provider.chainId) || provider.chainId <= 0)
39
+ throw new Error();
40
+ policyId.parse(provider.sponsorshipPolicyId);
41
+ const rpc = new URL(provider.paymasterUrl);
42
+ if (rpc.protocol !== 'https:' || rpc.hostname !== 'api.pimlico.io' || rpc.port || rpc.username || rpc.password || rpc.hash ||
43
+ rpc.pathname !== `/v2/${provider.chainId}/rpc` || [...rpc.searchParams.keys()].length !== 1 || !rpc.searchParams.get('apikey'))
44
+ throw new Error();
45
+ const url = new URL(`https://api.pimlico.io/v2/account/sponsorship_policies/${provider.sponsorshipPolicyId}`);
46
+ url.searchParams.set('apikey', rpc.searchParams.get('apikey'));
47
+ return url.toString();
48
+ }
49
+ catch {
50
+ return refuse('SPONSOR_GAS_POLICY_INVALID');
51
+ }
52
+ }
53
+ export function assertSponsoredGasPolicyCurrent(proof, nowMs) {
54
+ const clock = proofClocks.get(proof);
55
+ if (!clock)
56
+ return refuse('SPONSOR_GAS_POLICY_STALE');
57
+ nowMs = effectiveTime(clock, nowMs);
58
+ if (!Number.isSafeInteger(nowMs) || !Number.isSafeInteger(proof.checkedAtMs) || !Number.isSafeInteger(proof.validUntilMs) ||
59
+ nowMs < proof.checkedAtMs || nowMs >= proof.validUntilMs ||
60
+ proof.validUntilMs > proof.checkedAtMs + SPONSORED_GAS_POLICY_MAX_AGE_MS)
61
+ refuse('SPONSOR_GAS_POLICY_STALE');
62
+ }
63
+ export async function readSponsoredGasPolicy(provider, options = {}) {
64
+ provider = Object.freeze({ ...provider });
65
+ const url = policyReadUrl(provider), now = options.now ?? Date.now;
66
+ const monotonic = options.monotonic ?? (() => performance.now()), startMonotonicMs = monotonic();
67
+ const checkedAtMs = now();
68
+ if (!Number.isSafeInteger(checkedAtMs) || checkedAtMs < 0 || !Number.isFinite(startMonotonicMs) || startMonotonicMs < 0)
69
+ return refuse('SPONSOR_GAS_POLICY_STALE');
70
+ const clock = { startWallMs: checkedAtMs, startMonotonicMs, monotonic };
71
+ let raw;
72
+ try {
73
+ const response = await (options.fetch ?? fetch)(url, { method: 'GET', redirect: 'error',
74
+ signal: AbortSignal.timeout(POLICY_TIMEOUT_MS), headers: { Accept: 'application/json' } });
75
+ if (!response.ok)
76
+ return refuse('SPONSOR_GAS_POLICY_UNAVAILABLE');
77
+ const body = await response.text();
78
+ if (body.length > 65_536)
79
+ return refuse('SPONSOR_GAS_POLICY_INVALID');
80
+ try {
81
+ raw = JSON.parse(body);
82
+ }
83
+ catch {
84
+ return refuse('SPONSOR_GAS_POLICY_INVALID');
85
+ }
86
+ }
87
+ catch (error) {
88
+ if (error instanceof SponsoredGasPolicyError)
89
+ throw error;
90
+ return refuse('SPONSOR_GAS_POLICY_UNAVAILABLE');
91
+ }
92
+ const parsed = policySchema.safeParse(raw);
93
+ if (!parsed.success)
94
+ return refuse('SPONSOR_GAS_POLICY_INVALID');
95
+ const policy = parsed.data;
96
+ if (policy.id !== provider.sponsorshipPolicyId || policy.chain_ids.allowlist[0] !== provider.chainId)
97
+ return refuse('SPONSOR_GAS_POLICY_INVALID');
98
+ const currentMs = effectiveTime(clock, now()), startsAt = policy.start_time === null ? null : Date.parse(policy.start_time);
99
+ const endsAt = policy.end_time === null ? null : Date.parse(policy.end_time);
100
+ if (policy.policy_status !== 'active' || (startsAt !== null && startsAt > currentMs) ||
101
+ (endsAt !== null && endsAt <= currentMs) || (startsAt !== null && endsAt !== null && endsAt <= startsAt))
102
+ return refuse('SPONSOR_GAS_POLICY_INACTIVE');
103
+ const proof = Object.freeze({ chainId: provider.chainId, sponsorshipPolicyId: provider.sponsorshipPolicyId,
104
+ maximumGasCostUsdMicros: policy.limits.user_operation.user_operation_spending.amount * 10_000,
105
+ checkedAtMs, validUntilMs: Math.min(checkedAtMs + SPONSORED_GAS_POLICY_MAX_AGE_MS, endsAt ?? Number.MAX_SAFE_INTEGER) });
106
+ proofClocks.set(proof, clock);
107
+ assertSponsoredGasPolicyCurrent(proof, now());
108
+ return proof;
109
+ }
110
+ //# sourceMappingURL=execution-sponsored-gas-policy.js.map
@@ -0,0 +1,3 @@
1
+ import { type DelegationServices } from './execution-delegation.js';
2
+ import { type SponsoredAccountBinding } from './execution-sponsored-registration.js';
3
+ export declare function createHostedSponsoredAccountBinding(env: NodeJS.ProcessEnv, delegation: DelegationServices): Promise<SponsoredAccountBinding>;
@@ -0,0 +1,71 @@
1
+ import { loadDelegationEnv } from './execution-delegation.js';
2
+ import { resolveDelegationCapStorePath } from './execution-delegation-cap-store.js';
3
+ import { SPONSORED_ACCOUNT_ACTIVATIONS, SPONSORED_ACTIVATION_SCHEMA } from './execution-sponsored-definition.js';
4
+ import { createSponsoredAccountService } from './execution-sponsored-index.js';
5
+ import { unavailableSponsoredBinding } from './execution-sponsored-registration.js';
6
+ import { SPONSORED_AVAILABILITY_RESULT } from './execution-sponsored-mcp-definition.js';
7
+ const RPC_ENV = Object.freeze({
8
+ 1: 'OTTO_SPONSORED_RPC_URL_1', 8453: 'BASE_RPC_URL', 42161: 'OTTO_SPONSORED_RPC_URL_42161',
9
+ 10: 'OTTO_SPONSORED_RPC_URL_10', 137: 'OTTO_SPONSORED_RPC_URL_137',
10
+ });
11
+ function privateHttpsUrl(raw) {
12
+ if (!raw)
13
+ throw new Error('missing operator endpoint');
14
+ const url = new URL(raw);
15
+ if (url.protocol !== 'https:' || url.username || url.password || url.hash)
16
+ throw new Error('invalid operator endpoint');
17
+ return url.toString();
18
+ }
19
+ export async function createHostedSponsoredAccountBinding(env, delegation) {
20
+ // This is not an environment toggle. Adding endpoints cannot authorize a new financial rail.
21
+ if (SPONSORED_ACCOUNT_ACTIVATIONS.length !== 1)
22
+ return unavailableSponsoredBinding();
23
+ try {
24
+ const activation = SPONSORED_ACTIVATION_SCHEMA.parse(SPONSORED_ACCOUNT_ACTIVATIONS[0]);
25
+ const loaded = loadDelegationEnv(env);
26
+ if (!loaded || loaded.publicProjectId !== activation.projectId ||
27
+ delegation.publicProjectId !== activation.projectId)
28
+ return unavailableSponsoredBinding('SPONSOR_ACTIVATION_UNAVAILABLE');
29
+ const operationStorePath = resolveDelegationCapStorePath(env);
30
+ if (!operationStorePath)
31
+ return unavailableSponsoredBinding('SPONSOR_JOURNAL_UNAVAILABLE');
32
+ const providers = [];
33
+ const urls = new Map();
34
+ for (const terms of activation.chains) {
35
+ try {
36
+ providers.push({ chainId: terms.chainId, sponsorshipPolicyId: terms.sponsorshipPolicyId,
37
+ paymasterUrl: privateHttpsUrl(env['OTTO_SPONSORED_PAYMASTER_URL_' + terms.chainId]) });
38
+ }
39
+ catch { /* Missing send configuration leaves recovery available. */ }
40
+ try {
41
+ urls.set(terms.chainId, privateHttpsUrl(env[RPC_ENV[terms.chainId]]));
42
+ }
43
+ catch { /* Read works without RPC; reconcile keeps the original evidence until this chain returns. */ }
44
+ }
45
+ const [{ CdpClient }, { createPublicClient, http }, chains] = await Promise.all([
46
+ import('@coinbase/cdp-sdk'), import('viem'), import('viem/chains'),
47
+ ]);
48
+ const definitions = { 1: chains.mainnet, 8453: chains.base, 42161: chains.arbitrum,
49
+ 10: chains.optimism, 137: chains.polygon };
50
+ const clients = {};
51
+ for (const terms of activation.chains) {
52
+ if (terms.chainId === 8453 && delegation.pub)
53
+ clients[terms.chainId] = delegation.pub;
54
+ else if (urls.has(terms.chainId))
55
+ clients[terms.chainId] = createPublicClient({
56
+ chain: definitions[terms.chainId], transport: http(urls.get(terms.chainId))
57
+ });
58
+ }
59
+ const service = await createSponsoredAccountService({
60
+ cdp: new CdpClient(loaded.credentials), capStore: delegation.capStore,
61
+ projectId: activation.projectId, operationStorePath, clients, providers, credentials: loaded.credentials,
62
+ });
63
+ return Object.freeze({ ...service, availability: async () => SPONSORED_AVAILABILITY_RESULT.parse(await service.availability()) });
64
+ }
65
+ catch {
66
+ // Misconfigured sponsorship must not disable existing reads, Stop or recovery on other rails.
67
+ // Errors from providers may contain credentials; expose only a fixed status.
68
+ return unavailableSponsoredBinding('SPONSOR_RUNTIME_UNAVAILABLE');
69
+ }
70
+ }
71
+ //# sourceMappingURL=execution-sponsored-hosted.js.map