agentwallet-sdk 3.0.0 → 3.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 (214) hide show
  1. package/README.md +226 -10
  2. package/dist/fiat/index.d.ts +10 -0
  3. package/dist/fiat/index.d.ts.map +1 -0
  4. package/dist/fiat/index.js +9 -0
  5. package/dist/fiat/index.js.map +1 -0
  6. package/dist/fiat/onramp.d.ts +101 -0
  7. package/dist/fiat/onramp.d.ts.map +1 -0
  8. package/dist/fiat/onramp.js +155 -0
  9. package/dist/fiat/onramp.js.map +1 -0
  10. package/dist/fiat/providers/index.d.ts +16 -0
  11. package/dist/fiat/providers/index.d.ts.map +1 -0
  12. package/dist/fiat/providers/index.js +30 -0
  13. package/dist/fiat/providers/index.js.map +1 -0
  14. package/dist/fiat/providers/moonpay.d.ts +22 -0
  15. package/dist/fiat/providers/moonpay.d.ts.map +1 -0
  16. package/dist/fiat/providers/moonpay.js +107 -0
  17. package/dist/fiat/providers/moonpay.js.map +1 -0
  18. package/dist/fiat/providers/stripe.d.ts +26 -0
  19. package/dist/fiat/providers/stripe.d.ts.map +1 -0
  20. package/dist/fiat/providers/stripe.js +135 -0
  21. package/dist/fiat/providers/stripe.js.map +1 -0
  22. package/dist/fiat/providers/transak.d.ts +26 -0
  23. package/dist/fiat/providers/transak.d.ts.map +1 -0
  24. package/dist/fiat/providers/transak.js +119 -0
  25. package/dist/fiat/providers/transak.js.map +1 -0
  26. package/dist/fiat/types.d.ts +106 -0
  27. package/dist/fiat/types.d.ts.map +1 -0
  28. package/dist/fiat/types.js +13 -0
  29. package/dist/fiat/types.js.map +1 -0
  30. package/dist/flash/executor.d.ts +119 -0
  31. package/dist/flash/executor.d.ts.map +1 -0
  32. package/dist/flash/executor.js +195 -0
  33. package/dist/flash/executor.js.map +1 -0
  34. package/dist/flash/index.d.ts +28 -0
  35. package/dist/flash/index.d.ts.map +1 -0
  36. package/dist/flash/index.js +25 -0
  37. package/dist/flash/index.js.map +1 -0
  38. package/dist/flash/scanner.d.ts +133 -0
  39. package/dist/flash/scanner.d.ts.map +1 -0
  40. package/dist/flash/scanner.js +212 -0
  41. package/dist/flash/scanner.js.map +1 -0
  42. package/dist/flash/types.d.ts +136 -0
  43. package/dist/flash/types.d.ts.map +1 -0
  44. package/dist/flash/types.js +23 -0
  45. package/dist/flash/types.js.map +1 -0
  46. package/dist/gas/index.d.ts +4 -0
  47. package/dist/gas/index.d.ts.map +1 -0
  48. package/dist/gas/index.js +3 -0
  49. package/dist/gas/index.js.map +1 -0
  50. package/dist/gas/sponsor.d.ts +70 -0
  51. package/dist/gas/sponsor.d.ts.map +1 -0
  52. package/dist/gas/sponsor.js +193 -0
  53. package/dist/gas/sponsor.js.map +1 -0
  54. package/dist/gas/types.d.ts +76 -0
  55. package/dist/gas/types.d.ts.map +1 -0
  56. package/dist/gas/types.js +21 -0
  57. package/dist/gas/types.js.map +1 -0
  58. package/dist/index.d.ts +84 -62
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +29 -0
  61. package/dist/index.js.map +1 -1
  62. package/dist/mev/index.d.ts +4 -0
  63. package/dist/mev/index.d.ts.map +1 -0
  64. package/dist/mev/index.js +4 -0
  65. package/dist/mev/index.js.map +1 -0
  66. package/dist/mev/protection.d.ts +54 -0
  67. package/dist/mev/protection.d.ts.map +1 -0
  68. package/dist/mev/protection.js +185 -0
  69. package/dist/mev/protection.js.map +1 -0
  70. package/dist/mev/risk.d.ts +19 -0
  71. package/dist/mev/risk.d.ts.map +1 -0
  72. package/dist/mev/risk.js +95 -0
  73. package/dist/mev/risk.js.map +1 -0
  74. package/dist/mev/types.d.ts +49 -0
  75. package/dist/mev/types.d.ts.map +1 -0
  76. package/dist/mev/types.js +2 -0
  77. package/dist/mev/types.js.map +1 -0
  78. package/dist/settlement/index.d.ts +4 -0
  79. package/dist/settlement/index.d.ts.map +1 -0
  80. package/dist/settlement/index.js +3 -0
  81. package/dist/settlement/index.js.map +1 -0
  82. package/dist/settlement/types.d.ts +66 -0
  83. package/dist/settlement/types.d.ts.map +1 -0
  84. package/dist/settlement/types.js +37 -0
  85. package/dist/settlement/types.js.map +1 -0
  86. package/dist/settlement/verifier.d.ts +75 -0
  87. package/dist/settlement/verifier.d.ts.map +1 -0
  88. package/dist/settlement/verifier.js +354 -0
  89. package/dist/settlement/verifier.js.map +1 -0
  90. package/dist/solver/adapter.d.ts +47 -0
  91. package/dist/solver/adapter.d.ts.map +1 -0
  92. package/dist/solver/adapter.js +138 -0
  93. package/dist/solver/adapter.js.map +1 -0
  94. package/dist/solver/analyzer.d.ts +48 -0
  95. package/dist/solver/analyzer.d.ts.map +1 -0
  96. package/dist/solver/analyzer.js +89 -0
  97. package/dist/solver/analyzer.js.map +1 -0
  98. package/dist/solver/builder.d.ts +31 -0
  99. package/dist/solver/builder.d.ts.map +1 -0
  100. package/dist/solver/builder.js +60 -0
  101. package/dist/solver/builder.js.map +1 -0
  102. package/dist/solver/index.d.ts +22 -0
  103. package/dist/solver/index.d.ts.map +1 -0
  104. package/dist/solver/index.js +21 -0
  105. package/dist/solver/index.js.map +1 -0
  106. package/dist/solver/types.d.ts +115 -0
  107. package/dist/solver/types.d.ts.map +1 -0
  108. package/dist/solver/types.js +10 -0
  109. package/dist/solver/types.js.map +1 -0
  110. package/dist/swap/index.d.ts +1 -0
  111. package/dist/swap/index.d.ts.map +1 -1
  112. package/dist/swap/index.js +2 -0
  113. package/dist/swap/index.js.map +1 -1
  114. package/dist/swap/router/cache.d.ts +13 -0
  115. package/dist/swap/router/cache.d.ts.map +1 -0
  116. package/dist/swap/router/cache.js +30 -0
  117. package/dist/swap/router/cache.js.map +1 -0
  118. package/dist/swap/router/flashbots.d.ts +10 -0
  119. package/dist/swap/router/flashbots.d.ts.map +1 -0
  120. package/dist/swap/router/flashbots.js +43 -0
  121. package/dist/swap/router/flashbots.js.map +1 -0
  122. package/dist/swap/router/health.d.ts +17 -0
  123. package/dist/swap/router/health.d.ts.map +1 -0
  124. package/dist/swap/router/health.js +38 -0
  125. package/dist/swap/router/health.js.map +1 -0
  126. package/dist/swap/router/index.d.ts +10 -0
  127. package/dist/swap/router/index.d.ts.map +1 -0
  128. package/dist/swap/router/index.js +10 -0
  129. package/dist/swap/router/index.js.map +1 -0
  130. package/dist/swap/router/providers/cowswap.d.ts +11 -0
  131. package/dist/swap/router/providers/cowswap.d.ts.map +1 -0
  132. package/dist/swap/router/providers/cowswap.js +79 -0
  133. package/dist/swap/router/providers/cowswap.js.map +1 -0
  134. package/dist/swap/router/providers/index.d.ts +20 -0
  135. package/dist/swap/router/providers/index.d.ts.map +1 -0
  136. package/dist/swap/router/providers/index.js +32 -0
  137. package/dist/swap/router/providers/index.js.map +1 -0
  138. package/dist/swap/router/providers/jupiter.d.ts +12 -0
  139. package/dist/swap/router/providers/jupiter.d.ts.map +1 -0
  140. package/dist/swap/router/providers/jupiter.js +73 -0
  141. package/dist/swap/router/providers/jupiter.js.map +1 -0
  142. package/dist/swap/router/providers/lifi.d.ts +11 -0
  143. package/dist/swap/router/providers/lifi.d.ts.map +1 -0
  144. package/dist/swap/router/providers/lifi.js +123 -0
  145. package/dist/swap/router/providers/lifi.js.map +1 -0
  146. package/dist/swap/router/providers/oneinch.d.ts +13 -0
  147. package/dist/swap/router/providers/oneinch.d.ts.map +1 -0
  148. package/dist/swap/router/providers/oneinch.js +71 -0
  149. package/dist/swap/router/providers/oneinch.js.map +1 -0
  150. package/dist/swap/router/providers/paraswap.d.ts +11 -0
  151. package/dist/swap/router/providers/paraswap.d.ts.map +1 -0
  152. package/dist/swap/router/providers/paraswap.js +73 -0
  153. package/dist/swap/router/providers/paraswap.js.map +1 -0
  154. package/dist/swap/router/providers/uniswap.d.ts +31 -0
  155. package/dist/swap/router/providers/uniswap.d.ts.map +1 -0
  156. package/dist/swap/router/providers/uniswap.js +116 -0
  157. package/dist/swap/router/providers/uniswap.js.map +1 -0
  158. package/dist/swap/router/providers/zerox.d.ts +13 -0
  159. package/dist/swap/router/providers/zerox.d.ts.map +1 -0
  160. package/dist/swap/router/providers/zerox.js +94 -0
  161. package/dist/swap/router/providers/zerox.js.map +1 -0
  162. package/dist/swap/router/router.d.ts +86 -0
  163. package/dist/swap/router/router.d.ts.map +1 -0
  164. package/dist/swap/router/router.js +224 -0
  165. package/dist/swap/router/router.js.map +1 -0
  166. package/dist/swap/router/rsi/engine.d.ts +60 -0
  167. package/dist/swap/router/rsi/engine.d.ts.map +1 -0
  168. package/dist/swap/router/rsi/engine.js +483 -0
  169. package/dist/swap/router/rsi/engine.js.map +1 -0
  170. package/dist/swap/router/rsi/index.d.ts +3 -0
  171. package/dist/swap/router/rsi/index.d.ts.map +1 -0
  172. package/dist/swap/router/rsi/index.js +3 -0
  173. package/dist/swap/router/rsi/index.js.map +1 -0
  174. package/dist/swap/router/rsi/types.d.ts +106 -0
  175. package/dist/swap/router/rsi/types.d.ts.map +1 -0
  176. package/dist/swap/router/rsi/types.js +3 -0
  177. package/dist/swap/router/rsi/types.js.map +1 -0
  178. package/dist/swap/router/types.d.ts +120 -0
  179. package/dist/swap/router/types.d.ts.map +1 -0
  180. package/dist/swap/router/types.js +16 -0
  181. package/dist/swap/router/types.js.map +1 -0
  182. package/dist/tax/engine.d.ts +131 -0
  183. package/dist/tax/engine.d.ts.map +1 -0
  184. package/dist/tax/engine.js +307 -0
  185. package/dist/tax/engine.js.map +1 -0
  186. package/dist/tax/index.d.ts +9 -0
  187. package/dist/tax/index.d.ts.map +1 -0
  188. package/dist/tax/index.js +8 -0
  189. package/dist/tax/index.js.map +1 -0
  190. package/dist/tax/lots.d.ts +60 -0
  191. package/dist/tax/lots.d.ts.map +1 -0
  192. package/dist/tax/lots.js +129 -0
  193. package/dist/tax/lots.js.map +1 -0
  194. package/dist/tax/types.d.ts +113 -0
  195. package/dist/tax/types.d.ts.map +1 -0
  196. package/dist/tax/types.js +18 -0
  197. package/dist/tax/types.js.map +1 -0
  198. package/dist/yield/index.d.ts +26 -0
  199. package/dist/yield/index.d.ts.map +1 -0
  200. package/dist/yield/index.js +25 -0
  201. package/dist/yield/index.js.map +1 -0
  202. package/dist/yield/rates.d.ts +114 -0
  203. package/dist/yield/rates.d.ts.map +1 -0
  204. package/dist/yield/rates.js +351 -0
  205. package/dist/yield/rates.js.map +1 -0
  206. package/dist/yield/types.d.ts +134 -0
  207. package/dist/yield/types.d.ts.map +1 -0
  208. package/dist/yield/types.js +24 -0
  209. package/dist/yield/types.js.map +1 -0
  210. package/dist/yield/vault.d.ts +112 -0
  211. package/dist/yield/vault.d.ts.map +1 -0
  212. package/dist/yield/vault.js +264 -0
  213. package/dist/yield/vault.js.map +1 -0
  214. package/package.json +2 -2
