agentwallet-sdk 5.0.5 → 5.1.1

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 (271) hide show
  1. package/README.md +65 -30
  2. package/dist/ap2/index.d.ts +185 -0
  3. package/dist/ap2/index.d.ts.map +1 -0
  4. package/dist/ap2/index.js +255 -0
  5. package/dist/ap2/index.js.map +1 -0
  6. package/dist/bridge/unified.d.ts +101 -0
  7. package/dist/bridge/unified.d.ts.map +1 -0
  8. package/dist/bridge/unified.js +284 -0
  9. package/dist/bridge/unified.js.map +1 -0
  10. package/dist/chains.d.ts +62 -0
  11. package/dist/chains.d.ts.map +1 -0
  12. package/dist/chains.js +108 -0
  13. package/dist/chains.js.map +1 -0
  14. package/dist/fiat/index.d.ts +10 -0
  15. package/dist/fiat/index.d.ts.map +1 -0
  16. package/dist/fiat/index.js +9 -0
  17. package/dist/fiat/index.js.map +1 -0
  18. package/dist/fiat/onramp.d.ts +101 -0
  19. package/dist/fiat/onramp.d.ts.map +1 -0
  20. package/dist/fiat/onramp.js +155 -0
  21. package/dist/fiat/onramp.js.map +1 -0
  22. package/dist/fiat/providers/index.d.ts +16 -0
  23. package/dist/fiat/providers/index.d.ts.map +1 -0
  24. package/dist/fiat/providers/index.js +30 -0
  25. package/dist/fiat/providers/index.js.map +1 -0
  26. package/dist/fiat/providers/moonpay.d.ts +22 -0
  27. package/dist/fiat/providers/moonpay.d.ts.map +1 -0
  28. package/dist/fiat/providers/moonpay.js +107 -0
  29. package/dist/fiat/providers/moonpay.js.map +1 -0
  30. package/dist/fiat/providers/stripe.d.ts +26 -0
  31. package/dist/fiat/providers/stripe.d.ts.map +1 -0
  32. package/dist/fiat/providers/stripe.js +135 -0
  33. package/dist/fiat/providers/stripe.js.map +1 -0
  34. package/dist/fiat/providers/transak.d.ts +26 -0
  35. package/dist/fiat/providers/transak.d.ts.map +1 -0
  36. package/dist/fiat/providers/transak.js +119 -0
  37. package/dist/fiat/providers/transak.js.map +1 -0
  38. package/dist/fiat/types.d.ts +106 -0
  39. package/dist/fiat/types.d.ts.map +1 -0
  40. package/dist/fiat/types.js +13 -0
  41. package/dist/fiat/types.js.map +1 -0
  42. package/dist/flash/executor.d.ts +119 -0
  43. package/dist/flash/executor.d.ts.map +1 -0
  44. package/dist/flash/executor.js +195 -0
  45. package/dist/flash/executor.js.map +1 -0
  46. package/dist/flash/index.d.ts +28 -0
  47. package/dist/flash/index.d.ts.map +1 -0
  48. package/dist/flash/index.js +29 -0
  49. package/dist/flash/index.js.map +1 -0
  50. package/dist/flash/scanner.d.ts +133 -0
  51. package/dist/flash/scanner.d.ts.map +1 -0
  52. package/dist/flash/scanner.js +212 -0
  53. package/dist/flash/scanner.js.map +1 -0
  54. package/dist/flash/types.d.ts +136 -0
  55. package/dist/flash/types.d.ts.map +1 -0
  56. package/dist/flash/types.js +23 -0
  57. package/dist/flash/types.js.map +1 -0
  58. package/dist/gas/index.d.ts +4 -0
  59. package/dist/gas/index.d.ts.map +1 -0
  60. package/dist/gas/index.js +3 -0
  61. package/dist/gas/index.js.map +1 -0
  62. package/dist/gas/sponsor.d.ts +70 -0
  63. package/dist/gas/sponsor.d.ts.map +1 -0
  64. package/dist/gas/sponsor.js +193 -0
  65. package/dist/gas/sponsor.js.map +1 -0
  66. package/dist/gas/types.d.ts +76 -0
  67. package/dist/gas/types.d.ts.map +1 -0
  68. package/dist/gas/types.js +21 -0
  69. package/dist/gas/types.js.map +1 -0
  70. package/dist/identity/agent-identity.d.ts +276 -0
  71. package/dist/identity/agent-identity.d.ts.map +1 -0
  72. package/dist/identity/agent-identity.js +300 -0
  73. package/dist/identity/agent-identity.js.map +1 -0
  74. package/dist/identity/email-resolver.d.ts +235 -0
  75. package/dist/identity/email-resolver.js +283 -0
  76. package/dist/identity/erc6551.d.ts +441 -0
  77. package/dist/identity/erc6551.d.ts.map +1 -0
  78. package/dist/identity/erc6551.js +517 -0
  79. package/dist/identity/erc6551.js.map +1 -0
  80. package/dist/index.d.ts +286 -213
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +3 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/mev/index.d.ts +4 -0
  85. package/dist/mev/index.d.ts.map +1 -0
  86. package/dist/mev/index.js +8 -0
  87. package/dist/mev/index.js.map +1 -0
  88. package/dist/mev/protection.d.ts +54 -0
  89. package/dist/mev/protection.d.ts.map +1 -0
  90. package/dist/mev/protection.js +185 -0
  91. package/dist/mev/protection.js.map +1 -0
  92. package/dist/mev/risk.d.ts +19 -0
  93. package/dist/mev/risk.d.ts.map +1 -0
  94. package/dist/mev/risk.js +95 -0
  95. package/dist/mev/risk.js.map +1 -0
  96. package/dist/mev/types.d.ts +49 -0
  97. package/dist/mev/types.d.ts.map +1 -0
  98. package/dist/mev/types.js +2 -0
  99. package/dist/mev/types.js.map +1 -0
  100. package/dist/plugins/elizaos.d.ts +52 -0
  101. package/dist/plugins/elizaos.d.ts.map +1 -0
  102. package/dist/plugins/elizaos.js +89 -0
  103. package/dist/plugins/elizaos.js.map +1 -0
  104. package/dist/settlement/index.d.ts +4 -0
  105. package/dist/settlement/index.d.ts.map +1 -0
  106. package/dist/settlement/index.js +3 -0
  107. package/dist/settlement/index.js.map +1 -0
  108. package/dist/settlement/types.d.ts +66 -0
  109. package/dist/settlement/types.d.ts.map +1 -0
  110. package/dist/settlement/types.js +37 -0
  111. package/dist/settlement/types.js.map +1 -0
  112. package/dist/settlement/verifier.d.ts +75 -0
  113. package/dist/settlement/verifier.d.ts.map +1 -0
  114. package/dist/settlement/verifier.js +354 -0
  115. package/dist/settlement/verifier.js.map +1 -0
  116. package/dist/solana/bridge.d.ts +144 -0
  117. package/dist/solana/bridge.d.ts.map +1 -0
  118. package/dist/solana/bridge.js +352 -0
  119. package/dist/solana/bridge.js.map +1 -0
  120. package/dist/solana/index.d.ts +8 -0
  121. package/dist/solana/index.d.ts.map +1 -0
  122. package/dist/solana/index.js +6 -0
  123. package/dist/solana/index.js.map +1 -0
  124. package/dist/solana/swap.d.ts +85 -0
  125. package/dist/solana/swap.d.ts.map +1 -0
  126. package/dist/solana/swap.js +173 -0
  127. package/dist/solana/swap.js.map +1 -0
  128. package/dist/solana/types.d.ts +126 -0
  129. package/dist/solana/types.d.ts.map +1 -0
  130. package/dist/solana/types.js +10 -0
  131. package/dist/solana/types.js.map +1 -0
  132. package/dist/solana/wallet.d.ts +83 -0
  133. package/dist/solana/wallet.d.ts.map +1 -0
  134. package/dist/solana/wallet.js +164 -0
  135. package/dist/solana/wallet.js.map +1 -0
  136. package/dist/solana/x402.d.ts +69 -0
  137. package/dist/solana/x402.d.ts.map +1 -0
  138. package/dist/solana/x402.js +154 -0
  139. package/dist/solana/x402.js.map +1 -0
  140. package/dist/solver/adapter.d.ts +47 -0
  141. package/dist/solver/adapter.d.ts.map +1 -0
  142. package/dist/solver/adapter.js +146 -0
  143. package/dist/solver/adapter.js.map +1 -0
  144. package/dist/solver/analyzer.d.ts +48 -0
  145. package/dist/solver/analyzer.d.ts.map +1 -0
  146. package/dist/solver/analyzer.js +171 -0
  147. package/dist/solver/analyzer.js.map +1 -0
  148. package/dist/solver/builder.d.ts +31 -0
  149. package/dist/solver/builder.d.ts.map +1 -0
  150. package/dist/solver/builder.js +60 -0
  151. package/dist/solver/builder.js.map +1 -0
  152. package/dist/solver/index.d.ts +22 -0
  153. package/dist/solver/index.d.ts.map +1 -0
  154. package/dist/solver/index.js +25 -0
  155. package/dist/solver/index.js.map +1 -0
  156. package/dist/solver/types.d.ts +115 -0
  157. package/dist/solver/types.d.ts.map +1 -0
  158. package/dist/solver/types.js +10 -0
  159. package/dist/solver/types.js.map +1 -0
  160. package/dist/spend-guard/index.d.ts +125 -0
  161. package/dist/spend-guard/index.d.ts.map +1 -0
  162. package/dist/spend-guard/index.js +150 -0
  163. package/dist/spend-guard/index.js.map +1 -0
  164. package/dist/swap/router/cache.d.ts +13 -0
  165. package/dist/swap/router/cache.d.ts.map +1 -0
  166. package/dist/swap/router/cache.js +30 -0
  167. package/dist/swap/router/cache.js.map +1 -0
  168. package/dist/swap/router/flashbots.d.ts +10 -0
  169. package/dist/swap/router/flashbots.d.ts.map +1 -0
  170. package/dist/swap/router/flashbots.js +43 -0
  171. package/dist/swap/router/flashbots.js.map +1 -0
  172. package/dist/swap/router/health.d.ts +17 -0
  173. package/dist/swap/router/health.d.ts.map +1 -0
  174. package/dist/swap/router/health.js +38 -0
  175. package/dist/swap/router/health.js.map +1 -0
  176. package/dist/swap/router/index.d.ts +10 -0
  177. package/dist/swap/router/index.d.ts.map +1 -0
  178. package/dist/swap/router/index.js +10 -0
  179. package/dist/swap/router/index.js.map +1 -0
  180. package/dist/swap/router/providers/cowswap.d.ts +11 -0
  181. package/dist/swap/router/providers/cowswap.d.ts.map +1 -0
  182. package/dist/swap/router/providers/cowswap.js +79 -0
  183. package/dist/swap/router/providers/cowswap.js.map +1 -0
  184. package/dist/swap/router/providers/index.d.ts +20 -0
  185. package/dist/swap/router/providers/index.d.ts.map +1 -0
  186. package/dist/swap/router/providers/index.js +32 -0
  187. package/dist/swap/router/providers/index.js.map +1 -0
  188. package/dist/swap/router/providers/jupiter.d.ts +12 -0
  189. package/dist/swap/router/providers/jupiter.d.ts.map +1 -0
  190. package/dist/swap/router/providers/jupiter.js +73 -0
  191. package/dist/swap/router/providers/jupiter.js.map +1 -0
  192. package/dist/swap/router/providers/lifi.d.ts +11 -0
  193. package/dist/swap/router/providers/lifi.d.ts.map +1 -0
  194. package/dist/swap/router/providers/lifi.js +123 -0
  195. package/dist/swap/router/providers/lifi.js.map +1 -0
  196. package/dist/swap/router/providers/oneinch.d.ts +13 -0
  197. package/dist/swap/router/providers/oneinch.d.ts.map +1 -0
  198. package/dist/swap/router/providers/oneinch.js +71 -0
  199. package/dist/swap/router/providers/oneinch.js.map +1 -0
  200. package/dist/swap/router/providers/paraswap.d.ts +11 -0
  201. package/dist/swap/router/providers/paraswap.d.ts.map +1 -0
  202. package/dist/swap/router/providers/paraswap.js +73 -0
  203. package/dist/swap/router/providers/paraswap.js.map +1 -0
  204. package/dist/swap/router/providers/uniswap.d.ts +31 -0
  205. package/dist/swap/router/providers/uniswap.d.ts.map +1 -0
  206. package/dist/swap/router/providers/uniswap.js +237 -0
  207. package/dist/swap/router/providers/uniswap.js.map +1 -0
  208. package/dist/swap/router/providers/zerox.d.ts +13 -0
  209. package/dist/swap/router/providers/zerox.d.ts.map +1 -0
  210. package/dist/swap/router/providers/zerox.js +94 -0
  211. package/dist/swap/router/providers/zerox.js.map +1 -0
  212. package/dist/swap/router/router.d.ts +86 -0
  213. package/dist/swap/router/router.d.ts.map +1 -0
  214. package/dist/swap/router/router.js +224 -0
  215. package/dist/swap/router/router.js.map +1 -0
  216. package/dist/swap/router/rsi/engine.d.ts +60 -0
  217. package/dist/swap/router/rsi/engine.d.ts.map +1 -0
  218. package/dist/swap/router/rsi/engine.js +483 -0
  219. package/dist/swap/router/rsi/engine.js.map +1 -0
  220. package/dist/swap/router/rsi/index.d.ts +3 -0
  221. package/dist/swap/router/rsi/index.d.ts.map +1 -0
  222. package/dist/swap/router/rsi/index.js +3 -0
  223. package/dist/swap/router/rsi/index.js.map +1 -0
  224. package/dist/swap/router/rsi/types.d.ts +106 -0
  225. package/dist/swap/router/rsi/types.d.ts.map +1 -0
  226. package/dist/swap/router/rsi/types.js +3 -0
  227. package/dist/swap/router/rsi/types.js.map +1 -0
  228. package/dist/swap/router/types.d.ts +120 -0
  229. package/dist/swap/router/types.d.ts.map +1 -0
  230. package/dist/swap/router/types.js +16 -0
  231. package/dist/swap/router/types.js.map +1 -0
  232. package/dist/tax/engine.d.ts +131 -0
  233. package/dist/tax/engine.d.ts.map +1 -0
  234. package/dist/tax/engine.js +307 -0
  235. package/dist/tax/engine.js.map +1 -0
  236. package/dist/tax/index.d.ts +9 -0
  237. package/dist/tax/index.d.ts.map +1 -0
  238. package/dist/tax/index.js +12 -0
  239. package/dist/tax/index.js.map +1 -0
  240. package/dist/tax/lots.d.ts +60 -0
  241. package/dist/tax/lots.d.ts.map +1 -0
  242. package/dist/tax/lots.js +129 -0
  243. package/dist/tax/lots.js.map +1 -0
  244. package/dist/tax/types.d.ts +113 -0
  245. package/dist/tax/types.d.ts.map +1 -0
  246. package/dist/tax/types.js +18 -0
  247. package/dist/tax/types.js.map +1 -0
  248. package/dist/verifiable-intent/index.d.ts +84 -0
  249. package/dist/verifiable-intent/index.js +385 -0
  250. package/dist/yield/index.d.ts +26 -0
  251. package/dist/yield/index.d.ts.map +1 -0
  252. package/dist/yield/index.js +29 -0
  253. package/dist/yield/index.js.map +1 -0
  254. package/dist/yield/rates.d.ts +114 -0
  255. package/dist/yield/rates.d.ts.map +1 -0
  256. package/dist/yield/rates.js +351 -0
  257. package/dist/yield/rates.js.map +1 -0
  258. package/dist/yield/types.d.ts +134 -0
  259. package/dist/yield/types.d.ts.map +1 -0
  260. package/dist/yield/types.js +24 -0
  261. package/dist/yield/types.js.map +1 -0
  262. package/dist/yield/vault.d.ts +112 -0
  263. package/dist/yield/vault.d.ts.map +1 -0
  264. package/dist/yield/vault.js +264 -0
  265. package/dist/yield/vault.js.map +1 -0
  266. package/package.json +3 -3
  267. package/LICENSE +0 -21
  268. package/dist/x402/chains/stellar/index.d.ts +0 -136
  269. package/dist/x402/chains/stellar/index.d.ts.map +0 -1
  270. package/dist/x402/chains/stellar/index.js +0 -190
  271. package/dist/x402/chains/stellar/index.js.map +0 -1
