agentwallet-sdk 5.1.1 → 6.0.0

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 (366) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +463 -24
  3. package/dist/bridge/__tests__/solana.test.d.ts +2 -0
  4. package/dist/bridge/__tests__/solana.test.d.ts.map +1 -0
  5. package/dist/bridge/__tests__/solana.test.js +106 -0
  6. package/dist/bridge/__tests__/solana.test.js.map +1 -0
  7. package/dist/bridge/client.d.ts +21 -7
  8. package/dist/bridge/client.d.ts.map +1 -1
  9. package/dist/bridge/client.js +16 -1
  10. package/dist/bridge/client.js.map +1 -1
  11. package/dist/bridge/index.d.ts +12 -1
  12. package/dist/bridge/index.d.ts.map +1 -1
  13. package/dist/bridge/index.js +11 -0
  14. package/dist/bridge/index.js.map +1 -1
  15. package/dist/bridge/solana.d.ts +132 -0
  16. package/dist/bridge/solana.d.ts.map +1 -0
  17. package/dist/bridge/solana.js +313 -0
  18. package/dist/bridge/solana.js.map +1 -0
  19. package/dist/bridge/types.d.ts +35 -10
  20. package/dist/bridge/types.d.ts.map +1 -1
  21. package/dist/bridge/types.js +16 -4
  22. package/dist/bridge/types.js.map +1 -1
  23. package/dist/escrow/MutualStakeEscrow.d.ts.map +1 -1
  24. package/dist/escrow/MutualStakeEscrow.js +3 -5
  25. package/dist/escrow/MutualStakeEscrow.js.map +1 -1
  26. package/dist/index.d.ts +192 -469
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +14 -8
  29. package/dist/index.js.map +1 -1
  30. package/dist/policy/SpendingPolicy.test.js.map +1 -1
  31. package/dist/swap/SwapModule.d.ts +17 -3
  32. package/dist/swap/SwapModule.d.ts.map +1 -1
  33. package/dist/swap/SwapModule.js +21 -5
  34. package/dist/swap/SwapModule.js.map +1 -1
  35. package/dist/swap/index.d.ts +9 -2
  36. package/dist/swap/index.d.ts.map +1 -1
  37. package/dist/swap/index.js +8 -1
  38. package/dist/swap/index.js.map +1 -1
  39. package/dist/swap/types.d.ts +58 -1
  40. package/dist/swap/types.d.ts.map +1 -1
  41. package/dist/swap/types.js +56 -1
  42. package/dist/swap/types.js.map +1 -1
  43. package/dist/tokens/__tests__/decimals.test.d.ts +2 -0
  44. package/dist/tokens/__tests__/decimals.test.d.ts.map +1 -0
  45. package/dist/tokens/__tests__/decimals.test.js +107 -0
  46. package/dist/tokens/__tests__/decimals.test.js.map +1 -0
  47. package/dist/tokens/__tests__/registry.test.d.ts +2 -0
  48. package/dist/tokens/__tests__/registry.test.d.ts.map +1 -0
  49. package/dist/tokens/__tests__/registry.test.js +191 -0
  50. package/dist/tokens/__tests__/registry.test.js.map +1 -0
  51. package/dist/tokens/__tests__/transfers.test.d.ts +2 -0
  52. package/dist/tokens/__tests__/transfers.test.d.ts.map +1 -0
  53. package/dist/tokens/__tests__/transfers.test.js +103 -0
  54. package/dist/tokens/__tests__/transfers.test.js.map +1 -0
  55. package/dist/tokens/decimals.d.ts +65 -0
  56. package/dist/tokens/decimals.d.ts.map +1 -0
  57. package/dist/tokens/decimals.js +112 -0
  58. package/dist/tokens/decimals.js.map +1 -0
  59. package/dist/tokens/index.d.ts +14 -0
  60. package/dist/tokens/index.d.ts.map +1 -0
  61. package/dist/tokens/index.js +14 -0
  62. package/dist/tokens/index.js.map +1 -0
  63. package/dist/tokens/registry.d.ts +82 -0
  64. package/dist/tokens/registry.d.ts.map +1 -0
  65. package/dist/tokens/registry.js +293 -0
  66. package/dist/tokens/registry.js.map +1 -0
  67. package/dist/tokens/solana.d.ts +108 -0
  68. package/dist/tokens/solana.d.ts.map +1 -0
  69. package/dist/tokens/solana.js +306 -0
  70. package/dist/tokens/solana.js.map +1 -0
  71. package/dist/tokens/transfers.d.ts +95 -0
  72. package/dist/tokens/transfers.d.ts.map +1 -0
  73. package/dist/tokens/transfers.js +196 -0
  74. package/dist/tokens/transfers.js.map +1 -0
  75. package/dist/types.d.ts +20 -1
  76. package/dist/types.d.ts.map +1 -1
  77. package/dist/types.js +6 -0
  78. package/dist/types.js.map +1 -1
  79. package/dist/x402/__tests__/client.test.js +77 -5
  80. package/dist/x402/__tests__/client.test.js.map +1 -1
  81. package/dist/x402/chains/abstract/index.d.ts.map +1 -1
  82. package/dist/x402/chains/abstract/index.js.map +1 -1
  83. package/dist/x402/chains/stellar/index.d.ts +149 -0
  84. package/dist/x402/chains/stellar/index.d.ts.map +1 -0
  85. package/dist/x402/chains/stellar/index.js +199 -0
  86. package/dist/x402/chains/stellar/index.js.map +1 -0
  87. package/dist/x402/client.d.ts +7 -1
  88. package/dist/x402/client.d.ts.map +1 -1
  89. package/dist/x402/client.js +24 -13
  90. package/dist/x402/client.js.map +1 -1
  91. package/dist/x402/index.d.ts +1 -0
  92. package/dist/x402/index.d.ts.map +1 -1
  93. package/dist/x402/index.js +2 -0
  94. package/dist/x402/index.js.map +1 -1
  95. package/dist/x402/middleware.d.ts.map +1 -1
  96. package/dist/x402/middleware.js +0 -3
  97. package/dist/x402/middleware.js.map +1 -1
  98. package/dist/x402/multi-asset.d.ts +54 -0
  99. package/dist/x402/multi-asset.d.ts.map +1 -0
  100. package/dist/x402/multi-asset.js +123 -0
  101. package/dist/x402/multi-asset.js.map +1 -0
  102. package/dist/x402/types.d.ts +22 -3
  103. package/dist/x402/types.d.ts.map +1 -1
  104. package/dist/x402/types.js +34 -4
  105. package/dist/x402/types.js.map +1 -1
  106. package/package.json +21 -6
  107. package/dist/ap2/index.d.ts +0 -185
  108. package/dist/ap2/index.d.ts.map +0 -1
  109. package/dist/ap2/index.js +0 -255
  110. package/dist/ap2/index.js.map +0 -1
  111. package/dist/bridge/unified.d.ts +0 -101
  112. package/dist/bridge/unified.d.ts.map +0 -1
  113. package/dist/bridge/unified.js +0 -284
  114. package/dist/bridge/unified.js.map +0 -1
  115. package/dist/chains.d.ts +0 -62
  116. package/dist/chains.d.ts.map +0 -1
  117. package/dist/chains.js +0 -108
  118. package/dist/chains.js.map +0 -1
  119. package/dist/fiat/index.d.ts +0 -10
  120. package/dist/fiat/index.d.ts.map +0 -1
  121. package/dist/fiat/index.js +0 -9
  122. package/dist/fiat/index.js.map +0 -1
  123. package/dist/fiat/onramp.d.ts +0 -101
  124. package/dist/fiat/onramp.d.ts.map +0 -1
  125. package/dist/fiat/onramp.js +0 -155
  126. package/dist/fiat/onramp.js.map +0 -1
  127. package/dist/fiat/providers/index.d.ts +0 -16
  128. package/dist/fiat/providers/index.d.ts.map +0 -1
  129. package/dist/fiat/providers/index.js +0 -30
  130. package/dist/fiat/providers/index.js.map +0 -1
  131. package/dist/fiat/providers/moonpay.d.ts +0 -22
  132. package/dist/fiat/providers/moonpay.d.ts.map +0 -1
  133. package/dist/fiat/providers/moonpay.js +0 -107
  134. package/dist/fiat/providers/moonpay.js.map +0 -1
  135. package/dist/fiat/providers/stripe.d.ts +0 -26
  136. package/dist/fiat/providers/stripe.d.ts.map +0 -1
  137. package/dist/fiat/providers/stripe.js +0 -135
  138. package/dist/fiat/providers/stripe.js.map +0 -1
  139. package/dist/fiat/providers/transak.d.ts +0 -26
  140. package/dist/fiat/providers/transak.d.ts.map +0 -1
  141. package/dist/fiat/providers/transak.js +0 -119
  142. package/dist/fiat/providers/transak.js.map +0 -1
  143. package/dist/fiat/types.d.ts +0 -106
  144. package/dist/fiat/types.d.ts.map +0 -1
  145. package/dist/fiat/types.js +0 -13
  146. package/dist/fiat/types.js.map +0 -1
  147. package/dist/flash/executor.d.ts +0 -119
  148. package/dist/flash/executor.d.ts.map +0 -1
  149. package/dist/flash/executor.js +0 -195
  150. package/dist/flash/executor.js.map +0 -1
  151. package/dist/flash/index.d.ts +0 -28
  152. package/dist/flash/index.d.ts.map +0 -1
  153. package/dist/flash/index.js +0 -29
  154. package/dist/flash/index.js.map +0 -1
  155. package/dist/flash/scanner.d.ts +0 -133
  156. package/dist/flash/scanner.d.ts.map +0 -1
  157. package/dist/flash/scanner.js +0 -212
  158. package/dist/flash/scanner.js.map +0 -1
  159. package/dist/flash/types.d.ts +0 -136
  160. package/dist/flash/types.d.ts.map +0 -1
  161. package/dist/flash/types.js +0 -23
  162. package/dist/flash/types.js.map +0 -1
  163. package/dist/gas/index.d.ts +0 -4
  164. package/dist/gas/index.d.ts.map +0 -1
  165. package/dist/gas/index.js +0 -3
  166. package/dist/gas/index.js.map +0 -1
  167. package/dist/gas/sponsor.d.ts +0 -70
  168. package/dist/gas/sponsor.d.ts.map +0 -1
  169. package/dist/gas/sponsor.js +0 -193
  170. package/dist/gas/sponsor.js.map +0 -1
  171. package/dist/gas/types.d.ts +0 -76
  172. package/dist/gas/types.d.ts.map +0 -1
  173. package/dist/gas/types.js +0 -21
  174. package/dist/gas/types.js.map +0 -1
  175. package/dist/identity/agent-identity.d.ts +0 -276
  176. package/dist/identity/agent-identity.d.ts.map +0 -1
  177. package/dist/identity/agent-identity.js +0 -300
  178. package/dist/identity/agent-identity.js.map +0 -1
  179. package/dist/identity/email-resolver.d.ts +0 -235
  180. package/dist/identity/email-resolver.js +0 -283
  181. package/dist/identity/erc6551.d.ts +0 -441
  182. package/dist/identity/erc6551.d.ts.map +0 -1
  183. package/dist/identity/erc6551.js +0 -517
  184. package/dist/identity/erc6551.js.map +0 -1
  185. package/dist/mev/index.d.ts +0 -4
  186. package/dist/mev/index.d.ts.map +0 -1
  187. package/dist/mev/index.js +0 -8
  188. package/dist/mev/index.js.map +0 -1
  189. package/dist/mev/protection.d.ts +0 -54
  190. package/dist/mev/protection.d.ts.map +0 -1
  191. package/dist/mev/protection.js +0 -185
  192. package/dist/mev/protection.js.map +0 -1
  193. package/dist/mev/risk.d.ts +0 -19
  194. package/dist/mev/risk.d.ts.map +0 -1
  195. package/dist/mev/risk.js +0 -95
  196. package/dist/mev/risk.js.map +0 -1
  197. package/dist/mev/types.d.ts +0 -49
  198. package/dist/mev/types.d.ts.map +0 -1
  199. package/dist/mev/types.js +0 -2
  200. package/dist/mev/types.js.map +0 -1
  201. package/dist/plugins/elizaos.d.ts +0 -52
  202. package/dist/plugins/elizaos.d.ts.map +0 -1
  203. package/dist/plugins/elizaos.js +0 -89
  204. package/dist/plugins/elizaos.js.map +0 -1
  205. package/dist/settlement/index.d.ts +0 -4
  206. package/dist/settlement/index.d.ts.map +0 -1
  207. package/dist/settlement/index.js +0 -3
  208. package/dist/settlement/index.js.map +0 -1
  209. package/dist/settlement/types.d.ts +0 -66
  210. package/dist/settlement/types.d.ts.map +0 -1
  211. package/dist/settlement/types.js +0 -37
  212. package/dist/settlement/types.js.map +0 -1
  213. package/dist/settlement/verifier.d.ts +0 -75
  214. package/dist/settlement/verifier.d.ts.map +0 -1
  215. package/dist/settlement/verifier.js +0 -354
  216. package/dist/settlement/verifier.js.map +0 -1
  217. package/dist/solana/bridge.d.ts +0 -144
  218. package/dist/solana/bridge.d.ts.map +0 -1
  219. package/dist/solana/bridge.js +0 -352
  220. package/dist/solana/bridge.js.map +0 -1
  221. package/dist/solana/index.d.ts +0 -8
  222. package/dist/solana/index.d.ts.map +0 -1
  223. package/dist/solana/index.js +0 -6
  224. package/dist/solana/index.js.map +0 -1
  225. package/dist/solana/swap.d.ts +0 -85
  226. package/dist/solana/swap.d.ts.map +0 -1
  227. package/dist/solana/swap.js +0 -173
  228. package/dist/solana/swap.js.map +0 -1
  229. package/dist/solana/types.d.ts +0 -126
  230. package/dist/solana/types.d.ts.map +0 -1
  231. package/dist/solana/types.js +0 -10
  232. package/dist/solana/types.js.map +0 -1
  233. package/dist/solana/wallet.d.ts +0 -83
  234. package/dist/solana/wallet.d.ts.map +0 -1
  235. package/dist/solana/wallet.js +0 -164
  236. package/dist/solana/wallet.js.map +0 -1
  237. package/dist/solana/x402.d.ts +0 -69
  238. package/dist/solana/x402.d.ts.map +0 -1
  239. package/dist/solana/x402.js +0 -154
  240. package/dist/solana/x402.js.map +0 -1
  241. package/dist/solver/adapter.d.ts +0 -47
  242. package/dist/solver/adapter.d.ts.map +0 -1
  243. package/dist/solver/adapter.js +0 -146
  244. package/dist/solver/adapter.js.map +0 -1
  245. package/dist/solver/analyzer.d.ts +0 -48
  246. package/dist/solver/analyzer.d.ts.map +0 -1
  247. package/dist/solver/analyzer.js +0 -171
  248. package/dist/solver/analyzer.js.map +0 -1
  249. package/dist/solver/builder.d.ts +0 -31
  250. package/dist/solver/builder.d.ts.map +0 -1
  251. package/dist/solver/builder.js +0 -60
  252. package/dist/solver/builder.js.map +0 -1
  253. package/dist/solver/index.d.ts +0 -22
  254. package/dist/solver/index.d.ts.map +0 -1
  255. package/dist/solver/index.js +0 -25
  256. package/dist/solver/index.js.map +0 -1
  257. package/dist/solver/types.d.ts +0 -115
  258. package/dist/solver/types.d.ts.map +0 -1
  259. package/dist/solver/types.js +0 -10
  260. package/dist/solver/types.js.map +0 -1
  261. package/dist/spend-guard/index.d.ts +0 -125
  262. package/dist/spend-guard/index.d.ts.map +0 -1
  263. package/dist/spend-guard/index.js +0 -150
  264. package/dist/spend-guard/index.js.map +0 -1
  265. package/dist/swap/router/cache.d.ts +0 -13
  266. package/dist/swap/router/cache.d.ts.map +0 -1
  267. package/dist/swap/router/cache.js +0 -30
  268. package/dist/swap/router/cache.js.map +0 -1
  269. package/dist/swap/router/flashbots.d.ts +0 -10
  270. package/dist/swap/router/flashbots.d.ts.map +0 -1
  271. package/dist/swap/router/flashbots.js +0 -43
  272. package/dist/swap/router/flashbots.js.map +0 -1
  273. package/dist/swap/router/health.d.ts +0 -17
  274. package/dist/swap/router/health.d.ts.map +0 -1
  275. package/dist/swap/router/health.js +0 -38
  276. package/dist/swap/router/health.js.map +0 -1
  277. package/dist/swap/router/index.d.ts +0 -10
  278. package/dist/swap/router/index.d.ts.map +0 -1
  279. package/dist/swap/router/index.js +0 -10
  280. package/dist/swap/router/index.js.map +0 -1
  281. package/dist/swap/router/providers/cowswap.d.ts +0 -11
  282. package/dist/swap/router/providers/cowswap.d.ts.map +0 -1
  283. package/dist/swap/router/providers/cowswap.js +0 -79
  284. package/dist/swap/router/providers/cowswap.js.map +0 -1
  285. package/dist/swap/router/providers/index.d.ts +0 -20
  286. package/dist/swap/router/providers/index.d.ts.map +0 -1
  287. package/dist/swap/router/providers/index.js +0 -32
  288. package/dist/swap/router/providers/index.js.map +0 -1
  289. package/dist/swap/router/providers/jupiter.d.ts +0 -12
  290. package/dist/swap/router/providers/jupiter.d.ts.map +0 -1
  291. package/dist/swap/router/providers/jupiter.js +0 -73
  292. package/dist/swap/router/providers/jupiter.js.map +0 -1
  293. package/dist/swap/router/providers/lifi.d.ts +0 -11
  294. package/dist/swap/router/providers/lifi.d.ts.map +0 -1
  295. package/dist/swap/router/providers/lifi.js +0 -123
  296. package/dist/swap/router/providers/lifi.js.map +0 -1
  297. package/dist/swap/router/providers/oneinch.d.ts +0 -13
  298. package/dist/swap/router/providers/oneinch.d.ts.map +0 -1
  299. package/dist/swap/router/providers/oneinch.js +0 -71
  300. package/dist/swap/router/providers/oneinch.js.map +0 -1
  301. package/dist/swap/router/providers/paraswap.d.ts +0 -11
  302. package/dist/swap/router/providers/paraswap.d.ts.map +0 -1
  303. package/dist/swap/router/providers/paraswap.js +0 -73
  304. package/dist/swap/router/providers/paraswap.js.map +0 -1
  305. package/dist/swap/router/providers/uniswap.d.ts +0 -31
  306. package/dist/swap/router/providers/uniswap.d.ts.map +0 -1
  307. package/dist/swap/router/providers/uniswap.js +0 -237
  308. package/dist/swap/router/providers/uniswap.js.map +0 -1
  309. package/dist/swap/router/providers/zerox.d.ts +0 -13
  310. package/dist/swap/router/providers/zerox.d.ts.map +0 -1
  311. package/dist/swap/router/providers/zerox.js +0 -94
  312. package/dist/swap/router/providers/zerox.js.map +0 -1
  313. package/dist/swap/router/router.d.ts +0 -86
  314. package/dist/swap/router/router.d.ts.map +0 -1
  315. package/dist/swap/router/router.js +0 -224
  316. package/dist/swap/router/router.js.map +0 -1
  317. package/dist/swap/router/rsi/engine.d.ts +0 -60
  318. package/dist/swap/router/rsi/engine.d.ts.map +0 -1
  319. package/dist/swap/router/rsi/engine.js +0 -483
  320. package/dist/swap/router/rsi/engine.js.map +0 -1
  321. package/dist/swap/router/rsi/index.d.ts +0 -3
  322. package/dist/swap/router/rsi/index.d.ts.map +0 -1
  323. package/dist/swap/router/rsi/index.js +0 -3
  324. package/dist/swap/router/rsi/index.js.map +0 -1
  325. package/dist/swap/router/rsi/types.d.ts +0 -106
  326. package/dist/swap/router/rsi/types.d.ts.map +0 -1
  327. package/dist/swap/router/rsi/types.js +0 -3
  328. package/dist/swap/router/rsi/types.js.map +0 -1
  329. package/dist/swap/router/types.d.ts +0 -120
  330. package/dist/swap/router/types.d.ts.map +0 -1
  331. package/dist/swap/router/types.js +0 -16
  332. package/dist/swap/router/types.js.map +0 -1
  333. package/dist/tax/engine.d.ts +0 -131
  334. package/dist/tax/engine.d.ts.map +0 -1
  335. package/dist/tax/engine.js +0 -307
  336. package/dist/tax/engine.js.map +0 -1
  337. package/dist/tax/index.d.ts +0 -9
  338. package/dist/tax/index.d.ts.map +0 -1
  339. package/dist/tax/index.js +0 -12
  340. package/dist/tax/index.js.map +0 -1
  341. package/dist/tax/lots.d.ts +0 -60
  342. package/dist/tax/lots.d.ts.map +0 -1
  343. package/dist/tax/lots.js +0 -129
  344. package/dist/tax/lots.js.map +0 -1
  345. package/dist/tax/types.d.ts +0 -113
  346. package/dist/tax/types.d.ts.map +0 -1
  347. package/dist/tax/types.js +0 -18
  348. package/dist/tax/types.js.map +0 -1
  349. package/dist/verifiable-intent/index.d.ts +0 -84
  350. package/dist/verifiable-intent/index.js +0 -385
  351. package/dist/yield/index.d.ts +0 -26
  352. package/dist/yield/index.d.ts.map +0 -1
  353. package/dist/yield/index.js +0 -29
  354. package/dist/yield/index.js.map +0 -1
  355. package/dist/yield/rates.d.ts +0 -114
  356. package/dist/yield/rates.d.ts.map +0 -1
  357. package/dist/yield/rates.js +0 -351
  358. package/dist/yield/rates.js.map +0 -1
  359. package/dist/yield/types.d.ts +0 -134
  360. package/dist/yield/types.d.ts.map +0 -1
  361. package/dist/yield/types.js +0 -24
  362. package/dist/yield/types.js.map +0 -1
  363. package/dist/yield/vault.d.ts +0 -112
  364. package/dist/yield/vault.d.ts.map +0 -1
  365. package/dist/yield/vault.js +0 -264
  366. package/dist/yield/vault.js.map +0 -1
