@terkoizmy/intent-sdk 1.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 (371) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +258 -0
  3. package/dist/config/chains.d.ts +25 -0
  4. package/dist/config/chains.d.ts.map +1 -0
  5. package/dist/config/chains.js +85 -0
  6. package/dist/config/chains.js.map +1 -0
  7. package/dist/config/default.d.ts +39 -0
  8. package/dist/config/default.d.ts.map +1 -0
  9. package/dist/config/default.js +46 -0
  10. package/dist/config/default.js.map +1 -0
  11. package/dist/config/testnets.d.ts +31 -0
  12. package/dist/config/testnets.d.ts.map +1 -0
  13. package/dist/config/testnets.js +99 -0
  14. package/dist/config/testnets.js.map +1 -0
  15. package/dist/errors/inventory-errors.d.ts +31 -0
  16. package/dist/errors/inventory-errors.d.ts.map +1 -0
  17. package/dist/errors/inventory-errors.js +45 -0
  18. package/dist/errors/inventory-errors.js.map +1 -0
  19. package/dist/errors/settlement-errors.d.ts +27 -0
  20. package/dist/errors/settlement-errors.d.ts.map +1 -0
  21. package/dist/errors/settlement-errors.js +39 -0
  22. package/dist/errors/settlement-errors.js.map +1 -0
  23. package/dist/errors/solver-errors.d.ts +45 -0
  24. package/dist/errors/solver-errors.d.ts.map +1 -0
  25. package/dist/errors/solver-errors.js +66 -0
  26. package/dist/errors/solver-errors.js.map +1 -0
  27. package/dist/index.d.ts +34 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +28 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/parser/classifiers/intent-classifier.d.ts +40 -0
  32. package/dist/parser/classifiers/intent-classifier.d.ts.map +1 -0
  33. package/dist/parser/classifiers/intent-classifier.js +72 -0
  34. package/dist/parser/classifiers/intent-classifier.js.map +1 -0
  35. package/dist/parser/extractors/action.d.ts +32 -0
  36. package/dist/parser/extractors/action.d.ts.map +1 -0
  37. package/dist/parser/extractors/action.js +72 -0
  38. package/dist/parser/extractors/action.js.map +1 -0
  39. package/dist/parser/extractors/amount.d.ts +39 -0
  40. package/dist/parser/extractors/amount.d.ts.map +1 -0
  41. package/dist/parser/extractors/amount.js +113 -0
  42. package/dist/parser/extractors/amount.js.map +1 -0
  43. package/dist/parser/extractors/constraints.d.ts +37 -0
  44. package/dist/parser/extractors/constraints.d.ts.map +1 -0
  45. package/dist/parser/extractors/constraints.js +119 -0
  46. package/dist/parser/extractors/constraints.js.map +1 -0
  47. package/dist/parser/extractors/index.d.ts +5 -0
  48. package/dist/parser/extractors/index.d.ts.map +1 -0
  49. package/dist/parser/extractors/index.js +5 -0
  50. package/dist/parser/extractors/index.js.map +1 -0
  51. package/dist/parser/extractors/token.d.ts +24 -0
  52. package/dist/parser/extractors/token.d.ts.map +1 -0
  53. package/dist/parser/extractors/token.js +124 -0
  54. package/dist/parser/extractors/token.js.map +1 -0
  55. package/dist/parser/index.d.ts +125 -0
  56. package/dist/parser/index.d.ts.map +1 -0
  57. package/dist/parser/index.js +293 -0
  58. package/dist/parser/index.js.map +1 -0
  59. package/dist/parser/template/bridge.d.ts +37 -0
  60. package/dist/parser/template/bridge.d.ts.map +1 -0
  61. package/dist/parser/template/bridge.js +80 -0
  62. package/dist/parser/template/bridge.js.map +1 -0
  63. package/dist/parser/template/claim.d.ts +15 -0
  64. package/dist/parser/template/claim.d.ts.map +1 -0
  65. package/dist/parser/template/claim.js +36 -0
  66. package/dist/parser/template/claim.js.map +1 -0
  67. package/dist/parser/template/index.d.ts +28 -0
  68. package/dist/parser/template/index.d.ts.map +1 -0
  69. package/dist/parser/template/index.js +50 -0
  70. package/dist/parser/template/index.js.map +1 -0
  71. package/dist/parser/template/nft.d.ts +3 -0
  72. package/dist/parser/template/nft.d.ts.map +1 -0
  73. package/dist/parser/template/nft.js +19 -0
  74. package/dist/parser/template/nft.js.map +1 -0
  75. package/dist/parser/template/send.d.ts +24 -0
  76. package/dist/parser/template/send.d.ts.map +1 -0
  77. package/dist/parser/template/send.js +61 -0
  78. package/dist/parser/template/send.js.map +1 -0
  79. package/dist/parser/template/swap.d.ts +3 -0
  80. package/dist/parser/template/swap.d.ts.map +1 -0
  81. package/dist/parser/template/swap.js +21 -0
  82. package/dist/parser/template/swap.js.map +1 -0
  83. package/dist/parser/template/unknown.d.ts +3 -0
  84. package/dist/parser/template/unknown.d.ts.map +1 -0
  85. package/dist/parser/template/unknown.js +11 -0
  86. package/dist/parser/template/unknown.js.map +1 -0
  87. package/dist/parser/template/yield.d.ts +3 -0
  88. package/dist/parser/template/yield.d.ts.map +1 -0
  89. package/dist/parser/template/yield.js +25 -0
  90. package/dist/parser/template/yield.js.map +1 -0
  91. package/dist/parser/utils/normalize.d.ts +41 -0
  92. package/dist/parser/utils/normalize.d.ts.map +1 -0
  93. package/dist/parser/utils/normalize.js +71 -0
  94. package/dist/parser/utils/normalize.js.map +1 -0
  95. package/dist/parser/utils/parser-helpers.d.ts +20 -0
  96. package/dist/parser/utils/parser-helpers.d.ts.map +1 -0
  97. package/dist/parser/utils/parser-helpers.js +282 -0
  98. package/dist/parser/utils/parser-helpers.js.map +1 -0
  99. package/dist/parser/validators/schema.d.ts +14 -0
  100. package/dist/parser/validators/schema.d.ts.map +1 -0
  101. package/dist/parser/validators/schema.js +81 -0
  102. package/dist/parser/validators/schema.js.map +1 -0
  103. package/dist/sdk-factory.d.ts +55 -0
  104. package/dist/sdk-factory.d.ts.map +1 -0
  105. package/dist/sdk-factory.js +49 -0
  106. package/dist/sdk-factory.js.map +1 -0
  107. package/dist/services/token-resolver.d.ts +142 -0
  108. package/dist/services/token-resolver.d.ts.map +1 -0
  109. package/dist/services/token-resolver.js +254 -0
  110. package/dist/services/token-resolver.js.map +1 -0
  111. package/dist/shared/chain-registry/chain-names.d.ts +22 -0
  112. package/dist/shared/chain-registry/chain-names.d.ts.map +1 -0
  113. package/dist/shared/chain-registry/chain-names.js +49 -0
  114. package/dist/shared/chain-registry/chain-names.js.map +1 -0
  115. package/dist/shared/chain-registry/configs/arbitrum-sepolia.d.ts +9 -0
  116. package/dist/shared/chain-registry/configs/arbitrum-sepolia.d.ts.map +1 -0
  117. package/dist/shared/chain-registry/configs/arbitrum-sepolia.js +9 -0
  118. package/dist/shared/chain-registry/configs/arbitrum-sepolia.js.map +1 -0
  119. package/dist/shared/chain-registry/configs/base-sepolia.d.ts +9 -0
  120. package/dist/shared/chain-registry/configs/base-sepolia.d.ts.map +1 -0
  121. package/dist/shared/chain-registry/configs/base-sepolia.js +9 -0
  122. package/dist/shared/chain-registry/configs/base-sepolia.js.map +1 -0
  123. package/dist/shared/chain-registry/configs/ethereum.d.ts +7 -0
  124. package/dist/shared/chain-registry/configs/ethereum.d.ts.map +1 -0
  125. package/dist/shared/chain-registry/configs/ethereum.js +7 -0
  126. package/dist/shared/chain-registry/configs/ethereum.js.map +1 -0
  127. package/dist/shared/chain-registry/configs/polygon.d.ts +7 -0
  128. package/dist/shared/chain-registry/configs/polygon.d.ts.map +1 -0
  129. package/dist/shared/chain-registry/configs/polygon.js +7 -0
  130. package/dist/shared/chain-registry/configs/polygon.js.map +1 -0
  131. package/dist/shared/chain-registry/configs/sepolia.d.ts +9 -0
  132. package/dist/shared/chain-registry/configs/sepolia.d.ts.map +1 -0
  133. package/dist/shared/chain-registry/configs/sepolia.js +9 -0
  134. package/dist/shared/chain-registry/configs/sepolia.js.map +1 -0
  135. package/dist/shared/chain-registry/configs/unichain-sepolia.d.ts +9 -0
  136. package/dist/shared/chain-registry/configs/unichain-sepolia.d.ts.map +1 -0
  137. package/dist/shared/chain-registry/configs/unichain-sepolia.js +9 -0
  138. package/dist/shared/chain-registry/configs/unichain-sepolia.js.map +1 -0
  139. package/dist/shared/chain-registry/registry.d.ts +50 -0
  140. package/dist/shared/chain-registry/registry.d.ts.map +1 -0
  141. package/dist/shared/chain-registry/registry.js +72 -0
  142. package/dist/shared/chain-registry/registry.js.map +1 -0
  143. package/dist/shared/rpc/provider-manager.d.ts +111 -0
  144. package/dist/shared/rpc/provider-manager.d.ts.map +1 -0
  145. package/dist/shared/rpc/provider-manager.js +116 -0
  146. package/dist/shared/rpc/provider-manager.js.map +1 -0
  147. package/dist/shared/rpc/viem-provider.d.ts +78 -0
  148. package/dist/shared/rpc/viem-provider.d.ts.map +1 -0
  149. package/dist/shared/rpc/viem-provider.js +187 -0
  150. package/dist/shared/rpc/viem-provider.js.map +1 -0
  151. package/dist/shared/token-registry/enrichment.d.ts +48 -0
  152. package/dist/shared/token-registry/enrichment.d.ts.map +1 -0
  153. package/dist/shared/token-registry/enrichment.js +69 -0
  154. package/dist/shared/token-registry/enrichment.js.map +1 -0
  155. package/dist/shared/token-registry/registry.d.ts +119 -0
  156. package/dist/shared/token-registry/registry.d.ts.map +1 -0
  157. package/dist/shared/token-registry/registry.js +200 -0
  158. package/dist/shared/token-registry/registry.js.map +1 -0
  159. package/dist/shared/utils/erc20-utils.d.ts +24 -0
  160. package/dist/shared/utils/erc20-utils.d.ts.map +1 -0
  161. package/dist/shared/utils/erc20-utils.js +31 -0
  162. package/dist/shared/utils/erc20-utils.js.map +1 -0
  163. package/dist/shared/utils/retry.d.ts +57 -0
  164. package/dist/shared/utils/retry.d.ts.map +1 -0
  165. package/dist/shared/utils/retry.js +104 -0
  166. package/dist/shared/utils/retry.js.map +1 -0
  167. package/dist/shared/wallet-manager/viem-signer.d.ts +68 -0
  168. package/dist/shared/wallet-manager/viem-signer.d.ts.map +1 -0
  169. package/dist/shared/wallet-manager/viem-signer.js +116 -0
  170. package/dist/shared/wallet-manager/viem-signer.js.map +1 -0
  171. package/dist/shared/wallet-manager/wallet-manager.d.ts +96 -0
  172. package/dist/shared/wallet-manager/wallet-manager.d.ts.map +1 -0
  173. package/dist/shared/wallet-manager/wallet-manager.js +104 -0
  174. package/dist/shared/wallet-manager/wallet-manager.js.map +1 -0
  175. package/dist/solver/agent/agent-config.d.ts +62 -0
  176. package/dist/solver/agent/agent-config.d.ts.map +1 -0
  177. package/dist/solver/agent/agent-config.js +59 -0
  178. package/dist/solver/agent/agent-config.js.map +1 -0
  179. package/dist/solver/agent/index.d.ts +6 -0
  180. package/dist/solver/agent/index.d.ts.map +1 -0
  181. package/dist/solver/agent/index.js +6 -0
  182. package/dist/solver/agent/index.js.map +1 -0
  183. package/dist/solver/agent/liquidity-agent.d.ts +118 -0
  184. package/dist/solver/agent/liquidity-agent.d.ts.map +1 -0
  185. package/dist/solver/agent/liquidity-agent.js +285 -0
  186. package/dist/solver/agent/liquidity-agent.js.map +1 -0
  187. package/dist/solver/contracts/intent-settlement/index.d.ts +2 -0
  188. package/dist/solver/contracts/intent-settlement/index.d.ts.map +1 -0
  189. package/dist/solver/contracts/intent-settlement/index.js +2 -0
  190. package/dist/solver/contracts/intent-settlement/index.js.map +1 -0
  191. package/dist/solver/contracts/intent-settlement/intent-settlement.d.ts +22 -0
  192. package/dist/solver/contracts/intent-settlement/intent-settlement.d.ts.map +1 -0
  193. package/dist/solver/contracts/intent-settlement/intent-settlement.js +58 -0
  194. package/dist/solver/contracts/intent-settlement/intent-settlement.js.map +1 -0
  195. package/dist/solver/contracts/intent-settlement/viem-settlement-contract.d.ts +226 -0
  196. package/dist/solver/contracts/intent-settlement/viem-settlement-contract.d.ts.map +1 -0
  197. package/dist/solver/contracts/intent-settlement/viem-settlement-contract.js +204 -0
  198. package/dist/solver/contracts/intent-settlement/viem-settlement-contract.js.map +1 -0
  199. package/dist/solver/index.d.ts +87 -0
  200. package/dist/solver/index.d.ts.map +1 -0
  201. package/dist/solver/index.js +167 -0
  202. package/dist/solver/index.js.map +1 -0
  203. package/dist/solver/inventory/index.d.ts +7 -0
  204. package/dist/solver/inventory/index.d.ts.map +1 -0
  205. package/dist/solver/inventory/index.js +7 -0
  206. package/dist/solver/inventory/index.js.map +1 -0
  207. package/dist/solver/inventory/inventory-manager.d.ts +135 -0
  208. package/dist/solver/inventory/inventory-manager.d.ts.map +1 -0
  209. package/dist/solver/inventory/inventory-manager.js +323 -0
  210. package/dist/solver/inventory/inventory-manager.js.map +1 -0
  211. package/dist/solver/inventory/inventory-monitor.d.ts +72 -0
  212. package/dist/solver/inventory/inventory-monitor.d.ts.map +1 -0
  213. package/dist/solver/inventory/inventory-monitor.js +123 -0
  214. package/dist/solver/inventory/inventory-monitor.js.map +1 -0
  215. package/dist/solver/inventory/rebalancer.d.ts +78 -0
  216. package/dist/solver/inventory/rebalancer.d.ts.map +1 -0
  217. package/dist/solver/inventory/rebalancer.js +210 -0
  218. package/dist/solver/inventory/rebalancer.js.map +1 -0
  219. package/dist/solver/mempool/index.d.ts +8 -0
  220. package/dist/solver/mempool/index.d.ts.map +1 -0
  221. package/dist/solver/mempool/index.js +8 -0
  222. package/dist/solver/mempool/index.js.map +1 -0
  223. package/dist/solver/mempool/intent-filter.d.ts +49 -0
  224. package/dist/solver/mempool/intent-filter.d.ts.map +1 -0
  225. package/dist/solver/mempool/intent-filter.js +75 -0
  226. package/dist/solver/mempool/intent-filter.js.map +1 -0
  227. package/dist/solver/mempool/mempool-client.d.ts +105 -0
  228. package/dist/solver/mempool/mempool-client.d.ts.map +1 -0
  229. package/dist/solver/mempool/mempool-client.js +161 -0
  230. package/dist/solver/mempool/mempool-client.js.map +1 -0
  231. package/dist/solver/mempool/mempool-monitor.d.ts +71 -0
  232. package/dist/solver/mempool/mempool-monitor.d.ts.map +1 -0
  233. package/dist/solver/mempool/mempool-monitor.js +127 -0
  234. package/dist/solver/mempool/mempool-monitor.js.map +1 -0
  235. package/dist/solver/mempool/solution-submitter.d.ts +41 -0
  236. package/dist/solver/mempool/solution-submitter.d.ts.map +1 -0
  237. package/dist/solver/mempool/solution-submitter.js +71 -0
  238. package/dist/solver/mempool/solution-submitter.js.map +1 -0
  239. package/dist/solver/monitoring/alert-manager.d.ts +43 -0
  240. package/dist/solver/monitoring/alert-manager.d.ts.map +1 -0
  241. package/dist/solver/monitoring/alert-manager.js +69 -0
  242. package/dist/solver/monitoring/alert-manager.js.map +1 -0
  243. package/dist/solver/monitoring/health-checker.d.ts +53 -0
  244. package/dist/solver/monitoring/health-checker.d.ts.map +1 -0
  245. package/dist/solver/monitoring/health-checker.js +94 -0
  246. package/dist/solver/monitoring/health-checker.js.map +1 -0
  247. package/dist/solver/monitoring/index.d.ts +7 -0
  248. package/dist/solver/monitoring/index.d.ts.map +1 -0
  249. package/dist/solver/monitoring/index.js +7 -0
  250. package/dist/solver/monitoring/index.js.map +1 -0
  251. package/dist/solver/monitoring/profit-tracker.d.ts +47 -0
  252. package/dist/solver/monitoring/profit-tracker.d.ts.map +1 -0
  253. package/dist/solver/monitoring/profit-tracker.js +112 -0
  254. package/dist/solver/monitoring/profit-tracker.js.map +1 -0
  255. package/dist/solver/pricing/dynamic-pricing.d.ts +86 -0
  256. package/dist/solver/pricing/dynamic-pricing.d.ts.map +1 -0
  257. package/dist/solver/pricing/dynamic-pricing.js +189 -0
  258. package/dist/solver/pricing/dynamic-pricing.js.map +1 -0
  259. package/dist/solver/pricing/fee-calculator.d.ts +101 -0
  260. package/dist/solver/pricing/fee-calculator.d.ts.map +1 -0
  261. package/dist/solver/pricing/fee-calculator.js +149 -0
  262. package/dist/solver/pricing/fee-calculator.js.map +1 -0
  263. package/dist/solver/pricing/index.d.ts +7 -0
  264. package/dist/solver/pricing/index.d.ts.map +1 -0
  265. package/dist/solver/pricing/index.js +7 -0
  266. package/dist/solver/pricing/index.js.map +1 -0
  267. package/dist/solver/pricing/slippage-capture.d.ts +47 -0
  268. package/dist/solver/pricing/slippage-capture.d.ts.map +1 -0
  269. package/dist/solver/pricing/slippage-capture.js +63 -0
  270. package/dist/solver/pricing/slippage-capture.js.map +1 -0
  271. package/dist/solver/protocols/aggregators/lifi.d.ts +109 -0
  272. package/dist/solver/protocols/aggregators/lifi.d.ts.map +1 -0
  273. package/dist/solver/protocols/aggregators/lifi.js +110 -0
  274. package/dist/solver/protocols/aggregators/lifi.js.map +1 -0
  275. package/dist/solver/protocols/aggregators/swing.d.ts +67 -0
  276. package/dist/solver/protocols/aggregators/swing.d.ts.map +1 -0
  277. package/dist/solver/protocols/aggregators/swing.js +212 -0
  278. package/dist/solver/protocols/aggregators/swing.js.map +1 -0
  279. package/dist/solver/protocols/base-protocol.d.ts +42 -0
  280. package/dist/solver/protocols/base-protocol.d.ts.map +1 -0
  281. package/dist/solver/protocols/base-protocol.js +16 -0
  282. package/dist/solver/protocols/base-protocol.js.map +1 -0
  283. package/dist/solver/protocols/index.d.ts +10 -0
  284. package/dist/solver/protocols/index.d.ts.map +1 -0
  285. package/dist/solver/protocols/index.js +10 -0
  286. package/dist/solver/protocols/index.js.map +1 -0
  287. package/dist/solver/protocols/lending/aave.d.ts +51 -0
  288. package/dist/solver/protocols/lending/aave.d.ts.map +1 -0
  289. package/dist/solver/protocols/lending/aave.js +172 -0
  290. package/dist/solver/protocols/lending/aave.js.map +1 -0
  291. package/dist/solver/protocols/protocol-registry.d.ts +28 -0
  292. package/dist/solver/protocols/protocol-registry.d.ts.map +1 -0
  293. package/dist/solver/protocols/protocol-registry.js +40 -0
  294. package/dist/solver/protocols/protocol-registry.js.map +1 -0
  295. package/dist/solver/settlement/index.d.ts +7 -0
  296. package/dist/solver/settlement/index.d.ts.map +1 -0
  297. package/dist/solver/settlement/index.js +7 -0
  298. package/dist/solver/settlement/index.js.map +1 -0
  299. package/dist/solver/settlement/live-settlement-manager.d.ts +62 -0
  300. package/dist/solver/settlement/live-settlement-manager.d.ts.map +1 -0
  301. package/dist/solver/settlement/live-settlement-manager.js +68 -0
  302. package/dist/solver/settlement/live-settlement-manager.js.map +1 -0
  303. package/dist/solver/settlement/proof-generator.d.ts +48 -0
  304. package/dist/solver/settlement/proof-generator.d.ts.map +1 -0
  305. package/dist/solver/settlement/proof-generator.js +100 -0
  306. package/dist/solver/settlement/proof-generator.js.map +1 -0
  307. package/dist/solver/settlement/proof-verifier.d.ts +31 -0
  308. package/dist/solver/settlement/proof-verifier.d.ts.map +1 -0
  309. package/dist/solver/settlement/proof-verifier.js +46 -0
  310. package/dist/solver/settlement/proof-verifier.js.map +1 -0
  311. package/dist/solver/settlement/settlement-manager.d.ts +97 -0
  312. package/dist/solver/settlement/settlement-manager.d.ts.map +1 -0
  313. package/dist/solver/settlement/settlement-manager.js +220 -0
  314. package/dist/solver/settlement/settlement-manager.js.map +1 -0
  315. package/dist/solver/types/agent.d.ts +92 -0
  316. package/dist/solver/types/agent.d.ts.map +1 -0
  317. package/dist/solver/types/agent.js +8 -0
  318. package/dist/solver/types/agent.js.map +1 -0
  319. package/dist/solver/types/execution.d.ts +70 -0
  320. package/dist/solver/types/execution.d.ts.map +1 -0
  321. package/dist/solver/types/execution.js +7 -0
  322. package/dist/solver/types/execution.js.map +1 -0
  323. package/dist/solver/types/index.d.ts +13 -0
  324. package/dist/solver/types/index.d.ts.map +1 -0
  325. package/dist/solver/types/index.js +13 -0
  326. package/dist/solver/types/index.js.map +1 -0
  327. package/dist/solver/types/intent.d.ts +82 -0
  328. package/dist/solver/types/intent.d.ts.map +1 -0
  329. package/dist/solver/types/intent.js +33 -0
  330. package/dist/solver/types/intent.js.map +1 -0
  331. package/dist/solver/types/inventory.d.ts +83 -0
  332. package/dist/solver/types/inventory.d.ts.map +1 -0
  333. package/dist/solver/types/inventory.js +8 -0
  334. package/dist/solver/types/inventory.js.map +1 -0
  335. package/dist/solver/types/pricing.d.ts +59 -0
  336. package/dist/solver/types/pricing.d.ts.map +1 -0
  337. package/dist/solver/types/pricing.js +8 -0
  338. package/dist/solver/types/pricing.js.map +1 -0
  339. package/dist/solver/types/settlement.d.ts +98 -0
  340. package/dist/solver/types/settlement.d.ts.map +1 -0
  341. package/dist/solver/types/settlement.js +9 -0
  342. package/dist/solver/types/settlement.js.map +1 -0
  343. package/dist/types/chain.d.ts +66 -0
  344. package/dist/types/chain.d.ts.map +1 -0
  345. package/dist/types/chain.js +7 -0
  346. package/dist/types/chain.js.map +1 -0
  347. package/dist/types/common.d.ts +44 -0
  348. package/dist/types/common.d.ts.map +1 -0
  349. package/dist/types/common.js +8 -0
  350. package/dist/types/common.js.map +1 -0
  351. package/dist/types/entities.d.ts +61 -0
  352. package/dist/types/entities.d.ts.map +1 -0
  353. package/dist/types/entities.js +2 -0
  354. package/dist/types/entities.js.map +1 -0
  355. package/dist/types/index.d.ts +44 -0
  356. package/dist/types/index.d.ts.map +1 -0
  357. package/dist/types/index.js +8 -0
  358. package/dist/types/index.js.map +1 -0
  359. package/dist/types/intent.d.ts +70 -0
  360. package/dist/types/intent.d.ts.map +1 -0
  361. package/dist/types/intent.js +2 -0
  362. package/dist/types/intent.js.map +1 -0
  363. package/dist/types/templates.d.ts +18 -0
  364. package/dist/types/templates.d.ts.map +1 -0
  365. package/dist/types/templates.js +2 -0
  366. package/dist/types/templates.js.map +1 -0
  367. package/dist/types/token.d.ts +132 -0
  368. package/dist/types/token.d.ts.map +1 -0
  369. package/dist/types/token.js +8 -0
  370. package/dist/types/token.js.map +1 -0
  371. package/package.json +62 -0