@@ -0,0 +1,89 @@
1
+ export class AuctionAnalyzer {
2
+ constructor(router) {
3
+ this.router = router;
4
+ }
5
+ /**
6
+ * Analyse a single order — find the best execution route.
7
+ * Returns null if no router is configured or no viable quotes exist.
8
+ *
9
+ * NOTE: analyzeOrder is intentionally graceful — it never throws.
10
+ * A missing router or empty quote list simply returns null.
11
+ */
12
+ async analyzeOrder(order, chainId) {
13
+ if (!this.router)
14
+ return null;
15
+ try {
16
+ const quotes = await this.router.getQuotes({
17
+ fromToken: order.sellToken,
18
+ toToken: order.buyToken,
19
+ // getQuotes expects a human-readable amount string; we pass the raw
20
+ // uint256 string which is fine for comparisons in test/shadow mode.
21
+ amount: order.sellAmount,
22
+ chain: this.chainIdToName(chainId),
23
+ });
24
+ if (quotes.length === 0)
25
+ return null;
26
+ const best = quotes[0];
27
+ const limitPrice = BigInt(order.buyAmount);
28
+ // Surplus = what we can deliver ABOVE the user's limit price
29
+ const surplusBuyToken = best.toAmount > limitPrice ? best.toAmount - limitPrice : 0n;
30
+ // Simplified USD estimate (assumes 6-decimal stablecoin output)
31
+ const surplusUsd = Number(surplusBuyToken) / 1e6;
32
+ return {
33
+ order,
34
+ bestRoute: best,
35
+ surplusBuyToken,
36
+ surplusUsd,
37
+ viable: surplusBuyToken > 0n,
38
+ };
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ /**
45
+ * Find Coincidence of Wants (CoW) — orders that can trade directly.
46
+ *
47
+ * If user A wants to sell ETH for USDC and user B wants to sell USDC for
48
+ * ETH, they can settle directly with ZERO DEX fees. This is CowSwap's core
49
+ * innovation and is the primary edge for any competitive solver.
50
+ */
51
+ findCoincidenceOfWants(orders) {
52
+ const matches = [];
53
+ for (let i = 0; i < orders.length; i++) {
54
+ for (let j = i + 1; j < orders.length; j++) {
55
+ const a = orders[i];
56
+ const b = orders[j];
57
+ // Complementary: A sells what B buys, and B sells what A buys
58
+ if (a.sellToken === b.buyToken && a.buyToken === b.sellToken) {
59
+ const matchedAmount = this.calculateCoWMatch(a, b);
60
+ if (matchedAmount > 0n) {
61
+ matches.push({
62
+ orderA: a,
63
+ orderB: b,
64
+ matchedAmount,
65
+ estimatedGasSaved: 50000n, // ~50K gas saved per matched pair
66
+ });
67
+ }
68
+ }
69
+ }
70
+ }
71
+ return matches;
72
+ }
73
+ calculateCoWMatch(orderA, orderB) {
74
+ const aCanSell = BigInt(orderA.sellAmount);
75
+ const bWantsToBuy = BigInt(orderB.buyAmount); // minimum they accept
76
+ // Return the smaller of the two amounts (limited by both constraints)
77
+ return aCanSell < bWantsToBuy ? aCanSell : bWantsToBuy;
78
+ }
79
+ chainIdToName(chainId) {
80
+ const map = {
81
+ 1: 'ethereum',
82
+ 8453: 'base',
83
+ 42161: 'arbitrum',
84
+ 100: 'gnosis',
85
+ };
86
+ return map[chainId] ?? 'ethereum';
87
+ }
88
+ }
89
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/solver/analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * SolutionBuilder — Constructs CowSwap settlement solutions.
3
+ *
4
+ * Takes analysed orders (CoW matches + DEX-routed orders) and assembles
5
+ * the SolverSolution payload that is submitted to the CowSwap API.
6
+ */
7
+ import type { AggregatorQuote } from '../swap/router/types.js';
8
+ import type { CowOrder, SolverSolution } from './types.js';
9
+ export declare class SolutionBuilder {
10
+ /**
11
+ * Build a settlement solution from analysed orders.
12
+ *
13
+ * CoW-matched orders are processed first (zero DEX fees, best for users).
14
+ * DEX-routed orders are processed second, with swap calldata inserted as
15
+ * intra-transaction interactions.
16
+ */
17
+ buildSolution(params: {
18
+ auctionId: number;
19
+ orders: CowOrder[];
20
+ routes: Array<{
21
+ order: CowOrder;
22
+ route: AggregatorQuote | null;
23
+ }>;
24
+ cowMatches?: Array<{
25
+ orderA: CowOrder;
26
+ orderB: CowOrder;
27
+ matchedAmount: bigint;
28
+ }>;
29
+ }): SolverSolution;
30
+ }
31
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/solver/builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAoB,MAAM,YAAY,CAAC;AAE7E,qBAAa,eAAe;IAC1B;;;;;;OAMG;IACH,aAAa,CAAC,MAAM,EAAE;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,QAAQ,EAAE,CAAC;QACnB,MAAM,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,QAAQ,CAAC;YAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAA;SAAE,CAAC,CAAC;QAClE,UAAU,CAAC,EAAE,KAAK,CAAC;YACjB,MAAM,EAAE,QAAQ,CAAC;YACjB,MAAM,EAAE,QAAQ,CAAC;YACjB,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC,CAAC;KACJ,GAAG,cAAc;CAuDnB"}
@@ -0,0 +1,60 @@
1
+ export class SolutionBuilder {
2
+ /**
3
+ * Build a settlement solution from analysed orders.
4
+ *
5
+ * CoW-matched orders are processed first (zero DEX fees, best for users).
6
+ * DEX-routed orders are processed second, with swap calldata inserted as
7
+ * intra-transaction interactions.
8
+ */
9
+ buildSolution(params) {
10
+ const trades = [];
11
+ const interactions = {
12
+ pre: [],
13
+ intra: [],
14
+ post: [],
15
+ };
16
+ const prices = {};
17
+ // 1. Process CoW matches first — no DEX fees, pure surplus for users
18
+ for (const match of params.cowMatches ?? []) {
19
+ trades.push({
20
+ kind: 'fulfillment',
21
+ order: match.orderA.uid,
22
+ executedAmount: match.matchedAmount.toString(),
23
+ });
24
+ trades.push({
25
+ kind: 'fulfillment',
26
+ order: match.orderB.uid,
27
+ executedAmount: match.matchedAmount.toString(),
28
+ });
29
+ }
30
+ // 2. Process DEX-routed orders
31
+ for (const { order, route } of params.routes) {
32
+ if (!route)
33
+ continue;
34
+ trades.push({
35
+ kind: 'fulfillment',
36
+ order: order.uid,
37
+ executedAmount: route.toAmount.toString(),
38
+ });
39
+ // Insert swap calldata as an intra-settlement interaction
40
+ if (route.txData) {
41
+ const interaction = {
42
+ target: route.txData.to,
43
+ value: route.txData.value?.toString() ?? '0',
44
+ callData: route.txData.data ?? '0x',
45
+ };
46
+ interactions.intra.push(interaction);
47
+ }
48
+ // Set clearing prices for this token pair
49
+ prices[order.sellToken] = order.sellAmount;
50
+ prices[order.buyToken] = route.toAmount.toString();
51
+ }
52
+ return {
53
+ auctionId: params.auctionId,
54
+ trades,
55
+ interactions,
56
+ prices,
57
+ };
58
+ }
59
+ }
60
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/solver/builder.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,eAAe;IAC1B;;;;;;OAMG;IACH,aAAa,CAAC,MASb;QACC,MAAM,MAAM,GAA6B,EAAE,CAAC;QAC5C,MAAM,YAAY,GAAmC;YACnD,GAAG,EAAE,EAAE;YACP,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,EAAE;SACT,CAAC;QACF,MAAM,MAAM,GAA2B,EAAE,CAAC;QAE1C,qEAAqE;QACrE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG;gBACvB,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE;aAC/C,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG;gBACvB,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE;aAC/C,CAAC,CAAC;QACL,CAAC;QAED,+BAA+B;QAC/B,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7C,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,KAAK,CAAC,GAAG;gBAChB,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE;aAC1C,CAAC,CAAC;YAEH,0DAA0D;YAC1D,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,WAAW,GAAqB;oBACpC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;oBACvB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG;oBAC5C,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI;iBACpC,CAAC;gBACF,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACvC,CAAC;YAED,0CAA0C;YAC1C,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACrD,CAAC;QAED,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM;YACN,YAAY;YACZ,MAAM;SACP,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * CowSwap Solver Module
3
+ *
4
+ * Flips the CowSwap relationship: instead of submitting orders as a user,
5
+ * we receive auction batches and compete to fill them as a solver.
6
+ *
7
+ * ⚠️ Shadow competition is FREE — no registration, no KYC required.
8
+ * Production solver requires CowSwap DAO bonding pool approval and KYC.
9
+ *
10
+ * Quick start (shadow mode):
11
+ * ```ts
12
+ * import { CowSolverAdapter } from '@agentwallet/sdk';
13
+ * const solver = new CowSolverAdapter({ chain: 'ethereum' }, router);
14
+ * const solution = await solver.processAuction(batch);
15
+ * if (solution) await solver.submitSolution(solution);
16
+ * ```
17
+ */
18
+ export { CowSolverAdapter } from './adapter.js';
19
+ export { AuctionAnalyzer } from './analyzer.js';
20
+ export { SolutionBuilder } from './builder.js';
21
+ export type { OrderKind, SigningScheme, TokenBalance, CowOrder, CowAuctionBatch, TokenInteraction, SolverSolution, SolutionSubmissionResult, SolverStats, SolverConfig, } from './types.js';
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/solver/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EACV,SAAS,EACT,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,wBAAwB,EACxB,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * CowSwap Solver Module
3
+ *
4
+ * Flips the CowSwap relationship: instead of submitting orders as a user,
5
+ * we receive auction batches and compete to fill them as a solver.
6
+ *
7
+ * ⚠️ Shadow competition is FREE — no registration, no KYC required.
8
+ * Production solver requires CowSwap DAO bonding pool approval and KYC.
9
+ *
10
+ * Quick start (shadow mode):
11
+ * ```ts
12
+ * import { CowSolverAdapter } from '@agentwallet/sdk';
13
+ * const solver = new CowSolverAdapter({ chain: 'ethereum' }, router);
14
+ * const solution = await solver.processAuction(batch);
15
+ * if (solution) await solver.submitSolution(solution);
16
+ * ```
17
+ */
18
+ export { CowSolverAdapter } from './adapter.js';
19
+ export { AuctionAnalyzer } from './analyzer.js';
20
+ export { SolutionBuilder } from './builder.js';
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/solver/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * CowSwap Solver Adapter — Types
3
+ *
4
+ * Shadow competition is FREE. Production solver requires CowSwap DAO bonding
5
+ * pool approval and KYC. Never assume production credentials in this module.
6
+ *
7
+ * @module solver/types
8
+ */
9
+ /** CowSwap order types (from their protocol) */
10
+ export type OrderKind = 'sell' | 'buy';
11
+ export type SigningScheme = 'eip712' | 'ethsign' | 'presign' | 'eip1271';
12
+ export type TokenBalance = 'erc20' | 'internal' | 'external';
13
+ /** A single user order in a CowSwap auction batch */
14
+ export interface CowOrder {
15
+ /** Unique order UID */
16
+ uid: string;
17
+ /** Owner wallet */
18
+ owner: string;
19
+ sellToken: string;
20
+ buyToken: string;
21
+ sellAmount: string;
22
+ buyAmount: string;
23
+ feeAmount: string;
24
+ kind: OrderKind;
25
+ partiallyFillable: boolean;
26
+ sellTokenBalance: TokenBalance;
27
+ buyTokenBalance: TokenBalance;
28
+ validTo: number;
29
+ appData: string;
30
+ signingScheme: SigningScheme;
31
+ signature: string;
32
+ }
33
+ /** An auction batch that CowSwap sends to solvers */
34
+ export interface CowAuctionBatch {
35
+ id: number;
36
+ instance: {
37
+ /** The orders to settle */
38
+ orders: Record<string, CowOrder>;
39
+ /** Current on-chain token prices (used for surplus calculation) */
40
+ prices: Record<string, string>;
41
+ /** Available AMM pools for solver use */
42
+ ammsAndLiquidity?: unknown;
43
+ };
44
+ /** Auction deadline (submit before this) */
45
+ deadline: number;
46
+ }
47
+ /** A token interaction in a settlement (AMM trade, DEX swap, etc.) */
48
+ export interface TokenInteraction {
49
+ target: string;
50
+ value: string;
51
+ callData: string;
52
+ }
53
+ /** Our settlement solution to submit to CowSwap */
54
+ export interface SolverSolution {
55
+ /** Auction ID we're responding to */
56
+ auctionId: number;
57
+ /** Orders we're settling */
58
+ trades: Array<{
59
+ kind: 'fulfillment';
60
+ order: string;
61
+ executedAmount: string;
62
+ }>;
63
+ /** On-chain interactions needed to source the liquidity */
64
+ interactions: {
65
+ pre: TokenInteraction[];
66
+ intra: TokenInteraction[];
67
+ post: TokenInteraction[];
68
+ };
69
+ /** Token prices in our settlement (solver sets these, determines surplus) */
70
+ prices: Record<string, string>;
71
+ /** Gas used estimate (CowSwap v2 "score") */
72
+ score?: string;
73
+ }
74
+ /** Result of a solution submission */
75
+ export interface SolutionSubmissionResult {
76
+ success: boolean;
77
+ auctionId: number;
78
+ solutionId?: string;
79
+ won?: boolean;
80
+ surplus?: string;
81
+ error?: string;
82
+ }
83
+ /** Solver competition statistics */
84
+ export interface SolverStats {
85
+ auctionsProcessed: number;
86
+ auctionsWon: number;
87
+ auctionsLost: number;
88
+ totalSurplusGenerated: string;
89
+ winRate: number;
90
+ avgResponseTimeMs: number;
91
+ lastAuctionAt?: number;
92
+ }
93
+ /**
94
+ * Solver configuration.
95
+ *
96
+ * ⚠️ Shadow mode is the default and is FREE — no registration required.
97
+ * Production solver requires CowSwap DAO bonding pool approval and KYC.
98
+ */
99
+ export interface SolverConfig {
100
+ /** CowSwap environment (default: 'shadow') */
101
+ environment?: 'mainnet' | 'staging' | 'shadow';
102
+ /** Solver name shown in CowSwap UI (default: 'AgentWallet') */
103
+ solverName?: string;
104
+ /** Chain to operate on */
105
+ chain: string;
106
+ /** Submission endpoint override */
107
+ submissionUrl?: string;
108
+ /** Maximum gas willing to pay per settlement in Gwei (default: 50) */
109
+ maxGasGwei?: number;
110
+ /** Minimum surplus to bother submitting in USD (default: 0.5) */
111
+ minSurplusUsd?: number;
112
+ /** Response timeout ms — must be < 30s for CowSwap (default: 20000) */
113
+ responseTimeoutMs?: number;
114
+ }
115
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/solver/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * CowSwap Solver Adapter — Types
3
+ *
4
+ * Shadow competition is FREE. Production solver requires CowSwap DAO bonding
5
+ * pool approval and KYC. Never assume production credentials in this module.
6
+ *
7
+ * @module solver/types
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/solver/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -1,3 +1,4 @@
1
+ export * from './router/index.js';
1
2
  export { SwapModule, attachSwap, calcProtocolFee, applySlippage, calcDeadline } from './SwapModule.js';
2
3
  export { UniswapV3RouterAbi, UniswapV3QuoterV2Abi, ERC20Abi } from './abi.js';
3
4
  export { BASE_TOKENS, UNISWAP_V3_BASE, PROTOCOL_FEE_BPS, DEFAULT_SLIPPAGE_BPS, } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/swap/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EACL,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,cAAc,EACd,SAAS,EACT,WAAW,EACX,UAAU,EACV,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/swap/index.ts"],"names":[],"mappings":"AAEA,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EACL,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,cAAc,EACd,SAAS,EACT,WAAW,EACX,UAAU,EACV,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
@@ -1,4 +1,6 @@
1
1
  // [MAX-ADDED] SwapModule public API — Uniswap V3 aggregator with 0.875% protocol fee
2
+ // SmartSwapRouter — multi-DEX meta-aggregation
3
+ export * from './router/index.js';
2
4
  export { SwapModule, attachSwap, calcProtocolFee, applySlippage, calcDeadline } from './SwapModule.js';
3
5
  export { UniswapV3RouterAbi, UniswapV3QuoterV2Abi, ERC20Abi } from './abi.js';
4
6
  export { BASE_TOKENS, UNISWAP_V3_BASE, PROTOCOL_FEE_BPS, DEFAULT_SLIPPAGE_BPS, } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/swap/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EACL,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/swap/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,+CAA+C;AAC/C,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EACL,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { AggregatorQuote, QuoteParams } from './types.js';
2
+ export declare class QuoteCache {
3
+ private cache;
4
+ private ttlMs;
5
+ constructor(ttlMs?: number);
6
+ private key;
7
+ get(params: QuoteParams): AggregatorQuote[] | null;
8
+ set(params: QuoteParams, quotes: AggregatorQuote[]): void;
9
+ clear(): void;
10
+ /** Number of currently cached (non-expired) entries */
11
+ size(): number;
12
+ }
13
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/swap/router/cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE/D,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAuE;IACpF,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,SAAO;IAIxB,OAAO,CAAC,GAAG;IAIX,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,EAAE,GAAG,IAAI;IAUlD,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI;IAIzD,KAAK,IAAI,IAAI;IAIb,uDAAuD;IACvD,IAAI,IAAI,MAAM;CAGf"}
@@ -0,0 +1,30 @@
1
+ export class QuoteCache {
2
+ constructor(ttlMs = 3000) {
3
+ this.cache = new Map();
4
+ this.ttlMs = ttlMs;
5
+ }
6
+ key(params) {
7
+ return `${params.chain}:${params.fromToken}:${params.toToken}:${params.amount}`;
8
+ }
9
+ get(params) {
10
+ const entry = this.cache.get(this.key(params));
11
+ if (!entry)
12
+ return null;
13
+ if (Date.now() - entry.timestamp > this.ttlMs) {
14
+ this.cache.delete(this.key(params));
15
+ return null;
16
+ }
17
+ return entry.quotes;
18
+ }
19
+ set(params, quotes) {
20
+ this.cache.set(this.key(params), { quotes, timestamp: Date.now() });
21
+ }
22
+ clear() {
23
+ this.cache.clear();
24
+ }
25
+ /** Number of currently cached (non-expired) entries */
26
+ size() {
27
+ return this.cache.size;
28
+ }
29
+ }
30
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/swap/router/cache.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,UAAU;IAIrB,YAAY,KAAK,GAAG,IAAI;QAHhB,UAAK,GAAG,IAAI,GAAG,EAA4D,CAAC;QAIlF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEO,GAAG,CAAC,MAAmB;QAC7B,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;IAClF,CAAC;IAED,GAAG,CAAC,MAAmB;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,GAAG,CAAC,MAAmB,EAAE,MAAyB;QAChD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,uDAAuD;IACvD,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ export declare class FlashbotsProtectRpc {
2
+ private readonly rpcUrl;
3
+ constructor(options?: {
4
+ fast?: boolean;
5
+ useMempool?: boolean;
6
+ });
7
+ sendTransaction(signedTx: string): Promise<string>;
8
+ getTransactionStatus(txHash: string): Promise<'pending' | 'included' | 'failed' | 'unknown'>;
9
+ }
10
+ //# sourceMappingURL=flashbots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flashbots.d.ts","sourceRoot":"","sources":["../../../src/swap/router/flashbots.ts"],"names":[],"mappings":"AAOA,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE;IAOxD,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBlD,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;CASnG"}
@@ -0,0 +1,43 @@
1
+ // [MAX-ADDED] FlashbotsProtectRpc — MEV protection via Flashbots Protect RPC
2
+ // Endpoint: https://rpc.flashbots.net
3
+ // - Transactions are never sent to the public mempool
4
+ // - Failed transactions don't cost gas
5
+ // - MEV refunds if your tx creates MEV
6
+ // Only works on Ethereum mainnet.
7
+ export class FlashbotsProtectRpc {
8
+ constructor(options) {
9
+ let url = 'https://rpc.flashbots.net';
10
+ if (options?.fast)
11
+ url += '/fast';
12
+ if (options?.useMempool)
13
+ url += '?useMempool=true';
14
+ this.rpcUrl = url;
15
+ }
16
+ async sendTransaction(signedTx) {
17
+ const res = await fetch(this.rpcUrl, {
18
+ method: 'POST',
19
+ headers: { 'Content-Type': 'application/json' },
20
+ body: JSON.stringify({
21
+ jsonrpc: '2.0',
22
+ id: 1,
23
+ method: 'eth_sendRawTransaction',
24
+ params: [signedTx],
25
+ }),
26
+ });
27
+ const data = (await res.json());
28
+ if (data.error)
29
+ throw new Error(`Flashbots: ${data.error.message}`);
30
+ return data.result ?? '';
31
+ }
32
+ async getTransactionStatus(txHash) {
33
+ const res = await fetch(`https://protect.flashbots.net/tx/${txHash}`, {
34
+ headers: { 'Content-Type': 'application/json' },
35
+ });
36
+ const data = (await res.json());
37
+ const s = data.status;
38
+ if (s === 'pending' || s === 'included' || s === 'failed')
39
+ return s;
40
+ return 'unknown';
41
+ }
42
+ }
43
+ //# sourceMappingURL=flashbots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flashbots.js","sourceRoot":"","sources":["../../../src/swap/router/flashbots.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,sCAAsC;AACtC,sDAAsD;AACtD,uCAAuC;AACvC,uCAAuC;AACvC,kCAAkC;AAElC,MAAM,OAAO,mBAAmB;IAG9B,YAAY,OAAkD;QAC5D,IAAI,GAAG,GAAG,2BAA2B,CAAC;QACtC,IAAI,OAAO,EAAE,IAAI;YAAE,GAAG,IAAI,OAAO,CAAC;QAClC,IAAI,OAAO,EAAE,UAAU;YAAE,GAAG,IAAI,kBAAkB,CAAC;QACnD,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;YACnC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,CAAC;gBACL,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE,CAAC,QAAQ,CAAC;aACnB,CAAC;SACH,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAqD,CAAC;QACpF,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,MAAc;QACvC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oCAAoC,MAAM,EAAE,EAAE;YACpE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwB,CAAC;QACvD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QACpE,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ export declare class ProviderHealthTracker {
2
+ private failures;
3
+ private lastFailureTime;
4
+ private readonly maxFailures;
5
+ private readonly cooldownMs;
6
+ constructor(maxFailures?: number, cooldownMs?: number);
7
+ recordSuccess(provider: string): void;
8
+ recordFailure(provider: string): void;
9
+ isHealthy(provider: string): boolean;
10
+ getStats(): Record<string, {
11
+ failures: number;
12
+ healthy: boolean;
13
+ }>;
14
+ /** Reset a provider back to healthy state */
15
+ reset(provider: string): void;
16
+ }
17
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/swap/router/health.ts"],"names":[],"mappings":"AAEA,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,WAAW,SAAI,EAAE,UAAU,SAAQ;IAK/C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKrC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKrC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAQpC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAQlE,6CAA6C;IAC7C,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;CAI9B"}
@@ -0,0 +1,38 @@
1
+ // [MAX-ADDED] ProviderHealthTracker — circuit-breaker style health tracking for swap providers
2
+ export class ProviderHealthTracker {
3
+ constructor(maxFailures = 3, cooldownMs = 60000) {
4
+ this.failures = new Map(); // consecutive failures
5
+ this.lastFailureTime = new Map(); // timestamp of last recorded failure
6
+ this.maxFailures = maxFailures;
7
+ this.cooldownMs = cooldownMs;
8
+ }
9
+ recordSuccess(provider) {
10
+ this.failures.set(provider, 0);
11
+ this.lastFailureTime.delete(provider);
12
+ }
13
+ recordFailure(provider) {
14
+ this.failures.set(provider, (this.failures.get(provider) ?? 0) + 1);
15
+ this.lastFailureTime.set(provider, Date.now());
16
+ }
17
+ isHealthy(provider) {
18
+ const fails = this.failures.get(provider) ?? 0;
19
+ if (fails < this.maxFailures)
20
+ return true;
21
+ // After cooldown since last failure, allow retry
22
+ const lastFail = this.lastFailureTime.get(provider) ?? 0;
23
+ return Date.now() - lastFail > this.cooldownMs;
24
+ }
25
+ getStats() {
26
+ const stats = {};
27
+ for (const [name, fails] of this.failures) {
28
+ stats[name] = { failures: fails, healthy: this.isHealthy(name) };
29
+ }
30
+ return stats;
31
+ }
32
+ /** Reset a provider back to healthy state */
33
+ reset(provider) {
34
+ this.failures.delete(provider);
35
+ this.lastFailureTime.delete(provider);
36
+ }
37
+ }
38
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/swap/router/health.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,MAAM,OAAO,qBAAqB;IAMhC,YAAY,WAAW,GAAG,CAAC,EAAE,UAAU,GAAG,KAAK;QALvC,aAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,uBAAuB;QAC7D,oBAAe,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,qCAAqC;QAKxF,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,aAAa,CAAC,QAAgB;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,aAAa,CAAC,QAAgB;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,KAAK,GAAG,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAC1C,iDAAiD;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;IACjD,CAAC;IAED,QAAQ;QACN,MAAM,KAAK,GAA2D,EAAE,CAAC;QACzE,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,QAAgB;QACpB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ export { SmartSwapRouter, scoreQuote } from './router.js';
2
+ export { QuoteCache } from './cache.js';
3
+ export { ProviderHealthTracker } from './health.js';
4
+ export { FlashbotsProtectRpc } from './flashbots.js';
5
+ export { UniswapProvider, JupiterProvider, OneInchProvider, ZeroXProvider, ParaSwapProvider, CowSwapProvider, LiFiProvider, buildDefaultProviders, buildQuote, } from './providers/index.js';
6
+ export type { AggregatorQuote, AggregatorSwapResult, QuoteParams, SmartSwapConfig, SwapStrategy, ISwapProvider, TransactionReceipt, } from './types.js';
7
+ export { CHAIN_IDS, CHAIN_NAMES } from './types.js';
8
+ export { SwapRSIEngine } from './rsi/index.js';
9
+ export type { WalletGoals, WalletDirective, RSIConfig, RSIMetric, SwapOutcome, MutationResult, RSIState, ProviderWeights, } from './rsi/index.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/swap/router/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,qBAAqB,EACrB,UAAU,GACX,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,YAAY,EACZ,aAAa,EACb,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EACV,WAAW,EACX,eAAe,EACf,SAAS,EACT,SAAS,EACT,WAAW,EACX,cAAc,EACd,QAAQ,EACR,eAAe,GAChB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,10 @@
1
+ // [MAX-ADDED] SmartSwapRouter public API
2
+ export { SmartSwapRouter, scoreQuote } from './router.js';
3
+ export { QuoteCache } from './cache.js';
4
+ export { ProviderHealthTracker } from './health.js';
5
+ export { FlashbotsProtectRpc } from './flashbots.js';
6
+ export { UniswapProvider, JupiterProvider, OneInchProvider, ZeroXProvider, ParaSwapProvider, CowSwapProvider, LiFiProvider, buildDefaultProviders, buildQuote, } from './providers/index.js';
7
+ export { CHAIN_IDS, CHAIN_NAMES } from './types.js';
8
+ // [MAX-ADDED] RSI Engine
9
+ export { SwapRSIEngine } from './rsi/index.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/swap/router/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,qBAAqB,EACrB,UAAU,GACX,MAAM,sBAAsB,CAAC;AAU9B,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpD,yBAAyB;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}