@@ -1,6 +1,22 @@
1
+ /**
2
+ * @module swap/types
3
+ * Type definitions and constants for the multi-chain Uniswap V3 SwapModule.
4
+ *
5
+ * Supported swap chains: Base, Arbitrum, Optimism, Polygon.
6
+ * All router/quoter addresses verified against official Uniswap V3 deployment docs:
7
+ * - Base: https://docs.uniswap.org/contracts/v3/reference/deployments/base-deployments
8
+ * - Arbitrum: https://docs.uniswap.org/contracts/v3/reference/deployments/arbitrum-deployments
9
+ * - Optimism: https://docs.uniswap.org/contracts/v3/reference/deployments/optimism-deployments
10
+ * - Polygon: https://docs.uniswap.org/contracts/v3/reference/deployments/polygon-deployments
11
+ *
12
+ * Note: Base uses a unique SwapRouter02 address; Arbitrum, Optimism, and Polygon
13
+ * share the same universal SwapRouter02 deployment address.
14
+ */
1
15
  import type { Address, Hash } from 'viem';
2
16
  /** Uniswap V3 fee tier options */
3
17
  export type UniswapFeeTier = 100 | 500 | 3000 | 10000;
18
+ /** Chains supported for Uniswap V3 swap */
19
+ export type SwapChain = 'base' | 'arbitrum' | 'optimism' | 'polygon';
4
20
  export interface SwapQuote {
5
21
  tokenIn: Address;
6
22
  tokenOut: Address;
@@ -31,6 +47,8 @@ export interface SwapModuleConfig {
31
47
  quoterAddress: Address;
32
48
  feeBps: number;
33
49
  feeWallet: Address;
50
+ /** Chain this SwapModule is configured for */
51
+ chain: SwapChain;
34
52
  }
35
53
  /** Well-known Base Mainnet token addresses */
36
54
  export declare const BASE_TOKENS: {
@@ -39,7 +57,46 @@ export declare const BASE_TOKENS: {
39
57
  cbETH: "0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22";
40
58
  WNATIVE: "0x4200000000000000000000000000000000000006";
41
59
  };
42
- /** Uniswap V3 contract addresses on Base Mainnet (chain 8453) */
60
+ /** Well-known Arbitrum token addresses */
61
+ export declare const ARBITRUM_TOKENS: {
62
+ USDC: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831";
63
+ WETH: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1";
64
+ WNATIVE: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1";
65
+ };
66
+ /** Well-known Optimism token addresses */
67
+ export declare const OPTIMISM_TOKENS: {
68
+ USDC: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85";
69
+ WETH: "0x4200000000000000000000000000000000000006";
70
+ OP: "0x4200000000000000000000000000000000000042";
71
+ WNATIVE: "0x4200000000000000000000000000000000000006";
72
+ };
73
+ /** Well-known Polygon token addresses */
74
+ export declare const POLYGON_TOKENS: {
75
+ USDC: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359";
76
+ WETH: "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619";
77
+ WMATIC: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270";
78
+ WNATIVE: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270";
79
+ };
80
+ /**
81
+ * Uniswap V3 router and quoter addresses.
82
+ *
83
+ * Base has a different router (SwapRouter02 deployed at a unique address due to BASE chain launch).
84
+ * Arbitrum, Optimism, and Polygon use the same universal SwapRouter02 address.
85
+ *
86
+ * Sources:
87
+ * - Base: https://docs.uniswap.org/contracts/v3/reference/deployments/base-deployments
88
+ * - Arbitrum: https://docs.uniswap.org/contracts/v3/reference/deployments/arbitrum-deployments
89
+ * - Optimism: https://docs.uniswap.org/contracts/v3/reference/deployments/optimism-deployments
90
+ * - Polygon: https://docs.uniswap.org/contracts/v3/reference/deployments/polygon-deployments
91
+ */
92
+ export declare const UNISWAP_V3_ADDRESSES: Record<SwapChain, {
93
+ ROUTER: Address;
94
+ QUOTER_V2: Address;
95
+ }>;
96
+ /**
97
+ * @deprecated Use UNISWAP_V3_ADDRESSES.base instead.
98
+ * Kept for backwards compatibility.
99
+ */
43
100
  export declare const UNISWAP_V3_BASE: {
44
101
  ROUTER: "0x2626664c2603336E57B271c5C0b26F421741e481";
45
102
  QUOTER_V2: "0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a";
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/swap/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE1C,kCAAkC;AAClC,MAAM,MAAM,cAAc,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC;AAEtD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,cAAc,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,IAAI,CAAC;IACb,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,8CAA8C;AAC9C,eAAO,MAAM,WAAW;;;;;CAKvB,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,eAAe;;;CAG3B,CAAC;AAEF,mCAAmC;AACnC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,qCAAqC;AACrC,eAAO,MAAM,oBAAoB,KAAK,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/swap/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE1C,kCAAkC;AAClC,MAAM,MAAM,cAAc,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC;AAEtD,2CAA2C;AAC3C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAErE,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,cAAc,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,IAAI,CAAC;IACb,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,KAAK,EAAE,SAAS,CAAC;CAClB;AAID,8CAA8C;AAC9C,eAAO,MAAM,WAAW;;;;;CAKvB,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,eAAe;;;;CAI3B,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,eAAe;;;;;CAK3B,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,cAAc;;;;;CAK1B,CAAC;AAIF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,SAAS,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAiB3F,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe;;;CAG3B,CAAC;AAEF,mCAAmC;AACnC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,qCAAqC;AACrC,eAAO,MAAM,oBAAoB,KAAK,CAAC"}
@@ -1,3 +1,4 @@
1
+ // ─── Token Addresses ───
1
2
  /** Well-known Base Mainnet token addresses */
2
3
  export const BASE_TOKENS = {
3
4
  USDC: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
@@ -5,7 +6,61 @@ export const BASE_TOKENS = {
5
6
  cbETH: '0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22',
6
7
  WNATIVE: '0x4200000000000000000000000000000000000006',
7
8
  };
8
- /** Uniswap V3 contract addresses on Base Mainnet (chain 8453) */
9
+ /** Well-known Arbitrum token addresses */
10
+ export const ARBITRUM_TOKENS = {
11
+ USDC: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',
12
+ WETH: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',
13
+ WNATIVE: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',
14
+ };
15
+ /** Well-known Optimism token addresses */
16
+ export const OPTIMISM_TOKENS = {
17
+ USDC: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',
18
+ WETH: '0x4200000000000000000000000000000000000006',
19
+ OP: '0x4200000000000000000000000000000000000042',
20
+ WNATIVE: '0x4200000000000000000000000000000000000006',
21
+ };
22
+ /** Well-known Polygon token addresses */
23
+ export const POLYGON_TOKENS = {
24
+ USDC: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',
25
+ WETH: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',
26
+ WMATIC: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
27
+ WNATIVE: '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
28
+ };
29
+ // ─── Uniswap V3 Contract Addresses ───
30
+ /**
31
+ * Uniswap V3 router and quoter addresses.
32
+ *
33
+ * Base has a different router (SwapRouter02 deployed at a unique address due to BASE chain launch).
34
+ * Arbitrum, Optimism, and Polygon use the same universal SwapRouter02 address.
35
+ *
36
+ * Sources:
37
+ * - Base: https://docs.uniswap.org/contracts/v3/reference/deployments/base-deployments
38
+ * - Arbitrum: https://docs.uniswap.org/contracts/v3/reference/deployments/arbitrum-deployments
39
+ * - Optimism: https://docs.uniswap.org/contracts/v3/reference/deployments/optimism-deployments
40
+ * - Polygon: https://docs.uniswap.org/contracts/v3/reference/deployments/polygon-deployments
41
+ */
42
+ export const UNISWAP_V3_ADDRESSES = {
43
+ base: {
44
+ ROUTER: '0x2626664c2603336E57B271c5C0b26F421741e481',
45
+ QUOTER_V2: '0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a',
46
+ },
47
+ arbitrum: {
48
+ ROUTER: '0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45',
49
+ QUOTER_V2: '0x61fFE014bA17989E743c5F6cB21bF9697530B21e',
50
+ },
51
+ optimism: {
52
+ ROUTER: '0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45',
53
+ QUOTER_V2: '0x61fFE014bA17989E743c5F6cB21bF9697530B21e',
54
+ },
55
+ polygon: {
56
+ ROUTER: '0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45',
57
+ QUOTER_V2: '0x61fFE014bA17989E743c5F6cB21bF9697530B21e',
58
+ },
59
+ };
60
+ /**
61
+ * @deprecated Use UNISWAP_V3_ADDRESSES.base instead.
62
+ * Kept for backwards compatibility.
63
+ */
9
64
  export const UNISWAP_V3_BASE = {
10
65
  ROUTER: '0x2626664c2603336E57B271c5C0b26F421741e481',
11
66
  QUOTER_V2: '0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a',
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/swap/types.ts"],"names":[],"mappings":"AAwCA,8CAA8C;AAC9C,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,4CAAqD;IAC3D,IAAI,EAAE,4CAAqD;IAC3D,KAAK,EAAE,4CAAqD;IAC5D,OAAO,EAAE,4CAAqD;CAC/D,CAAC;AAEF,iEAAiE;AACjE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM,EAAE,4CAAqD;IAC7D,SAAS,EAAE,4CAAqD;CACjE,CAAC;AAEF,mCAAmC;AACnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,qCAAqC;AACrC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/swap/types.ts"],"names":[],"mappings":"AA2DA,0BAA0B;AAE1B,8CAA8C;AAC9C,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAK,4CAAqD;IAC9D,IAAI,EAAK,4CAAqD;IAC9D,KAAK,EAAI,4CAAqD;IAC9D,OAAO,EAAE,4CAAqD;CAC/D,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAK,4CAAqD;IAC9D,IAAI,EAAK,4CAAqD;IAC9D,OAAO,EAAE,4CAAqD;CAC/D,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAK,4CAAqD;IAC9D,IAAI,EAAK,4CAAqD;IAC9D,EAAE,EAAO,4CAAqD;IAC9D,OAAO,EAAE,4CAAqD;CAC/D,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAK,4CAAqD;IAC9D,IAAI,EAAK,4CAAqD;IAC9D,MAAM,EAAG,4CAAqD;IAC9D,OAAO,EAAE,4CAAqD;CAC/D,CAAC;AAEF,wCAAwC;AAExC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA+D;IAC9F,IAAI,EAAE;QACJ,MAAM,EAAK,4CAA4C;QACvD,SAAS,EAAE,4CAA4C;KACxD;IACD,QAAQ,EAAE;QACR,MAAM,EAAK,4CAA4C;QACvD,SAAS,EAAE,4CAA4C;KACxD;IACD,QAAQ,EAAE;QACR,MAAM,EAAK,4CAA4C;QACvD,SAAS,EAAE,4CAA4C;KACxD;IACD,OAAO,EAAE;QACP,MAAM,EAAK,4CAA4C;QACvD,SAAS,EAAE,4CAA4C;KACxD;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM,EAAK,4CAAqD;IAChE,SAAS,EAAE,4CAAqD;CACjE,CAAC;AAEF,mCAAmC;AACnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,qCAAqC;AACrC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=decimals.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decimals.test.d.ts","sourceRoot":"","sources":["../../../src/tokens/__tests__/decimals.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Tests for token decimal normalization utilities.
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { toRaw, toHuman, formatBalance, parseAmount } from '../decimals.js';
6
+ describe('toRaw', () => {
7
+ it('converts "1.5" with 6 decimals to 1500000n (USDC)', () => {
8
+ expect(toRaw('1.5', 6)).toBe(1500000n);
9
+ });
10
+ it('converts "1.0" with 18 decimals to 1000000000000000000n (WETH)', () => {
11
+ expect(toRaw('1.0', 18)).toBe(1000000000000000000n);
12
+ });
13
+ it('converts "0.001" with 8 decimals to 100000n (WBTC)', () => {
14
+ expect(toRaw('0.001', 8)).toBe(100000n);
15
+ });
16
+ it('converts integer "100" with 6 decimals correctly', () => {
17
+ expect(toRaw('100', 6)).toBe(100000000n);
18
+ });
19
+ it('converts "0" to 0n', () => {
20
+ expect(toRaw('0', 6)).toBe(0n);
21
+ });
22
+ it('handles string with more fractional digits than decimals (truncates)', () => {
23
+ // 1.9999999 with 6 decimals should truncate to 1.999999 → 1999999n
24
+ expect(toRaw('1.9999999', 6)).toBe(1999999n);
25
+ });
26
+ it('handles fractional-only strings', () => {
27
+ expect(toRaw('0.5', 6)).toBe(500000n);
28
+ });
29
+ it('handles bigint passthrough', () => {
30
+ expect(toRaw(12345n, 6)).toBe(12345n);
31
+ });
32
+ it('handles zero-padding short fractions', () => {
33
+ // "1.5" with 18 decimals → 1500000000000000000n
34
+ expect(toRaw('1.5', 18)).toBe(1500000000000000000n);
35
+ });
36
+ it('throws on invalid amount string', () => {
37
+ expect(() => toRaw('abc', 6)).toThrow();
38
+ expect(() => toRaw('1.2.3', 6)).toThrow();
39
+ });
40
+ });
41
+ describe('toHuman', () => {
42
+ it('converts 1500000n with 6 decimals to "1.5"', () => {
43
+ expect(toHuman(1500000n, 6)).toBe('1.5');
44
+ });
45
+ it('converts 1000000000000000000n with 18 decimals to "1.0"', () => {
46
+ expect(toHuman(1000000000000000000n, 18)).toBe('1.0');
47
+ });
48
+ it('converts 0n to "0.0"', () => {
49
+ expect(toHuman(0n, 6)).toBe('0.0');
50
+ expect(toHuman(0n, 18)).toBe('0.0');
51
+ });
52
+ it('converts 100000000n with 6 decimals to "100.0"', () => {
53
+ expect(toHuman(100000000n, 6)).toBe('100.0');
54
+ });
55
+ it('trims trailing zeros but keeps at least one decimal', () => {
56
+ expect(toHuman(1500000n, 6)).toBe('1.5');
57
+ expect(toHuman(1000000n, 6)).toBe('1.0');
58
+ });
59
+ it('handles 0 decimals', () => {
60
+ expect(toHuman(12345n, 0)).toBe('12345');
61
+ });
62
+ });
63
+ describe('formatBalance', () => {
64
+ it('formats USDC (6 decimals) with 2 decimal places', () => {
65
+ const token = { symbol: 'USDC', decimals: 6, address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' };
66
+ expect(formatBalance(1500000n, token)).toBe('1.50 USDC');
67
+ });
68
+ it('formats WETH (18 decimals) with 4 decimal places', () => {
69
+ const token = { symbol: 'WETH', decimals: 18, address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2' };
70
+ expect(formatBalance(1000000000000000000n, token)).toBe('1.0000 WETH');
71
+ });
72
+ it('formats 0 balance correctly', () => {
73
+ const token = { symbol: 'USDC', decimals: 6, address: '0x0000000000000000000000000000000000000000' };
74
+ expect(formatBalance(0n, token)).toBe('0.00 USDC');
75
+ });
76
+ it('accepts custom displayDecimals', () => {
77
+ const token = { symbol: 'WETH', decimals: 18, address: '0x0000000000000000000000000000000000000000' };
78
+ expect(formatBalance(1000000000000000000n, token, 2)).toBe('1.00 WETH');
79
+ });
80
+ });
81
+ describe('parseAmount', () => {
82
+ it('parses string to raw bigint', () => {
83
+ expect(parseAmount('1.5', 6)).toBe(1500000n);
84
+ });
85
+ it('passes through bigint unchanged', () => {
86
+ expect(parseAmount(1500000n, 6)).toBe(1500000n);
87
+ });
88
+ });
89
+ describe('round-trip consistency', () => {
90
+ it('toRaw(toHuman(x)) === x for USDC amounts', () => {
91
+ const cases = [0n, 1n, 1000000n, 1500000n, 100000000n, 999999n];
92
+ for (const raw of cases) {
93
+ const human = toHuman(raw, 6);
94
+ const backToRaw = toRaw(human, 6);
95
+ expect(backToRaw).toBe(raw);
96
+ }
97
+ });
98
+ it('toRaw(toHuman(x)) === x for ETH amounts (selected)', () => {
99
+ const cases = [0n, 1000000000000000000n, 500000000000000000n];
100
+ for (const raw of cases) {
101
+ const human = toHuman(raw, 18);
102
+ const backToRaw = toRaw(human, 18);
103
+ expect(backToRaw).toBe(raw);
104
+ }
105
+ });
106
+ });
107
+ //# sourceMappingURL=decimals.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decimals.test.js","sourceRoot":"","sources":["../../../src/tokens/__tests__/decimals.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=registry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../../../src/tokens/__tests__/registry.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Tests for the TokenRegistry — pre-populated multi-chain token registry.
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { TokenRegistry, getGlobalRegistry, BASE_REGISTRY, ETHEREUM_REGISTRY } from '../registry.js';
6
+ import { zeroAddress } from 'viem';
7
+ // Chain IDs
8
+ const ETH = 1;
9
+ const BASE = 8453;
10
+ const ARB = 42161;
11
+ const OP = 10;
12
+ const POLY = 137;
13
+ const AVAX = 43114;
14
+ const SONIC = 146;
15
+ describe('TokenRegistry — construction', () => {
16
+ it('creates a registry and has tokens pre-populated', () => {
17
+ const r = new TokenRegistry();
18
+ expect(r.size()).toBeGreaterThan(0);
19
+ });
20
+ it('populates tokens for Ethereum mainnet', () => {
21
+ const r = new TokenRegistry();
22
+ const tokens = r.listTokens(ETH);
23
+ expect(tokens.length).toBeGreaterThanOrEqual(10);
24
+ const symbols = tokens.map(t => t.symbol);
25
+ expect(symbols).toContain('USDC');
26
+ expect(symbols).toContain('WETH');
27
+ expect(symbols).toContain('WBTC');
28
+ expect(symbols).toContain('LINK');
29
+ expect(symbols).toContain('UNI');
30
+ expect(symbols).toContain('AAVE');
31
+ expect(symbols).toContain('DAI');
32
+ expect(symbols).toContain('MKR');
33
+ expect(symbols).toContain('ETH'); // native
34
+ });
35
+ it('populates tokens for Base mainnet', () => {
36
+ const r = new TokenRegistry();
37
+ const tokens = r.listTokens(BASE);
38
+ const symbols = tokens.map(t => t.symbol);
39
+ expect(symbols).toContain('USDC');
40
+ expect(symbols).toContain('WETH');
41
+ expect(symbols).toContain('cbETH');
42
+ });
43
+ it('populates ARB on Arbitrum', () => {
44
+ const r = new TokenRegistry();
45
+ const token = r.getToken('ARB', ARB);
46
+ expect(token).toBeDefined();
47
+ expect(token.address.toLowerCase()).toBe('0x912ce59144191c1204e64559fe8253a0e49e6548');
48
+ });
49
+ it('populates OP on Optimism', () => {
50
+ const r = new TokenRegistry();
51
+ const token = r.getToken('OP', OP);
52
+ expect(token).toBeDefined();
53
+ expect(token.address.toLowerCase()).toBe('0x4200000000000000000000000000000000000042');
54
+ });
55
+ it('populates WMATIC on Polygon', () => {
56
+ const r = new TokenRegistry();
57
+ const token = r.getToken('WMATIC', POLY);
58
+ expect(token).toBeDefined();
59
+ expect(token.address.toLowerCase()).toBe('0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270');
60
+ });
61
+ it('populates WAVAX on Avalanche', () => {
62
+ const r = new TokenRegistry();
63
+ const token = r.getToken('WAVAX', AVAX);
64
+ expect(token).toBeDefined();
65
+ expect(token.address.toLowerCase()).toBe('0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7');
66
+ });
67
+ it('includes native gas tokens with isNative=true and zeroAddress', () => {
68
+ const r = new TokenRegistry();
69
+ const eth = r.getToken('ETH', BASE);
70
+ expect(eth).toBeDefined();
71
+ expect(eth.isNative).toBe(true);
72
+ expect(eth.address).toBe(zeroAddress);
73
+ const pol = r.getToken('POL', POLY);
74
+ expect(pol).toBeDefined();
75
+ expect(pol.isNative).toBe(true);
76
+ const avax = r.getToken('AVAX', AVAX);
77
+ expect(avax).toBeDefined();
78
+ expect(avax.isNative).toBe(true);
79
+ const s = r.getToken('S', SONIC);
80
+ expect(s).toBeDefined();
81
+ expect(s.isNative).toBe(true);
82
+ });
83
+ });
84
+ describe('TokenRegistry — getToken', () => {
85
+ it('returns undefined for unknown symbol', () => {
86
+ const r = new TokenRegistry();
87
+ expect(r.getToken('FAKECOIN', ETH)).toBeUndefined();
88
+ });
89
+ it('is case-insensitive for symbol lookup', () => {
90
+ const r = new TokenRegistry();
91
+ expect(r.getToken('usdc', ETH)).toBeDefined();
92
+ expect(r.getToken('USDC', ETH)).toBeDefined();
93
+ expect(r.getToken('Usdc', ETH)).toBeDefined();
94
+ });
95
+ it('USDC on Ethereum is correct address', () => {
96
+ const r = new TokenRegistry();
97
+ const usdc = r.getToken('USDC', ETH);
98
+ expect(usdc.address.toLowerCase()).toBe('0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48');
99
+ expect(usdc.decimals).toBe(6);
100
+ });
101
+ it('USDC on Base is correct address', () => {
102
+ const r = new TokenRegistry();
103
+ const usdc = r.getToken('USDC', BASE);
104
+ expect(usdc.address.toLowerCase()).toBe('0x833589fcd6edb6e08f4c7c32d4f71b54bda02913');
105
+ });
106
+ it('WETH on Ethereum is correct address', () => {
107
+ const r = new TokenRegistry();
108
+ const weth = r.getToken('WETH', ETH);
109
+ expect(weth.address.toLowerCase()).toBe('0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2');
110
+ expect(weth.decimals).toBe(18);
111
+ });
112
+ });
113
+ describe('TokenRegistry — addToken (custom)', () => {
114
+ it('adds a custom token and retrieves it', () => {
115
+ const r = new TokenRegistry();
116
+ r.addToken({
117
+ symbol: 'MYTOKEN',
118
+ address: '0xDeadBeefDeadBeefDeadBeefDeadBeefDeadBeef',
119
+ decimals: 18,
120
+ chainId: BASE,
121
+ name: 'My Custom Token',
122
+ });
123
+ const t = r.getToken('MYTOKEN', BASE);
124
+ expect(t).toBeDefined();
125
+ expect(t.name).toBe('My Custom Token');
126
+ expect(t.decimals).toBe(18);
127
+ });
128
+ it('overwriting a token with addToken replaces it', () => {
129
+ const r = new TokenRegistry();
130
+ r.addToken({
131
+ symbol: 'USDC',
132
+ address: '0x1234567890123456789012345678901234567890',
133
+ decimals: 6,
134
+ chainId: BASE,
135
+ name: 'Test USDC',
136
+ });
137
+ const usdc = r.getToken('USDC', BASE);
138
+ expect(usdc.address.toLowerCase()).toBe('0x1234567890123456789012345678901234567890');
139
+ });
140
+ });
141
+ describe('TokenRegistry — listTokens', () => {
142
+ it('returns all tokens for a chain', () => {
143
+ const r = new TokenRegistry();
144
+ const tokens = r.listTokens(ARB);
145
+ expect(tokens.length).toBeGreaterThan(0);
146
+ // Every returned token should have chainId === ARB
147
+ for (const t of tokens) {
148
+ expect(t.chainId).toBe(ARB);
149
+ }
150
+ });
151
+ it('returns empty array for unknown chainId', () => {
152
+ const r = new TokenRegistry();
153
+ const tokens = r.listTokens(99999);
154
+ expect(tokens).toEqual([]);
155
+ });
156
+ });
157
+ describe('TokenRegistry — getTokenByAddress', () => {
158
+ it('finds a token by its address', () => {
159
+ const r = new TokenRegistry();
160
+ const usdc = r.getTokenByAddress('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', ETH);
161
+ expect(usdc).toBeDefined();
162
+ expect(usdc.symbol).toBe('USDC');
163
+ });
164
+ it('is case-insensitive for address lookup', () => {
165
+ const r = new TokenRegistry();
166
+ const usdc = r.getTokenByAddress('0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', // lower
167
+ ETH);
168
+ expect(usdc).toBeDefined();
169
+ });
170
+ it('returns undefined for unknown address', () => {
171
+ const r = new TokenRegistry();
172
+ const t = r.getTokenByAddress('0xDeadBeefDeadBeefDeadBeefDeadBeefDeadBeef', ETH);
173
+ expect(t).toBeUndefined();
174
+ });
175
+ });
176
+ describe('Pre-built registry exports', () => {
177
+ it('BASE_REGISTRY has Base tokens', () => {
178
+ const tokens = BASE_REGISTRY.listTokens(BASE);
179
+ expect(tokens.length).toBeGreaterThan(0);
180
+ });
181
+ it('ETHEREUM_REGISTRY has Ethereum tokens', () => {
182
+ const tokens = ETHEREUM_REGISTRY.listTokens(ETH);
183
+ expect(tokens.length).toBeGreaterThan(0);
184
+ });
185
+ it('getGlobalRegistry() returns consistent instance', () => {
186
+ const r1 = getGlobalRegistry();
187
+ const r2 = getGlobalRegistry();
188
+ expect(r1).toBe(r2);
189
+ });
190
+ });
191
+ //# sourceMappingURL=registry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../../src/tokens/__tests__/registry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transfers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfers.test.d.ts","sourceRoot":"","sources":["../../../src/tokens/__tests__/transfers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Tests for ERC-20 and native transfer encoding.
3
+ * Uses mocked publicClient/walletClient to avoid real RPC calls.
4
+ *
5
+ * NOTE: viem enforces EIP-55 checksummed addresses. All addresses here
6
+ * are checksummed via `getAddress()` from viem.
7
+ */
8
+ import { describe, it, expect, vi } from 'vitest';
9
+ import { encodeERC20Transfer } from '../transfers.js';
10
+ import { toRaw } from '../decimals.js';
11
+ // Checksummed test addresses (verified via viem's getAddress)
12
+ // These are real EIP-55 addresses used only in tests
13
+ const TO = '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB'; // BBBB... checksummed
14
+ const ACCOUNT = '0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa'; // AAAA... checksummed
15
+ const USDC_ETH = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
16
+ const FAKE_HASH = ('0x' + 'a'.repeat(64));
17
+ // ─── encodeERC20Transfer tests ────────────────────────────────────────────────
18
+ describe('encodeERC20Transfer', () => {
19
+ it('produces correct 4-byte selector for transfer()', () => {
20
+ const data = encodeERC20Transfer(TO, 1000000n);
21
+ // transfer(address,uint256) selector = 0xa9059cbb
22
+ expect(data.slice(0, 10).toLowerCase()).toBe('0xa9059cbb');
23
+ });
24
+ it('encodes the recipient address in the calldata', () => {
25
+ const data = encodeERC20Transfer(TO, 1000000n);
26
+ // Recipient is ABI-encoded as 32-byte padded address starting at byte 4
27
+ const lowerTo = TO.toLowerCase().slice(2); // strip 0x
28
+ expect(data.toLowerCase()).toContain(lowerTo);
29
+ });
30
+ it('encodes the amount correctly', () => {
31
+ const amount = 1500000n; // 1.5 USDC
32
+ const data = encodeERC20Transfer(TO, amount);
33
+ // Amount 1500000 = 0x16e360
34
+ expect(data.toLowerCase()).toContain('16e360');
35
+ });
36
+ it('encodes zero amount', () => {
37
+ const data = encodeERC20Transfer(TO, 0n);
38
+ expect(data).toBeDefined();
39
+ expect(data.startsWith('0xa9059cbb')).toBe(true);
40
+ });
41
+ it('encodes large amounts (18 decimals, 1 WETH)', () => {
42
+ const oneWeth = toRaw('1.0', 18);
43
+ const data = encodeERC20Transfer(TO, oneWeth);
44
+ expect(data.startsWith('0xa9059cbb')).toBe(true);
45
+ // 1e18 = 0xde0b6b3a7640000
46
+ expect(data.toLowerCase()).toContain('de0b6b3a7640000');
47
+ });
48
+ });
49
+ // ─── Transfer function smoke tests (mocked clients) ──────────────────────────
50
+ describe('sendToken (mocked)', () => {
51
+ it('calls walletClient.sendTransaction with transfer calldata', async () => {
52
+ const { sendToken } = await import('../transfers.js');
53
+ const sendTransaction = vi.fn().mockResolvedValue(FAKE_HASH);
54
+ const readContract = vi.fn().mockResolvedValue(6); // decimals
55
+ const ctx = {
56
+ publicClient: { readContract },
57
+ walletClient: { sendTransaction },
58
+ account: ACCOUNT,
59
+ chainId: 1,
60
+ };
61
+ const hash = await sendToken(ctx, TO, '1.5', USDC_ETH);
62
+ expect(hash).toBe(FAKE_HASH);
63
+ expect(sendTransaction).toHaveBeenCalledOnce();
64
+ const callArgs = sendTransaction.mock.calls[0][0];
65
+ // Should send to the token contract address
66
+ expect(callArgs.to).toBe(USDC_ETH);
67
+ // Data should start with transfer() selector
68
+ expect(callArgs.data.toLowerCase().startsWith('0xa9059cbb')).toBe(true);
69
+ });
70
+ });
71
+ describe('sendNative (mocked)', () => {
72
+ it('calls walletClient.sendTransaction with value and no data', async () => {
73
+ const { sendNative } = await import('../transfers.js');
74
+ const sendTransaction = vi.fn().mockResolvedValue(('0x' + 'b'.repeat(64)));
75
+ const ctx = {
76
+ publicClient: {},
77
+ walletClient: { sendTransaction },
78
+ account: ACCOUNT,
79
+ };
80
+ const _hash = await sendNative(ctx, TO, '0.5'); // 0.5 ETH
81
+ expect(sendTransaction).toHaveBeenCalledOnce();
82
+ const callArgs = sendTransaction.mock.calls[0][0];
83
+ expect(callArgs.to).toBe(TO);
84
+ expect(callArgs.value).toBe(500000000000000000n); // 0.5 * 10^18
85
+ });
86
+ });
87
+ describe('getNativeBalance (mocked)', () => {
88
+ it('returns correct balance info', async () => {
89
+ const { getNativeBalance } = await import('../transfers.js');
90
+ const getBalance = vi.fn().mockResolvedValue(1000000000000000000n); // 1 ETH
91
+ const ctx = {
92
+ publicClient: { getBalance },
93
+ walletClient: {},
94
+ account: ACCOUNT,
95
+ chainId: 8453,
96
+ };
97
+ const result = await getNativeBalance(ctx);
98
+ expect(result.rawBalance).toBe(1000000000000000000n);
99
+ expect(result.humanBalance).toBe('1.0');
100
+ expect(result.decimals).toBe(18);
101
+ });
102
+ });
103
+ //# sourceMappingURL=transfers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfers.test.js","sourceRoot":"","sources":["../../../src/tokens/__tests__/transfers.test.ts"],"names":[],"mappings":"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"}