@@ -0,0 +1,81 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Zod schemas for validation
4
+ */
5
+ const IntentParametersSchema = z
6
+ .object({
7
+ inputToken: z.string().optional(),
8
+ inputTokenAddress: z.string().optional(),
9
+ inputAmount: z.string().optional(),
10
+ outputToken: z.string().optional(),
11
+ outputTokenAddress: z.string().optional(),
12
+ minOutputAmount: z.string().optional(),
13
+ recipient: z.string().optional(),
14
+ riskLevel: z.enum(["low", "medium", "high"]).optional(),
15
+ diversificationRequired: z.boolean().optional(),
16
+ preferredProtocols: z.array(z.string()).optional(),
17
+ targetAPY: z.string().optional(),
18
+ collection: z.string().optional(),
19
+ collectionAddress: z.string().optional(),
20
+ traits: z.record(z.string(), z.string()).optional(),
21
+ maxPrice: z.string().optional(),
22
+ })
23
+ .passthrough();
24
+ const IntentConstraintsSchema = z
25
+ .object({
26
+ deadline: z.number(),
27
+ maxSlippage: z.number().optional(),
28
+ maxGasCost: z.string().optional(),
29
+ minProtocols: z.number().optional(),
30
+ maxExposurePerProtocol: z.number().optional(),
31
+ preferredDEXs: z.array(z.string()).optional(),
32
+ preferredMarketplaces: z.array(z.string()).optional(),
33
+ })
34
+ .passthrough();
35
+ const StructuredIntentSchema = z.object({
36
+ intentType: z.enum([
37
+ "swap",
38
+ "yield_strategy",
39
+ "nft_purchase",
40
+ "send",
41
+ "bridge",
42
+ "claim",
43
+ "unknown",
44
+ ]),
45
+ parameters: IntentParametersSchema,
46
+ constraints: IntentConstraintsSchema,
47
+ metadata: z.object({
48
+ originalText: z.string(),
49
+ confidence: z.number().min(0).max(1),
50
+ parsedAt: z.number(),
51
+ warnings: z.array(z.string()).optional(),
52
+ }),
53
+ });
54
+ /**
55
+ * Validate structured intent
56
+ *
57
+ * INPUT: StructuredIntent
58
+ * OUTPUT: { success: boolean, error?: string }
59
+ *
60
+ * TODO: Implement validation logic
61
+ */
62
+ export function validateIntent(intent) {
63
+ try {
64
+ StructuredIntentSchema.parse(intent);
65
+ return { success: true };
66
+ }
67
+ catch (error) {
68
+ if (error instanceof z.ZodError) {
69
+ return {
70
+ success: false,
71
+ // @ts-ignore
72
+ error: error.errors.map((e) => e.message).join(", "),
73
+ };
74
+ }
75
+ return {
76
+ success: false,
77
+ error: "Unknown validation error",
78
+ };
79
+ }
80
+ }
81
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/parser/validators/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * SDK Factory — Convenience function to create Parser + Solver
3
+ *
4
+ * Usage:
5
+ * import { createIntentSDK } from "@terkoizmy/intent-sdk";
6
+ *
7
+ * const { parser, solver } = createIntentSDK({
8
+ * agent: {
9
+ * privateKey: "0x...",
10
+ * mode: "simulate",
11
+ * supportedChains: [1, 42161],
12
+ * supportedTokens: ["USDC"],
13
+ * },
14
+ * contractAddress: "0x...",
15
+ * });
16
+ */
17
+ import { IntentParser } from "./parser";
18
+ import { IntentSolver } from "./solver";
19
+ import type { LiquidityAgentConfig } from "./solver/agent/agent-config";
20
+ import type { ParserConfig } from "./parser";
21
+ export interface SDKConfig {
22
+ /** Parser configuration (optional — sensible defaults used) */
23
+ parser?: ParserConfig;
24
+ /** Solver configuration (required for solver functionality) */
25
+ solver: LiquidityAgentConfig;
26
+ }
27
+ /**
28
+ * Create a fully configured Intent SDK with both parser and solver.
29
+ *
30
+ * @param config - SDK configuration
31
+ * @returns Object containing `parser` and `solver` instances
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * const { parser, solver } = createIntentSDK({
36
+ * solver: {
37
+ * agent: {
38
+ * privateKey: process.env.SOLVER_PRIVATE_KEY!,
39
+ * mode: "live",
40
+ * supportedChains: [1, 42161],
41
+ * supportedTokens: ["USDC"],
42
+ * },
43
+ * contractAddress: process.env.SETTLEMENT_CONTRACT!,
44
+ * },
45
+ * });
46
+ *
47
+ * await solver.initialize();
48
+ * const parsed = parser.parse("Bridge 100 USDC from Ethereum to Arbitrum");
49
+ * ```
50
+ */
51
+ export declare function createIntentSDK(config: SDKConfig): {
52
+ parser: IntentParser;
53
+ solver: IntentSolver;
54
+ };
55
+ //# sourceMappingURL=sdk-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-factory.d.ts","sourceRoot":"","sources":["../src/sdk-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,MAAM,WAAW,SAAS;IACtB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,+DAA+D;IAC/D,MAAM,EAAE,oBAAoB,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS;;;EAKhD"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * SDK Factory — Convenience function to create Parser + Solver
3
+ *
4
+ * Usage:
5
+ * import { createIntentSDK } from "@terkoizmy/intent-sdk";
6
+ *
7
+ * const { parser, solver } = createIntentSDK({
8
+ * agent: {
9
+ * privateKey: "0x...",
10
+ * mode: "simulate",
11
+ * supportedChains: [1, 42161],
12
+ * supportedTokens: ["USDC"],
13
+ * },
14
+ * contractAddress: "0x...",
15
+ * });
16
+ */
17
+ import { IntentParser } from "./parser";
18
+ import { IntentSolver } from "./solver";
19
+ /**
20
+ * Create a fully configured Intent SDK with both parser and solver.
21
+ *
22
+ * @param config - SDK configuration
23
+ * @returns Object containing `parser` and `solver` instances
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const { parser, solver } = createIntentSDK({
28
+ * solver: {
29
+ * agent: {
30
+ * privateKey: process.env.SOLVER_PRIVATE_KEY!,
31
+ * mode: "live",
32
+ * supportedChains: [1, 42161],
33
+ * supportedTokens: ["USDC"],
34
+ * },
35
+ * contractAddress: process.env.SETTLEMENT_CONTRACT!,
36
+ * },
37
+ * });
38
+ *
39
+ * await solver.initialize();
40
+ * const parsed = parser.parse("Bridge 100 USDC from Ethereum to Arbitrum");
41
+ * ```
42
+ */
43
+ export function createIntentSDK(config) {
44
+ return {
45
+ parser: new IntentParser(config.parser),
46
+ solver: new IntentSolver(config.solver),
47
+ };
48
+ }
49
+ //# sourceMappingURL=sdk-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-factory.js","sourceRoot":"","sources":["../src/sdk-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAYxC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC7C,OAAO;QACH,MAAM,EAAE,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;QACvC,MAAM,EAAE,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;KAC1C,CAAC;AACN,CAAC"}
@@ -0,0 +1,142 @@
1
+ import type { ResolvedToken, TokenResolverConfig } from "../types/token";
2
+ /**
3
+ * Token Resolver Service
4
+ *
5
+ * Resolve token symbol + chain → contract address menggunakan Swing.xyz API.
6
+ * Includes built-in caching untuk menghindari API call berulang.
7
+ *
8
+ * API ENDPOINT: https://platform.swing.xyz/api/v1/tokens?chain={chain}&symbol={symbol}
9
+ * - Public API, tidak perlu API key
10
+ * - Support EVM chains (Ethereum, Polygon, Arbitrum, etc.) + Solana
11
+ * - Response: { symbol, name, address, decimals, price, chain, logo }
12
+ *
13
+ * CONTOH PENGGUNAAN:
14
+ * const resolver = new TokenResolver({ enabled: true, cacheTTL: 300_000, timeout: 5000 });
15
+ * const token = await resolver.resolve("USDC", "polygon");
16
+ * // → { symbol: "USDC", address: "0x3c499c...", decimals: 6, chain: "polygon" }
17
+ *
18
+ * CACHING:
19
+ * - Cache key: "${SYMBOL}:${chain}" (e.g., "USDC:polygon")
20
+ * - TTL: configurable, default 5 menit
21
+ * - Jika cache hit dan belum expired → return cached, skip API call
22
+ *
23
+ * ERROR HANDLING:
24
+ * - Jika API down / timeout → return null (parser tetap berfungsi tanpa address)
25
+ * - Jika token tidak ditemukan → return null
26
+ * - Tidak throw error — selalu graceful
27
+ */
28
+ export declare class TokenResolver {
29
+ private config;
30
+ private cache;
31
+ private static readonly BASE_URL;
32
+ /**
33
+ * Constructor
34
+ *
35
+ * INPUT: TokenResolverConfig
36
+ * - enabled: boolean (default: true)
37
+ * - cacheTTL: number in ms (default: 300_000 = 5 min)
38
+ * - timeout: number in ms (default: 5000)
39
+ * - customResolver?: (symbol, chain) => Promise<ResolvedToken | null>
40
+ */
41
+ constructor(config?: Partial<TokenResolverConfig>);
42
+ /**
43
+ * Resolve a token symbol on a specific chain to its contract address
44
+ *
45
+ * INPUT:
46
+ * - symbol: Token symbol, e.g., "USDC", "ETH", "WBTC"
47
+ * - chain: Chain name, e.g., "ethereum", "polygon", "solana"
48
+ *
49
+ * OUTPUT:
50
+ * - Promise<ResolvedToken | null>
51
+ * - Returns null jika: disabled, token not found, API error, timeout
52
+ *
53
+ * FLOW:
54
+ * 1. Jika disabled → return null
55
+ * 2. Jika customResolver disediakan → gunakan itu
56
+ * 3. Check cache → jika hit dan belum expired → return cached
57
+ * 4. Call Swing.xyz API
58
+ * 5. Parse response → map ke ResolvedToken
59
+ * 6. Simpan ke cache
60
+ * 7. Return ResolvedToken
61
+ *
62
+ * ERROR: Tidak throw. Jika terjadi error apapun → return null
63
+ */
64
+ resolve(symbol: string, chain: string): Promise<ResolvedToken | null>;
65
+ /**
66
+ * Resolve multiple tokens in parallel
67
+ *
68
+ * INPUT:
69
+ * - tokens: Array of { symbol, chain } objects
70
+ *
71
+ * OUTPUT:
72
+ * - Promise<Map<string, ResolvedToken | null>>
73
+ * - Map key = "SYMBOL:chain" (e.g., "USDC:polygon")
74
+ *
75
+ * CONTOH:
76
+ * const results = await resolver.resolveMany([
77
+ * { symbol: "USDC", chain: "ethereum" },
78
+ * { symbol: "ETH", chain: "polygon" },
79
+ * ]);
80
+ * // results.get("USDC:ethereum") → { address: "0xA0b8..." }
81
+ */
82
+ resolveMany(tokens: Array<{
83
+ symbol: string;
84
+ chain: string;
85
+ }>): Promise<Map<string, ResolvedToken | null>>;
86
+ /**
87
+ * Fetch token data from Swing.xyz API
88
+ *
89
+ * INPUT:
90
+ * - symbol: Token symbol (e.g., "USDC")
91
+ * - chain: Chain name (e.g., "polygon")
92
+ *
93
+ * OUTPUT:
94
+ * - Promise<ResolvedToken | null>
95
+ *
96
+ * API CALL:
97
+ * GET https://platform.swing.xyz/api/v1/tokens?chain={chain}&symbol={symbol}
98
+ * Headers: { "x-swing-environment": "" }
99
+ *
100
+ * RESPONSE SHAPE (array):
101
+ * [{ symbol, name, address, decimals, logo, chain, price, ... }]
102
+ *
103
+ * MAPPING:
104
+ * SwingTokenResponse → ResolvedToken:
105
+ * - symbol → symbol
106
+ * - address → address
107
+ * - decimals → decimals
108
+ * - chain → chain
109
+ * - name → name
110
+ * - price → price
111
+ * - logo → logoUrl
112
+ *
113
+ * ERROR HANDLING:
114
+ * - Wrap in try/catch
115
+ * - Use AbortController for timeout
116
+ * - Return null on any error
117
+ */
118
+ private fetchFromSwing;
119
+ /**
120
+ * Generate cache key dari symbol dan chain
121
+ *
122
+ * INPUT: symbol ("USDC"), chain ("polygon")
123
+ * OUTPUT: "USDC:polygon" (symbol uppercase, chain lowercase)
124
+ */
125
+ private getCacheKey;
126
+ /**
127
+ * Get dari cache jika ada dan belum expired
128
+ *
129
+ * INPUT: Cache key (e.g., "USDC:polygon")
130
+ * OUTPUT: ResolvedToken | null
131
+ *
132
+ * LOGIC:
133
+ * 1. Check apakah key ada di Map
134
+ * 2. Check apakah (now - cachedAt) < cacheTTL
135
+ * 3. Jika expired → delete entry, return null
136
+ * 4. Jika valid → return token
137
+ */
138
+ private getFromCache;
139
+ private setCache;
140
+ clearCache(): void;
141
+ }
142
+ //# sourceMappingURL=token-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-resolver.d.ts","sourceRoot":"","sources":["../../src/services/token-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,aAAa,EACb,mBAAmB,EAGtB,MAAM,gBAAgB,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,KAAK,CAA+B;IAE5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CACe;IAE/C;;;;;;;;OAQG;gBACS,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAYrD;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA0B3E;;;;;;;;;;;;;;;;OAgBG;IACG,WAAW,CACb,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GACjD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC,CAAC;IAqB7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;YACW,cAAc;IAoD5B;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAInB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,QAAQ;IAahB,UAAU,IAAI,IAAI;CAGrB"}
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Token Resolver Service
3
+ *
4
+ * Resolve token symbol + chain → contract address menggunakan Swing.xyz API.
5
+ * Includes built-in caching untuk menghindari API call berulang.
6
+ *
7
+ * API ENDPOINT: https://platform.swing.xyz/api/v1/tokens?chain={chain}&symbol={symbol}
8
+ * - Public API, tidak perlu API key
9
+ * - Support EVM chains (Ethereum, Polygon, Arbitrum, etc.) + Solana
10
+ * - Response: { symbol, name, address, decimals, price, chain, logo }
11
+ *
12
+ * CONTOH PENGGUNAAN:
13
+ * const resolver = new TokenResolver({ enabled: true, cacheTTL: 300_000, timeout: 5000 });
14
+ * const token = await resolver.resolve("USDC", "polygon");
15
+ * // → { symbol: "USDC", address: "0x3c499c...", decimals: 6, chain: "polygon" }
16
+ *
17
+ * CACHING:
18
+ * - Cache key: "${SYMBOL}:${chain}" (e.g., "USDC:polygon")
19
+ * - TTL: configurable, default 5 menit
20
+ * - Jika cache hit dan belum expired → return cached, skip API call
21
+ *
22
+ * ERROR HANDLING:
23
+ * - Jika API down / timeout → return null (parser tetap berfungsi tanpa address)
24
+ * - Jika token tidak ditemukan → return null
25
+ * - Tidak throw error — selalu graceful
26
+ */
27
+ export class TokenResolver {
28
+ config;
29
+ cache;
30
+ static BASE_URL = "https://platform.swing.xyz/api/v1/tokens";
31
+ /**
32
+ * Constructor
33
+ *
34
+ * INPUT: TokenResolverConfig
35
+ * - enabled: boolean (default: true)
36
+ * - cacheTTL: number in ms (default: 300_000 = 5 min)
37
+ * - timeout: number in ms (default: 5000)
38
+ * - customResolver?: (symbol, chain) => Promise<ResolvedToken | null>
39
+ */
40
+ constructor(config = {}) {
41
+ this.config = {
42
+ enabled: config.enabled ?? true,
43
+ cacheTTL: config.cacheTTL ?? 300_000,
44
+ timeout: config.timeout ?? 5000,
45
+ maxCacheSize: config.maxCacheSize ?? 1000,
46
+ customResolver: config.customResolver,
47
+ };
48
+ this.cache = new Map();
49
+ }
50
+ /**
51
+ * Resolve a token symbol on a specific chain to its contract address
52
+ *
53
+ * INPUT:
54
+ * - symbol: Token symbol, e.g., "USDC", "ETH", "WBTC"
55
+ * - chain: Chain name, e.g., "ethereum", "polygon", "solana"
56
+ *
57
+ * OUTPUT:
58
+ * - Promise<ResolvedToken | null>
59
+ * - Returns null jika: disabled, token not found, API error, timeout
60
+ *
61
+ * FLOW:
62
+ * 1. Jika disabled → return null
63
+ * 2. Jika customResolver disediakan → gunakan itu
64
+ * 3. Check cache → jika hit dan belum expired → return cached
65
+ * 4. Call Swing.xyz API
66
+ * 5. Parse response → map ke ResolvedToken
67
+ * 6. Simpan ke cache
68
+ * 7. Return ResolvedToken
69
+ *
70
+ * ERROR: Tidak throw. Jika terjadi error apapun → return null
71
+ */
72
+ async resolve(symbol, chain) {
73
+ // Step 1: Early return jika disabled
74
+ if (!this.config.enabled)
75
+ return null;
76
+ // Step 2: Jika customResolver disediakan, gunakan itu
77
+ if (this.config.customResolver) {
78
+ return this.config.customResolver(symbol, chain);
79
+ }
80
+ // Step 3: Check cache
81
+ const cacheKey = this.getCacheKey(symbol, chain);
82
+ const cached = this.getFromCache(cacheKey);
83
+ if (cached)
84
+ return cached;
85
+ // Step 4: Call Swing.xyz API via fetchFromSwing()
86
+ const resolved = await this.fetchFromSwing(symbol, chain);
87
+ // Step 5: Cache result jika berhasil
88
+ if (resolved) {
89
+ this.setCache(cacheKey, resolved);
90
+ }
91
+ // Step 6: Return result
92
+ return resolved;
93
+ }
94
+ /**
95
+ * Resolve multiple tokens in parallel
96
+ *
97
+ * INPUT:
98
+ * - tokens: Array of { symbol, chain } objects
99
+ *
100
+ * OUTPUT:
101
+ * - Promise<Map<string, ResolvedToken | null>>
102
+ * - Map key = "SYMBOL:chain" (e.g., "USDC:polygon")
103
+ *
104
+ * CONTOH:
105
+ * const results = await resolver.resolveMany([
106
+ * { symbol: "USDC", chain: "ethereum" },
107
+ * { symbol: "ETH", chain: "polygon" },
108
+ * ]);
109
+ * // results.get("USDC:ethereum") → { address: "0xA0b8..." }
110
+ */
111
+ async resolveMany(tokens) {
112
+ // Step 1: Map each token ke Promise<[key, ResolvedToken | null]>
113
+ const promises = tokens.map(async ({ symbol, chain }) => {
114
+ const key = this.getCacheKey(symbol, chain);
115
+ const resolved = await this.resolve(symbol, chain);
116
+ return [key, resolved];
117
+ });
118
+ // Step 2: Promise.allSettled() untuk parallel execution
119
+ const results = await Promise.allSettled(promises);
120
+ // Step 3: Build result map
121
+ const resultMap = new Map();
122
+ for (const result of results) {
123
+ if (result.status === "fulfilled") {
124
+ resultMap.set(result.value[0], result.value[1]);
125
+ }
126
+ }
127
+ return resultMap;
128
+ }
129
+ /**
130
+ * Fetch token data from Swing.xyz API
131
+ *
132
+ * INPUT:
133
+ * - symbol: Token symbol (e.g., "USDC")
134
+ * - chain: Chain name (e.g., "polygon")
135
+ *
136
+ * OUTPUT:
137
+ * - Promise<ResolvedToken | null>
138
+ *
139
+ * API CALL:
140
+ * GET https://platform.swing.xyz/api/v1/tokens?chain={chain}&symbol={symbol}
141
+ * Headers: { "x-swing-environment": "" }
142
+ *
143
+ * RESPONSE SHAPE (array):
144
+ * [{ symbol, name, address, decimals, logo, chain, price, ... }]
145
+ *
146
+ * MAPPING:
147
+ * SwingTokenResponse → ResolvedToken:
148
+ * - symbol → symbol
149
+ * - address → address
150
+ * - decimals → decimals
151
+ * - chain → chain
152
+ * - name → name
153
+ * - price → price
154
+ * - logo → logoUrl
155
+ *
156
+ * ERROR HANDLING:
157
+ * - Wrap in try/catch
158
+ * - Use AbortController for timeout
159
+ * - Return null on any error
160
+ */
161
+ async fetchFromSwing(symbol, chain) {
162
+ // Step 1: Build URL
163
+ const url = `${TokenResolver.BASE_URL}?chain=${encodeURIComponent(chain)}&symbol=${encodeURIComponent(symbol)}`;
164
+ // Step 2: Setup AbortController for timeout
165
+ const controller = new AbortController();
166
+ const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
167
+ try {
168
+ // Step 3: Fetch
169
+ const response = await fetch(url, {
170
+ headers: { "x-swing-environment": "" },
171
+ signal: controller.signal,
172
+ });
173
+ clearTimeout(timeoutId);
174
+ // Step 4: Parse response
175
+ if (!response.ok)
176
+ return null;
177
+ const data = await response.json();
178
+ // Handle Swing API response format wrapped in "value" if present (some APIs wrap list in value object)
179
+ // Based on user provided curl output: {"value": [...], "Count": 1} is possible?
180
+ // Wait, previous curl output showed:
181
+ // { "value": [ ... ] }
182
+ // So we need to access data.value if it exists.
183
+ const tokens = Array.isArray(data) ? data : (data.value || []);
184
+ // Step 5: Validasi — API return array, ambil pertama
185
+ if (!tokens || tokens.length === 0)
186
+ return null;
187
+ const token = tokens[0];
188
+ // Step 6: Map ke ResolvedToken
189
+ return {
190
+ symbol: token.symbol,
191
+ address: token.address,
192
+ decimals: token.decimals,
193
+ chain: token.chain,
194
+ name: token.name,
195
+ price: token.price,
196
+ logoUrl: token.logo,
197
+ };
198
+ }
199
+ catch (error) {
200
+ return null;
201
+ }
202
+ finally {
203
+ clearTimeout(timeoutId);
204
+ }
205
+ }
206
+ /**
207
+ * Generate cache key dari symbol dan chain
208
+ *
209
+ * INPUT: symbol ("USDC"), chain ("polygon")
210
+ * OUTPUT: "USDC:polygon" (symbol uppercase, chain lowercase)
211
+ */
212
+ getCacheKey(symbol, chain) {
213
+ return `${symbol.toUpperCase()}:${chain.toLowerCase()}`;
214
+ }
215
+ /**
216
+ * Get dari cache jika ada dan belum expired
217
+ *
218
+ * INPUT: Cache key (e.g., "USDC:polygon")
219
+ * OUTPUT: ResolvedToken | null
220
+ *
221
+ * LOGIC:
222
+ * 1. Check apakah key ada di Map
223
+ * 2. Check apakah (now - cachedAt) < cacheTTL
224
+ * 3. Jika expired → delete entry, return null
225
+ * 4. Jika valid → return token
226
+ */
227
+ getFromCache(key) {
228
+ const entry = this.cache.get(key);
229
+ if (!entry)
230
+ return null;
231
+ const isExpired = Date.now() - entry.cachedAt > this.config.cacheTTL;
232
+ if (isExpired) {
233
+ this.cache.delete(key);
234
+ return null;
235
+ }
236
+ return entry.token;
237
+ }
238
+ setCache(key, token) {
239
+ // Evict oldest entry if cache is full
240
+ if (this.cache.size >= this.config.maxCacheSize) {
241
+ const oldestKey = this.cache.keys().next().value;
242
+ if (oldestKey)
243
+ this.cache.delete(oldestKey);
244
+ }
245
+ this.cache.set(key, {
246
+ token,
247
+ cachedAt: Date.now(),
248
+ });
249
+ }
250
+ clearCache() {
251
+ this.cache.clear();
252
+ }
253
+ }
254
+ //# sourceMappingURL=token-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-resolver.js","sourceRoot":"","sources":["../../src/services/token-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Chain Names — Human-Readable Display Names
3
+ *
4
+ * Static lookup map for well-known EVM chain IDs.
5
+ * Zero external dependencies — used across error messages and logging.
6
+ *
7
+ * Stage 3 — Phase G (Production Hardening)
8
+ */
9
+ /**
10
+ * Well-known EVM chain ID → human-readable name.
11
+ */
12
+ export declare const CHAIN_NAMES: Record<number, string>;
13
+ /**
14
+ * Get a human-readable display name for a chain ID.
15
+ *
16
+ * Returns `"Ethereum (1)"` for known chains or `"Unknown Chain (99999)"` for unknown.
17
+ *
18
+ * @param chainId - Numeric EVM chain ID
19
+ * @returns Display string like `"Arbitrum One (42161)"`
20
+ */
21
+ export declare function getChainDisplayName(chainId: number): string;
22
+ //# sourceMappingURL=chain-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain-names.d.ts","sourceRoot":"","sources":["../../../src/shared/chain-registry/chain-names.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAsB9C,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM3D"}