agentwallet-sdk 5.0.3 → 5.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/README.md +11 -32
  2. package/dist/index.d.ts +213 -284
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -1
  5. package/dist/index.js.map +1 -1
  6. package/package.json +2 -2
  7. package/dist/ap2/index.d.ts +0 -185
  8. package/dist/ap2/index.d.ts.map +0 -1
  9. package/dist/ap2/index.js +0 -255
  10. package/dist/ap2/index.js.map +0 -1
  11. package/dist/bridge/unified.d.ts +0 -101
  12. package/dist/bridge/unified.d.ts.map +0 -1
  13. package/dist/bridge/unified.js +0 -284
  14. package/dist/bridge/unified.js.map +0 -1
  15. package/dist/chains.d.ts +0 -62
  16. package/dist/chains.d.ts.map +0 -1
  17. package/dist/chains.js +0 -108
  18. package/dist/chains.js.map +0 -1
  19. package/dist/fiat/index.d.ts +0 -10
  20. package/dist/fiat/index.d.ts.map +0 -1
  21. package/dist/fiat/index.js +0 -9
  22. package/dist/fiat/index.js.map +0 -1
  23. package/dist/fiat/onramp.d.ts +0 -101
  24. package/dist/fiat/onramp.d.ts.map +0 -1
  25. package/dist/fiat/onramp.js +0 -155
  26. package/dist/fiat/onramp.js.map +0 -1
  27. package/dist/fiat/providers/index.d.ts +0 -16
  28. package/dist/fiat/providers/index.d.ts.map +0 -1
  29. package/dist/fiat/providers/index.js +0 -30
  30. package/dist/fiat/providers/index.js.map +0 -1
  31. package/dist/fiat/providers/moonpay.d.ts +0 -22
  32. package/dist/fiat/providers/moonpay.d.ts.map +0 -1
  33. package/dist/fiat/providers/moonpay.js +0 -107
  34. package/dist/fiat/providers/moonpay.js.map +0 -1
  35. package/dist/fiat/providers/stripe.d.ts +0 -26
  36. package/dist/fiat/providers/stripe.d.ts.map +0 -1
  37. package/dist/fiat/providers/stripe.js +0 -135
  38. package/dist/fiat/providers/stripe.js.map +0 -1
  39. package/dist/fiat/providers/transak.d.ts +0 -26
  40. package/dist/fiat/providers/transak.d.ts.map +0 -1
  41. package/dist/fiat/providers/transak.js +0 -119
  42. package/dist/fiat/providers/transak.js.map +0 -1
  43. package/dist/fiat/types.d.ts +0 -106
  44. package/dist/fiat/types.d.ts.map +0 -1
  45. package/dist/fiat/types.js +0 -13
  46. package/dist/fiat/types.js.map +0 -1
  47. package/dist/flash/executor.d.ts +0 -119
  48. package/dist/flash/executor.d.ts.map +0 -1
  49. package/dist/flash/executor.js +0 -195
  50. package/dist/flash/executor.js.map +0 -1
  51. package/dist/flash/index.d.ts +0 -28
  52. package/dist/flash/index.d.ts.map +0 -1
  53. package/dist/flash/index.js +0 -29
  54. package/dist/flash/index.js.map +0 -1
  55. package/dist/flash/scanner.d.ts +0 -133
  56. package/dist/flash/scanner.d.ts.map +0 -1
  57. package/dist/flash/scanner.js +0 -212
  58. package/dist/flash/scanner.js.map +0 -1
  59. package/dist/flash/types.d.ts +0 -136
  60. package/dist/flash/types.d.ts.map +0 -1
  61. package/dist/flash/types.js +0 -23
  62. package/dist/flash/types.js.map +0 -1
  63. package/dist/gas/index.d.ts +0 -4
  64. package/dist/gas/index.d.ts.map +0 -1
  65. package/dist/gas/index.js +0 -3
  66. package/dist/gas/index.js.map +0 -1
  67. package/dist/gas/sponsor.d.ts +0 -70
  68. package/dist/gas/sponsor.d.ts.map +0 -1
  69. package/dist/gas/sponsor.js +0 -193
  70. package/dist/gas/sponsor.js.map +0 -1
  71. package/dist/gas/types.d.ts +0 -76
  72. package/dist/gas/types.d.ts.map +0 -1
  73. package/dist/gas/types.js +0 -21
  74. package/dist/gas/types.js.map +0 -1
  75. package/dist/identity/agent-identity.d.ts +0 -276
  76. package/dist/identity/agent-identity.d.ts.map +0 -1
  77. package/dist/identity/agent-identity.js +0 -300
  78. package/dist/identity/agent-identity.js.map +0 -1
  79. package/dist/identity/erc6551.d.ts +0 -441
  80. package/dist/identity/erc6551.d.ts.map +0 -1
  81. package/dist/identity/erc6551.js +0 -517
  82. package/dist/identity/erc6551.js.map +0 -1
  83. package/dist/mev/index.d.ts +0 -4
  84. package/dist/mev/index.d.ts.map +0 -1
  85. package/dist/mev/index.js +0 -8
  86. package/dist/mev/index.js.map +0 -1
  87. package/dist/mev/protection.d.ts +0 -54
  88. package/dist/mev/protection.d.ts.map +0 -1
  89. package/dist/mev/protection.js +0 -185
  90. package/dist/mev/protection.js.map +0 -1
  91. package/dist/mev/risk.d.ts +0 -19
  92. package/dist/mev/risk.d.ts.map +0 -1
  93. package/dist/mev/risk.js +0 -95
  94. package/dist/mev/risk.js.map +0 -1
  95. package/dist/mev/types.d.ts +0 -49
  96. package/dist/mev/types.d.ts.map +0 -1
  97. package/dist/mev/types.js +0 -2
  98. package/dist/mev/types.js.map +0 -1
  99. package/dist/settlement/index.d.ts +0 -4
  100. package/dist/settlement/index.d.ts.map +0 -1
  101. package/dist/settlement/index.js +0 -3
  102. package/dist/settlement/index.js.map +0 -1
  103. package/dist/settlement/types.d.ts +0 -66
  104. package/dist/settlement/types.d.ts.map +0 -1
  105. package/dist/settlement/types.js +0 -37
  106. package/dist/settlement/types.js.map +0 -1
  107. package/dist/settlement/verifier.d.ts +0 -75
  108. package/dist/settlement/verifier.d.ts.map +0 -1
  109. package/dist/settlement/verifier.js +0 -354
  110. package/dist/settlement/verifier.js.map +0 -1
  111. package/dist/solana/bridge.d.ts +0 -144
  112. package/dist/solana/bridge.d.ts.map +0 -1
  113. package/dist/solana/bridge.js +0 -352
  114. package/dist/solana/bridge.js.map +0 -1
  115. package/dist/solana/index.d.ts +0 -8
  116. package/dist/solana/index.d.ts.map +0 -1
  117. package/dist/solana/index.js +0 -6
  118. package/dist/solana/index.js.map +0 -1
  119. package/dist/solana/swap.d.ts +0 -85
  120. package/dist/solana/swap.d.ts.map +0 -1
  121. package/dist/solana/swap.js +0 -173
  122. package/dist/solana/swap.js.map +0 -1
  123. package/dist/solana/types.d.ts +0 -126
  124. package/dist/solana/types.d.ts.map +0 -1
  125. package/dist/solana/types.js +0 -10
  126. package/dist/solana/types.js.map +0 -1
  127. package/dist/solana/wallet.d.ts +0 -83
  128. package/dist/solana/wallet.d.ts.map +0 -1
  129. package/dist/solana/wallet.js +0 -164
  130. package/dist/solana/wallet.js.map +0 -1
  131. package/dist/solana/x402.d.ts +0 -69
  132. package/dist/solana/x402.d.ts.map +0 -1
  133. package/dist/solana/x402.js +0 -154
  134. package/dist/solana/x402.js.map +0 -1
  135. package/dist/solver/adapter.d.ts +0 -47
  136. package/dist/solver/adapter.d.ts.map +0 -1
  137. package/dist/solver/adapter.js +0 -146
  138. package/dist/solver/adapter.js.map +0 -1
  139. package/dist/solver/analyzer.d.ts +0 -48
  140. package/dist/solver/analyzer.d.ts.map +0 -1
  141. package/dist/solver/analyzer.js +0 -171
  142. package/dist/solver/analyzer.js.map +0 -1
  143. package/dist/solver/builder.d.ts +0 -31
  144. package/dist/solver/builder.d.ts.map +0 -1
  145. package/dist/solver/builder.js +0 -60
  146. package/dist/solver/builder.js.map +0 -1
  147. package/dist/solver/index.d.ts +0 -22
  148. package/dist/solver/index.d.ts.map +0 -1
  149. package/dist/solver/index.js +0 -25
  150. package/dist/solver/index.js.map +0 -1
  151. package/dist/solver/types.d.ts +0 -115
  152. package/dist/solver/types.d.ts.map +0 -1
  153. package/dist/solver/types.js +0 -10
  154. package/dist/solver/types.js.map +0 -1
  155. package/dist/spend-guard/index.d.ts +0 -125
  156. package/dist/spend-guard/index.d.ts.map +0 -1
  157. package/dist/spend-guard/index.js +0 -150
  158. package/dist/spend-guard/index.js.map +0 -1
  159. package/dist/swap/router/cache.d.ts +0 -13
  160. package/dist/swap/router/cache.d.ts.map +0 -1
  161. package/dist/swap/router/cache.js +0 -30
  162. package/dist/swap/router/cache.js.map +0 -1
  163. package/dist/swap/router/flashbots.d.ts +0 -10
  164. package/dist/swap/router/flashbots.d.ts.map +0 -1
  165. package/dist/swap/router/flashbots.js +0 -43
  166. package/dist/swap/router/flashbots.js.map +0 -1
  167. package/dist/swap/router/health.d.ts +0 -17
  168. package/dist/swap/router/health.d.ts.map +0 -1
  169. package/dist/swap/router/health.js +0 -38
  170. package/dist/swap/router/health.js.map +0 -1
  171. package/dist/swap/router/index.d.ts +0 -10
  172. package/dist/swap/router/index.d.ts.map +0 -1
  173. package/dist/swap/router/index.js +0 -10
  174. package/dist/swap/router/index.js.map +0 -1
  175. package/dist/swap/router/providers/cowswap.d.ts +0 -11
  176. package/dist/swap/router/providers/cowswap.d.ts.map +0 -1
  177. package/dist/swap/router/providers/cowswap.js +0 -79
  178. package/dist/swap/router/providers/cowswap.js.map +0 -1
  179. package/dist/swap/router/providers/index.d.ts +0 -20
  180. package/dist/swap/router/providers/index.d.ts.map +0 -1
  181. package/dist/swap/router/providers/index.js +0 -32
  182. package/dist/swap/router/providers/index.js.map +0 -1
  183. package/dist/swap/router/providers/jupiter.d.ts +0 -12
  184. package/dist/swap/router/providers/jupiter.d.ts.map +0 -1
  185. package/dist/swap/router/providers/jupiter.js +0 -73
  186. package/dist/swap/router/providers/jupiter.js.map +0 -1
  187. package/dist/swap/router/providers/lifi.d.ts +0 -11
  188. package/dist/swap/router/providers/lifi.d.ts.map +0 -1
  189. package/dist/swap/router/providers/lifi.js +0 -123
  190. package/dist/swap/router/providers/lifi.js.map +0 -1
  191. package/dist/swap/router/providers/oneinch.d.ts +0 -13
  192. package/dist/swap/router/providers/oneinch.d.ts.map +0 -1
  193. package/dist/swap/router/providers/oneinch.js +0 -71
  194. package/dist/swap/router/providers/oneinch.js.map +0 -1
  195. package/dist/swap/router/providers/paraswap.d.ts +0 -11
  196. package/dist/swap/router/providers/paraswap.d.ts.map +0 -1
  197. package/dist/swap/router/providers/paraswap.js +0 -73
  198. package/dist/swap/router/providers/paraswap.js.map +0 -1
  199. package/dist/swap/router/providers/uniswap.d.ts +0 -31
  200. package/dist/swap/router/providers/uniswap.d.ts.map +0 -1
  201. package/dist/swap/router/providers/uniswap.js +0 -237
  202. package/dist/swap/router/providers/uniswap.js.map +0 -1
  203. package/dist/swap/router/providers/zerox.d.ts +0 -13
  204. package/dist/swap/router/providers/zerox.d.ts.map +0 -1
  205. package/dist/swap/router/providers/zerox.js +0 -94
  206. package/dist/swap/router/providers/zerox.js.map +0 -1
  207. package/dist/swap/router/router.d.ts +0 -86
  208. package/dist/swap/router/router.d.ts.map +0 -1
  209. package/dist/swap/router/router.js +0 -224
  210. package/dist/swap/router/router.js.map +0 -1
  211. package/dist/swap/router/rsi/engine.d.ts +0 -60
  212. package/dist/swap/router/rsi/engine.d.ts.map +0 -1
  213. package/dist/swap/router/rsi/engine.js +0 -483
  214. package/dist/swap/router/rsi/engine.js.map +0 -1
  215. package/dist/swap/router/rsi/index.d.ts +0 -3
  216. package/dist/swap/router/rsi/index.d.ts.map +0 -1
  217. package/dist/swap/router/rsi/index.js +0 -3
  218. package/dist/swap/router/rsi/index.js.map +0 -1
  219. package/dist/swap/router/rsi/types.d.ts +0 -106
  220. package/dist/swap/router/rsi/types.d.ts.map +0 -1
  221. package/dist/swap/router/rsi/types.js +0 -3
  222. package/dist/swap/router/rsi/types.js.map +0 -1
  223. package/dist/swap/router/types.d.ts +0 -120
  224. package/dist/swap/router/types.d.ts.map +0 -1
  225. package/dist/swap/router/types.js +0 -16
  226. package/dist/swap/router/types.js.map +0 -1
  227. package/dist/tax/engine.d.ts +0 -131
  228. package/dist/tax/engine.d.ts.map +0 -1
  229. package/dist/tax/engine.js +0 -307
  230. package/dist/tax/engine.js.map +0 -1
  231. package/dist/tax/index.d.ts +0 -9
  232. package/dist/tax/index.d.ts.map +0 -1
  233. package/dist/tax/index.js +0 -12
  234. package/dist/tax/index.js.map +0 -1
  235. package/dist/tax/lots.d.ts +0 -60
  236. package/dist/tax/lots.d.ts.map +0 -1
  237. package/dist/tax/lots.js +0 -129
  238. package/dist/tax/lots.js.map +0 -1
  239. package/dist/tax/types.d.ts +0 -113
  240. package/dist/tax/types.d.ts.map +0 -1
  241. package/dist/tax/types.js +0 -18
  242. package/dist/tax/types.js.map +0 -1
  243. package/dist/verifiable-intent/index.d.ts +0 -84
  244. package/dist/verifiable-intent/index.js +0 -385
  245. package/dist/yield/index.d.ts +0 -26
  246. package/dist/yield/index.d.ts.map +0 -1
  247. package/dist/yield/index.js +0 -29
  248. package/dist/yield/index.js.map +0 -1
  249. package/dist/yield/rates.d.ts +0 -114
  250. package/dist/yield/rates.d.ts.map +0 -1
  251. package/dist/yield/rates.js +0 -351
  252. package/dist/yield/rates.js.map +0 -1
  253. package/dist/yield/types.d.ts +0 -134
  254. package/dist/yield/types.d.ts.map +0 -1
  255. package/dist/yield/types.js +0 -24
  256. package/dist/yield/types.js.map +0 -1
  257. package/dist/yield/vault.d.ts +0 -112
  258. package/dist/yield/vault.d.ts.map +0 -1
  259. package/dist/yield/vault.js +0 -264
  260. package/dist/yield/vault.js.map +0 -1