@@ -0,0 +1,483 @@
1
+ const DEFAULT_LEARNING_WINDOW = 50;
2
+ const DEFAULT_MUTATION_RATE = 0.1;
3
+ const WEIGHT_MIN = 0.5;
4
+ const WEIGHT_MAX = 2.0;
5
+ const STATE_VERSION = 1;
6
+ const MAX_OUTCOMES = 500;
7
+ const MAX_MUTATION_HISTORY = 10;
8
+ const DEFAULT_GOALS = {
9
+ primary: 'maximize-net-output',
10
+ constraints: {},
11
+ };
12
+ // ─── SwapRSIEngine ───────────────────────────────────────────────────────────
13
+ export class SwapRSIEngine {
14
+ constructor(config, goals) {
15
+ this.pendingOutcomes = [];
16
+ this.config = {
17
+ enabled: config.enabled,
18
+ learningWindow: config.learningWindow ?? DEFAULT_LEARNING_WINDOW,
19
+ mutationRate: config.mutationRate ?? DEFAULT_MUTATION_RATE,
20
+ metrics: config.metrics ?? [
21
+ 'provider-win-rate',
22
+ 'quote-accuracy',
23
+ 'latency',
24
+ 'failure-rate',
25
+ ],
26
+ storageKey: config.storageKey ?? 'swap-rsi-state',
27
+ };
28
+ this.state = {
29
+ version: STATE_VERSION,
30
+ lastMutationCycle: 0,
31
+ totalOutcomes: 0,
32
+ providerWeights: { global: {}, byChain: {}, byPair: {} },
33
+ outcomes: [],
34
+ mutationHistory: [],
35
+ directives: [],
36
+ goals: goals ?? { ...DEFAULT_GOALS },
37
+ };
38
+ }
39
+ // ── Recording ──────────────────────────────────────────────────────────────
40
+ /** Record a swap outcome. Triggers mutation cycle when learningWindow is reached. */
41
+ recordOutcome(outcome) {
42
+ this.pendingOutcomes.push(outcome);
43
+ this.state.outcomes.push(outcome);
44
+ this.state.totalOutcomes++;
45
+ // Trim rolling window to 500 max
46
+ if (this.state.outcomes.length > MAX_OUTCOMES) {
47
+ this.state.outcomes = this.state.outcomes.slice(-MAX_OUTCOMES);
48
+ }
49
+ // Check if mutation cycle should run
50
+ if (this.pendingOutcomes.length >= this.config.learningWindow) {
51
+ return this.runMutationCycle();
52
+ }
53
+ return null;
54
+ }
55
+ // ── Weights ────────────────────────────────────────────────────────────────
56
+ /** Get learned provider weight for a specific chain+pair.
57
+ * Returns multiplier (1.0 = neutral, >1 = preferred, <1 = deprioritized) */
58
+ getProviderWeight(provider, chain, fromToken, toToken) {
59
+ const pairKey = `${chain}:${fromToken}→${toToken}`;
60
+ // Most specific first: pair > chain > global
61
+ const pairWeight = this.state.providerWeights.byPair[pairKey]?.[provider];
62
+ if (pairWeight !== undefined)
63
+ return pairWeight;
64
+ const chainWeight = this.state.providerWeights.byChain[chain]?.[provider];
65
+ if (chainWeight !== undefined)
66
+ return chainWeight;
67
+ return this.state.providerWeights.global[provider] ?? 1.0;
68
+ }
69
+ /** Get all provider weights for a chain+pair (for SmartSwapRouter integration).
70
+ * Builds a merged map: pair weights override chain weights override global weights. */
71
+ getProviderWeights(chain, fromToken, toToken) {
72
+ const pairKey = `${chain}:${fromToken}→${toToken}`;
73
+ const merged = {};
74
+ // Layer 1: global
75
+ for (const [provider, weight] of Object.entries(this.state.providerWeights.global)) {
76
+ merged[provider] = weight;
77
+ }
78
+ // Layer 2: chain (overrides global)
79
+ const chainWeights = this.state.providerWeights.byChain[chain] ?? {};
80
+ for (const [provider, weight] of Object.entries(chainWeights)) {
81
+ merged[provider] = weight;
82
+ }
83
+ // Layer 3: pair (overrides chain + global)
84
+ const pairWeights = this.state.providerWeights.byPair[pairKey] ?? {};
85
+ for (const [provider, weight] of Object.entries(pairWeights)) {
86
+ merged[provider] = weight;
87
+ }
88
+ return merged;
89
+ }
90
+ // ── Mutation Cycle ─────────────────────────────────────────────────────────
91
+ /** Analyze recent outcomes and adjust provider weights */
92
+ runMutationCycle() {
93
+ const outcomes = [...this.pendingOutcomes];
94
+ this.pendingOutcomes = [];
95
+ const mutations = [];
96
+ const { mutationRate } = this.config;
97
+ // ── 1. Provider Win Rate Analysis ────────────────────────────────────────
98
+ // Group by chain+pair, find winner per outcome, adjust weights
99
+ const pairWins = {};
100
+ const pairCounts = {};
101
+ for (const outcome of outcomes) {
102
+ if (outcome.allQuotes.length < 2)
103
+ continue;
104
+ const pairKey = `${outcome.chain}:${outcome.fromToken}→${outcome.toToken}`;
105
+ // Find the provider with highest toAmount
106
+ let bestProvider = outcome.allQuotes[0].provider;
107
+ let bestAmount = BigInt(outcome.allQuotes[0].toAmount);
108
+ for (const q of outcome.allQuotes) {
109
+ const amt = BigInt(q.toAmount);
110
+ if (amt > bestAmount) {
111
+ bestAmount = amt;
112
+ bestProvider = q.provider;
113
+ }
114
+ }
115
+ if (!pairWins[pairKey])
116
+ pairWins[pairKey] = {};
117
+ if (!pairCounts[pairKey])
118
+ pairCounts[pairKey] = 0;
119
+ pairWins[pairKey][bestProvider] = (pairWins[pairKey][bestProvider] ?? 0) + 1;
120
+ pairCounts[pairKey]++;
121
+ }
122
+ // Apply win rate adjustments per pair
123
+ for (const [pairKey, wins] of Object.entries(pairWins)) {
124
+ const total = pairCounts[pairKey];
125
+ const allProviders = new Set();
126
+ // Collect all providers that appeared in this pair's outcomes
127
+ for (const outcome of outcomes) {
128
+ const key = `${outcome.chain}:${outcome.fromToken}→${outcome.toToken}`;
129
+ if (key === pairKey) {
130
+ for (const q of outcome.allQuotes)
131
+ allProviders.add(q.provider);
132
+ }
133
+ }
134
+ const numProviders = allProviders.size;
135
+ if (numProviders < 2)
136
+ continue;
137
+ const expectedWinRate = 1 / numProviders;
138
+ // Parse chain from pairKey: "chain:from→to"
139
+ const chain = pairKey.split(':')[0];
140
+ if (!this.state.providerWeights.byPair[pairKey]) {
141
+ this.state.providerWeights.byPair[pairKey] = {};
142
+ }
143
+ for (const provider of allProviders) {
144
+ const actualWinRate = (wins[provider] ?? 0) / total;
145
+ const diff = actualWinRate - expectedWinRate;
146
+ const adjustment = mutationRate * diff;
147
+ const oldWeight = this.state.providerWeights.byPair[pairKey][provider] ??
148
+ this.state.providerWeights.byChain[chain]?.[provider] ??
149
+ this.state.providerWeights.global[provider] ??
150
+ 1.0;
151
+ const newWeight = Math.max(WEIGHT_MIN, Math.min(WEIGHT_MAX, oldWeight + adjustment));
152
+ if (Math.abs(newWeight - oldWeight) > 1e-9) {
153
+ this.state.providerWeights.byPair[pairKey][provider] = newWeight;
154
+ mutations.push({
155
+ type: 'win-rate',
156
+ provider,
157
+ field: `byPair.${pairKey}`,
158
+ oldValue: oldWeight,
159
+ newValue: newWeight,
160
+ reason: `Win rate ${(actualWinRate * 100).toFixed(1)}% vs expected ${(expectedWinRate * 100).toFixed(1)}%`,
161
+ });
162
+ }
163
+ }
164
+ }
165
+ // ── 2. Quote Accuracy Analysis ───────────────────────────────────────────
166
+ // Penalize providers that consistently over-promise (actualOutput < quotedOutput)
167
+ const accuracySums = {};
168
+ const accuracyCounts = {};
169
+ for (const outcome of outcomes) {
170
+ if (!outcome.actualOutput || !outcome.quotedOutput)
171
+ continue;
172
+ const actual = BigInt(outcome.actualOutput);
173
+ const quoted = BigInt(outcome.quotedOutput);
174
+ if (quoted === 0n)
175
+ continue;
176
+ const accuracy = Number(actual) / Number(quoted);
177
+ const p = outcome.selectedProvider;
178
+ accuracySums[p] = (accuracySums[p] ?? 0) + accuracy;
179
+ accuracyCounts[p] = (accuracyCounts[p] ?? 0) + 1;
180
+ }
181
+ for (const [provider, sum] of Object.entries(accuracySums)) {
182
+ const count = accuracyCounts[provider];
183
+ const avgAccuracy = sum / count;
184
+ // Only penalize if consistently over-quoting (avgAccuracy < 1.0)
185
+ if (avgAccuracy >= 1.0)
186
+ continue;
187
+ const adjustment = -(1.0 - avgAccuracy) * mutationRate;
188
+ const oldWeight = this.state.providerWeights.global[provider] ?? 1.0;
189
+ const newWeight = Math.max(WEIGHT_MIN, Math.min(WEIGHT_MAX, oldWeight + adjustment));
190
+ if (Math.abs(newWeight - oldWeight) > 1e-9) {
191
+ this.state.providerWeights.global[provider] = newWeight;
192
+ mutations.push({
193
+ type: 'quote-accuracy',
194
+ provider,
195
+ field: 'global',
196
+ oldValue: oldWeight,
197
+ newValue: newWeight,
198
+ reason: `Avg quote accuracy ${(avgAccuracy * 100).toFixed(2)}% (over-promises)`,
199
+ });
200
+ }
201
+ }
202
+ // ── 3. Failure Rate Analysis ─────────────────────────────────────────────
203
+ // Penalize providers with high failure rates (long-term trends)
204
+ const attemptCounts = {};
205
+ const failureCounts = {};
206
+ for (const outcome of outcomes) {
207
+ const p = outcome.selectedProvider;
208
+ attemptCounts[p] = (attemptCounts[p] ?? 0) + 1;
209
+ if (!outcome.success) {
210
+ failureCounts[p] = (failureCounts[p] ?? 0) + 1;
211
+ }
212
+ }
213
+ for (const [provider, attempts] of Object.entries(attemptCounts)) {
214
+ const failures = failureCounts[provider] ?? 0;
215
+ const failureRate = failures / attempts;
216
+ if (failureRate === 0)
217
+ continue;
218
+ const adjustment = -failureRate * mutationRate;
219
+ const oldWeight = this.state.providerWeights.global[provider] ?? 1.0;
220
+ const newWeight = Math.max(WEIGHT_MIN, Math.min(WEIGHT_MAX, oldWeight + adjustment));
221
+ if (Math.abs(newWeight - oldWeight) > 1e-9) {
222
+ this.state.providerWeights.global[provider] = newWeight;
223
+ mutations.push({
224
+ type: 'failure-rate',
225
+ provider,
226
+ field: 'global',
227
+ oldValue: oldWeight,
228
+ newValue: newWeight,
229
+ reason: `Failure rate ${(failureRate * 100).toFixed(1)}%`,
230
+ });
231
+ }
232
+ }
233
+ // ── 4. Gas Accuracy Analysis ─────────────────────────────────────────────
234
+ // Penalize providers that consistently underestimate gas
235
+ // (they appear cheaper than they are — bad for planning)
236
+ const gasAccSums = {};
237
+ const gasAccCounts = {};
238
+ for (const outcome of outcomes) {
239
+ if (outcome.actualGasUsd === undefined)
240
+ continue;
241
+ for (const q of outcome.allQuotes) {
242
+ if (q.provider !== outcome.selectedProvider)
243
+ continue;
244
+ if (q.gasEstimateUsd === 0)
245
+ continue;
246
+ const gasAccuracy = q.gasEstimateUsd / outcome.actualGasUsd;
247
+ gasAccSums[q.provider] = (gasAccSums[q.provider] ?? 0) + gasAccuracy;
248
+ gasAccCounts[q.provider] = (gasAccCounts[q.provider] ?? 0) + 1;
249
+ }
250
+ }
251
+ for (const [provider, sum] of Object.entries(gasAccSums)) {
252
+ const count = gasAccCounts[provider];
253
+ const avgGasAccuracy = sum / count;
254
+ // Penalize only if consistently underestimating gas (estimate < actual → ratio < 1)
255
+ if (avgGasAccuracy >= 1.0)
256
+ continue;
257
+ const adjustment = -(1.0 - avgGasAccuracy) * mutationRate;
258
+ const oldWeight = this.state.providerWeights.global[provider] ?? 1.0;
259
+ const newWeight = Math.max(WEIGHT_MIN, Math.min(WEIGHT_MAX, oldWeight + adjustment));
260
+ if (Math.abs(newWeight - oldWeight) > 1e-9) {
261
+ this.state.providerWeights.global[provider] = newWeight;
262
+ mutations.push({
263
+ type: 'gas-accuracy',
264
+ provider,
265
+ field: 'global',
266
+ oldValue: oldWeight,
267
+ newValue: newWeight,
268
+ reason: `Avg gas accuracy ${(avgGasAccuracy * 100).toFixed(2)}% (underestimates)`,
269
+ });
270
+ }
271
+ }
272
+ // ── Build metrics summary ────────────────────────────────────────────────
273
+ const result = {
274
+ cycle: ++this.state.lastMutationCycle,
275
+ timestamp: Date.now(),
276
+ outcomesAnalyzed: outcomes.length,
277
+ mutations,
278
+ metrics: {
279
+ avgSavingsVsBaselineBps: this.calculateSavingsVsBaseline(outcomes),
280
+ providerWinRates: this.calculateWinRates(outcomes),
281
+ avgQuoteAccuracy: this.calculateQuoteAccuracy(outcomes),
282
+ avgLatencyMs: this.calculateAvgLatency(outcomes),
283
+ },
284
+ };
285
+ // Store mutation history (keep last 10)
286
+ this.state.mutationHistory.push(result);
287
+ if (this.state.mutationHistory.length > MAX_MUTATION_HISTORY) {
288
+ this.state.mutationHistory = this.state.mutationHistory.slice(-MAX_MUTATION_HISTORY);
289
+ }
290
+ return result;
291
+ }
292
+ // ── Metrics Helpers ────────────────────────────────────────────────────────
293
+ calculateSavingsVsBaseline(outcomes) {
294
+ // Savings vs baseline = best quote vs worst quote, in bps
295
+ const savingsBps = [];
296
+ for (const outcome of outcomes) {
297
+ if (outcome.allQuotes.length < 2)
298
+ continue;
299
+ const amounts = outcome.allQuotes.map((q) => Number(BigInt(q.toAmount)));
300
+ const best = Math.max(...amounts);
301
+ const worst = Math.min(...amounts);
302
+ if (worst === 0)
303
+ continue;
304
+ const savings = ((best - worst) / worst) * 10000;
305
+ savingsBps.push(savings);
306
+ }
307
+ if (savingsBps.length === 0)
308
+ return 0;
309
+ return savingsBps.reduce((a, b) => a + b, 0) / savingsBps.length;
310
+ }
311
+ calculateWinRates(outcomes) {
312
+ const wins = {};
313
+ const appearances = {};
314
+ for (const outcome of outcomes) {
315
+ if (outcome.allQuotes.length === 0)
316
+ continue;
317
+ let bestProvider = outcome.allQuotes[0].provider;
318
+ let bestAmount = BigInt(outcome.allQuotes[0].toAmount);
319
+ for (const q of outcome.allQuotes) {
320
+ appearances[q.provider] = (appearances[q.provider] ?? 0) + 1;
321
+ const amt = BigInt(q.toAmount);
322
+ if (amt > bestAmount) {
323
+ bestAmount = amt;
324
+ bestProvider = q.provider;
325
+ }
326
+ }
327
+ wins[bestProvider] = (wins[bestProvider] ?? 0) + 1;
328
+ }
329
+ const rates = {};
330
+ for (const [provider, count] of Object.entries(appearances)) {
331
+ rates[provider] = (wins[provider] ?? 0) / count;
332
+ }
333
+ return rates;
334
+ }
335
+ calculateQuoteAccuracy(outcomes) {
336
+ const accuracies = [];
337
+ for (const outcome of outcomes) {
338
+ if (!outcome.actualOutput || !outcome.quotedOutput)
339
+ continue;
340
+ const quoted = Number(BigInt(outcome.quotedOutput));
341
+ if (quoted === 0)
342
+ continue;
343
+ accuracies.push(Number(BigInt(outcome.actualOutput)) / quoted);
344
+ }
345
+ if (accuracies.length === 0)
346
+ return 1.0;
347
+ return accuracies.reduce((a, b) => a + b, 0) / accuracies.length;
348
+ }
349
+ calculateAvgLatency(outcomes) {
350
+ const latencySums = {};
351
+ const latencyCounts = {};
352
+ for (const outcome of outcomes) {
353
+ for (const q of outcome.allQuotes) {
354
+ latencySums[q.provider] = (latencySums[q.provider] ?? 0) + q.estimatedTimeMs;
355
+ latencyCounts[q.provider] = (latencyCounts[q.provider] ?? 0) + 1;
356
+ }
357
+ }
358
+ const result = {};
359
+ for (const [provider, sum] of Object.entries(latencySums)) {
360
+ result[provider] = sum / latencyCounts[provider];
361
+ }
362
+ return result;
363
+ }
364
+ // ── Directives ─────────────────────────────────────────────────────────────
365
+ /** Check if a swap should proceed based on directives */
366
+ evaluateDirectives(params) {
367
+ const adjustments = {};
368
+ for (const directive of this.state.directives) {
369
+ if (!directive.enabled)
370
+ continue;
371
+ switch (directive.rule) {
372
+ case 'avoid-high-gas': {
373
+ const threshold = directive.params['gasGweiThreshold'];
374
+ if (typeof threshold === 'number' && params.gasGwei !== undefined) {
375
+ if (params.gasGwei > threshold) {
376
+ return {
377
+ proceed: false,
378
+ reason: `Gas ${params.gasGwei} Gwei exceeds threshold ${threshold} Gwei`,
379
+ };
380
+ }
381
+ }
382
+ break;
383
+ }
384
+ case 'prefer-mev-protected': {
385
+ const bonus = directive.params['mevBonus'];
386
+ if (typeof bonus === 'number') {
387
+ adjustments['mevBonus'] = bonus;
388
+ }
389
+ else {
390
+ adjustments['mevBonus'] = 1.5; // default
391
+ }
392
+ break;
393
+ }
394
+ case 'alert-on-arb-opportunity': {
395
+ // Handled separately via detectArbOpportunities
396
+ break;
397
+ }
398
+ case 'time-based-routing': {
399
+ // Store time-of-day signal for routing decisions
400
+ break;
401
+ }
402
+ case 'pair-specific-routing': {
403
+ // Pair weights already applied via getProviderWeights
404
+ break;
405
+ }
406
+ }
407
+ }
408
+ return {
409
+ proceed: true,
410
+ adjustments: Object.keys(adjustments).length > 0 ? adjustments : undefined,
411
+ };
412
+ }
413
+ /** Detect arbitrage opportunities from recent quotes */
414
+ detectArbOpportunities(quotes) {
415
+ if (quotes.length < 2)
416
+ return null;
417
+ const sorted = [...quotes].sort((a, b) => Number(b.toAmount - a.toAmount));
418
+ const best = sorted[0];
419
+ const worst = sorted[sorted.length - 1];
420
+ if (Number(worst.toAmount) === 0)
421
+ return null;
422
+ const spread = Number(best.toAmount - worst.toAmount);
423
+ const spreadBps = Math.round((spread / Number(worst.toAmount)) * 10000);
424
+ // Find the configured threshold (default: 50 bps)
425
+ const arbDirective = this.state.directives.find((d) => d.rule === 'alert-on-arb-opportunity' && d.enabled);
426
+ const threshold = typeof arbDirective?.params['spreadBpsThreshold'] === 'number'
427
+ ? arbDirective.params['spreadBpsThreshold']
428
+ : 50;
429
+ if (spreadBps < threshold)
430
+ return null;
431
+ return {
432
+ detected: true,
433
+ spreadBps,
434
+ bestProvider: best.provider,
435
+ worstProvider: worst.provider,
436
+ };
437
+ }
438
+ // ── Directive Management ───────────────────────────────────────────────────
439
+ /** Add or replace a directive */
440
+ setDirective(directive) {
441
+ const idx = this.state.directives.findIndex((d) => d.rule === directive.rule);
442
+ if (idx >= 0) {
443
+ this.state.directives[idx] = directive;
444
+ }
445
+ else {
446
+ this.state.directives.push(directive);
447
+ }
448
+ }
449
+ /** Get all directives */
450
+ getDirectives() {
451
+ return this.state.directives;
452
+ }
453
+ // ── State Management ───────────────────────────────────────────────────────
454
+ /** Export full state for persistence */
455
+ exportState() {
456
+ return structuredClone(this.state);
457
+ }
458
+ /** Load state from previous session */
459
+ loadState(state) {
460
+ this.state = structuredClone(state);
461
+ }
462
+ /** Get current goals */
463
+ getGoals() {
464
+ return this.state.goals;
465
+ }
466
+ /** Update goals */
467
+ setGoals(goals) {
468
+ this.state.goals = goals;
469
+ }
470
+ /** Get mutation history */
471
+ getMutationHistory() {
472
+ return this.state.mutationHistory;
473
+ }
474
+ /** Get total outcomes recorded */
475
+ getTotalOutcomes() {
476
+ return this.state.totalOutcomes;
477
+ }
478
+ /** Reset all learned weights back to 1.0 */
479
+ resetWeights() {
480
+ this.state.providerWeights = { global: {}, byChain: {}, byPair: {} };
481
+ }
482
+ }
483
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../../src/swap/router/rsi/engine.ts"],"names":[],"mappings":"AAWA,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,MAAM,aAAa,GAAgB;IACjC,OAAO,EAAE,qBAAqB;IAC9B,WAAW,EAAE,EAAE;CAChB,CAAC;AAEF,gFAAgF;AAEhF,MAAM,OAAO,aAAa;IAKxB,YAAY,MAAiB,EAAE,KAAmB;QAF1C,oBAAe,GAAkB,EAAE,CAAC;QAG1C,IAAI,CAAC,MAAM,GAAG;YACZ,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,uBAAuB;YAChE,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,qBAAqB;YAC1D,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI;gBACzB,mBAAmB;gBACnB,gBAAgB;gBAChB,SAAS;gBACT,cAAc;aACf;YACD,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,gBAAgB;SAClD,CAAC;QAEF,IAAI,CAAC,KAAK,GAAG;YACX,OAAO,EAAE,aAAa;YACtB,iBAAiB,EAAE,CAAC;YACpB,aAAa,EAAE,CAAC;YAChB,eAAe,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACxD,QAAQ,EAAE,EAAE;YACZ,eAAe,EAAE,EAAE;YACnB,UAAU,EAAE,EAAE;YACd,KAAK,EAAE,KAAK,IAAI,EAAE,GAAG,aAAa,EAAE;SACrC,CAAC;IACJ,CAAC;IAED,8EAA8E;IAE9E,qFAAqF;IACrF,aAAa,CAAC,OAAoB;QAChC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAE3B,iCAAiC;QACjC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC;QACjE,CAAC;QAED,qCAAqC;QACrC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAC9D,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8EAA8E;IAE9E;iFAC6E;IAC7E,iBAAiB,CACf,QAAgB,EAChB,KAAa,EACb,SAAiB,EACjB,OAAe;QAEf,MAAM,OAAO,GAAG,GAAG,KAAK,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;QAEnD,6CAA6C;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC1E,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,UAAU,CAAC;QAEhD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC1E,IAAI,WAAW,KAAK,SAAS;YAAE,OAAO,WAAW,CAAC;QAElD,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;IAC5D,CAAC;IAED;4FACwF;IACxF,kBAAkB,CAChB,KAAa,EACb,SAAiB,EACjB,OAAe;QAEf,MAAM,OAAO,GAAG,GAAG,KAAK,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;QACnD,MAAM,MAAM,GAA2B,EAAE,CAAC;QAE1C,kBAAkB;QAClB,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YACnF,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;QAC5B,CAAC;QACD,oCAAoC;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACrE,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;QAC5B,CAAC;QACD,2CAA2C;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACrE,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7D,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;QAC5B,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,8EAA8E;IAE9E,0DAA0D;IAC1D,gBAAgB;QACd,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3C,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAE1B,MAAM,SAAS,GAAgC,EAAE,CAAC;QAClD,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAErC,4EAA4E;QAC5E,+DAA+D;QAC/D,MAAM,QAAQ,GAA2C,EAAE,CAAC;QAC5D,MAAM,UAAU,GAA2B,EAAE,CAAC;QAE9C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAE3C,MAAM,OAAO,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAE3E,0CAA0C;YAC1C,IAAI,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YACjD,IAAI,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACvD,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC/B,IAAI,GAAG,GAAG,UAAU,EAAE,CAAC;oBACrB,UAAU,GAAG,GAAG,CAAC;oBACjB,YAAY,GAAG,CAAC,CAAC,QAAQ,CAAC;gBAC5B,CAAC;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAC/C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAElD,QAAQ,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC7E,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,CAAC;QAED,sCAAsC;QACtC,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;YACvC,8DAA8D;YAC9D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACvE,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;oBACpB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS;wBAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;YAED,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC;YACvC,IAAI,YAAY,GAAG,CAAC;gBAAE,SAAS;YAC/B,MAAM,eAAe,GAAG,CAAC,GAAG,YAAY,CAAC;YAEzC,4CAA4C;YAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAEpC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAClD,CAAC;YAED,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;gBACpC,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;gBACpD,MAAM,IAAI,GAAG,aAAa,GAAG,eAAe,CAAC;gBAC7C,MAAM,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC;gBAEvC,MAAM,SAAS,GACb,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;oBACpD,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC;oBACrD,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC;oBAC3C,GAAG,CAAC;gBAEN,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC;gBAErF,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC;oBAC3C,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;oBACjE,SAAS,CAAC,IAAI,CAAC;wBACb,IAAI,EAAE,UAAU;wBAChB,QAAQ;wBACR,KAAK,EAAE,UAAU,OAAO,EAAE;wBAC1B,QAAQ,EAAE,SAAS;wBACnB,QAAQ,EAAE,SAAS;wBACnB,MAAM,EAAE,YAAY,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;qBAC3G,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,4EAA4E;QAC5E,kFAAkF;QAClF,MAAM,YAAY,GAA2B,EAAE,CAAC;QAChD,MAAM,cAAc,GAA2B,EAAE,CAAC;QAElD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,YAAY;gBAAE,SAAS;YAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC5C,IAAI,MAAM,KAAK,EAAE;gBAAE,SAAS;YAE5B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YACjD,MAAM,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;YACnC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC;YACpD,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;QAED,KAAK,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3D,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,WAAW,GAAG,GAAG,GAAG,KAAK,CAAC;YAEhC,iEAAiE;YACjE,IAAI,WAAW,IAAI,GAAG;gBAAE,SAAS;YAEjC,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,YAAY,CAAC;YACvD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;YACrE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC;YAErF,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC;gBAC3C,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;gBACxD,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,gBAAgB;oBACtB,QAAQ;oBACR,KAAK,EAAE,QAAQ;oBACf,QAAQ,EAAE,SAAS;oBACnB,QAAQ,EAAE,SAAS;oBACnB,MAAM,EAAE,sBAAsB,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB;iBAChF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,4EAA4E;QAC5E,gEAAgE;QAChE,MAAM,aAAa,GAA2B,EAAE,CAAC;QACjD,MAAM,aAAa,GAA2B,EAAE,CAAC;QAEjD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;YACnC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrB,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAED,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YACjE,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;YACxC,IAAI,WAAW,KAAK,CAAC;gBAAE,SAAS;YAEhC,MAAM,UAAU,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;YACrE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC;YAErF,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC;gBAC3C,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;gBACxD,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,cAAc;oBACpB,QAAQ;oBACR,KAAK,EAAE,QAAQ;oBACf,QAAQ,EAAE,SAAS;oBACnB,QAAQ,EAAE,SAAS;oBACnB,MAAM,EAAE,gBAAgB,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;iBAC1D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,4EAA4E;QAC5E,yDAAyD;QACzD,yDAAyD;QACzD,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,MAAM,YAAY,GAA2B,EAAE,CAAC;QAEhD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS;gBAAE,SAAS;YACjD,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBAClC,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,gBAAgB;oBAAE,SAAS;gBACtD,IAAI,CAAC,CAAC,cAAc,KAAK,CAAC;oBAAE,SAAS;gBACrC,MAAM,WAAW,GAAG,CAAC,CAAC,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;gBAC5D,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC;gBACrE,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,KAAK,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACzD,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACrC,MAAM,cAAc,GAAG,GAAG,GAAG,KAAK,CAAC;YAEnC,oFAAoF;YACpF,IAAI,cAAc,IAAI,GAAG;gBAAE,SAAS;YAEpC,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,GAAG,cAAc,CAAC,GAAG,YAAY,CAAC;YAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;YACrE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC;YAErF,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC;gBAC3C,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;gBACxD,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,cAAc;oBACpB,QAAQ;oBACR,KAAK,EAAE,QAAQ;oBACf,QAAQ,EAAE,SAAS;oBACnB,QAAQ,EAAE,SAAS;oBACnB,MAAM,EAAE,oBAAoB,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB;iBAClF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,4EAA4E;QAC5E,MAAM,MAAM,GAAmB;YAC7B,KAAK,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB;YACrC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,gBAAgB,EAAE,QAAQ,CAAC,MAAM;YACjC,SAAS;YACT,OAAO,EAAE;gBACP,uBAAuB,EAAE,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC;gBAClE,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;gBAClD,gBAAgB,EAAE,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC;gBACvD,YAAY,EAAE,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;aACjD;SACF,CAAC;QAEF,wCAAwC;QACxC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;YAC7D,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,CAAC;QACvF,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,8EAA8E;IAEtE,0BAA0B,CAAC,QAAuB;QACxD,0DAA0D;QAC1D,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;YACnC,IAAI,KAAK,KAAK,CAAC;gBAAE,SAAS;YAC1B,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;YACjD,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IACnE,CAAC;IAEO,iBAAiB,CAAC,QAAuB;QAC/C,MAAM,IAAI,GAA2B,EAAE,CAAC;QACxC,MAAM,WAAW,GAA2B,EAAE,CAAC;QAE/C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAE7C,IAAI,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YACjD,IAAI,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAEvD,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBAClC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC/B,IAAI,GAAG,GAAG,UAAU,EAAE,CAAC;oBACrB,UAAU,GAAG,GAAG,CAAC;oBACjB,YAAY,GAAG,CAAC,CAAC,QAAQ,CAAC;gBAC5B,CAAC;YACH,CAAC;YACD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5D,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;QAClD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,sBAAsB,CAAC,QAAuB;QACpD,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,YAAY;gBAAE,SAAS;YAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;YACpD,IAAI,MAAM,KAAK,CAAC;gBAAE,SAAS;YAC3B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QACxC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IACnE,CAAC;IAEO,mBAAmB,CAAC,QAAuB;QACjD,MAAM,WAAW,GAA2B,EAAE,CAAC;QAC/C,MAAM,aAAa,GAA2B,EAAE,CAAC;QAEjD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBAClC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC;gBAC7E,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1D,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,8EAA8E;IAE9E,yDAAyD;IACzD,kBAAkB,CAAC,MAIlB;QAKC,MAAM,WAAW,GAA2B,EAAE,CAAC;QAE/C,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,SAAS;YAEjC,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;gBACvB,KAAK,gBAAgB,CAAC,CAAC,CAAC;oBACtB,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;oBACvD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;wBAClE,IAAI,MAAM,CAAC,OAAO,GAAG,SAAS,EAAE,CAAC;4BAC/B,OAAO;gCACL,OAAO,EAAE,KAAK;gCACd,MAAM,EAAE,OAAO,MAAM,CAAC,OAAO,2BAA2B,SAAS,OAAO;6BACzE,CAAC;wBACJ,CAAC;oBACH,CAAC;oBACD,MAAM;gBACR,CAAC;gBAED,KAAK,sBAAsB,CAAC,CAAC,CAAC;oBAC5B,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;oBAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;wBAC9B,WAAW,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC;oBAClC,CAAC;yBAAM,CAAC;wBACN,WAAW,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU;oBAC3C,CAAC;oBACD,MAAM;gBACR,CAAC;gBAED,KAAK,0BAA0B,CAAC,CAAC,CAAC;oBAChC,gDAAgD;oBAChD,MAAM;gBACR,CAAC;gBAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;oBAC1B,iDAAiD;oBACjD,MAAM;gBACR,CAAC;gBAED,KAAK,uBAAuB,CAAC,CAAC,CAAC;oBAC7B,sDAAsD;oBACtD,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;SAC3E,CAAC;IACJ,CAAC;IAED,wDAAwD;IACxD,sBAAsB,CAAC,MAAqD;QAM1E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAEnC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAExC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAE9C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAExE,kDAAkD;QAClD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,0BAA0B,IAAI,CAAC,CAAC,OAAO,CAC1D,CAAC;QACF,MAAM,SAAS,GACb,OAAO,YAAY,EAAE,MAAM,CAAC,oBAAoB,CAAC,KAAK,QAAQ;YAC5D,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,oBAAoB,CAAC;YAC3C,CAAC,CAAC,EAAE,CAAC;QAET,IAAI,SAAS,GAAG,SAAS;YAAE,OAAO,IAAI,CAAC;QAEvC,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,SAAS;YACT,YAAY,EAAE,IAAI,CAAC,QAAQ;YAC3B,aAAa,EAAE,KAAK,CAAC,QAAQ;SAC9B,CAAC;IACJ,CAAC;IAED,8EAA8E;IAE9E,iCAAiC;IACjC,YAAY,CAAC,SAA0B;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9E,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,aAAa;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;IAC/B,CAAC;IAED,8EAA8E;IAE9E,wCAAwC;IACxC,WAAW;QACT,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,uCAAuC;IACvC,SAAS,CAAC,KAAe;QACvB,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,wBAAwB;IACxB,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,mBAAmB;IACnB,QAAQ,CAAC,KAAkB;QACzB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,2BAA2B;IAC3B,kBAAkB;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;IACpC,CAAC;IAED,kCAAkC;IAClC,gBAAgB;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;IAClC,CAAC;IAED,4CAA4C;IAC5C,YAAY;QACV,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACvE,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export { SwapRSIEngine } from './engine.js';
2
+ export type { WalletGoals, WalletDirective, DirectiveRule, RSIConfig, RSIMetric, SwapOutcome, ProviderWeights, MutationResult, RSIState, } from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/swap/router/rsi/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EACV,WAAW,EACX,eAAe,EACf,aAAa,EACb,SAAS,EACT,SAAS,EACT,WAAW,EACX,eAAe,EACf,cAAc,EACd,QAAQ,GACT,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ // [MAX-ADDED] SwapRSIEngine public API
2
+ export { SwapRSIEngine } from './engine.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/swap/router/rsi/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,106 @@
1
+ /** Goals — what the agent is optimizing for */
2
+ export interface WalletGoals {
3
+ /** Primary optimization target */
4
+ primary: 'maximize-net-output' | 'minimize-gas' | 'maximize-speed' | 'minimize-risk';
5
+ /** Hard constraints — never violated */
6
+ constraints: {
7
+ maxSlippageBps?: number;
8
+ maxGasUsd?: number;
9
+ mevProtectionRequired?: boolean;
10
+ maxSingleSwapUsd?: number;
11
+ };
12
+ /** Soft targets — tracked and optimized toward */
13
+ targets?: {
14
+ minSavingsVsBaselineBps?: number;
15
+ };
16
+ }
17
+ /** Directives — standing orders the agent follows */
18
+ export interface WalletDirective {
19
+ rule: string;
20
+ enabled: boolean;
21
+ params: Record<string, number | string | boolean>;
22
+ }
23
+ /** Built-in directive rules */
24
+ export type DirectiveRule = 'prefer-mev-protected' | 'avoid-high-gas' | 'time-based-routing' | 'pair-specific-routing' | 'alert-on-arb-opportunity';
25
+ /** RSI Configuration */
26
+ export interface RSIConfig {
27
+ enabled: boolean;
28
+ /** How many outcomes before running a mutation cycle */
29
+ learningWindow?: number;
30
+ /** Maximum parameter change per cycle (0-1) */
31
+ mutationRate?: number;
32
+ /** Metrics to track */
33
+ metrics?: RSIMetric[];
34
+ /** File path or key for persisting state */
35
+ storageKey?: string;
36
+ }
37
+ export type RSIMetric = 'provider-win-rate' | 'quote-accuracy' | 'latency' | 'failure-rate' | 'gas-accuracy' | 'fill-rate' | 'time-of-day-patterns';
38
+ /** A single recorded swap outcome */
39
+ export interface SwapOutcome {
40
+ timestamp: number;
41
+ chain: string;
42
+ fromToken: string;
43
+ toToken: string;
44
+ amount: string;
45
+ /** All quotes received (not just the winner) */
46
+ allQuotes: Array<{
47
+ provider: string;
48
+ toAmount: string;
49
+ gasEstimateUsd: number;
50
+ estimatedTimeMs: number;
51
+ mevProtected: boolean;
52
+ }>;
53
+ /** The provider that was selected */
54
+ selectedProvider: string;
55
+ /** Quoted output amount */
56
+ quotedOutput: string;
57
+ /** Actual output received (after execution) */
58
+ actualOutput?: string;
59
+ /** Actual gas paid in USD */
60
+ actualGasUsd?: number;
61
+ /** Whether the swap succeeded */
62
+ success: boolean;
63
+ /** Execution time in ms */
64
+ executionTimeMs?: number;
65
+ }
66
+ /** Learned provider weight adjustments */
67
+ export interface ProviderWeights {
68
+ /** Global weights (across all pairs) */
69
+ global: Record<string, number>;
70
+ /** Per-chain weights */
71
+ byChain: Record<string, Record<string, number>>;
72
+ /** Per-pair weights (most specific) */
73
+ byPair: Record<string, Record<string, number>>;
74
+ }
75
+ /** Result of a mutation cycle */
76
+ export interface MutationResult {
77
+ cycle: number;
78
+ timestamp: number;
79
+ outcomesAnalyzed: number;
80
+ mutations: Array<{
81
+ type: string;
82
+ provider: string;
83
+ field: string;
84
+ oldValue: number;
85
+ newValue: number;
86
+ reason: string;
87
+ }>;
88
+ metrics: {
89
+ avgSavingsVsBaselineBps: number;
90
+ providerWinRates: Record<string, number>;
91
+ avgQuoteAccuracy: number;
92
+ avgLatencyMs: Record<string, number>;
93
+ };
94
+ }
95
+ /** Full persisted RSI state */
96
+ export interface RSIState {
97
+ version: number;
98
+ lastMutationCycle: number;
99
+ totalOutcomes: number;
100
+ providerWeights: ProviderWeights;
101
+ outcomes: SwapOutcome[];
102
+ mutationHistory: MutationResult[];
103
+ directives: WalletDirective[];
104
+ goals: WalletGoals;
105
+ }
106
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/swap/router/rsi/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ // [MAX-ADDED] SwapRSIEngine types — Recursively Self-Improving swap routing brain
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/swap/router/rsi/types.ts"],"names":[],"mappings":"AAAA,kFAAkF"}