@@ -1,154 +0,0 @@
1
- // [MAX-ADDED] Solana x402 payment support — handles 'solana:mainnet' network in x402 offers.
2
- // SPL token (USDC) payment signing + proof construction, compatible with x402 protocol spec.
3
- import { PublicKey, Transaction, SystemProgram, } from '@solana/web3.js';
4
- import { getAssociatedTokenAddress, createTransferInstruction, } from '@solana/spl-token';
5
- import { SOLANA_USDC_MINT, SOLANA_USDC_DEVNET_MINT, SOL_NATIVE_MINT } from './types.js';
6
- /** x402 version this client implements */
7
- const X402_VERSION = 1;
8
- /** Default USDC mint per network */
9
- export const SOLANA_NETWORK_USDC = {
10
- 'solana:mainnet': SOLANA_USDC_MINT,
11
- 'solana:devnet': SOLANA_USDC_DEVNET_MINT,
12
- };
13
- /**
14
- * SolanaX402Client — handles x402 payment flows on Solana.
15
- *
16
- * Flow:
17
- * 1. Receive x402 PaymentRequired with network='solana:mainnet'
18
- * 2. Build an SPL token transfer transaction (USDC → payTo)
19
- * 3. Sign with agent's Ed25519 keypair
20
- * 4. Return base64-serialized signed tx as payment proof
21
- * 5. Optionally broadcast and return tx signature
22
- *
23
- * Non-custodial: private key never leaves the SolanaWallet instance.
24
- */
25
- export class SolanaX402Client {
26
- constructor(wallet) {
27
- this.wallet = wallet;
28
- }
29
- /**
30
- * Determine if this client can handle a given x402 network string.
31
- */
32
- canHandle(network) {
33
- return network === 'solana:mainnet' || network === 'solana:devnet';
34
- }
35
- /**
36
- * Build and sign a USDC SPL token payment for x402.
37
- *
38
- * Does NOT broadcast — returns signed tx as base64 for the caller to submit.
39
- * This matches the x402 pattern where the client returns a payment proof
40
- * that the facilitator can verify and then settle.
41
- *
42
- * @param requirements - Payment requirements from the x402 402 response
43
- * @returns SolanaX402PaymentProof with signed transaction
44
- */
45
- async buildPaymentProof(requirements) {
46
- if (!this.canHandle(requirements.network)) {
47
- throw new Error(`SolanaX402Client cannot handle network: ${requirements.network}. ` +
48
- `Supported: solana:mainnet, solana:devnet`);
49
- }
50
- const amount = BigInt(requirements.amount);
51
- if (amount <= 0n) {
52
- throw new Error(`Invalid x402 payment amount: ${requirements.amount}`);
53
- }
54
- const mint = requirements.asset;
55
- const recipient = new PublicKey(requirements.payTo);
56
- const sender = this.wallet.getPublicKey();
57
- const connection = this.wallet.getConnection();
58
- // Build the SPL transfer transaction
59
- const tx = new Transaction();
60
- if (mint === SOL_NATIVE_MINT) {
61
- // Native SOL payment
62
- tx.add(SystemProgram.transfer({
63
- fromPubkey: sender,
64
- toPubkey: recipient,
65
- lamports: Number(amount),
66
- }));
67
- }
68
- else {
69
- // SPL token payment (USDC or other)
70
- const mintPubkey = new PublicKey(mint);
71
- const senderAta = await getAssociatedTokenAddress(mintPubkey, sender);
72
- const recipientAta = await getAssociatedTokenAddress(mintPubkey, recipient);
73
- tx.add(createTransferInstruction(senderAta, recipientAta, sender, Number(amount)));
74
- }
75
- // Sign the transaction (with blockhash for validity)
76
- const signedTxBase64 = await this.wallet.signTransactionBase64(tx);
77
- return {
78
- x402Version: X402_VERSION,
79
- network: requirements.network,
80
- mint,
81
- recipient: requirements.payTo,
82
- amount: requirements.amount,
83
- sender: this.wallet.getAddress(),
84
- signedTransaction: signedTxBase64,
85
- };
86
- }
87
- /**
88
- * Build payment proof AND broadcast the transaction to Solana.
89
- * Returns the proof enriched with the on-chain tx signature.
90
- *
91
- * @param requirements - Payment requirements from 402 response
92
- * @returns SolanaX402PaymentProof with txSignature populated
93
- */
94
- async pay(requirements) {
95
- const proof = await this.buildPaymentProof(requirements);
96
- // Broadcast
97
- const txSignature = await this.wallet.transfer({
98
- recipient: requirements.payTo,
99
- amount: BigInt(requirements.amount),
100
- mint: requirements.asset !== SOL_NATIVE_MINT ? requirements.asset : undefined,
101
- });
102
- return { ...proof, txSignature };
103
- }
104
- /**
105
- * Validate that payment requirements are acceptable before paying.
106
- *
107
- * Checks:
108
- * - Network is Solana (mainnet or devnet)
109
- * - Asset is USDC or native SOL
110
- * - Amount > 0
111
- * - maxTimeoutSeconds is reasonable
112
- */
113
- validateRequirements(requirements, options = {}) {
114
- if (!this.canHandle(requirements.network)) {
115
- return { valid: false, reason: `Unsupported network: ${requirements.network}` };
116
- }
117
- const amount = BigInt(requirements.amount);
118
- if (amount <= 0n) {
119
- return { valid: false, reason: 'Amount must be > 0' };
120
- }
121
- if (options.maxAmount !== undefined && amount > options.maxAmount) {
122
- return {
123
- valid: false,
124
- reason: `Amount ${amount} exceeds max allowed ${options.maxAmount}`,
125
- };
126
- }
127
- const expectedUsdc = SOLANA_NETWORK_USDC[requirements.network];
128
- const allowedMints = options.allowedMints ?? [expectedUsdc, SOL_NATIVE_MINT];
129
- if (!allowedMints.includes(requirements.asset)) {
130
- return {
131
- valid: false,
132
- reason: `Asset ${requirements.asset} not in allowed mints: ${allowedMints.join(', ')}`,
133
- };
134
- }
135
- if (requirements.maxTimeoutSeconds <= 0) {
136
- return { valid: false, reason: 'maxTimeoutSeconds must be > 0' };
137
- }
138
- try {
139
- new PublicKey(requirements.payTo);
140
- }
141
- catch {
142
- return { valid: false, reason: `Invalid recipient public key: ${requirements.payTo}` };
143
- }
144
- return { valid: true };
145
- }
146
- }
147
- /**
148
- * Factory: create a SolanaX402Client from a SolanaWallet.
149
- */
150
- export function createSolanaX402Client(wallet) {
151
- return new SolanaX402Client(wallet);
152
- }
153
- export { SOLANA_USDC_MINT, SOLANA_USDC_DEVNET_MINT };
154
- //# sourceMappingURL=x402.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"x402.js","sourceRoot":"","sources":["../../src/solana/x402.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,6FAA6F;AAE7F,OAAO,EACL,SAAS,EACT,WAAW,EACX,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGxF,0CAA0C;AAC1C,MAAM,YAAY,GAAG,CAAC,CAAC;AAKvB,oCAAoC;AACpC,MAAM,CAAC,MAAM,mBAAmB,GAAsC;IACpE,gBAAgB,EAAE,gBAAgB;IAClC,eAAe,EAAE,uBAAuB;CACzC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,gBAAgB;IAG3B,YAAY,MAAoB;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAe;QACvB,OAAO,OAAO,KAAK,gBAAgB,IAAI,OAAO,KAAK,eAAe,CAAC;IACrE,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,iBAAiB,CACrB,YAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,2CAA2C,YAAY,CAAC,OAAO,IAAI;gBACnE,0CAA0C,CAC3C,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAE/C,qCAAqC;QACrC,MAAM,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC;QAE7B,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YAC7B,qBAAqB;YACrB,EAAE,CAAC,GAAG,CACJ,aAAa,CAAC,QAAQ,CAAC;gBACrB,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,SAAS;gBACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;aACzB,CAAC,CACH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,oCAAoC;YACpC,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACtE,MAAM,YAAY,GAAG,MAAM,yBAAyB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAE5E,EAAE,CAAC,GAAG,CACJ,yBAAyB,CACvB,SAAS,EACT,YAAY,EACZ,MAAM,EACN,MAAM,CAAC,MAAM,CAAC,CACf,CACF,CAAC;QACJ,CAAC;QAED,qDAAqD;QACrD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAEnE,OAAO;YACL,WAAW,EAAE,YAAY;YACzB,OAAO,EAAE,YAAY,CAAC,OAAO;YAC7B,IAAI;YACJ,SAAS,EAAE,YAAY,CAAC,KAAK;YAC7B,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;YAChC,iBAAiB,EAAE,cAAc;SAClC,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,CAAC,YAAoC;QAC5C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAEzD,YAAY;QACZ,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC7C,SAAS,EAAE,YAAY,CAAC,KAAK;YAC7B,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;YACnC,IAAI,EAAE,YAAY,CAAC,KAAK,KAAK,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SAC9E,CAAC,CAAC;QAEH,OAAO,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC;IACnC,CAAC;IAED;;;;;;;;OAQG;IACH,oBAAoB,CAClB,YAAoC,EACpC,UAA2D,EAAE;QAE7D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QAClF,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;QACxD,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YAClE,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,UAAU,MAAM,wBAAwB,OAAO,CAAC,SAAS,EAAE;aACpE,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,mBAAmB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC/D,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAC7E,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,SAAS,YAAY,CAAC,KAAK,0BAA0B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACvF,CAAC;QACJ,CAAC;QAED,IAAI,YAAY,CAAC,iBAAiB,IAAI,CAAC,EAAE,CAAC;YACxC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAC;QACnE,CAAC;QAED,IAAI,CAAC;YACH,IAAI,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,iCAAiC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;QACzF,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAoB;IACzD,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAID,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,CAAC"}
@@ -1,47 +0,0 @@
1
- /**
2
- * CowSolverAdapter — Main entry point for the CowSwap solver integration.
3
- *
4
- * ⚠️ IMPORTANT: Shadow competition is FREE and requires no registration or KYC.
5
- * Production solver requires CowSwap DAO bonding pool approval and KYC.
6
- * This adapter defaults to 'shadow' mode — never assume production credentials.
7
- *
8
- * Flow:
9
- * 1. CowSwap broadcasts an auction batch to all registered solvers.
10
- * 2. We call processAuction() — must return within ~30 seconds.
11
- * 3. We detect CoW (Coincidence of Wants) first — zero DEX fees.
12
- * 4. Remaining orders are routed through SmartSwapRouter (7 DEXes in parallel).
13
- * 5. We call submitSolution() with the best settlement we can construct.
14
- * 6. If we win, we earn the surplus above user limit prices.
15
- */
16
- import type { SmartSwapRouter } from '../swap/router/router.js';
17
- import type { CowAuctionBatch, SolverConfig, SolverSolution, SolverStats, SolutionSubmissionResult } from './types.js';
18
- export declare class CowSolverAdapter {
19
- private config;
20
- private analyzer;
21
- private builder;
22
- private stats;
23
- /** CowSwap competition API endpoints */
24
- private readonly ENDPOINTS;
25
- constructor(config: SolverConfig, router?: SmartSwapRouter);
26
- /**
27
- * Process an auction batch and return our best settlement solution.
28
- *
29
- * Called when CowSwap sends us an auction. Must respond within 30 seconds.
30
- * Returns null if we have nothing viable to submit.
31
- */
32
- processAuction(batch: CowAuctionBatch): Promise<SolverSolution | null>;
33
- /**
34
- * Submit a solution to CowSwap.
35
- *
36
- * In shadow mode, the solution is evaluated but never executed on-chain —
37
- * useful for measuring competitiveness before applying for the production
38
- * bonding pool.
39
- */
40
- submitSolution(solution: SolverSolution): Promise<SolutionSubmissionResult>;
41
- /** Get current solver performance statistics */
42
- getStats(): SolverStats;
43
- /** Get the CowSwap API base URL for the configured environment */
44
- getApiUrl(): string;
45
- private getChainId;
46
- }
47
- //# sourceMappingURL=adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/solver/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,cAAc,EACd,WAAW,EACX,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAIpB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,KAAK,CAAc;IAE3B,wCAAwC;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAIxB;gBAEU,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,eAAe;IAyB1D;;;;;OAKG;IACG,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAmD5E;;;;;;OAMG;IACG,cAAc,CAClB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,wBAAwB,CAAC;IAgDpC,gDAAgD;IAChD,QAAQ,IAAI,WAAW;IAIvB,kEAAkE;IAClE,SAAS,IAAI,MAAM;IAInB,OAAO,CAAC,UAAU;CASnB"}
@@ -1,146 +0,0 @@
1
- import { AuctionAnalyzer } from './analyzer.js';
2
- import { SolutionBuilder } from './builder.js';
3
- export class CowSolverAdapter {
4
- constructor(config, router) {
5
- /** CowSwap competition API endpoints */
6
- this.ENDPOINTS = {
7
- shadow: 'https://api.cow.fi/mainnet/api/v1/solver_competition',
8
- staging: 'https://barn.api.cow.fi/mainnet/api/v1/solver_competition',
9
- mainnet: 'https://api.cow.fi/mainnet/api/v1/solver_competition',
10
- };
11
- // Optional custom fetch (e.g. SOCKS proxy-aware) — falls back to global fetch
12
- this.fetchFn = config.fetchFn ?? globalThis.fetch.bind(globalThis);
13
- this.config = {
14
- environment: 'shadow',
15
- solverName: 'AgentWallet',
16
- maxGasGwei: 50,
17
- minSurplusUsd: 0.5,
18
- responseTimeoutMs: 20000,
19
- submissionUrl: '',
20
- ...config,
21
- };
22
- this.analyzer = new AuctionAnalyzer(router);
23
- this.builder = new SolutionBuilder();
24
- this.stats = {
25
- auctionsProcessed: 0,
26
- auctionsWon: 0,
27
- auctionsLost: 0,
28
- totalSurplusGenerated: '0',
29
- winRate: 0,
30
- avgResponseTimeMs: 0,
31
- lastAuctionAt: undefined,
32
- };
33
- }
34
- /**
35
- * Process an auction batch and return our best settlement solution.
36
- *
37
- * Called when CowSwap sends us an auction. Must respond within 30 seconds.
38
- * Returns null if we have nothing viable to submit.
39
- */
40
- async processAuction(batch) {
41
- const startTime = Date.now();
42
- this.stats.auctionsProcessed++;
43
- this.stats.lastAuctionAt = startTime;
44
- const orders = Object.values(batch.instance.orders);
45
- if (orders.length === 0)
46
- return null;
47
- // Step 1: Find Coincidence of Wants — best outcome for users, no DEX fees
48
- const cowMatches = this.analyzer.findCoincidenceOfWants(orders);
49
- // Step 2: Route remaining orders through SmartSwapRouter (streaming batches)
50
- const matchedOrderIds = new Set(cowMatches.flatMap((m) => [m.orderA.uid, m.orderB.uid]));
51
- const remainingOrders = orders.filter((o) => !matchedOrderIds.has(o.uid));
52
- // CYCLE 1 FIX: Stream orders in chunks of 20 for lower latency
53
- const CHUNK_SIZE = 20;
54
- const routes = [];
55
- for (let i = 0; i < remainingOrders.length; i += CHUNK_SIZE) {
56
- const chunk = remainingOrders.slice(i, i + CHUNK_SIZE);
57
- const chunkResults = await Promise.all(chunk.map((order) => this.analyzer
58
- .analyzeOrder(order, this.getChainId())
59
- .then((result) => result ? { order, route: result.bestRoute } : { order, route: null })));
60
- routes.push(...chunkResults);
61
- }
62
- // Step 3: Only keep orders we can actually fill
63
- const viableRoutes = routes.filter((r) => r.route !== null);
64
- // Step 4: Nothing to submit?
65
- if (viableRoutes.length === 0 && cowMatches.length === 0)
66
- return null;
67
- // Step 5: Assemble the solution
68
- const solution = this.builder.buildSolution({
69
- auctionId: batch.id,
70
- orders,
71
- routes: viableRoutes,
72
- cowMatches,
73
- });
74
- // Step 6: Update timing stats
75
- const elapsed = Date.now() - startTime;
76
- this.stats.avgResponseTimeMs =
77
- (this.stats.avgResponseTimeMs * (this.stats.auctionsProcessed - 1) +
78
- elapsed) /
79
- this.stats.auctionsProcessed;
80
- return solution;
81
- }
82
- /**
83
- * Submit a solution to CowSwap.
84
- *
85
- * In shadow mode, the solution is evaluated but never executed on-chain —
86
- * useful for measuring competitiveness before applying for the production
87
- * bonding pool.
88
- */
89
- async submitSolution(solution) {
90
- const endpoint = this.config.submissionUrl ||
91
- this.ENDPOINTS[this.config.environment];
92
- try {
93
- const response = await this.fetchFn(`${endpoint}/solutions`, {
94
- method: 'POST',
95
- headers: { 'Content-Type': 'application/json' },
96
- body: JSON.stringify({
97
- auctionId: solution.auctionId,
98
- trades: solution.trades,
99
- interactions: solution.interactions,
100
- prices: solution.prices,
101
- }),
102
- });
103
- if (!response.ok) {
104
- const text = await response.text();
105
- return {
106
- success: false,
107
- auctionId: solution.auctionId,
108
- error: text,
109
- };
110
- }
111
- const result = (await response.json());
112
- return {
113
- success: true,
114
- auctionId: solution.auctionId,
115
- solutionId: result.id,
116
- won: result.winner === this.config.solverName,
117
- surplus: result.surplus,
118
- };
119
- }
120
- catch (err) {
121
- return {
122
- success: false,
123
- auctionId: solution.auctionId,
124
- error: err instanceof Error ? err.message : 'Unknown error',
125
- };
126
- }
127
- }
128
- /** Get current solver performance statistics */
129
- getStats() {
130
- return { ...this.stats };
131
- }
132
- /** Get the CowSwap API base URL for the configured environment */
133
- getApiUrl() {
134
- return this.ENDPOINTS[this.config.environment];
135
- }
136
- getChainId() {
137
- const map = {
138
- ethereum: 1,
139
- base: 8453,
140
- arbitrum: 42161,
141
- gnosis: 100,
142
- };
143
- return map[this.config.chain] ?? 1;
144
- }
145
- }
146
- //# sourceMappingURL=adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/solver/adapter.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,OAAO,gBAAgB;IAa3B,YAAY,MAAoB,EAAE,MAAwB;QAP1D,wCAAwC;QACvB,cAAS,GAA2B;YACnD,MAAM,EAAE,sDAAsD;YAC9D,OAAO,EAAE,2DAA2D;YACpE,OAAO,EAAE,sDAAsD;SAChE,CAAC;QAGA,IAAI,CAAC,MAAM,GAAG;YACZ,WAAW,EAAE,QAAQ;YACrB,UAAU,EAAE,aAAa;YACzB,UAAU,EAAE,EAAE;YACd,aAAa,EAAE,GAAG;YAClB,iBAAiB,EAAE,KAAK;YACxB,aAAa,EAAE,EAAE;YACjB,GAAG,MAAM;SACV,CAAC;QAEF,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QAErC,IAAI,CAAC,KAAK,GAAG;YACX,iBAAiB,EAAE,CAAC;YACpB,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,qBAAqB,EAAE,GAAG;YAC1B,OAAO,EAAE,CAAC;YACV,iBAAiB,EAAE,CAAC;YACpB,aAAa,EAAE,SAAS;SACzB,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAAC,KAAsB;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC;QAErC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAErC,0EAA0E;QAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAEhE,yDAAyD;QACzD,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CACxD,CAAC;QACF,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE1E,MAAM,gBAAgB,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACrD,IAAI,CAAC,QAAQ;aACV,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;aACtC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACf,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CACrE,CACJ,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAEnD,gDAAgD;QAChD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;QAE5D,6BAA6B;QAC7B,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtE,gCAAgC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;YAC1C,SAAS,EAAE,KAAK,CAAC,EAAE;YACnB,MAAM;YACN,MAAM,EAAE,YAAY;YACpB,UAAU;SACX,CAAC,CAAC;QAEH,8BAA8B;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,iBAAiB;YAC1B,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBAChE,OAAO,CAAC;gBACV,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAE/B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,cAAc,CAClB,QAAwB;QAExB,MAAM,QAAQ,GACZ,IAAI,CAAC,MAAM,CAAC,aAAa;YACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,YAAY,EAAE;gBACpD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,YAAY,EAAE,QAAQ,CAAC,YAAY;oBACnC,MAAM,EAAE,QAAQ,CAAC,MAAM;iBACxB,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,KAAK,EAAE,IAAI;iBACZ,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAIpC,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,UAAU,EAAE,MAAM,CAAC,EAAE;gBACrB,GAAG,EAAE,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU;gBAC7C,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAC5D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,QAAQ;QACN,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,kEAAkE;IAClE,SAAS;QACP,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACjD,CAAC;IAEO,UAAU;QAChB,MAAM,GAAG,GAA2B;YAClC,QAAQ,EAAE,CAAC;YACX,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,GAAG;SACZ,CAAC;QACF,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;CACF"}
@@ -1,48 +0,0 @@
1
- /**
2
- * AuctionAnalyzer — Core intelligence for CowSwap solver.
3
- *
4
- * Given an auction batch, finds the best execution route for each order
5
- * by leveraging SmartSwapRouter (7 DEX aggregators queried in parallel).
6
- *
7
- * Also detects Coincidence of Wants (CoW): orders that can settle directly
8
- * without any DEX, saving gas and maximising user surplus.
9
- */
10
- import type { SmartSwapRouter } from '../swap/router/router.js';
11
- import type { AggregatorQuote } from '../swap/router/types.js';
12
- import type { CowOrder } from './types.js';
13
- export declare class AuctionAnalyzer {
14
- private router?;
15
- constructor(router?: SmartSwapRouter | undefined);
16
- /**
17
- * Analyse a single order — find the best execution route.
18
- * Returns null if no router is configured or no viable quotes exist.
19
- *
20
- * NOTE: analyzeOrder is intentionally graceful — it never throws.
21
- * A missing router or empty quote list simply returns null.
22
- */
23
- analyzeOrder(order: CowOrder, chainId: number): Promise<{
24
- order: CowOrder;
25
- bestRoute: AggregatorQuote | null;
26
- /** Surplus vs the order's limit price in buy-token units */
27
- surplusBuyToken: bigint;
28
- /** Surplus in USD (simplified) */
29
- surplusUsd: number;
30
- viable: boolean;
31
- } | null>;
32
- /**
33
- * Find Coincidence of Wants (CoW) — orders that can trade directly.
34
- *
35
- * If user A wants to sell ETH for USDC and user B wants to sell USDC for
36
- * ETH, they can settle directly with ZERO DEX fees. This is CowSwap's core
37
- * innovation and is the primary edge for any competitive solver.
38
- */
39
- findCoincidenceOfWants(orders: CowOrder[]): Array<{
40
- orderA: CowOrder;
41
- orderB: CowOrder;
42
- matchedAmount: bigint;
43
- estimatedGasSaved: bigint;
44
- }>;
45
- private calculateCoWMatch;
46
- private chainIdToName;
47
- }
48
- //# sourceMappingURL=analyzer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/solver/analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,qBAAa,eAAe;IACd,OAAO,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,6BAAiB;IAE5C;;;;;;OAMG;IACG,YAAY,CAChB,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QACT,KAAK,EAAE,QAAQ,CAAC;QAChB,SAAS,EAAE,eAAe,GAAG,IAAI,CAAC;QAClC,4DAA4D;QAC5D,eAAe,EAAE,MAAM,CAAC;QACxB,kCAAkC;QAClC,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,OAAO,CAAC;KACjB,GAAG,IAAI,CAAC;IAqCT;;;;;;OAMG;IACH,sBAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;QAChD,MAAM,EAAE,QAAQ,CAAC;QACjB,MAAM,EAAE,QAAQ,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IA+BF,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,aAAa;CAStB"}
@@ -1,171 +0,0 @@
1
- // ─── Known token decimals (mainnet + Arbitrum) ────────────────────────────────
2
- const KNOWN_DECIMALS = {
3
- '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2': 18, // WETH mainnet
4
- '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48': 6, // USDC mainnet
5
- '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599': 8, // WBTC
6
- '0x6b175474e89094c44da98b954eedeac495271d0f': 18, // DAI
7
- '0xaf88d065e77c8cc2239327c5edb3a432268e5831': 6, // USDC Arbitrum
8
- '0x82af49447d8a07e3bd95bd0d56f35241523fbab1': 18, // WETH Arbitrum
9
- '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9': 6, // USDT Arbitrum
10
- '0xff970a61a04b1ca14834a43f5de4533ebddb5cc8': 6, // USDC.e Arbitrum
11
- '0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f': 8, // WBTC Arbitrum
12
- '0xda10009cbd5d07dd0cecc66161fc93d7c9000da1': 18, // DAI Arbitrum
13
- };
14
-
15
- function getTokenDecimals(tokenAddr) {
16
- const lower = tokenAddr.toLowerCase();
17
- return KNOWN_DECIMALS[lower] ?? 18; // default to 18 (ETH-like)
18
- }
19
-
20
- export class AuctionAnalyzer {
21
- constructor(router) {
22
- this.router = router;
23
- }
24
-
25
- toChecksumAddress(addr) {
26
- // Ensure 0x prefix; Uniswap API accepts lowercase addresses
27
- if (!addr) return addr;
28
- const hex = addr.startsWith('0x') ? addr : '0x' + addr;
29
- return hex.toLowerCase();
30
- }
31
-
32
- /**
33
- * Analyse a single order — find the best execution route.
34
- * Returns null if no router is configured or no viable quotes exist.
35
- *
36
- * NOTE: analyzeOrder is intentionally graceful — it never throws.
37
- * A missing router or empty quote list simply returns null.
38
- * Errors are logged (not swallowed silently) for debugging.
39
- */
40
- async analyzeOrder(order, chainId) {
41
- if (!this.router)
42
- return null;
43
- try {
44
- // Normalize addresses (Uniswap API accepts lowercase)
45
- const fromToken = this.toChecksumAddress(order.sellToken);
46
- const toToken = this.toChecksumAddress(order.buyToken);
47
- const quotes = await this.router.getQuotes({
48
- fromToken,
49
- toToken,
50
- // Wei string — Uniswap API accepts raw uint256 as amount
51
- amount: order.sellAmount,
52
- chain: this.chainIdToName(chainId),
53
- });
54
- if (quotes.length === 0)
55
- return null;
56
- const best = quotes[0];
57
- const limitPrice = BigInt(order.buyAmount);
58
- // Surplus = what we can deliver ABOVE the user's limit price
59
- const surplusBuyToken = best.toAmount > limitPrice ? best.toAmount - limitPrice : 0n;
60
- // Correct USD estimate using token-specific decimals
61
- // Use bigint-safe conversion: shift to 6-decimal precision first,
62
- // then convert to Number — prevents overflow for 18-decimal tokens
63
- const decimals = getTokenDecimals(order.buyToken);
64
- const DISPLAY_PRECISION = 6;
65
- let surplusUsd;
66
- if (decimals <= DISPLAY_PRECISION) {
67
- // 6-decimal tokens (USDC, USDT): safe to convert directly
68
- surplusUsd = (Number(surplusBuyToken) / Math.pow(10, decimals)) * (best.toTokenPriceUsd ?? 1);
69
- } else {
70
- // 18-decimal tokens (ETH, DAI): downshift first to avoid Number overflow
71
- const shift = BigInt(decimals - DISPLAY_PRECISION);
72
- const reduced = surplusBuyToken / (10n ** shift);
73
- surplusUsd = (Number(reduced) / Math.pow(10, DISPLAY_PRECISION)) * (best.toTokenPriceUsd ?? 1);
74
- }
75
- return {
76
- order,
77
- bestRoute: best,
78
- surplusBuyToken,
79
- surplusUsd,
80
- viable: surplusBuyToken > 0n,
81
- };
82
- }
83
- catch (err) {
84
- // Log the error so it doesn't disappear silently — critical for debugging
85
- console.warn(`[AuctionAnalyzer] analyzeOrder failed for order ${order.uid}: ${err?.message ?? err}`);
86
- return null;
87
- }
88
- }
89
- /**
90
- * Find Coincidence of Wants (CoW) — orders that can trade directly.
91
- *
92
- * If user A wants to sell ETH for USDC and user B wants to sell USDC for
93
- * ETH, they can settle directly with ZERO DEX fees. This is CowSwap's core
94
- * innovation and is the primary edge for any competitive solver.
95
- */
96
- findCoincidenceOfWants(orders) {
97
- // CYCLE 1 FIX: Build token-pair index for O(n log n) matching
98
- // CYCLE 3 FIX: Sort by best price first within each token pair
99
- const index = new Map();
100
- for (const order of orders) {
101
- const key = `${order.sellToken.toLowerCase()}-${order.buyToken.toLowerCase()}`;
102
- if (!index.has(key)) index.set(key, []);
103
- index.get(key).push(order);
104
- }
105
- const matches = [];
106
- const used = new Set();
107
- for (const [key, sellOrders] of index) {
108
- const [sellToken, buyToken] = key.split('-');
109
- const reverseKey = `${buyToken}-${sellToken}`;
110
- const buyOrders = index.get(reverseKey) || [];
111
- if (buyOrders.length === 0) continue;
112
- // Sort by price: best sell price first (highest buyAmount/sellAmount ratio)
113
- const sortedSell = [...sellOrders].sort((a, b) => {
114
- const ratioA = Number(BigInt(a.buyAmount) * 1000000n / BigInt(a.sellAmount));
115
- const ratioB = Number(BigInt(b.buyAmount) * 1000000n / BigInt(b.sellAmount));
116
- return ratioB - ratioA;
117
- });
118
- const sortedBuy = [...buyOrders].sort((a, b) => {
119
- const ratioA = Number(BigInt(a.sellAmount) * 1000000n / BigInt(a.buyAmount));
120
- const ratioB = Number(BigInt(b.sellAmount) * 1000000n / BigInt(b.buyAmount));
121
- return ratioA - ratioB; // lowest sell price first
122
- });
123
- for (const sell of sortedSell) {
124
- if (used.has(sell.uid)) continue;
125
- for (const buy of sortedBuy) {
126
- if (used.has(buy.uid)) continue;
127
- // Complementary check with deduplication
128
- if (sell.sellToken === buy.buyToken && buy.sellToken === sell.buyToken) {
129
- const matchedAmount = this.calculateCoWMatch(sell, buy);
130
- if (matchedAmount > 0n) {
131
- matches.push({
132
- orderA: sell,
133
- orderB: buy,
134
- matchedAmount,
135
- estimatedGasSaved: 50000n,
136
- });
137
- used.add(sell.uid);
138
- used.add(buy.uid);
139
- break; // move to next sell order
140
- }
141
- }
142
- }
143
- }
144
- }
145
- return matches;
146
- }
147
- calculateCoWMatch(orderA, orderB) {
148
- const aSell = BigInt(orderA.sellAmount);
149
- const aBuy = BigInt(orderA.buyAmount);
150
- const bSell = BigInt(orderB.sellAmount);
151
- const bBuy = BigInt(orderB.buyAmount);
152
- // Price compatibility check: A's limit price must be satisfiable by B and vice versa
153
- // A wants: aBuy / aSell (min buy per sell unit)
154
- // B offers: bSell / bBuy (sell per buy unit, i.e., how much B sells per unit of what A wants)
155
- // For match: A's ask <= B's offer in the same token direction
156
- // i.e., aBuy * bBuy <= aSell * bSell (cross-multiply to avoid division)
157
- if (aBuy * bBuy > aSell * bSell) return 0n;
158
- // Return the smaller fill amount
159
- return aSell < bBuy ? aSell : bBuy;
160
- }
161
- chainIdToName(chainId) {
162
- const map = {
163
- 1: 'ethereum',
164
- 8453: 'base',
165
- 42161: 'arbitrum',
166
- 100: 'gnosis',
167
- };
168
- return map[chainId] ?? 'ethereum';
169
- }
170
- }
171
- //# sourceMappingURL=analyzer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/solver/analyzer.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
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
@@ -1 +0,0 @@
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"}