@eco-incorp/sauce 0.99.4 → 0.99.6

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 (1343) hide show
  1. package/README.md +105 -63
  2. package/actions/action-program.schema.json +1810 -0
  3. package/actions/dist/abis.d.ts +167 -0
  4. package/actions/dist/abis.d.ts.map +1 -0
  5. package/actions/dist/abis.js +215 -0
  6. package/actions/dist/compile.d.ts +15 -8
  7. package/actions/dist/compile.d.ts.map +1 -1
  8. package/actions/dist/compile.js +11 -33
  9. package/actions/dist/compose.d.ts +46 -0
  10. package/actions/dist/compose.d.ts.map +1 -0
  11. package/actions/dist/compose.js +118 -0
  12. package/actions/dist/emit.d.ts +0 -35
  13. package/actions/dist/emit.d.ts.map +1 -1
  14. package/actions/dist/emit.js +15 -46
  15. package/actions/dist/index.d.ts +11 -8
  16. package/actions/dist/index.d.ts.map +1 -1
  17. package/actions/dist/index.js +6 -4
  18. package/actions/dist/program.d.ts +23 -0
  19. package/actions/dist/program.d.ts.map +1 -0
  20. package/actions/dist/program.js +358 -0
  21. package/actions/dist/registry.d.ts +37 -0
  22. package/actions/dist/registry.d.ts.map +1 -0
  23. package/actions/dist/registry.js +36 -0
  24. package/actions/dist/schema.d.ts +6 -0
  25. package/actions/dist/schema.d.ts.map +1 -0
  26. package/actions/dist/schema.js +166 -0
  27. package/actions/dist/semantics.d.ts +18 -0
  28. package/actions/dist/semantics.d.ts.map +1 -0
  29. package/actions/dist/semantics.js +164 -0
  30. package/actions/dist/spec.d.ts +97 -0
  31. package/actions/dist/spec.d.ts.map +1 -0
  32. package/actions/dist/spec.js +323 -0
  33. package/actions/dist/split-swap.d.ts +35 -0
  34. package/actions/dist/split-swap.d.ts.map +1 -0
  35. package/actions/dist/split-swap.js +175 -0
  36. package/actions/dist/to-quote.d.ts +32 -56
  37. package/actions/dist/to-quote.d.ts.map +1 -1
  38. package/actions/dist/to-quote.js +134 -141
  39. package/actions/dist/to-sauce.d.ts +48 -32
  40. package/actions/dist/to-sauce.d.ts.map +1 -1
  41. package/actions/dist/to-sauce.js +691 -753
  42. package/actions/dist/types.d.ts +227 -335
  43. package/actions/dist/types.d.ts.map +1 -1
  44. package/actions/dist/types.js +12 -3
  45. package/dev-tools/README.md +9 -9
  46. package/dev-tools/artifacts/ISauceRouter.json +1 -1
  47. package/dev-tools/artifacts/Router.json +1 -1
  48. package/dev-tools/scripts/start-fork.sh +1 -1
  49. package/dev-tools/scripts/start-local.sh +5 -1
  50. package/dev-tools/src/svm-local.ts +23 -13
  51. package/docs/README.md +45 -34
  52. package/docs/api/README.md +37 -29
  53. package/docs/api/compiler.md +116 -55
  54. package/docs/api/coverage.md +99 -48
  55. package/docs/api/routes.md +51 -22
  56. package/docs/concepts/architecture.md +85 -116
  57. package/docs/concepts/saucescript.md +46 -25
  58. package/docs/examples/README.md +18 -10
  59. package/docs/examples/action-program.ts +75 -0
  60. package/docs/examples/cross-chain-cascade.sauce.ts +21 -0
  61. package/docs/examples/cross-chain-cascade.ts +43 -0
  62. package/docs/examples/cross-chain-intent.sauce.ts +23 -0
  63. package/docs/examples/cross-chain-intent.ts +49 -0
  64. package/docs/examples/first-intent.ts +7 -10
  65. package/docs/examples/protocol-approval.ts +3 -7
  66. package/docs/guides/actions.md +395 -0
  67. package/docs/guides/builders-and-actions.md +34 -37
  68. package/docs/guides/compiling.md +99 -98
  69. package/docs/guides/intents.md +273 -25
  70. package/docs/guides/nested-intents.md +165 -5
  71. package/docs/guides/protocols-and-tokens.md +36 -8
  72. package/docs/guides/quick-start.md +51 -22
  73. package/docs/guides/solana.md +38 -40
  74. package/docs/guides/verification.md +70 -31
  75. package/package.json +7 -2
  76. package/sdk/dist/artifacts/ISauceRouter.json +1 -1
  77. package/sdk/dist/artifacts/Router.json +1 -1
  78. package/sdk/dist/artifacts/V12Deployments.json +23 -22
  79. package/sdk/dist/artifacts/V12EngineGate.json +2 -2
  80. package/sdk/dist/artifacts/V12Kitchen.json +1 -1
  81. package/sdk/dist/artifacts/V12Pot.json +1 -1
  82. package/sdk/dist/artifacts/V12RuntimeBytecode.json +1 -1
  83. package/sdk/dist/artifacts/svm/engine-devnet.so +0 -0
  84. package/sdk/dist/artifacts/svm/engine-mainnet.so +0 -0
  85. package/sdk/dist/bytes.d.ts +10 -0
  86. package/sdk/dist/bytes.d.ts.map +1 -0
  87. package/sdk/dist/bytes.js +31 -0
  88. package/sdk/dist/bytes.js.map +1 -0
  89. package/sdk/dist/chains/canonical.d.ts +7 -1
  90. package/sdk/dist/chains/canonical.d.ts.map +1 -1
  91. package/sdk/dist/chains/canonical.js +6 -2
  92. package/sdk/dist/chains/canonical.js.map +1 -1
  93. package/sdk/dist/chains/index.d.ts +16 -2
  94. package/sdk/dist/chains/index.d.ts.map +1 -1
  95. package/sdk/dist/chains/index.js +51 -34
  96. package/sdk/dist/chains/index.js.map +1 -1
  97. package/sdk/dist/compact-arguments.d.ts +4 -1
  98. package/sdk/dist/compact-arguments.d.ts.map +1 -1
  99. package/sdk/dist/compact-arguments.js +25 -4
  100. package/sdk/dist/compact-arguments.js.map +1 -1
  101. package/sdk/dist/compiler.d.ts +13 -1
  102. package/sdk/dist/compiler.d.ts.map +1 -1
  103. package/sdk/dist/compiler.js +5 -6
  104. package/sdk/dist/compiler.js.map +1 -1
  105. package/sdk/dist/core/types.d.ts +18 -2
  106. package/sdk/dist/core/types.d.ts.map +1 -1
  107. package/sdk/dist/deployments/pot.d.ts +39 -0
  108. package/sdk/dist/deployments/pot.d.ts.map +1 -0
  109. package/sdk/dist/deployments/pot.js +48 -0
  110. package/sdk/dist/deployments/pot.js.map +1 -0
  111. package/sdk/dist/deployments/v12-addresses.d.ts +1 -4
  112. package/sdk/dist/deployments/v12-addresses.d.ts.map +1 -1
  113. package/sdk/dist/deployments/v12-addresses.js +7 -21
  114. package/sdk/dist/deployments/v12-addresses.js.map +1 -1
  115. package/sdk/dist/deposit/index.d.ts +5 -5
  116. package/sdk/dist/deposit/index.d.ts.map +1 -1
  117. package/sdk/dist/deposit/index.js +1 -1
  118. package/sdk/dist/deposit/index.js.map +1 -1
  119. package/sdk/dist/deposit/params.d.ts +3 -2
  120. package/sdk/dist/deposit/params.d.ts.map +1 -1
  121. package/sdk/dist/deposit/params.js +40 -3
  122. package/sdk/dist/deposit/params.js.map +1 -1
  123. package/sdk/dist/deposit/source.d.ts +0 -19
  124. package/sdk/dist/deposit/source.d.ts.map +1 -1
  125. package/sdk/dist/deposit/source.js +17 -34
  126. package/sdk/dist/deposit/source.js.map +1 -1
  127. package/sdk/dist/descriptors/accessors.d.ts +2 -2
  128. package/sdk/dist/descriptors/accessors.d.ts.map +1 -1
  129. package/sdk/dist/descriptors/accessors.js +15 -4
  130. package/sdk/dist/descriptors/accessors.js.map +1 -1
  131. package/sdk/dist/descriptors/call.d.ts +8 -13
  132. package/sdk/dist/descriptors/call.d.ts.map +1 -1
  133. package/sdk/dist/descriptors/call.js +7 -19
  134. package/sdk/dist/descriptors/call.js.map +1 -1
  135. package/sdk/dist/descriptors/derive.d.ts +1 -1
  136. package/sdk/dist/descriptors/derive.d.ts.map +1 -1
  137. package/sdk/dist/descriptors/derive.js +1 -1
  138. package/sdk/dist/descriptors/derive.js.map +1 -1
  139. package/sdk/dist/descriptors/index.d.ts +1 -1
  140. package/sdk/dist/descriptors/index.d.ts.map +1 -1
  141. package/sdk/dist/descriptors/index.js +1 -1
  142. package/sdk/dist/descriptors/index.js.map +1 -1
  143. package/sdk/dist/descriptors/links.d.ts +3 -12
  144. package/sdk/dist/descriptors/links.d.ts.map +1 -1
  145. package/sdk/dist/descriptors/links.js +2 -32
  146. package/sdk/dist/descriptors/links.js.map +1 -1
  147. package/sdk/dist/descriptors/query.d.ts +7 -3
  148. package/sdk/dist/descriptors/query.d.ts.map +1 -1
  149. package/sdk/dist/descriptors/query.js +9 -5
  150. package/sdk/dist/descriptors/query.js.map +1 -1
  151. package/sdk/dist/descriptors/registry.d.ts.map +1 -1
  152. package/sdk/dist/descriptors/registry.js +1 -0
  153. package/sdk/dist/descriptors/registry.js.map +1 -1
  154. package/sdk/dist/embedded/recipes.d.ts +3 -0
  155. package/sdk/dist/embedded/recipes.d.ts.map +1 -0
  156. package/sdk/dist/embedded/recipes.js +15 -0
  157. package/sdk/dist/embedded/recipes.js.map +1 -0
  158. package/sdk/dist/embedded/resolve.d.ts +27 -0
  159. package/sdk/dist/embedded/resolve.d.ts.map +1 -0
  160. package/sdk/dist/embedded/resolve.js +99 -0
  161. package/sdk/dist/embedded/resolve.js.map +1 -0
  162. package/sdk/dist/embedded/skills.generated.d.ts +3 -0
  163. package/sdk/dist/embedded/skills.generated.d.ts.map +1 -0
  164. package/sdk/dist/embedded/skills.generated.js +141 -0
  165. package/sdk/dist/embedded/skills.generated.js.map +1 -0
  166. package/sdk/dist/embedded/sources.generated.d.ts +7 -0
  167. package/sdk/dist/embedded/sources.generated.d.ts.map +1 -0
  168. package/sdk/dist/embedded/sources.generated.js +231 -0
  169. package/sdk/dist/embedded/sources.generated.js.map +1 -0
  170. package/sdk/dist/evm/execution-fee.d.ts +30 -0
  171. package/sdk/dist/evm/execution-fee.d.ts.map +1 -0
  172. package/sdk/dist/evm/execution-fee.js +33 -0
  173. package/sdk/dist/evm/execution-fee.js.map +1 -0
  174. package/sdk/dist/index.d.ts +7 -2
  175. package/sdk/dist/index.d.ts.map +1 -1
  176. package/sdk/dist/index.js +16 -10
  177. package/sdk/dist/index.js.map +1 -1
  178. package/sdk/dist/plugin/index.d.ts +4 -3
  179. package/sdk/dist/plugin/index.d.ts.map +1 -1
  180. package/sdk/dist/plugin/index.js +5 -22
  181. package/sdk/dist/plugin/index.js.map +1 -1
  182. package/sdk/dist/protocols/aave-v4/abis.d.ts +201 -0
  183. package/sdk/dist/protocols/aave-v4/abis.d.ts.map +1 -0
  184. package/sdk/dist/protocols/aave-v4/abis.js +139 -0
  185. package/sdk/dist/protocols/aave-v4/abis.js.map +1 -0
  186. package/sdk/dist/protocols/aave-v4/addresses.d.ts +3 -0
  187. package/sdk/dist/protocols/aave-v4/addresses.d.ts.map +1 -0
  188. package/sdk/dist/protocols/aave-v4/addresses.js +65 -0
  189. package/sdk/dist/protocols/aave-v4/addresses.js.map +1 -0
  190. package/sdk/dist/protocols/aave-v4/functions.d.ts +5 -0
  191. package/sdk/dist/protocols/aave-v4/functions.d.ts.map +1 -0
  192. package/sdk/dist/protocols/aave-v4/functions.js +37 -0
  193. package/sdk/dist/protocols/aave-v4/functions.js.map +1 -0
  194. package/sdk/dist/protocols/aave-v4/index.d.ts +5 -0
  195. package/sdk/dist/protocols/aave-v4/index.d.ts.map +1 -0
  196. package/sdk/dist/protocols/aave-v4/index.js +5 -0
  197. package/sdk/dist/protocols/aave-v4/index.js.map +1 -0
  198. package/sdk/dist/protocols/aave-v4/info.d.ts +3 -0
  199. package/sdk/dist/protocols/aave-v4/info.d.ts.map +1 -0
  200. package/sdk/dist/protocols/aave-v4/info.js +12 -0
  201. package/sdk/dist/protocols/aave-v4/info.js.map +1 -0
  202. package/sdk/dist/protocols/across/abis.d.ts +24 -12
  203. package/sdk/dist/protocols/across/abis.d.ts.map +1 -1
  204. package/sdk/dist/protocols/across/abis.js +16 -8
  205. package/sdk/dist/protocols/across/abis.js.map +1 -1
  206. package/sdk/dist/protocols/across/addresses.d.ts.map +1 -1
  207. package/sdk/dist/protocols/across/addresses.js +10 -0
  208. package/sdk/dist/protocols/across/addresses.js.map +1 -1
  209. package/sdk/dist/protocols/across/functions.d.ts +1 -1
  210. package/sdk/dist/protocols/across/functions.d.ts.map +1 -1
  211. package/sdk/dist/protocols/across/functions.js +2 -2
  212. package/sdk/dist/protocols/aerodrome-slipstream/abis.d.ts +112 -0
  213. package/sdk/dist/protocols/aerodrome-slipstream/abis.d.ts.map +1 -0
  214. package/sdk/dist/protocols/aerodrome-slipstream/abis.js +73 -0
  215. package/sdk/dist/protocols/aerodrome-slipstream/abis.js.map +1 -0
  216. package/sdk/dist/protocols/aerodrome-slipstream/addresses.d.ts +3 -0
  217. package/sdk/dist/protocols/aerodrome-slipstream/addresses.d.ts.map +1 -0
  218. package/sdk/dist/protocols/aerodrome-slipstream/addresses.js +39 -0
  219. package/sdk/dist/protocols/aerodrome-slipstream/addresses.js.map +1 -0
  220. package/sdk/dist/protocols/aerodrome-slipstream/functions.d.ts +2 -0
  221. package/sdk/dist/protocols/aerodrome-slipstream/functions.d.ts.map +1 -0
  222. package/sdk/dist/protocols/aerodrome-slipstream/functions.js +9 -0
  223. package/sdk/dist/protocols/aerodrome-slipstream/functions.js.map +1 -0
  224. package/sdk/dist/protocols/aerodrome-slipstream/index.d.ts +5 -0
  225. package/sdk/dist/protocols/aerodrome-slipstream/index.d.ts.map +1 -0
  226. package/sdk/dist/protocols/aerodrome-slipstream/index.js +5 -0
  227. package/sdk/dist/protocols/aerodrome-slipstream/index.js.map +1 -0
  228. package/sdk/dist/protocols/aerodrome-slipstream/info.d.ts +3 -0
  229. package/sdk/dist/protocols/aerodrome-slipstream/info.d.ts.map +1 -0
  230. package/sdk/dist/protocols/aerodrome-slipstream/info.js +12 -0
  231. package/sdk/dist/protocols/aerodrome-slipstream/info.js.map +1 -0
  232. package/sdk/dist/protocols/aevo/abis.d.ts +17 -2
  233. package/sdk/dist/protocols/aevo/abis.d.ts.map +1 -1
  234. package/sdk/dist/protocols/aevo/abis.js +10 -2
  235. package/sdk/dist/protocols/aevo/abis.js.map +1 -1
  236. package/sdk/dist/protocols/aevo/functions.d.ts +1 -1
  237. package/sdk/dist/protocols/aevo/functions.d.ts.map +1 -1
  238. package/sdk/dist/protocols/aevo/functions.js +2 -2
  239. package/sdk/dist/protocols/alchemix/abis.d.ts +1 -1
  240. package/sdk/dist/protocols/alchemix/abis.js +1 -1
  241. package/sdk/dist/protocols/alchemix/abis.js.map +1 -1
  242. package/sdk/dist/protocols/ambient/abis.d.ts +2 -2
  243. package/sdk/dist/protocols/ambient/abis.d.ts.map +1 -1
  244. package/sdk/dist/protocols/ambient/abis.js +3 -2
  245. package/sdk/dist/protocols/ambient/abis.js.map +1 -1
  246. package/sdk/dist/protocols/ambient/addresses.d.ts.map +1 -1
  247. package/sdk/dist/protocols/ambient/addresses.js +2 -1
  248. package/sdk/dist/protocols/ambient/addresses.js.map +1 -1
  249. package/sdk/dist/protocols/arrakis/abis.d.ts +4 -13
  250. package/sdk/dist/protocols/arrakis/abis.d.ts.map +1 -1
  251. package/sdk/dist/protocols/arrakis/abis.js +2 -11
  252. package/sdk/dist/protocols/arrakis/abis.js.map +1 -1
  253. package/sdk/dist/protocols/arrakis/functions.d.ts +1 -1
  254. package/sdk/dist/protocols/arrakis/functions.d.ts.map +1 -1
  255. package/sdk/dist/protocols/arrakis/functions.js +2 -1
  256. package/sdk/dist/protocols/arrakis/functions.js.map +1 -1
  257. package/sdk/dist/protocols/axelar/abis.d.ts +1 -1
  258. package/sdk/dist/protocols/axelar/abis.js +1 -1
  259. package/sdk/dist/protocols/balancer-v2/abis.d.ts +7 -7
  260. package/sdk/dist/protocols/balancer-v2/abis.js +7 -7
  261. package/sdk/dist/protocols/balancer-v2/abis.js.map +1 -1
  262. package/sdk/dist/protocols/cbeth/abis.d.ts +7 -1
  263. package/sdk/dist/protocols/cbeth/abis.d.ts.map +1 -1
  264. package/sdk/dist/protocols/cbeth/abis.js +6 -2
  265. package/sdk/dist/protocols/cbeth/abis.js.map +1 -1
  266. package/sdk/dist/protocols/cbeth/functions.d.ts +2 -2
  267. package/sdk/dist/protocols/cbeth/functions.d.ts.map +1 -1
  268. package/sdk/dist/protocols/cbeth/functions.js +4 -6
  269. package/sdk/dist/protocols/cbeth/functions.js.map +1 -1
  270. package/sdk/dist/protocols/cctp/abis.d.ts +1 -4
  271. package/sdk/dist/protocols/cctp/abis.d.ts.map +1 -1
  272. package/sdk/dist/protocols/cctp/abis.js +3 -1
  273. package/sdk/dist/protocols/cctp/abis.js.map +1 -1
  274. package/sdk/dist/protocols/cctp/addresses.d.ts.map +1 -1
  275. package/sdk/dist/protocols/cctp/addresses.js +3 -0
  276. package/sdk/dist/protocols/cctp/addresses.js.map +1 -1
  277. package/sdk/dist/protocols/chainlink/abis.d.ts +6 -6
  278. package/sdk/dist/protocols/chainlink/abis.js +6 -6
  279. package/sdk/dist/protocols/chainlink/abis.js.map +1 -1
  280. package/sdk/dist/protocols/chainlink/addresses.d.ts.map +1 -1
  281. package/sdk/dist/protocols/chainlink/addresses.js +10 -0
  282. package/sdk/dist/protocols/chainlink/addresses.js.map +1 -1
  283. package/sdk/dist/protocols/chainlink-ccip/abis.d.ts +1 -1
  284. package/sdk/dist/protocols/chainlink-ccip/abis.js +1 -1
  285. package/sdk/dist/protocols/chainlink-ccip/addresses.d.ts.map +1 -1
  286. package/sdk/dist/protocols/chainlink-ccip/addresses.js +9 -0
  287. package/sdk/dist/protocols/chainlink-ccip/addresses.js.map +1 -1
  288. package/sdk/dist/protocols/circle-gateway/abis.d.ts +114 -0
  289. package/sdk/dist/protocols/circle-gateway/abis.d.ts.map +1 -0
  290. package/sdk/dist/protocols/circle-gateway/abis.js +86 -0
  291. package/sdk/dist/protocols/circle-gateway/abis.js.map +1 -0
  292. package/sdk/dist/protocols/circle-gateway/addresses.d.ts +3 -0
  293. package/sdk/dist/protocols/circle-gateway/addresses.d.ts.map +1 -0
  294. package/sdk/dist/protocols/circle-gateway/addresses.js +37 -0
  295. package/sdk/dist/protocols/circle-gateway/addresses.js.map +1 -0
  296. package/sdk/dist/protocols/circle-gateway/functions.d.ts +4 -0
  297. package/sdk/dist/protocols/circle-gateway/functions.d.ts.map +1 -0
  298. package/sdk/dist/protocols/circle-gateway/functions.js +27 -0
  299. package/sdk/dist/protocols/circle-gateway/functions.js.map +1 -0
  300. package/sdk/dist/protocols/circle-gateway/index.d.ts +5 -0
  301. package/sdk/dist/protocols/circle-gateway/index.d.ts.map +1 -0
  302. package/sdk/dist/protocols/circle-gateway/index.js +5 -0
  303. package/sdk/dist/protocols/circle-gateway/index.js.map +1 -0
  304. package/sdk/dist/protocols/circle-gateway/info.d.ts +3 -0
  305. package/sdk/dist/protocols/circle-gateway/info.d.ts.map +1 -0
  306. package/sdk/dist/protocols/circle-gateway/info.js +12 -0
  307. package/sdk/dist/protocols/circle-gateway/info.js.map +1 -0
  308. package/sdk/dist/protocols/compound-v2/abis.d.ts +2 -2
  309. package/sdk/dist/protocols/compound-v2/abis.js +2 -2
  310. package/sdk/dist/protocols/compound-v2/abis.js.map +1 -1
  311. package/sdk/dist/protocols/connext/abis.d.ts +46 -6
  312. package/sdk/dist/protocols/connext/abis.d.ts.map +1 -1
  313. package/sdk/dist/protocols/connext/abis.js +27 -5
  314. package/sdk/dist/protocols/connext/abis.js.map +1 -1
  315. package/sdk/dist/protocols/connext/addresses.d.ts.map +1 -1
  316. package/sdk/dist/protocols/connext/addresses.js +1 -7
  317. package/sdk/dist/protocols/connext/addresses.js.map +1 -1
  318. package/sdk/dist/protocols/connext/functions.d.ts +1 -1
  319. package/sdk/dist/protocols/connext/functions.d.ts.map +1 -1
  320. package/sdk/dist/protocols/connext/functions.js +3 -2
  321. package/sdk/dist/protocols/connext/functions.js.map +1 -1
  322. package/sdk/dist/protocols/crvusd/functions.d.ts +2 -2
  323. package/sdk/dist/protocols/crvusd/functions.d.ts.map +1 -1
  324. package/sdk/dist/protocols/crvusd/functions.js +6 -6
  325. package/sdk/dist/protocols/curve/abis.d.ts +119 -7
  326. package/sdk/dist/protocols/curve/abis.d.ts.map +1 -1
  327. package/sdk/dist/protocols/curve/abis.js +90 -7
  328. package/sdk/dist/protocols/curve/abis.js.map +1 -1
  329. package/sdk/dist/protocols/debridge/abis.d.ts +7 -7
  330. package/sdk/dist/protocols/debridge/abis.js +5 -5
  331. package/sdk/dist/protocols/debridge/abis.js.map +1 -1
  332. package/sdk/dist/protocols/debridge/addresses.d.ts.map +1 -1
  333. package/sdk/dist/protocols/debridge/addresses.js +11 -0
  334. package/sdk/dist/protocols/debridge/addresses.js.map +1 -1
  335. package/sdk/dist/protocols/eco-routes/abis.d.ts +463 -0
  336. package/sdk/dist/protocols/eco-routes/abis.d.ts.map +1 -0
  337. package/sdk/dist/protocols/eco-routes/abis.js +632 -0
  338. package/sdk/dist/protocols/eco-routes/abis.js.map +1 -0
  339. package/sdk/dist/protocols/eco-routes/addresses.d.ts +9 -0
  340. package/sdk/dist/protocols/eco-routes/addresses.d.ts.map +1 -0
  341. package/sdk/dist/protocols/eco-routes/addresses.generated.d.ts +585 -0
  342. package/sdk/dist/protocols/eco-routes/addresses.generated.d.ts.map +1 -0
  343. package/sdk/dist/protocols/eco-routes/addresses.generated.js +590 -0
  344. package/sdk/dist/protocols/eco-routes/addresses.generated.js.map +1 -0
  345. package/sdk/dist/protocols/eco-routes/addresses.js +21 -0
  346. package/sdk/dist/protocols/eco-routes/addresses.js.map +1 -0
  347. package/sdk/dist/protocols/eco-routes/functions.d.ts +12 -0
  348. package/sdk/dist/protocols/eco-routes/functions.d.ts.map +1 -0
  349. package/sdk/dist/protocols/eco-routes/functions.js +45 -0
  350. package/sdk/dist/protocols/eco-routes/functions.js.map +1 -0
  351. package/sdk/dist/protocols/eco-routes/index.d.ts +6 -0
  352. package/sdk/dist/protocols/eco-routes/index.d.ts.map +1 -0
  353. package/sdk/dist/protocols/eco-routes/index.js +6 -0
  354. package/sdk/dist/protocols/eco-routes/index.js.map +1 -0
  355. package/sdk/dist/protocols/eco-routes/info.d.ts +3 -0
  356. package/sdk/dist/protocols/eco-routes/info.d.ts.map +1 -0
  357. package/sdk/dist/protocols/eco-routes/info.js +12 -0
  358. package/sdk/dist/protocols/eco-routes/info.js.map +1 -0
  359. package/sdk/dist/protocols/eco-routes/lookup.d.ts +82 -0
  360. package/sdk/dist/protocols/eco-routes/lookup.d.ts.map +1 -0
  361. package/sdk/dist/protocols/eco-routes/lookup.js +148 -0
  362. package/sdk/dist/protocols/eco-routes/lookup.js.map +1 -0
  363. package/sdk/dist/protocols/eigenlayer/abis.d.ts +4 -4
  364. package/sdk/dist/protocols/eigenlayer/abis.d.ts.map +1 -1
  365. package/sdk/dist/protocols/eigenlayer/abis.js +5 -4
  366. package/sdk/dist/protocols/eigenlayer/abis.js.map +1 -1
  367. package/sdk/dist/protocols/ens/abis.d.ts +4 -4
  368. package/sdk/dist/protocols/ens/abis.js +4 -4
  369. package/sdk/dist/protocols/erc20/functions.d.ts +3 -3
  370. package/sdk/dist/protocols/erc20/functions.d.ts.map +1 -1
  371. package/sdk/dist/protocols/erc20/functions.js +6 -9
  372. package/sdk/dist/protocols/erc20/functions.js.map +1 -1
  373. package/sdk/dist/protocols/etherfi/abis.d.ts +1 -1
  374. package/sdk/dist/protocols/etherfi/abis.d.ts.map +1 -1
  375. package/sdk/dist/protocols/etherfi/abis.js +2 -1
  376. package/sdk/dist/protocols/etherfi/abis.js.map +1 -1
  377. package/sdk/dist/protocols/euler-v2/abis.d.ts +2 -2
  378. package/sdk/dist/protocols/euler-v2/abis.js +2 -2
  379. package/sdk/dist/protocols/euler-v2/abis.js.map +1 -1
  380. package/sdk/dist/protocols/fluid/abis.d.ts +47 -26
  381. package/sdk/dist/protocols/fluid/abis.d.ts.map +1 -1
  382. package/sdk/dist/protocols/fluid/abis.js +39 -18
  383. package/sdk/dist/protocols/fluid/abis.js.map +1 -1
  384. package/sdk/dist/protocols/fluid/functions.d.ts +4 -4
  385. package/sdk/dist/protocols/fluid/functions.d.ts.map +1 -1
  386. package/sdk/dist/protocols/fluid/functions.js +18 -16
  387. package/sdk/dist/protocols/fluid/functions.js.map +1 -1
  388. package/sdk/dist/protocols/frax/functions.d.ts +2 -2
  389. package/sdk/dist/protocols/frax/functions.d.ts.map +1 -1
  390. package/sdk/dist/protocols/frax/functions.js +6 -6
  391. package/sdk/dist/protocols/gains-network/abis.d.ts +44 -35
  392. package/sdk/dist/protocols/gains-network/abis.d.ts.map +1 -1
  393. package/sdk/dist/protocols/gains-network/abis.js +26 -21
  394. package/sdk/dist/protocols/gains-network/abis.js.map +1 -1
  395. package/sdk/dist/protocols/gains-network/functions.d.ts +3 -3
  396. package/sdk/dist/protocols/gains-network/functions.d.ts.map +1 -1
  397. package/sdk/dist/protocols/gains-network/functions.js +6 -6
  398. package/sdk/dist/protocols/gamma/abis.d.ts +43 -0
  399. package/sdk/dist/protocols/gamma/abis.d.ts.map +1 -1
  400. package/sdk/dist/protocols/gamma/abis.js +30 -0
  401. package/sdk/dist/protocols/gamma/abis.js.map +1 -1
  402. package/sdk/dist/protocols/gamma/addresses.d.ts.map +1 -1
  403. package/sdk/dist/protocols/gamma/addresses.js +2 -7
  404. package/sdk/dist/protocols/gamma/addresses.js.map +1 -1
  405. package/sdk/dist/protocols/gamma/functions.d.ts +1 -0
  406. package/sdk/dist/protocols/gamma/functions.d.ts.map +1 -1
  407. package/sdk/dist/protocols/gamma/functions.js +9 -0
  408. package/sdk/dist/protocols/gamma/functions.js.map +1 -1
  409. package/sdk/dist/protocols/gelato/abis.d.ts +2 -2
  410. package/sdk/dist/protocols/gelato/abis.js +2 -2
  411. package/sdk/dist/protocols/gho/functions.d.ts +2 -2
  412. package/sdk/dist/protocols/gho/functions.d.ts.map +1 -1
  413. package/sdk/dist/protocols/gho/functions.js +4 -6
  414. package/sdk/dist/protocols/gho/functions.js.map +1 -1
  415. package/sdk/dist/protocols/gmx-v1/abis.d.ts +15 -3
  416. package/sdk/dist/protocols/gmx-v1/abis.d.ts.map +1 -1
  417. package/sdk/dist/protocols/gmx-v1/abis.js +5 -3
  418. package/sdk/dist/protocols/gmx-v1/abis.js.map +1 -1
  419. package/sdk/dist/protocols/gmx-v1/functions.d.ts +2 -2
  420. package/sdk/dist/protocols/gmx-v1/functions.d.ts.map +1 -1
  421. package/sdk/dist/protocols/gmx-v1/functions.js +2 -2
  422. package/sdk/dist/protocols/gmx-v2/abis.d.ts +11 -5
  423. package/sdk/dist/protocols/gmx-v2/abis.d.ts.map +1 -1
  424. package/sdk/dist/protocols/gmx-v2/abis.js +7 -4
  425. package/sdk/dist/protocols/gmx-v2/abis.js.map +1 -1
  426. package/sdk/dist/protocols/gmx-v2/addresses.d.ts.map +1 -1
  427. package/sdk/dist/protocols/gmx-v2/addresses.js +3 -1
  428. package/sdk/dist/protocols/gmx-v2/addresses.js.map +1 -1
  429. package/sdk/dist/protocols/gmx-v2/functions.d.ts +1 -1
  430. package/sdk/dist/protocols/gmx-v2/functions.d.ts.map +1 -1
  431. package/sdk/dist/protocols/gmx-v2/functions.js +4 -2
  432. package/sdk/dist/protocols/gmx-v2/functions.js.map +1 -1
  433. package/sdk/dist/protocols/harvest/abis.d.ts +8 -2
  434. package/sdk/dist/protocols/harvest/abis.d.ts.map +1 -1
  435. package/sdk/dist/protocols/harvest/abis.js +2 -2
  436. package/sdk/dist/protocols/harvest/abis.js.map +1 -1
  437. package/sdk/dist/protocols/hegic/abis.d.ts +5 -2
  438. package/sdk/dist/protocols/hegic/abis.d.ts.map +1 -1
  439. package/sdk/dist/protocols/hegic/abis.js +7 -2
  440. package/sdk/dist/protocols/hegic/abis.js.map +1 -1
  441. package/sdk/dist/protocols/hegic/addresses.d.ts.map +1 -1
  442. package/sdk/dist/protocols/hegic/addresses.js +1 -0
  443. package/sdk/dist/protocols/hegic/addresses.js.map +1 -1
  444. package/sdk/dist/protocols/hegic/functions.d.ts +1 -1
  445. package/sdk/dist/protocols/hegic/functions.d.ts.map +1 -1
  446. package/sdk/dist/protocols/hegic/functions.js +3 -3
  447. package/sdk/dist/protocols/hop/addresses.d.ts.map +1 -1
  448. package/sdk/dist/protocols/hop/addresses.js +5 -2
  449. package/sdk/dist/protocols/hop/addresses.js.map +1 -1
  450. package/sdk/dist/protocols/hyperlane/abis.d.ts +5 -5
  451. package/sdk/dist/protocols/hyperlane/abis.js +5 -5
  452. package/sdk/dist/protocols/hyperlane/abis.js.map +1 -1
  453. package/sdk/dist/protocols/hyperlane/addresses.d.ts.map +1 -1
  454. package/sdk/dist/protocols/hyperlane/addresses.js +9 -0
  455. package/sdk/dist/protocols/hyperlane/addresses.js.map +1 -1
  456. package/sdk/dist/protocols/index.d.ts +1 -0
  457. package/sdk/dist/protocols/index.d.ts.map +1 -1
  458. package/sdk/dist/protocols/index.js +13 -0
  459. package/sdk/dist/protocols/index.js.map +1 -1
  460. package/sdk/dist/protocols/kim/abis.d.ts +7 -20
  461. package/sdk/dist/protocols/kim/abis.d.ts.map +1 -1
  462. package/sdk/dist/protocols/kim/abis.js +6 -12
  463. package/sdk/dist/protocols/kim/abis.js.map +1 -1
  464. package/sdk/dist/protocols/kim/functions.d.ts +1 -1
  465. package/sdk/dist/protocols/kim/functions.d.ts.map +1 -1
  466. package/sdk/dist/protocols/kim/functions.js +3 -2
  467. package/sdk/dist/protocols/kim/functions.js.map +1 -1
  468. package/sdk/dist/protocols/kyberswap/abis.d.ts +41 -16
  469. package/sdk/dist/protocols/kyberswap/abis.d.ts.map +1 -1
  470. package/sdk/dist/protocols/kyberswap/abis.js +21 -8
  471. package/sdk/dist/protocols/kyberswap/abis.js.map +1 -1
  472. package/sdk/dist/protocols/kyberswap/addresses.d.ts.map +1 -1
  473. package/sdk/dist/protocols/kyberswap/addresses.js +12 -2
  474. package/sdk/dist/protocols/kyberswap/addresses.js.map +1 -1
  475. package/sdk/dist/protocols/kyberswap-aggregator/addresses.d.ts.map +1 -1
  476. package/sdk/dist/protocols/kyberswap-aggregator/addresses.js +12 -1
  477. package/sdk/dist/protocols/kyberswap-aggregator/addresses.js.map +1 -1
  478. package/sdk/dist/protocols/layerbank/abis.d.ts +81 -24
  479. package/sdk/dist/protocols/layerbank/abis.d.ts.map +1 -1
  480. package/sdk/dist/protocols/layerbank/abis.js +69 -17
  481. package/sdk/dist/protocols/layerbank/abis.js.map +1 -1
  482. package/sdk/dist/protocols/layerbank/addresses.d.ts.map +1 -1
  483. package/sdk/dist/protocols/layerbank/addresses.js +3 -1
  484. package/sdk/dist/protocols/layerbank/addresses.js.map +1 -1
  485. package/sdk/dist/protocols/layerbank/functions.d.ts +4 -4
  486. package/sdk/dist/protocols/layerbank/functions.d.ts.map +1 -1
  487. package/sdk/dist/protocols/layerbank/functions.js +18 -16
  488. package/sdk/dist/protocols/layerbank/functions.js.map +1 -1
  489. package/sdk/dist/protocols/layerzero/abis.d.ts +3 -3
  490. package/sdk/dist/protocols/layerzero/abis.js +3 -3
  491. package/sdk/dist/protocols/layerzero/addresses.d.ts.map +1 -1
  492. package/sdk/dist/protocols/layerzero/addresses.js +11 -1
  493. package/sdk/dist/protocols/layerzero/addresses.js.map +1 -1
  494. package/sdk/dist/protocols/level-finance/abis.d.ts +6 -0
  495. package/sdk/dist/protocols/level-finance/abis.d.ts.map +1 -1
  496. package/sdk/dist/protocols/level-finance/abis.js +2 -0
  497. package/sdk/dist/protocols/level-finance/abis.js.map +1 -1
  498. package/sdk/dist/protocols/level-finance/functions.d.ts +2 -2
  499. package/sdk/dist/protocols/level-finance/functions.d.ts.map +1 -1
  500. package/sdk/dist/protocols/level-finance/functions.js +4 -4
  501. package/sdk/dist/protocols/lifi/abis.d.ts +41 -4
  502. package/sdk/dist/protocols/lifi/abis.d.ts.map +1 -1
  503. package/sdk/dist/protocols/lifi/abis.js +24 -4
  504. package/sdk/dist/protocols/lifi/abis.js.map +1 -1
  505. package/sdk/dist/protocols/lifi/addresses.d.ts.map +1 -1
  506. package/sdk/dist/protocols/lifi/addresses.js +9 -0
  507. package/sdk/dist/protocols/lifi/addresses.js.map +1 -1
  508. package/sdk/dist/protocols/lifi/functions.d.ts +1 -1
  509. package/sdk/dist/protocols/lifi/functions.d.ts.map +1 -1
  510. package/sdk/dist/protocols/lifi/functions.js +5 -2
  511. package/sdk/dist/protocols/lifi/functions.js.map +1 -1
  512. package/sdk/dist/protocols/liquity-v1/abis.d.ts +6 -0
  513. package/sdk/dist/protocols/liquity-v1/abis.d.ts.map +1 -1
  514. package/sdk/dist/protocols/liquity-v1/abis.js +7 -1
  515. package/sdk/dist/protocols/liquity-v1/abis.js.map +1 -1
  516. package/sdk/dist/protocols/liquity-v1/functions.d.ts +1 -1
  517. package/sdk/dist/protocols/liquity-v1/functions.d.ts.map +1 -1
  518. package/sdk/dist/protocols/liquity-v1/functions.js +1 -1
  519. package/sdk/dist/protocols/liquity-v2/functions.d.ts +2 -2
  520. package/sdk/dist/protocols/liquity-v2/functions.d.ts.map +1 -1
  521. package/sdk/dist/protocols/liquity-v2/functions.js +4 -6
  522. package/sdk/dist/protocols/liquity-v2/functions.js.map +1 -1
  523. package/sdk/dist/protocols/mantle-meth/abis.d.ts +26 -25
  524. package/sdk/dist/protocols/mantle-meth/abis.d.ts.map +1 -1
  525. package/sdk/dist/protocols/mantle-meth/abis.js +22 -17
  526. package/sdk/dist/protocols/mantle-meth/abis.js.map +1 -1
  527. package/sdk/dist/protocols/mantle-meth/addresses.d.ts.map +1 -1
  528. package/sdk/dist/protocols/mantle-meth/addresses.js +3 -0
  529. package/sdk/dist/protocols/mantle-meth/addresses.js.map +1 -1
  530. package/sdk/dist/protocols/mantle-meth/functions.d.ts +1 -1
  531. package/sdk/dist/protocols/mantle-meth/functions.d.ts.map +1 -1
  532. package/sdk/dist/protocols/mantle-meth/functions.js +4 -4
  533. package/sdk/dist/protocols/maverick/abis.d.ts +9 -0
  534. package/sdk/dist/protocols/maverick/abis.d.ts.map +1 -1
  535. package/sdk/dist/protocols/maverick/abis.js +7 -1
  536. package/sdk/dist/protocols/maverick/abis.js.map +1 -1
  537. package/sdk/dist/protocols/morpho-blue/addresses.d.ts.map +1 -1
  538. package/sdk/dist/protocols/morpho-blue/addresses.js +10 -0
  539. package/sdk/dist/protocols/morpho-blue/addresses.js.map +1 -1
  540. package/sdk/dist/protocols/mux-protocol/abis.d.ts +87 -32
  541. package/sdk/dist/protocols/mux-protocol/abis.d.ts.map +1 -1
  542. package/sdk/dist/protocols/mux-protocol/abis.js +54 -21
  543. package/sdk/dist/protocols/mux-protocol/abis.js.map +1 -1
  544. package/sdk/dist/protocols/mux-protocol/functions.d.ts +2 -2
  545. package/sdk/dist/protocols/mux-protocol/functions.d.ts.map +1 -1
  546. package/sdk/dist/protocols/mux-protocol/functions.js +8 -8
  547. package/sdk/dist/protocols/olympus/abis.d.ts +5 -2
  548. package/sdk/dist/protocols/olympus/abis.d.ts.map +1 -1
  549. package/sdk/dist/protocols/olympus/abis.js +2 -2
  550. package/sdk/dist/protocols/olympus/abis.js.map +1 -1
  551. package/sdk/dist/protocols/oneinch/abis.d.ts +5 -5
  552. package/sdk/dist/protocols/oneinch/abis.d.ts.map +1 -1
  553. package/sdk/dist/protocols/oneinch/abis.js +5 -3
  554. package/sdk/dist/protocols/oneinch/abis.js.map +1 -1
  555. package/sdk/dist/protocols/oneinch/functions.d.ts +1 -1
  556. package/sdk/dist/protocols/oneinch/functions.d.ts.map +1 -1
  557. package/sdk/dist/protocols/oneinch/functions.js +2 -2
  558. package/sdk/dist/protocols/openocean/abis.d.ts +14 -1
  559. package/sdk/dist/protocols/openocean/abis.d.ts.map +1 -1
  560. package/sdk/dist/protocols/openocean/abis.js +11 -1
  561. package/sdk/dist/protocols/openocean/abis.js.map +1 -1
  562. package/sdk/dist/protocols/openocean/functions.d.ts +1 -1
  563. package/sdk/dist/protocols/openocean/functions.d.ts.map +1 -1
  564. package/sdk/dist/protocols/openocean/functions.js +1 -1
  565. package/sdk/dist/protocols/opyn/abis.d.ts +4 -1
  566. package/sdk/dist/protocols/opyn/abis.d.ts.map +1 -1
  567. package/sdk/dist/protocols/opyn/abis.js +1 -1
  568. package/sdk/dist/protocols/opyn/abis.js.map +1 -1
  569. package/sdk/dist/protocols/pancakeswap-v3/abis.d.ts +6 -6
  570. package/sdk/dist/protocols/pancakeswap-v3/abis.js +6 -6
  571. package/sdk/dist/protocols/pancakeswap-v3/abis.js.map +1 -1
  572. package/sdk/dist/protocols/paraswap/abis.d.ts +1 -1
  573. package/sdk/dist/protocols/paraswap/abis.js +1 -1
  574. package/sdk/dist/protocols/pendle/abis.d.ts +288 -6
  575. package/sdk/dist/protocols/pendle/abis.d.ts.map +1 -1
  576. package/sdk/dist/protocols/pendle/abis.js +160 -6
  577. package/sdk/dist/protocols/pendle/abis.js.map +1 -1
  578. package/sdk/dist/protocols/permit2/abis.d.ts +1 -1
  579. package/sdk/dist/protocols/permit2/abis.js +1 -1
  580. package/sdk/dist/protocols/permit2/addresses.d.ts.map +1 -1
  581. package/sdk/dist/protocols/permit2/addresses.js +9 -0
  582. package/sdk/dist/protocols/permit2/addresses.js.map +1 -1
  583. package/sdk/dist/protocols/perpetual-protocol/abis.d.ts +46 -38
  584. package/sdk/dist/protocols/perpetual-protocol/abis.d.ts.map +1 -1
  585. package/sdk/dist/protocols/perpetual-protocol/abis.js +27 -14
  586. package/sdk/dist/protocols/perpetual-protocol/abis.js.map +1 -1
  587. package/sdk/dist/protocols/premia/abis.d.ts +18 -17
  588. package/sdk/dist/protocols/premia/abis.d.ts.map +1 -1
  589. package/sdk/dist/protocols/premia/abis.js +20 -10
  590. package/sdk/dist/protocols/premia/abis.js.map +1 -1
  591. package/sdk/dist/protocols/premia/addresses.d.ts.map +1 -1
  592. package/sdk/dist/protocols/premia/addresses.js +3 -8
  593. package/sdk/dist/protocols/premia/addresses.js.map +1 -1
  594. package/sdk/dist/protocols/premia/functions.d.ts +2 -2
  595. package/sdk/dist/protocols/premia/functions.d.ts.map +1 -1
  596. package/sdk/dist/protocols/premia/functions.js +8 -8
  597. package/sdk/dist/protocols/pyth/abis.d.ts +3 -3
  598. package/sdk/dist/protocols/pyth/abis.d.ts.map +1 -1
  599. package/sdk/dist/protocols/pyth/abis.js +6 -3
  600. package/sdk/dist/protocols/pyth/abis.js.map +1 -1
  601. package/sdk/dist/protocols/reflexer/abis.d.ts +8 -5
  602. package/sdk/dist/protocols/reflexer/abis.d.ts.map +1 -1
  603. package/sdk/dist/protocols/reflexer/abis.js +10 -6
  604. package/sdk/dist/protocols/reflexer/abis.js.map +1 -1
  605. package/sdk/dist/protocols/renzo/abis.d.ts +1 -1
  606. package/sdk/dist/protocols/renzo/abis.js +1 -1
  607. package/sdk/dist/protocols/renzo/abis.js.map +1 -1
  608. package/sdk/dist/protocols/sablier/abis.d.ts +2 -2
  609. package/sdk/dist/protocols/sablier/abis.js +2 -2
  610. package/sdk/dist/protocols/safe/addresses.d.ts.map +1 -1
  611. package/sdk/dist/protocols/safe/addresses.js +10 -0
  612. package/sdk/dist/protocols/safe/addresses.js.map +1 -1
  613. package/sdk/dist/protocols/seaport/abis.d.ts +65 -5
  614. package/sdk/dist/protocols/seaport/abis.d.ts.map +1 -1
  615. package/sdk/dist/protocols/seaport/abis.js +41 -5
  616. package/sdk/dist/protocols/seaport/abis.js.map +1 -1
  617. package/sdk/dist/protocols/seaport/addresses.d.ts.map +1 -1
  618. package/sdk/dist/protocols/seaport/addresses.js +10 -0
  619. package/sdk/dist/protocols/seaport/addresses.js.map +1 -1
  620. package/sdk/dist/protocols/seaport/functions.d.ts +1 -1
  621. package/sdk/dist/protocols/seaport/functions.d.ts.map +1 -1
  622. package/sdk/dist/protocols/seaport/functions.js +1 -0
  623. package/sdk/dist/protocols/seaport/functions.js.map +1 -1
  624. package/sdk/dist/protocols/silo/abis.d.ts +3 -0
  625. package/sdk/dist/protocols/silo/abis.d.ts.map +1 -1
  626. package/sdk/dist/protocols/silo/abis.js +4 -1
  627. package/sdk/dist/protocols/silo/abis.js.map +1 -1
  628. package/sdk/dist/protocols/silo/addresses.d.ts.map +1 -1
  629. package/sdk/dist/protocols/silo/addresses.js +2 -1
  630. package/sdk/dist/protocols/silo/addresses.js.map +1 -1
  631. package/sdk/dist/protocols/silo/functions.d.ts +1 -1
  632. package/sdk/dist/protocols/silo/functions.d.ts.map +1 -1
  633. package/sdk/dist/protocols/silo/functions.js +2 -1
  634. package/sdk/dist/protocols/silo/functions.js.map +1 -1
  635. package/sdk/dist/protocols/socket/abis.d.ts +1 -13
  636. package/sdk/dist/protocols/socket/abis.d.ts.map +1 -1
  637. package/sdk/dist/protocols/socket/abis.js +3 -11
  638. package/sdk/dist/protocols/socket/abis.js.map +1 -1
  639. package/sdk/dist/protocols/socket/functions.d.ts +1 -1
  640. package/sdk/dist/protocols/socket/functions.d.ts.map +1 -1
  641. package/sdk/dist/protocols/socket/functions.js +1 -1
  642. package/sdk/dist/protocols/spookyswap/addresses.d.ts.map +1 -1
  643. package/sdk/dist/protocols/spookyswap/addresses.js +2 -1
  644. package/sdk/dist/protocols/spookyswap/addresses.js.map +1 -1
  645. package/sdk/dist/protocols/squid/abis.d.ts +33 -21
  646. package/sdk/dist/protocols/squid/abis.d.ts.map +1 -1
  647. package/sdk/dist/protocols/squid/abis.js +19 -13
  648. package/sdk/dist/protocols/squid/abis.js.map +1 -1
  649. package/sdk/dist/protocols/squid/functions.d.ts +1 -1
  650. package/sdk/dist/protocols/squid/functions.d.ts.map +1 -1
  651. package/sdk/dist/protocols/squid/functions.js +2 -2
  652. package/sdk/dist/protocols/stargate/abis.d.ts +23 -3
  653. package/sdk/dist/protocols/stargate/abis.d.ts.map +1 -1
  654. package/sdk/dist/protocols/stargate/abis.js +19 -3
  655. package/sdk/dist/protocols/stargate/abis.js.map +1 -1
  656. package/sdk/dist/protocols/superfluid/abis.d.ts +2 -2
  657. package/sdk/dist/protocols/superfluid/abis.js +2 -2
  658. package/sdk/dist/protocols/superfluid/abis.js.map +1 -1
  659. package/sdk/dist/protocols/sushiswap-v2/addresses.d.ts.map +1 -1
  660. package/sdk/dist/protocols/sushiswap-v2/addresses.js +2 -1
  661. package/sdk/dist/protocols/sushiswap-v2/addresses.js.map +1 -1
  662. package/sdk/dist/protocols/swell/abis.d.ts +2 -8
  663. package/sdk/dist/protocols/swell/abis.d.ts.map +1 -1
  664. package/sdk/dist/protocols/swell/abis.js +4 -2
  665. package/sdk/dist/protocols/swell/abis.js.map +1 -1
  666. package/sdk/dist/protocols/swell/functions.d.ts +2 -2
  667. package/sdk/dist/protocols/swell/functions.d.ts.map +1 -1
  668. package/sdk/dist/protocols/swell/functions.js +4 -2
  669. package/sdk/dist/protocols/swell/functions.js.map +1 -1
  670. package/sdk/dist/protocols/synapse/addresses.d.ts.map +1 -1
  671. package/sdk/dist/protocols/synapse/addresses.js +2 -1
  672. package/sdk/dist/protocols/synapse/addresses.js.map +1 -1
  673. package/sdk/dist/protocols/synthetix-v3/abis.d.ts +40 -5
  674. package/sdk/dist/protocols/synthetix-v3/abis.d.ts.map +1 -1
  675. package/sdk/dist/protocols/synthetix-v3/abis.js +27 -5
  676. package/sdk/dist/protocols/synthetix-v3/abis.js.map +1 -1
  677. package/sdk/dist/protocols/synthetix-v3/addresses.d.ts.map +1 -1
  678. package/sdk/dist/protocols/synthetix-v3/addresses.js +2 -1
  679. package/sdk/dist/protocols/synthetix-v3/addresses.js.map +1 -1
  680. package/sdk/dist/protocols/synthra-v3/abis.d.ts +347 -0
  681. package/sdk/dist/protocols/synthra-v3/abis.d.ts.map +1 -0
  682. package/sdk/dist/protocols/synthra-v3/abis.js +242 -0
  683. package/sdk/dist/protocols/synthra-v3/abis.js.map +1 -0
  684. package/sdk/dist/protocols/synthra-v3/addresses.d.ts +3 -0
  685. package/sdk/dist/protocols/synthra-v3/addresses.d.ts.map +1 -0
  686. package/sdk/dist/protocols/synthra-v3/addresses.js +16 -0
  687. package/sdk/dist/protocols/synthra-v3/addresses.js.map +1 -0
  688. package/sdk/dist/protocols/synthra-v3/functions.d.ts +2 -0
  689. package/sdk/dist/protocols/synthra-v3/functions.d.ts.map +1 -0
  690. package/sdk/dist/protocols/synthra-v3/functions.js +9 -0
  691. package/sdk/dist/protocols/synthra-v3/functions.js.map +1 -0
  692. package/sdk/dist/protocols/synthra-v3/index.d.ts +5 -0
  693. package/sdk/dist/protocols/synthra-v3/index.d.ts.map +1 -0
  694. package/sdk/dist/protocols/synthra-v3/index.js +5 -0
  695. package/sdk/dist/protocols/synthra-v3/index.js.map +1 -0
  696. package/sdk/dist/protocols/synthra-v3/info.d.ts +3 -0
  697. package/sdk/dist/protocols/synthra-v3/info.d.ts.map +1 -0
  698. package/sdk/dist/protocols/synthra-v3/info.js +11 -0
  699. package/sdk/dist/protocols/synthra-v3/info.js.map +1 -0
  700. package/sdk/dist/protocols/thales/abis.d.ts +53 -24
  701. package/sdk/dist/protocols/thales/abis.d.ts.map +1 -1
  702. package/sdk/dist/protocols/thales/abis.js +27 -11
  703. package/sdk/dist/protocols/thales/abis.js.map +1 -1
  704. package/sdk/dist/protocols/thales/functions.d.ts +2 -2
  705. package/sdk/dist/protocols/thales/functions.d.ts.map +1 -1
  706. package/sdk/dist/protocols/thales/functions.js +5 -6
  707. package/sdk/dist/protocols/thales/functions.js.map +1 -1
  708. package/sdk/dist/protocols/thruster/abis.d.ts +1 -1
  709. package/sdk/dist/protocols/thruster/abis.js +1 -1
  710. package/sdk/dist/protocols/trader-joe/abis.d.ts +3 -3
  711. package/sdk/dist/protocols/trader-joe/abis.js +2 -2
  712. package/sdk/dist/protocols/trader-joe/abis.js.map +1 -1
  713. package/sdk/dist/protocols/uniswap-v2/addresses.d.ts.map +1 -1
  714. package/sdk/dist/protocols/uniswap-v2/addresses.js +10 -0
  715. package/sdk/dist/protocols/uniswap-v2/addresses.js.map +1 -1
  716. package/sdk/dist/protocols/uniswap-v3/abis.d.ts +127 -8
  717. package/sdk/dist/protocols/uniswap-v3/abis.d.ts.map +1 -1
  718. package/sdk/dist/protocols/uniswap-v3/abis.js +90 -8
  719. package/sdk/dist/protocols/uniswap-v3/abis.js.map +1 -1
  720. package/sdk/dist/protocols/uniswap-v3/addresses.d.ts.map +1 -1
  721. package/sdk/dist/protocols/uniswap-v3/addresses.js +14 -0
  722. package/sdk/dist/protocols/uniswap-v3/addresses.js.map +1 -1
  723. package/sdk/dist/protocols/uniswap-v4/abis.d.ts +27 -15
  724. package/sdk/dist/protocols/uniswap-v4/abis.d.ts.map +1 -1
  725. package/sdk/dist/protocols/uniswap-v4/abis.js +25 -15
  726. package/sdk/dist/protocols/uniswap-v4/abis.js.map +1 -1
  727. package/sdk/dist/protocols/uniswap-v4/addresses.d.ts.map +1 -1
  728. package/sdk/dist/protocols/uniswap-v4/addresses.js +11 -0
  729. package/sdk/dist/protocols/uniswap-v4/addresses.js.map +1 -1
  730. package/sdk/dist/protocols/unitflow-v3/abis.d.ts +104 -0
  731. package/sdk/dist/protocols/unitflow-v3/abis.d.ts.map +1 -0
  732. package/sdk/dist/protocols/unitflow-v3/abis.js +70 -0
  733. package/sdk/dist/protocols/unitflow-v3/abis.js.map +1 -0
  734. package/sdk/dist/protocols/unitflow-v3/addresses.d.ts +3 -0
  735. package/sdk/dist/protocols/unitflow-v3/addresses.d.ts.map +1 -0
  736. package/sdk/dist/protocols/unitflow-v3/addresses.js +19 -0
  737. package/sdk/dist/protocols/unitflow-v3/addresses.js.map +1 -0
  738. package/sdk/dist/protocols/unitflow-v3/functions.d.ts +2 -0
  739. package/sdk/dist/protocols/unitflow-v3/functions.d.ts.map +1 -0
  740. package/sdk/dist/protocols/unitflow-v3/functions.js +9 -0
  741. package/sdk/dist/protocols/unitflow-v3/functions.js.map +1 -0
  742. package/sdk/dist/protocols/unitflow-v3/index.d.ts +5 -0
  743. package/sdk/dist/protocols/unitflow-v3/index.d.ts.map +1 -0
  744. package/sdk/dist/protocols/unitflow-v3/index.js +5 -0
  745. package/sdk/dist/protocols/unitflow-v3/index.js.map +1 -0
  746. package/sdk/dist/protocols/unitflow-v3/info.d.ts +3 -0
  747. package/sdk/dist/protocols/unitflow-v3/info.d.ts.map +1 -0
  748. package/sdk/dist/protocols/unitflow-v3/info.js +12 -0
  749. package/sdk/dist/protocols/unitflow-v3/info.js.map +1 -0
  750. package/sdk/dist/protocols/velodrome/addresses.d.ts.map +1 -1
  751. package/sdk/dist/protocols/velodrome/addresses.js +3 -1
  752. package/sdk/dist/protocols/velodrome/addresses.js.map +1 -1
  753. package/sdk/dist/protocols/venus/abis.d.ts +62 -1
  754. package/sdk/dist/protocols/venus/abis.d.ts.map +1 -1
  755. package/sdk/dist/protocols/venus/abis.js +48 -1
  756. package/sdk/dist/protocols/venus/abis.js.map +1 -1
  757. package/sdk/dist/protocols/vertex/abis.d.ts +16 -9
  758. package/sdk/dist/protocols/vertex/abis.d.ts.map +1 -1
  759. package/sdk/dist/protocols/vertex/abis.js +13 -4
  760. package/sdk/dist/protocols/vertex/abis.js.map +1 -1
  761. package/sdk/dist/protocols/wormhole/abis.d.ts +2 -2
  762. package/sdk/dist/protocols/wormhole/abis.js +2 -2
  763. package/sdk/dist/protocols/wormhole/addresses.d.ts.map +1 -1
  764. package/sdk/dist/protocols/wormhole/addresses.js +9 -0
  765. package/sdk/dist/protocols/wormhole/addresses.js.map +1 -1
  766. package/sdk/dist/protocols/zerolend/addresses.d.ts.map +1 -1
  767. package/sdk/dist/protocols/zerolend/addresses.js +2 -1
  768. package/sdk/dist/protocols/zerolend/addresses.js.map +1 -1
  769. package/sdk/dist/protocols/zerox/addresses.d.ts.map +1 -1
  770. package/sdk/dist/protocols/zerox/addresses.js +2 -1
  771. package/sdk/dist/protocols/zerox/addresses.js.map +1 -1
  772. package/sdk/dist/protocols/zksync-bridge/abis.d.ts +1 -1
  773. package/sdk/dist/protocols/zksync-bridge/abis.js +1 -1
  774. package/sdk/dist/recipes/cctp-split.sauce.ts +3 -1
  775. package/sdk/dist/recipes/cctp-transfer.d.ts +17 -6
  776. package/sdk/dist/recipes/cctp-transfer.d.ts.map +1 -1
  777. package/sdk/dist/recipes/cctp-transfer.js +7 -20
  778. package/sdk/dist/recipes/cctp-transfer.js.map +1 -1
  779. package/sdk/dist/recipes/index.d.ts +5 -15
  780. package/sdk/dist/recipes/index.d.ts.map +1 -1
  781. package/sdk/dist/recipes/index.js +19 -36
  782. package/sdk/dist/recipes/index.js.map +1 -1
  783. package/sdk/dist/recipes/plain-transfer.sauce.ts +3 -0
  784. package/sdk/dist/recipes/settle.sauce.ts +15 -2
  785. package/sdk/dist/routes/ast-walk.d.ts +4 -0
  786. package/sdk/dist/routes/ast-walk.d.ts.map +1 -1
  787. package/sdk/dist/routes/ast-walk.js +9 -2
  788. package/sdk/dist/routes/ast-walk.js.map +1 -1
  789. package/sdk/dist/routes/chain-exports.generated.d.ts +97 -0
  790. package/sdk/dist/routes/chain-exports.generated.d.ts.map +1 -0
  791. package/sdk/dist/routes/chain-exports.generated.js +91 -0
  792. package/sdk/dist/routes/chain-exports.generated.js.map +1 -0
  793. package/sdk/dist/routes/compile-types.d.ts +3 -0
  794. package/sdk/dist/routes/compile-types.d.ts.map +1 -1
  795. package/sdk/dist/routes/composed.d.ts +13 -0
  796. package/sdk/dist/routes/composed.d.ts.map +1 -0
  797. package/sdk/dist/routes/composed.js +94 -0
  798. package/sdk/dist/routes/composed.js.map +1 -0
  799. package/sdk/dist/routes/encode.d.ts +6 -6
  800. package/sdk/dist/routes/globals.d.ts +19 -4
  801. package/sdk/dist/routes/globals.d.ts.map +1 -1
  802. package/sdk/dist/routes/globals.js +51 -85
  803. package/sdk/dist/routes/globals.js.map +1 -1
  804. package/sdk/dist/routes/index.d.ts +17 -8
  805. package/sdk/dist/routes/index.d.ts.map +1 -1
  806. package/sdk/dist/routes/index.js +18 -6
  807. package/sdk/dist/routes/index.js.map +1 -1
  808. package/sdk/dist/routes/intent-dsl.d.ts +60 -19
  809. package/sdk/dist/routes/intent-dsl.d.ts.map +1 -1
  810. package/sdk/dist/routes/intent-dsl.js +175 -67
  811. package/sdk/dist/routes/intent-dsl.js.map +1 -1
  812. package/sdk/dist/routes/intent-pot.d.ts +49 -0
  813. package/sdk/dist/routes/intent-pot.d.ts.map +1 -0
  814. package/sdk/dist/routes/intent-pot.js +46 -0
  815. package/sdk/dist/routes/intent-pot.js.map +1 -0
  816. package/sdk/dist/routes/intent-sugar.d.ts +97 -0
  817. package/sdk/dist/routes/intent-sugar.d.ts.map +1 -0
  818. package/sdk/dist/routes/intent-sugar.js +632 -0
  819. package/sdk/dist/routes/intent-sugar.js.map +1 -0
  820. package/sdk/dist/routes/nest-dynamic.d.ts +146 -0
  821. package/sdk/dist/routes/nest-dynamic.d.ts.map +1 -0
  822. package/sdk/dist/routes/nest-dynamic.js +308 -0
  823. package/sdk/dist/routes/nest-dynamic.js.map +1 -0
  824. package/sdk/dist/routes/nest.d.ts +16 -5
  825. package/sdk/dist/routes/nest.d.ts.map +1 -1
  826. package/sdk/dist/routes/nest.js +29 -10
  827. package/sdk/dist/routes/nest.js.map +1 -1
  828. package/sdk/dist/routes/portal.d.ts +7 -272
  829. package/sdk/dist/routes/portal.d.ts.map +1 -1
  830. package/sdk/dist/routes/portal.js +13 -92
  831. package/sdk/dist/routes/portal.js.map +1 -1
  832. package/sdk/dist/routes/protocol-rewrite.d.ts.map +1 -1
  833. package/sdk/dist/routes/protocol-rewrite.js +2 -0
  834. package/sdk/dist/routes/protocol-rewrite.js.map +1 -1
  835. package/sdk/dist/routes/rs-compile.d.ts +26 -15
  836. package/sdk/dist/routes/rs-compile.d.ts.map +1 -1
  837. package/sdk/dist/routes/rs-compile.js +57 -169
  838. package/sdk/dist/routes/rs-compile.js.map +1 -1
  839. package/sdk/dist/routes/sauce-route.d.ts +26 -1
  840. package/sdk/dist/routes/sauce-route.d.ts.map +1 -1
  841. package/sdk/dist/routes/sauce-route.js +133 -27
  842. package/sdk/dist/routes/sauce-route.js.map +1 -1
  843. package/sdk/dist/routes/source-globals.generated.d.ts +442 -23
  844. package/sdk/dist/routes/source-globals.generated.d.ts.map +1 -1
  845. package/sdk/dist/routes/template.d.ts +184 -0
  846. package/sdk/dist/routes/template.d.ts.map +1 -0
  847. package/sdk/dist/routes/template.js +338 -0
  848. package/sdk/dist/routes/template.js.map +1 -0
  849. package/sdk/dist/routes/token-registry.d.ts.map +1 -1
  850. package/sdk/dist/routes/token-registry.js +41 -1
  851. package/sdk/dist/routes/token-registry.js.map +1 -1
  852. package/sdk/dist/routes/token-rewrite.d.ts +63 -28
  853. package/sdk/dist/routes/token-rewrite.d.ts.map +1 -1
  854. package/sdk/dist/routes/token-rewrite.js +390 -122
  855. package/sdk/dist/routes/token-rewrite.js.map +1 -1
  856. package/sdk/dist/skills/loader.d.ts +2 -7
  857. package/sdk/dist/skills/loader.d.ts.map +1 -1
  858. package/sdk/dist/skills/loader.js +14 -25
  859. package/sdk/dist/skills/loader.js.map +1 -1
  860. package/sdk/dist/std/token/token.evm.js +56 -15
  861. package/sdk/dist/std/token/token.svm.js +24 -3
  862. package/sdk/dist/svm/accessors.d.ts +3 -3
  863. package/sdk/dist/svm/accessors.js +3 -3
  864. package/sdk/dist/svm/client.d.ts +1 -0
  865. package/sdk/dist/svm/client.d.ts.map +1 -1
  866. package/sdk/dist/svm/client.js +6 -0
  867. package/sdk/dist/svm/client.js.map +1 -1
  868. package/sdk/dist/svm/clusters.d.ts +6 -2
  869. package/sdk/dist/svm/clusters.d.ts.map +1 -1
  870. package/sdk/dist/svm/clusters.js +0 -2
  871. package/sdk/dist/svm/clusters.js.map +1 -1
  872. package/sdk/dist/svm/engine-artifacts.d.ts +24 -13
  873. package/sdk/dist/svm/engine-artifacts.d.ts.map +1 -1
  874. package/sdk/dist/svm/engine-artifacts.js +31 -26
  875. package/sdk/dist/svm/engine-artifacts.js.map +1 -1
  876. package/sdk/dist/svm/engine-public.d.ts.map +1 -1
  877. package/sdk/dist/svm/engine-public.js +2 -1
  878. package/sdk/dist/svm/engine-public.js.map +1 -1
  879. package/sdk/dist/svm/index.d.ts +0 -1
  880. package/sdk/dist/svm/index.d.ts.map +1 -1
  881. package/sdk/dist/svm/index.js +3 -1
  882. package/sdk/dist/svm/index.js.map +1 -1
  883. package/sdk/dist/svm/intent.d.ts.map +1 -1
  884. package/sdk/dist/svm/intent.js +4 -3
  885. package/sdk/dist/svm/intent.js.map +1 -1
  886. package/sdk/dist/svm/loader.d.ts.map +1 -1
  887. package/sdk/dist/svm/loader.js +2 -3
  888. package/sdk/dist/svm/loader.js.map +1 -1
  889. package/sdk/dist/svm/recipes/index.d.ts +57 -4
  890. package/sdk/dist/svm/recipes/index.d.ts.map +1 -1
  891. package/sdk/dist/svm/recipes/index.js +7 -9
  892. package/sdk/dist/svm/recipes/index.js.map +1 -1
  893. package/sdk/dist/svm/venues/alphaq/index.d.ts.map +1 -1
  894. package/sdk/dist/svm/venues/alphaq/index.js +4 -2
  895. package/sdk/dist/svm/venues/alphaq/index.js.map +1 -1
  896. package/sdk/dist/svm/venues/binaryfi/index.d.ts.map +1 -1
  897. package/sdk/dist/svm/venues/binaryfi/index.js +2 -1
  898. package/sdk/dist/svm/venues/binaryfi/index.js.map +1 -1
  899. package/sdk/dist/svm/venues/fluxbeam/index.d.ts.map +1 -1
  900. package/sdk/dist/svm/venues/fluxbeam/index.js +2 -7
  901. package/sdk/dist/svm/venues/fluxbeam/index.js.map +1 -1
  902. package/sdk/dist/svm/venues/jupiter-lend-earn/index.d.ts.map +1 -1
  903. package/sdk/dist/svm/venues/jupiter-lend-earn/index.js +2 -1
  904. package/sdk/dist/svm/venues/jupiter-lend-earn/index.js.map +1 -1
  905. package/sdk/dist/svm/venues/kipseli/index.d.ts.map +1 -1
  906. package/sdk/dist/svm/venues/kipseli/index.js +31 -14
  907. package/sdk/dist/svm/venues/kipseli/index.js.map +1 -1
  908. package/sdk/dist/svm/venues/mercurial/index.d.ts.map +1 -1
  909. package/sdk/dist/svm/venues/mercurial/index.js +2 -7
  910. package/sdk/dist/svm/venues/mercurial/index.js.map +1 -1
  911. package/sdk/dist/svm/venues/meteora-damm-v1-stable/index.d.ts.map +1 -1
  912. package/sdk/dist/svm/venues/meteora-damm-v1-stable/index.js +3 -2
  913. package/sdk/dist/svm/venues/meteora-damm-v1-stable/index.js.map +1 -1
  914. package/sdk/dist/svm/venues/mswap/index.d.ts.map +1 -1
  915. package/sdk/dist/svm/venues/mswap/index.js +2 -2
  916. package/sdk/dist/svm/venues/mswap/index.js.map +1 -1
  917. package/sdk/dist/svm/venues/orca-legacy-token-swap/index.d.ts.map +1 -1
  918. package/sdk/dist/svm/venues/orca-legacy-token-swap/index.js +2 -7
  919. package/sdk/dist/svm/venues/orca-legacy-token-swap/index.js.map +1 -1
  920. package/sdk/dist/svm/venues/saber-stableswap/index.d.ts.map +1 -1
  921. package/sdk/dist/svm/venues/saber-stableswap/index.js +2 -7
  922. package/sdk/dist/svm/venues/saber-stableswap/index.js.map +1 -1
  923. package/sdk/dist/svm/venues/sanctum-infinity/index.js +2 -2
  924. package/sdk/dist/svm/venues/sanctum-infinity/index.js.map +1 -1
  925. package/sdk/dist/svm/venues/sanctum-stake-pool/index.d.ts.map +1 -1
  926. package/sdk/dist/svm/venues/sanctum-stake-pool/index.js +2 -8
  927. package/sdk/dist/svm/venues/sanctum-stake-pool/index.js.map +1 -1
  928. package/sdk/dist/svm/venues/spl-token-swap-forks/index.d.ts.map +1 -1
  929. package/sdk/dist/svm/venues/spl-token-swap-forks/index.js +2 -7
  930. package/sdk/dist/svm/venues/spl-token-swap-forks/index.js.map +1 -1
  931. package/sdk/dist/svm/venues/stabble-common.d.ts.map +1 -1
  932. package/sdk/dist/svm/venues/stabble-common.js +3 -8
  933. package/sdk/dist/svm/venues/stabble-common.js.map +1 -1
  934. package/sdk/dist/svm/verify.d.ts.map +1 -1
  935. package/sdk/dist/svm/verify.js +1 -4
  936. package/sdk/dist/svm/verify.js.map +1 -1
  937. package/sdk/dist/swap/index.d.ts +4 -4
  938. package/sdk/dist/swap/index.d.ts.map +1 -1
  939. package/sdk/dist/swap/index.js +4 -4
  940. package/sdk/dist/swap/index.js.map +1 -1
  941. package/sdk/dist/swap/source.d.ts +0 -7
  942. package/sdk/dist/swap/source.d.ts.map +1 -1
  943. package/sdk/dist/swap/source.js +3 -11
  944. package/sdk/dist/swap/source.js.map +1 -1
  945. package/sdk/dist/token/api.d.ts +14 -12
  946. package/sdk/dist/token/api.d.ts.map +1 -1
  947. package/sdk/dist/token/api.js +4 -5
  948. package/sdk/dist/token/api.js.map +1 -1
  949. package/sdk/dist/token/evm.d.ts +5 -2
  950. package/sdk/dist/token/evm.d.ts.map +1 -1
  951. package/sdk/dist/token/evm.js +26 -15
  952. package/sdk/dist/token/evm.js.map +1 -1
  953. package/sdk/dist/token/index.d.ts +7 -7
  954. package/sdk/dist/token/index.js +7 -7
  955. package/sdk/dist/token/safe.d.ts +17 -0
  956. package/sdk/dist/token/safe.d.ts.map +1 -0
  957. package/sdk/dist/token/safe.js +211 -0
  958. package/sdk/dist/token/safe.js.map +1 -0
  959. package/sdk/dist/token/source.d.ts +0 -4
  960. package/sdk/dist/token/source.d.ts.map +1 -1
  961. package/sdk/dist/token/source.js +7 -10
  962. package/sdk/dist/token/source.js.map +1 -1
  963. package/sdk/dist/verify/decode.d.ts +6 -6
  964. package/sdk/dist/verify/decode.js +7 -7
  965. package/sdk/dist/verify/decode.js.map +1 -1
  966. package/sdk/dist/verify/index.js +2 -2
  967. package/sdk/dist/verify/intent.js +2 -2
  968. package/sdk/dist/verify/vectors.d.ts +1 -1
  969. package/sdk/dist/verify/vectors.d.ts.map +1 -1
  970. package/sdk/dist/verify/vectors.js +2 -2
  971. package/sdk/dist/verify/vectors.js.map +1 -1
  972. package/sdk/dist/verify/wire.d.ts +21 -4
  973. package/sdk/dist/verify/wire.d.ts.map +1 -1
  974. package/sdk/dist/verify/wire.js +21 -4
  975. package/sdk/dist/verify/wire.js.map +1 -1
  976. package/sdk/dist/wasm-compiler.d.ts +31 -0
  977. package/sdk/dist/wasm-compiler.d.ts.map +1 -0
  978. package/sdk/dist/wasm-compiler.js +52 -0
  979. package/sdk/dist/wasm-compiler.js.map +1 -0
  980. package/sdk/src/protocols/aave-v4/AaveV4HubABI.json +67 -0
  981. package/sdk/src/protocols/aave-v4/AaveV4SpokeABI.json +215 -0
  982. package/sdk/src/protocols/aave-v4/abis.ts +139 -0
  983. package/sdk/src/protocols/aave-v4/addresses.ts +66 -0
  984. package/sdk/src/protocols/aave-v4/functions.ts +39 -0
  985. package/sdk/src/protocols/aave-v4/index.ts +4 -0
  986. package/sdk/src/protocols/aave-v4/info.ts +14 -0
  987. package/sdk/src/protocols/across/AcrossHubPoolABI.json +2 -2
  988. package/sdk/src/protocols/across/AcrossSpokePoolABI.json +27 -11
  989. package/sdk/src/protocols/across/abis.ts +16 -8
  990. package/sdk/src/protocols/across/addresses.ts +10 -0
  991. package/sdk/src/protocols/across/functions.ts +2 -2
  992. package/sdk/src/protocols/aerodrome-slipstream/AeroMetarouterABI.json +24 -0
  993. package/sdk/src/protocols/aerodrome-slipstream/SlipstreamCLFactoryABI.json +58 -0
  994. package/sdk/src/protocols/aerodrome-slipstream/SlipstreamPositionManagerABI.json +77 -0
  995. package/sdk/src/protocols/aerodrome-slipstream/abis.ts +74 -0
  996. package/sdk/src/protocols/aerodrome-slipstream/addresses.ts +40 -0
  997. package/sdk/src/protocols/aerodrome-slipstream/functions.ts +8 -0
  998. package/sdk/src/protocols/aerodrome-slipstream/index.ts +4 -0
  999. package/sdk/src/protocols/aerodrome-slipstream/info.ts +14 -0
  1000. package/sdk/src/protocols/aevo/DepositContractABI.json +23 -2
  1001. package/sdk/src/protocols/aevo/abis.ts +10 -2
  1002. package/sdk/src/protocols/aevo/functions.ts +2 -2
  1003. package/sdk/src/protocols/alchemix/AlchemistABI.json +1 -1
  1004. package/sdk/src/protocols/alchemix/abis.ts +1 -1
  1005. package/sdk/src/protocols/ambient/CrocSwapDexABI.json +2 -2
  1006. package/sdk/src/protocols/ambient/abis.ts +3 -2
  1007. package/sdk/src/protocols/ambient/addresses.ts +2 -1
  1008. package/sdk/src/protocols/arrakis/ArrakisRouterABI.json +5 -1
  1009. package/sdk/src/protocols/arrakis/ArrakisVaultABI.json +0 -16
  1010. package/sdk/src/protocols/arrakis/abis.ts +2 -11
  1011. package/sdk/src/protocols/arrakis/functions.ts +2 -1
  1012. package/sdk/src/protocols/axelar/AxelarITSABI.json +1 -1
  1013. package/sdk/src/protocols/axelar/abis.ts +1 -1
  1014. package/sdk/src/protocols/balancer-v2/BalancerV2VaultABI.json +7 -7
  1015. package/sdk/src/protocols/balancer-v2/abis.ts +7 -7
  1016. package/sdk/src/protocols/cbeth/CbETHABI.json +10 -1
  1017. package/sdk/src/protocols/cbeth/abis.ts +6 -2
  1018. package/sdk/src/protocols/cbeth/functions.ts +4 -6
  1019. package/sdk/src/protocols/cctp/TokenMessengerABI.json +30 -9
  1020. package/sdk/src/protocols/cctp/abis.ts +3 -1
  1021. package/sdk/src/protocols/cctp/addresses.ts +3 -0
  1022. package/sdk/src/protocols/chainlink/AggregatorV3ABI.json +3 -3
  1023. package/sdk/src/protocols/chainlink/FeedRegistryABI.json +3 -3
  1024. package/sdk/src/protocols/chainlink/abis.ts +6 -6
  1025. package/sdk/src/protocols/chainlink/addresses.ts +10 -0
  1026. package/sdk/src/protocols/chainlink-ccip/CCIPRouterABI.json +1 -1
  1027. package/sdk/src/protocols/chainlink-ccip/abis.ts +1 -1
  1028. package/sdk/src/protocols/chainlink-ccip/addresses.ts +9 -0
  1029. package/sdk/src/protocols/circle-gateway/GatewayMinterABI.json +49 -0
  1030. package/sdk/src/protocols/circle-gateway/GatewayWalletABI.json +111 -0
  1031. package/sdk/src/protocols/circle-gateway/abis.ts +86 -0
  1032. package/sdk/src/protocols/circle-gateway/addresses.ts +39 -0
  1033. package/sdk/src/protocols/circle-gateway/functions.ts +28 -0
  1034. package/sdk/src/protocols/circle-gateway/index.ts +4 -0
  1035. package/sdk/src/protocols/circle-gateway/info.ts +14 -0
  1036. package/sdk/src/protocols/compound-v2/CErc20ABI.json +2 -2
  1037. package/sdk/src/protocols/compound-v2/abis.ts +2 -2
  1038. package/sdk/src/protocols/connext/EverclearSpokeABI.json +60 -6
  1039. package/sdk/src/protocols/connext/abis.ts +27 -5
  1040. package/sdk/src/protocols/connext/addresses.ts +1 -7
  1041. package/sdk/src/protocols/connext/functions.ts +3 -2
  1042. package/sdk/src/protocols/crvusd/functions.ts +6 -6
  1043. package/sdk/src/protocols/curve/CurveRouterNGABI.json +37 -0
  1044. package/sdk/src/protocols/curve/CurveStableSwapABI.json +7 -7
  1045. package/sdk/src/protocols/curve/CurveThreePoolABI.json +117 -0
  1046. package/sdk/src/protocols/curve/abis.ts +91 -7
  1047. package/sdk/src/protocols/debridge/DlnDestinationABI.json +7 -7
  1048. package/sdk/src/protocols/debridge/DlnSourceABI.json +1 -1
  1049. package/sdk/src/protocols/debridge/abis.ts +5 -5
  1050. package/sdk/src/protocols/debridge/addresses.ts +11 -0
  1051. package/sdk/src/protocols/eco-routes/abis.ts +633 -0
  1052. package/sdk/src/protocols/eco-routes/addresses.generated.ts +589 -0
  1053. package/sdk/src/protocols/eco-routes/addresses.ts +27 -0
  1054. package/sdk/src/protocols/eco-routes/functions.ts +45 -0
  1055. package/sdk/src/protocols/eco-routes/index.ts +5 -0
  1056. package/sdk/src/protocols/eco-routes/info.ts +14 -0
  1057. package/sdk/src/protocols/eco-routes/lookup.ts +215 -0
  1058. package/sdk/src/protocols/eigenlayer/DelegationManagerABI.json +2 -2
  1059. package/sdk/src/protocols/eigenlayer/StrategyManagerABI.json +2 -2
  1060. package/sdk/src/protocols/eigenlayer/abis.ts +5 -4
  1061. package/sdk/src/protocols/ens/ENSRegistryABI.json +4 -4
  1062. package/sdk/src/protocols/ens/abis.ts +4 -4
  1063. package/sdk/src/protocols/erc20/functions.ts +6 -9
  1064. package/sdk/src/protocols/etherfi/WeETHABI.json +1 -1
  1065. package/sdk/src/protocols/etherfi/abis.ts +2 -1
  1066. package/sdk/src/protocols/euler-v2/EVCABI.json +2 -2
  1067. package/sdk/src/protocols/euler-v2/abis.ts +2 -2
  1068. package/sdk/src/protocols/fluid/FluidLendingABI.json +20 -37
  1069. package/sdk/src/protocols/fluid/FluidVaultABI.json +41 -0
  1070. package/sdk/src/protocols/fluid/abis.ts +41 -18
  1071. package/sdk/src/protocols/fluid/functions.ts +18 -16
  1072. package/sdk/src/protocols/frax/functions.ts +6 -6
  1073. package/sdk/src/protocols/gains-network/DiamondABI.json +49 -37
  1074. package/sdk/src/protocols/gains-network/abis.ts +26 -21
  1075. package/sdk/src/protocols/gains-network/functions.ts +6 -6
  1076. package/sdk/src/protocols/gamma/UniProxyLegacyABI.json +62 -0
  1077. package/sdk/src/protocols/gamma/abis.ts +31 -0
  1078. package/sdk/src/protocols/gamma/addresses.ts +2 -7
  1079. package/sdk/src/protocols/gamma/functions.ts +10 -0
  1080. package/sdk/src/protocols/gelato/GelatoAutomateABI.json +2 -2
  1081. package/sdk/src/protocols/gelato/abis.ts +2 -2
  1082. package/sdk/src/protocols/gho/functions.ts +4 -6
  1083. package/sdk/src/protocols/gmx-v1/PositionRouterABI.json +21 -3
  1084. package/sdk/src/protocols/gmx-v1/abis.ts +5 -3
  1085. package/sdk/src/protocols/gmx-v1/functions.ts +2 -2
  1086. package/sdk/src/protocols/gmx-v2/ExchangeRouterABI.json +13 -5
  1087. package/sdk/src/protocols/gmx-v2/abis.ts +7 -4
  1088. package/sdk/src/protocols/gmx-v2/addresses.ts +3 -1
  1089. package/sdk/src/protocols/gmx-v2/functions.ts +4 -2
  1090. package/sdk/src/protocols/harvest/VaultABI.json +12 -2
  1091. package/sdk/src/protocols/harvest/abis.ts +2 -2
  1092. package/sdk/src/protocols/hegic/HegicABI.json +6 -2
  1093. package/sdk/src/protocols/hegic/abis.ts +7 -2
  1094. package/sdk/src/protocols/hegic/addresses.ts +1 -0
  1095. package/sdk/src/protocols/hegic/functions.ts +3 -3
  1096. package/sdk/src/protocols/hop/addresses.ts +5 -2
  1097. package/sdk/src/protocols/hyperlane/HyperlaneMailboxABI.json +5 -5
  1098. package/sdk/src/protocols/hyperlane/abis.ts +5 -5
  1099. package/sdk/src/protocols/hyperlane/addresses.ts +9 -0
  1100. package/sdk/src/protocols/index.ts +13 -0
  1101. package/sdk/src/protocols/kim/KimRouterABI.json +8 -27
  1102. package/sdk/src/protocols/kim/abis.ts +6 -12
  1103. package/sdk/src/protocols/kim/functions.ts +3 -2
  1104. package/sdk/src/protocols/kyberswap/KyberSwapElasticRouterABI.json +1 -1
  1105. package/sdk/src/protocols/kyberswap/KyberSwapMetaAggregationRouterABI.json +52 -18
  1106. package/sdk/src/protocols/kyberswap/abis.ts +21 -8
  1107. package/sdk/src/protocols/kyberswap/addresses.ts +12 -2
  1108. package/sdk/src/protocols/kyberswap-aggregator/addresses.ts +12 -1
  1109. package/sdk/src/protocols/layerbank/LTokenABI.json +19 -29
  1110. package/sdk/src/protocols/layerbank/LayerBankCoreABI.json +87 -2
  1111. package/sdk/src/protocols/layerbank/abis.ts +69 -17
  1112. package/sdk/src/protocols/layerbank/addresses.ts +3 -1
  1113. package/sdk/src/protocols/layerbank/functions.ts +18 -16
  1114. package/sdk/src/protocols/layerzero/LayerZeroEndpointV2ABI.json +3 -3
  1115. package/sdk/src/protocols/layerzero/abis.ts +3 -3
  1116. package/sdk/src/protocols/layerzero/addresses.ts +11 -1
  1117. package/sdk/src/protocols/level-finance/LiquidityPoolABI.json +8 -0
  1118. package/sdk/src/protocols/level-finance/abis.ts +2 -0
  1119. package/sdk/src/protocols/level-finance/functions.ts +4 -4
  1120. package/sdk/src/protocols/lifi/LiFiDiamondABI.json +54 -4
  1121. package/sdk/src/protocols/lifi/abis.ts +24 -4
  1122. package/sdk/src/protocols/lifi/addresses.ts +9 -0
  1123. package/sdk/src/protocols/lifi/functions.ts +5 -2
  1124. package/sdk/src/protocols/liquity-v1/BorrowerOperationsABI.json +8 -0
  1125. package/sdk/src/protocols/liquity-v1/abis.ts +7 -1
  1126. package/sdk/src/protocols/liquity-v1/functions.ts +1 -1
  1127. package/sdk/src/protocols/liquity-v2/functions.ts +4 -6
  1128. package/sdk/src/protocols/mantle-meth/METHABI.json +0 -46
  1129. package/sdk/src/protocols/mantle-meth/METHStakingABI.json +50 -0
  1130. package/sdk/src/protocols/mantle-meth/abis.ts +23 -17
  1131. package/sdk/src/protocols/mantle-meth/addresses.ts +3 -0
  1132. package/sdk/src/protocols/mantle-meth/functions.ts +4 -4
  1133. package/sdk/src/protocols/maverick/MaverickV2FactoryABI.json +8 -0
  1134. package/sdk/src/protocols/maverick/MaverickV2RouterABI.json +4 -0
  1135. package/sdk/src/protocols/maverick/abis.ts +7 -1
  1136. package/sdk/src/protocols/morpho-blue/addresses.ts +10 -0
  1137. package/sdk/src/protocols/mux-protocol/LiquidityPoolABI.json +45 -11
  1138. package/sdk/src/protocols/mux-protocol/OrderBookABI.json +59 -17
  1139. package/sdk/src/protocols/mux-protocol/abis.ts +55 -22
  1140. package/sdk/src/protocols/mux-protocol/functions.ts +8 -8
  1141. package/sdk/src/protocols/olympus/StakingABI.json +8 -3
  1142. package/sdk/src/protocols/olympus/abis.ts +2 -2
  1143. package/sdk/src/protocols/oneinch/AggregationRouterV6ABI.json +5 -5
  1144. package/sdk/src/protocols/oneinch/abis.ts +5 -3
  1145. package/sdk/src/protocols/oneinch/functions.ts +2 -2
  1146. package/sdk/src/protocols/openocean/OpenOceanExchangeV2ABI.json +19 -1
  1147. package/sdk/src/protocols/openocean/abis.ts +11 -1
  1148. package/sdk/src/protocols/openocean/functions.ts +1 -1
  1149. package/sdk/src/protocols/opyn/ControllerABI.json +6 -1
  1150. package/sdk/src/protocols/opyn/abis.ts +1 -1
  1151. package/sdk/src/protocols/pancakeswap-v3/PancakeSwapV3FactoryABI.json +1 -1
  1152. package/sdk/src/protocols/pancakeswap-v3/PancakeSwapV3NFPMABI.json +3 -3
  1153. package/sdk/src/protocols/pancakeswap-v3/PancakeSwapV3SmartRouterABI.json +2 -2
  1154. package/sdk/src/protocols/pancakeswap-v3/abis.ts +6 -6
  1155. package/sdk/src/protocols/paraswap/AugustusV5ABI.json +1 -1
  1156. package/sdk/src/protocols/paraswap/abis.ts +1 -1
  1157. package/sdk/src/protocols/pendle/PendleRouterABI.json +392 -6
  1158. package/sdk/src/protocols/pendle/abis.ts +160 -6
  1159. package/sdk/src/protocols/permit2/Permit2ABI.json +1 -1
  1160. package/sdk/src/protocols/permit2/abis.ts +1 -1
  1161. package/sdk/src/protocols/permit2/addresses.ts +9 -0
  1162. package/sdk/src/protocols/perpetual-protocol/ClearingHouseABI.json +61 -49
  1163. package/sdk/src/protocols/perpetual-protocol/abis.ts +27 -14
  1164. package/sdk/src/protocols/premia/DiamondABI.json +24 -24
  1165. package/sdk/src/protocols/premia/abis.ts +20 -10
  1166. package/sdk/src/protocols/premia/addresses.ts +3 -8
  1167. package/sdk/src/protocols/premia/functions.ts +8 -8
  1168. package/sdk/src/protocols/pyth/PythOracleABI.json +3 -3
  1169. package/sdk/src/protocols/pyth/abis.ts +6 -3
  1170. package/sdk/src/protocols/reflexer/ETHJoinABI.json +5 -1
  1171. package/sdk/src/protocols/reflexer/SAFEEngineABI.json +4 -4
  1172. package/sdk/src/protocols/reflexer/abis.ts +10 -6
  1173. package/sdk/src/protocols/renzo/RestakeManagerABI.json +1 -1
  1174. package/sdk/src/protocols/renzo/abis.ts +1 -1
  1175. package/sdk/src/protocols/sablier/LockupLinearABI.json +2 -2
  1176. package/sdk/src/protocols/sablier/abis.ts +2 -2
  1177. package/sdk/src/protocols/safe/addresses.ts +10 -0
  1178. package/sdk/src/protocols/seaport/SeaportABI.json +87 -5
  1179. package/sdk/src/protocols/seaport/abis.ts +41 -5
  1180. package/sdk/src/protocols/seaport/addresses.ts +10 -0
  1181. package/sdk/src/protocols/seaport/functions.ts +1 -0
  1182. package/sdk/src/protocols/silo/SiloABI.json +4 -0
  1183. package/sdk/src/protocols/silo/abis.ts +4 -1
  1184. package/sdk/src/protocols/silo/addresses.ts +2 -1
  1185. package/sdk/src/protocols/silo/functions.ts +2 -1
  1186. package/sdk/src/protocols/socket/SocketGatewayABI.json +1 -17
  1187. package/sdk/src/protocols/socket/abis.ts +3 -11
  1188. package/sdk/src/protocols/socket/functions.ts +1 -1
  1189. package/sdk/src/protocols/spookyswap/addresses.ts +2 -1
  1190. package/sdk/src/protocols/squid/SquidRouterABI.json +42 -26
  1191. package/sdk/src/protocols/squid/abis.ts +19 -13
  1192. package/sdk/src/protocols/squid/functions.ts +2 -2
  1193. package/sdk/src/protocols/stargate/StargatePoolABI.json +31 -3
  1194. package/sdk/src/protocols/stargate/abis.ts +19 -3
  1195. package/sdk/src/protocols/superfluid/CFAForwarderABI.json +2 -2
  1196. package/sdk/src/protocols/superfluid/abis.ts +2 -2
  1197. package/sdk/src/protocols/sushiswap-v2/addresses.ts +2 -1
  1198. package/sdk/src/protocols/swell/RswETHABI.json +1 -6
  1199. package/sdk/src/protocols/swell/SwETHABI.json +1 -6
  1200. package/sdk/src/protocols/swell/abis.ts +4 -2
  1201. package/sdk/src/protocols/swell/functions.ts +4 -2
  1202. package/sdk/src/protocols/synapse/addresses.ts +2 -1
  1203. package/sdk/src/protocols/synthetix-v3/PerpsMarketProxyABI.json +54 -5
  1204. package/sdk/src/protocols/synthetix-v3/abis.ts +27 -5
  1205. package/sdk/src/protocols/synthetix-v3/addresses.ts +2 -1
  1206. package/sdk/src/protocols/synthra-v3/SynthraV3FactoryABI.json +54 -0
  1207. package/sdk/src/protocols/synthra-v3/SynthraV3NonfungiblePositionManagerABI.json +212 -0
  1208. package/sdk/src/protocols/synthra-v3/SynthraV3QuoterV2ABI.json +55 -0
  1209. package/sdk/src/protocols/synthra-v3/SynthraV3SwapRouter02ABI.json +168 -0
  1210. package/sdk/src/protocols/synthra-v3/abis.ts +244 -0
  1211. package/sdk/src/protocols/synthra-v3/addresses.ts +17 -0
  1212. package/sdk/src/protocols/synthra-v3/functions.ts +8 -0
  1213. package/sdk/src/protocols/synthra-v3/index.ts +4 -0
  1214. package/sdk/src/protocols/synthra-v3/info.ts +13 -0
  1215. package/sdk/src/protocols/thales/PositionalMarketABI.json +16 -0
  1216. package/sdk/src/protocols/thales/SpeedMarketsAMMABI.json +57 -22
  1217. package/sdk/src/protocols/thales/ThalesAMMABI.json +4 -11
  1218. package/sdk/src/protocols/thales/abis.ts +28 -11
  1219. package/sdk/src/protocols/thales/functions.ts +5 -6
  1220. package/sdk/src/protocols/thruster/ThrusterV3SwapRouterABI.json +1 -1
  1221. package/sdk/src/protocols/thruster/abis.ts +1 -1
  1222. package/sdk/src/protocols/trader-joe/LBRouterABI.json +3 -3
  1223. package/sdk/src/protocols/trader-joe/abis.ts +2 -2
  1224. package/sdk/src/protocols/uniswap-v2/addresses.ts +10 -0
  1225. package/sdk/src/protocols/uniswap-v3/UniswapV3FactoryABI.json +2 -2
  1226. package/sdk/src/protocols/uniswap-v3/UniswapV3NonfungiblePositionManagerABI.json +3 -3
  1227. package/sdk/src/protocols/uniswap-v3/UniswapV3QuoterV2ABI.json +1 -1
  1228. package/sdk/src/protocols/uniswap-v3/UniswapV3SwapRouter02ABI.json +168 -0
  1229. package/sdk/src/protocols/uniswap-v3/UniswapV3SwapRouterABI.json +2 -2
  1230. package/sdk/src/protocols/uniswap-v3/abis.ts +91 -8
  1231. package/sdk/src/protocols/uniswap-v3/addresses.ts +14 -0
  1232. package/sdk/src/protocols/uniswap-v4/UniswapV4PoolManagerABI.json +15 -15
  1233. package/sdk/src/protocols/uniswap-v4/UniswapV4UniversalRouterABI.json +16 -0
  1234. package/sdk/src/protocols/uniswap-v4/abis.ts +25 -15
  1235. package/sdk/src/protocols/uniswap-v4/addresses.ts +11 -0
  1236. package/sdk/src/protocols/unitflow-v3/UnitFlowV3FactoryABI.json +46 -0
  1237. package/sdk/src/protocols/unitflow-v3/UnitFlowV3QuoterABI.json +37 -0
  1238. package/sdk/src/protocols/unitflow-v3/UnitFlowV3RouterABI.json +67 -0
  1239. package/sdk/src/protocols/unitflow-v3/abis.ts +71 -0
  1240. package/sdk/src/protocols/unitflow-v3/addresses.ts +20 -0
  1241. package/sdk/src/protocols/unitflow-v3/functions.ts +8 -0
  1242. package/sdk/src/protocols/unitflow-v3/index.ts +4 -0
  1243. package/sdk/src/protocols/unitflow-v3/info.ts +14 -0
  1244. package/sdk/src/protocols/velodrome/addresses.ts +3 -1
  1245. package/sdk/src/protocols/venus/VBNBABI.json +86 -0
  1246. package/sdk/src/protocols/venus/VTokenABI.json +1 -1
  1247. package/sdk/src/protocols/venus/abis.ts +49 -1
  1248. package/sdk/src/protocols/vertex/ClearinghouseABI.json +20 -10
  1249. package/sdk/src/protocols/vertex/EndpointABI.json +1 -1
  1250. package/sdk/src/protocols/vertex/abis.ts +13 -4
  1251. package/sdk/src/protocols/wormhole/WormholeTokenBridgeABI.json +2 -2
  1252. package/sdk/src/protocols/wormhole/abis.ts +2 -2
  1253. package/sdk/src/protocols/wormhole/addresses.ts +9 -0
  1254. package/sdk/src/protocols/zerolend/addresses.ts +2 -1
  1255. package/sdk/src/protocols/zerox/addresses.ts +2 -1
  1256. package/sdk/src/protocols/zksync-bridge/ZkSyncDiamondProxyABI.json +1 -1
  1257. package/sdk/src/protocols/zksync-bridge/abis.ts +1 -1
  1258. package/sdk/src/skills/aave-v4.md +91 -0
  1259. package/sdk/src/skills/across.md +28 -10
  1260. package/sdk/src/skills/aerodrome-slipstream.md +57 -0
  1261. package/sdk/src/skills/aerodrome.md +1 -0
  1262. package/sdk/src/skills/aevo.md +12 -4
  1263. package/sdk/src/skills/ambient.md +2 -2
  1264. package/sdk/src/skills/arrakis.md +3 -3
  1265. package/sdk/src/skills/cbeth.md +6 -8
  1266. package/sdk/src/skills/chainlink-ccip.md +3 -2
  1267. package/sdk/src/skills/chainlink.md +1 -1
  1268. package/sdk/src/skills/circle-gateway.md +98 -0
  1269. package/sdk/src/skills/compound-v2.md +2 -2
  1270. package/sdk/src/skills/connext.md +8 -7
  1271. package/sdk/src/skills/crvusd.md +6 -6
  1272. package/sdk/src/skills/curve.md +17 -2
  1273. package/sdk/src/skills/debridge.md +3 -2
  1274. package/sdk/src/skills/eigenlayer.md +1 -1
  1275. package/sdk/src/skills/erc20.md +8 -10
  1276. package/sdk/src/skills/etherfi.md +1 -1
  1277. package/sdk/src/skills/fluid.md +46 -39
  1278. package/sdk/src/skills/frax.md +6 -6
  1279. package/sdk/src/skills/gains-network.md +13 -21
  1280. package/sdk/src/skills/gamma.md +12 -6
  1281. package/sdk/src/skills/gho.md +4 -6
  1282. package/sdk/src/skills/gmx-v1.md +4 -2
  1283. package/sdk/src/skills/gmx-v2.md +6 -2
  1284. package/sdk/src/skills/harvest.md +2 -2
  1285. package/sdk/src/skills/hegic.md +9 -8
  1286. package/sdk/src/skills/hop.md +8 -8
  1287. package/sdk/src/skills/hyperlane.md +4 -3
  1288. package/sdk/src/skills/index.md +84 -77
  1289. package/sdk/src/skills/kim.md +11 -14
  1290. package/sdk/src/skills/kyberswap-aggregator.md +5 -3
  1291. package/sdk/src/skills/kyberswap.md +6 -6
  1292. package/sdk/src/skills/layerbank.md +41 -35
  1293. package/sdk/src/skills/layerzero.md +3 -2
  1294. package/sdk/src/skills/level-finance.md +6 -4
  1295. package/sdk/src/skills/lido.md +5 -5
  1296. package/sdk/src/skills/lifi.md +41 -23
  1297. package/sdk/src/skills/liquity-v1.md +6 -2
  1298. package/sdk/src/skills/liquity-v2.md +4 -6
  1299. package/sdk/src/skills/loader.ts +15 -25
  1300. package/sdk/src/skills/mantle-meth.md +13 -5
  1301. package/sdk/src/skills/maverick.md +3 -3
  1302. package/sdk/src/skills/morpho-blue.md +1 -1
  1303. package/sdk/src/skills/mux-protocol.md +21 -17
  1304. package/sdk/src/skills/oneinch.md +4 -3
  1305. package/sdk/src/skills/openocean.md +2 -2
  1306. package/sdk/src/skills/opyn.md +1 -1
  1307. package/sdk/src/skills/permit2.md +1 -1
  1308. package/sdk/src/skills/perpetual-protocol.md +2 -2
  1309. package/sdk/src/skills/premia.md +21 -21
  1310. package/sdk/src/skills/reflexer.md +1 -1
  1311. package/sdk/src/skills/renzo.md +1 -1
  1312. package/sdk/src/skills/safe.md +1 -1
  1313. package/sdk/src/skills/seaport.md +3 -2
  1314. package/sdk/src/skills/silo.md +4 -3
  1315. package/sdk/src/skills/socket.md +4 -5
  1316. package/sdk/src/skills/spookyswap.md +2 -2
  1317. package/sdk/src/skills/squid.md +18 -10
  1318. package/sdk/src/skills/stargate.md +1 -1
  1319. package/sdk/src/skills/sushiswap-v2.md +1 -1
  1320. package/sdk/src/skills/swell.md +6 -4
  1321. package/sdk/src/skills/synapse.md +1 -1
  1322. package/sdk/src/skills/synthetix-v3.md +1 -1
  1323. package/sdk/src/skills/synthra-v3.md +57 -0
  1324. package/sdk/src/skills/thales.md +12 -10
  1325. package/sdk/src/skills/trader-joe.md +1 -1
  1326. package/sdk/src/skills/uniswap-v2.md +2 -1
  1327. package/sdk/src/skills/uniswap-v3.md +14 -4
  1328. package/sdk/src/skills/uniswap-v4.md +3 -1
  1329. package/sdk/src/skills/unitflow-v3.md +62 -0
  1330. package/sdk/src/skills/velodrome.md +2 -2
  1331. package/sdk/src/skills/venus.md +10 -2
  1332. package/sdk/src/skills/vertex.md +1 -1
  1333. package/sdk/src/skills/wormhole.md +1 -1
  1334. package/sdk/src/skills/zerolend.md +1 -1
  1335. package/sdk/src/skills/zerox.md +1 -1
  1336. package/sdk/src/skills/zksync-bridge.md +1 -1
  1337. package/actions/dist/megas-swap.d.ts +0 -97
  1338. package/actions/dist/megas-swap.d.ts.map +0 -1
  1339. package/actions/dist/megas-swap.js +0 -286
  1340. package/sdk/dist/routes/globals.generated.d.ts +0 -94
  1341. package/sdk/dist/routes/globals.generated.d.ts.map +0 -1
  1342. package/sdk/dist/routes/globals.generated.js +0 -2
  1343. package/sdk/dist/routes/globals.generated.js.map +0 -1
@@ -0,0 +1,141 @@
1
+ // GENERATED by sdk/scripts/gen-embedded-sources.mjs. Do not edit: it is build output
2
+ // (gitignored), rewritten by `build`, `typecheck` and `test`. Edit the files it copies:
3
+ // src/skills/*.md.
4
+ /** Each `src/skills/*.md`, keyed by file name without `.md`. */
5
+ export const SKILL_DOCUMENTS = {
6
+ "aave-v2": "# Aave V2\n\nLegacy version of Aave lending protocol. Still holds significant TVL on Ethereum, Polygon, and Avalanche.\n\n## Category\n\nlending | Chains: Ethereum (1), Polygon (137), Avalanche (43114)\n\n## SauceScript Functions\n\n### deposit\n\nDeposit assets into the lending pool to earn interest. Mints aTokens to the depositor.\n\n```typescript\nimport { LendingPoolABI as ILendingPool } from \"./abis\";\n\nfunction main(\n lendingPoolAddress: Address,\n asset: Address,\n amount: Uint256,\n onBehalfOf: Address,\n): Uint256 {\n const pool = ILendingPool.at(lendingPoolAddress);\n pool.deposit(asset, amount, onBehalfOf, 0);\n return 1;\n}\n```\n\n- `lendingPoolAddress`: LendingPool contract for the target chain\n- `asset`: ERC-20 token address to deposit\n- `amount`: Amount in token's native decimals (e.g. 1e6 for 1 USDC). Use `type(uint256).max` to deposit entire balance\n- `onBehalfOf`: Address that receives the aTokens (use msg.sender for self)\n- Requires ERC-20 approval to the LendingPool before calling\n\n### withdraw\n\nWithdraw deposited assets by burning aTokens.\n\n```typescript\nimport { LendingPoolABI as ILendingPool } from \"./abis\";\n\nfunction main(lendingPoolAddress: Address, asset: Address, amount: Uint256, to: Address): Uint256 {\n const pool = ILendingPool.at(lendingPoolAddress);\n return pool.withdraw(asset, amount, to);\n}\n```\n\n- `amount`: Amount to withdraw. Use `type(uint256).max` to withdraw entire deposited balance\n- `to`: Address that receives the underlying tokens\n- Returns the actual withdrawn amount\n\n### borrow\n\nBorrow assets against deposited collateral.\n\n```typescript\nimport { LendingPoolABI as ILendingPool } from \"./abis\";\n\nfunction main(\n lendingPoolAddress: Address,\n asset: Address,\n amount: Uint256,\n interestRateMode: Uint256,\n onBehalfOf: Address,\n): Uint256 {\n const pool = ILendingPool.at(lendingPoolAddress);\n pool.borrow(asset, amount, interestRateMode, 0, onBehalfOf);\n return 1;\n}\n```\n\n- `interestRateMode`: 1 = stable rate, 2 = variable rate. Variable is more common and typically lower\n- `onBehalfOf`: Address that receives the debt tokens (must have delegated credit if not msg.sender)\n- Must have sufficient collateral deposited first\n\n### repay\n\nRepay borrowed assets to reduce debt.\n\n```typescript\nimport { LendingPoolABI as ILendingPool } from \"./abis\";\n\nfunction main(\n lendingPoolAddress: Address,\n asset: Address,\n amount: Uint256,\n rateMode: Uint256,\n onBehalfOf: Address,\n): Uint256 {\n const pool = ILendingPool.at(lendingPoolAddress);\n return pool.repay(asset, amount, rateMode, onBehalfOf);\n}\n```\n\n- `rateMode`: Must match the rate mode of the existing debt (1 = stable, 2 = variable)\n- `amount`: Use `type(uint256).max` to repay entire debt\n- Requires ERC-20 approval to the LendingPool\n- Returns the actual repaid amount\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| --------- | ----------- | -------------------------------------------- |\n| Ethereum | lendingPool | `0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9` |\n| Polygon | lendingPool | `0x8dFf5E27EA6b7AC08EbFdf9eB090F32ee9a30fcf` |\n| Avalanche | lendingPool | `0x4F01AeD16D97E3aB5ab2B501154DC9bb0F1A5A2C` |\n\n## ABI Reference\n\n### LendingPoolABI\n\n- `deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)` - Deposit asset into pool\n- `withdraw(address asset, uint256 amount, address to) returns (uint256)` - Withdraw asset from pool\n- `borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf)` - Borrow asset\n- `repay(address asset, uint256 amount, uint256 rateMode, address onBehalfOf) returns (uint256)` - Repay borrowed asset\n\n## Notes\n\n- interestRateMode: 1 = stable, 2 = variable. Most users use variable rate\n- referralCode is always 0 (referral program inactive)\n- Legacy protocol -- consider Aave V3 for new deployments\n- All deposit/repay operations require prior ERC-20 approval to the LendingPool address\n- TVL: $2B+. Audited\n",
7
+ "aave-v3": "# Aave V3\n\nNon-custodial liquidity protocol for earning interest on deposits and borrowing assets. The most widely deployed lending protocol in DeFi.\n\n## Category\n\nlending | Chains: Ethereum (1), Polygon (137), Arbitrum (42161), Optimism (10), Avalanche (43114), Base (8453), BSC (56), Scroll (534352), Fantom (250), Gnosis (100), Metis (1088)\n\n## SauceScript Functions\n\n### supply\n\nSupply assets to earn interest. Mints aTokens to the supplier.\n\n```typescript\nimport { PoolABI as IPool } from \"./abis\";\n\nfunction main(poolAddress: Address, asset: Address, amount: Uint256, onBehalfOf: Address): Uint256 {\n const pool = IPool.at(poolAddress);\n pool.supply(asset, amount, onBehalfOf, 0);\n return 1;\n}\n```\n\n- `poolAddress`: Pool contract for the target chain\n- `asset`: ERC-20 token address to supply\n- `amount`: Amount in token's native decimals. Use `type(uint256).max` for entire balance\n- `onBehalfOf`: Address that receives aTokens (use msg.sender for self)\n- Requires ERC-20 approval to the Pool before calling\n\n### withdraw\n\nWithdraw supplied assets by burning aTokens.\n\n```typescript\nimport { PoolABI as IPool } from \"./abis\";\n\nfunction main(poolAddress: Address, asset: Address, amount: Uint256, to: Address): Uint256 {\n const pool = IPool.at(poolAddress);\n return pool.withdraw(asset, amount, to);\n}\n```\n\n- `amount`: Use `type(uint256).max` to withdraw entire balance\n- Returns the actual withdrawn amount\n\n### borrow\n\nBorrow assets against supplied collateral.\n\n```typescript\nimport { PoolABI as IPool } from \"./abis\";\n\nfunction main(\n poolAddress: Address,\n asset: Address,\n amount: Uint256,\n interestRateMode: Uint256,\n onBehalfOf: Address,\n): Uint256 {\n const pool = IPool.at(poolAddress);\n pool.borrow(asset, amount, interestRateMode, 0, onBehalfOf);\n return 1;\n}\n```\n\n- `interestRateMode`: 1 = stable (being phased out), 2 = variable. Use 2 for variable rate\n- Must have sufficient collateral supplied first\n\n### repay\n\nRepay borrowed assets to reduce debt.\n\n```typescript\nimport { PoolABI as IPool } from \"./abis\";\n\nfunction main(\n poolAddress: Address,\n asset: Address,\n amount: Uint256,\n interestRateMode: Uint256,\n onBehalfOf: Address,\n): Uint256 {\n const pool = IPool.at(poolAddress);\n return pool.repay(asset, amount, interestRateMode, onBehalfOf);\n}\n```\n\n- `interestRateMode`: Must match the debt type (1 = stable, 2 = variable)\n- `amount`: Use `type(uint256).max` to repay entire debt\n- Requires ERC-20 approval to the Pool\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| --------- | --------------------- | -------------------------------------------- |\n| Ethereum | pool | `0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2` |\n| Ethereum | poolAddressesProvider | `0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e` |\n| Polygon | pool | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` |\n| Polygon | poolAddressesProvider | `0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb` |\n| Arbitrum | pool | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` |\n| Arbitrum | poolAddressesProvider | `0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb` |\n| Optimism | pool | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` |\n| Optimism | poolAddressesProvider | `0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb` |\n| Avalanche | pool | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` |\n| Avalanche | poolAddressesProvider | `0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb` |\n| Base | pool | `0xA238Dd80C259a72e81d7e4664a9801593F98d1c5` |\n| Base | poolAddressesProvider | `0xe20fCBdBfFC4Dd138cE8b2E6FBb6CB49777ad64D` |\n| BSC | pool | `0x6807dc923806fE8Fd134338EABCA509979a7e0cB` |\n| Scroll | pool | `0x11fCfe756c05AD438e312a7fd934381537D3cFfe` |\n| Fantom | pool | `0x794a61358D6845594F94dc1DB02A252b5b4814aD` |\n| Gnosis | pool | `0xb50201558B00496A145fE76f7424749556E326D8` |\n| Metis | pool | `0x90df02551bB792286e8D4f13E0e357b4Bf1D6a57` |\n\n## ABI Reference\n\n### PoolABI\n\n- `supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)` - Supply asset to earn interest\n- `withdraw(address asset, uint256 amount, address to) returns (uint256)` - Withdraw supplied asset\n- `borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf)` - Borrow against collateral\n- `repay(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf) returns (uint256)` - Repay borrowed debt\n- `flashLoanSimple(address receiverAddress, address asset, uint256 amount, bytes params, uint16 referralCode)` - Single-asset flash loan (receiver must implement IFlashLoanSimpleReceiver)\n- `liquidationCall(address collateralAsset, address debtAsset, address user, uint256 debtToCover, bool receiveAToken)` - Liquidate undercollateralized position (healthFactor < 1e18)\n- `getUserAccountData(address user) returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)` - Get account health data (view)\n\n## Notes\n\n- interestRateMode: 1 = stable (deprecated on most markets), 2 = variable\n- referralCode is always 0 (referral program inactive)\n- V3 introduced efficiency mode (eMode) for correlated assets, isolation mode for new assets, and siloed borrowing\n- All supply/repay operations require prior ERC-20 approval to the Pool address\n- healthFactor < 1e18 means position is liquidatable\n- TVL: $40B+. Audited\n",
8
+ "aave-v4": "# Aave V4\n\nHub-and-spoke lending. Liquidity sits in a Hub; users supply, borrow and repay through Spokes, and each Spoke addresses its assets by reserve id rather than by token address.\n\n## Category\n\nlending | Chains: Ethereum (1), Base (8453), Avalanche (43114), Arc (5042)\n\n## SauceScript Functions\n\n### supply\n\n```typescript\nimport { AaveV4SpokeABI as ISpoke } from \"./abis\";\n\nfunction main(\n spokeAddress: Address,\n reserveId: Uint256,\n amount: Uint256,\n onBehalfOf: Address,\n): Uint256 {\n const spoke = ISpoke.at(spokeAddress);\n spoke.supply(reserveId, amount, onBehalfOf);\n return 1;\n}\n```\n\n- `reserveId`: the Spoke's reserve id for the asset. Resolve it with `spoke.getReserveId(hub, hub.getAssetId(token))`\n- The underlying token must be `approve`d to the Spoke first\n\n`withdraw`, `borrow` and `repay` take the same `(reserveId, amount, onBehalfOf)` arguments.\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| --------- | ----------------------- | -------------------------------------------- |\n| Ethereum | Core Hub | `0xCca852Bc40e560adC3b1Cc58CA5b55638ce826c9` |\n| Ethereum | Plus Hub | `0x06002e9c4412CB7814a791eA3666D905871E536A` |\n| Ethereum | Prime Hub | `0x943827DCA022D0F354a8a8c332dA1e5Eb9f9F931` |\n| Ethereum | Global Dollar Hub | `0x62d63197660c080236193CA60b70E49A08E90368` |\n| Ethereum | Main Spoke | `0x94e7A5dCbE816e498b89aB752661904E2F56c485` |\n| Ethereum | Forex Spoke | `0xD8B93635b8C6d0fF98CbE90b5988E3F2d1Cd9da1` |\n| Ethereum | Bluechip Spoke | `0x973a023A77420ba610f06b3858aD991Df6d85A08` |\n| Ethereum | Ethena Correlated Spoke | `0x58131E79531caB1d52301228d1f7b842F26B9649` |\n| Ethereum | Ethena Ecosystem Spoke | `0xba1B3D55D249692b669A164024A838309B7508AF` |\n| Ethereum | Gold Spoke | `0x65407b940966954b23dfA3caA5C0702bB42984DC` |\n| Ethereum | PAXG Gold Spoke | `0xAD75cE6354f87F3135cE10621d385d8D1e2562C2` |\n| Ethereum | Lombard BTC Spoke | `0x7EC68b5695e803e98a21a9A05d744F28b0a7753D` |\n| Ethereum | USDG Pendle Spoke | `0x956d8e0A89cfa3744428C4641b5a53B56167a7f9` |\n| Ethereum | ether.fi E-Spoke | `0xbF10BDfE177dE0336aFD7fcCF80A904E15386219` |\n| Ethereum | Kelp E-Spoke | `0x3131FE68C4722e726fe6B2819ED68e514395B9a4` |\n| Ethereum | Lido E-Spoke | `0xe1900480ac69f0B296841Cd01cC37546d92F35Cd` |\n| Ethereum | USDG Maple E-Spoke | `0x774b9655413c34809c1f1b16b654465A89EBE989` |\n| Base | Equities Hub | `0xa4d5947Eb727A052bae69C593FfC84247EC9864E` |\n| Base | Mag7 Spoke | `0x17905Db0e4A3514467539956c084180616AE7B8D` |\n| Avalanche | Core Hub | `0xd07369fAE4A5BB13c9Ce446B052c7867B1AbDf6e` |\n| Avalanche | Main Spoke | `0x435272CefF93a1E657E8ABfdf0A13e95900A3a56` |\n| Avalanche | Forex Spoke | `0x6a37776B5E026dBdF043b4F933c323C84DD1B514` |\n| Avalanche | AVAX Correlated Spoke | `0x3b517594277c67307CF2d7CBE6FE1D4399B68c41` |\n| Arc | Core Hub | `0x17288dfc86205301064577b98B02b81017e6F79C` |\n| Arc | Main Spoke | `0xB843bdC3a87A05E77E07Df9FE48928b3A34b134d` |\n| Arc | Forex Spoke | `0x4164EBCAF74670aa74C8D4F59de6157c0780F1bB` |\n\n## ABI Reference\n\n### AaveV4SpokeABI\n\n- `supply(uint256 reserveId, uint256 amount, address onBehalfOf) returns (uint256, uint256)`\n- `withdraw(uint256 reserveId, uint256 amount, address onBehalfOf) returns (uint256, uint256)`\n- `borrow(uint256 reserveId, uint256 amount, address onBehalfOf) returns (uint256, uint256)`\n- `repay(uint256 reserveId, uint256 amount, address onBehalfOf) returns (uint256, uint256)`\n- `setUsingAsCollateral(uint256 reserveId, bool usingAsCollateral, address onBehalfOf)`\n- `getReserveId(address hub, uint256 assetId) returns (uint256)` (view)\n- `getReserveCount() returns (uint256)` (view)\n- `getUserSuppliedAssets(uint256 reserveId, address user) returns (uint256)` (view)\n- `getUserTotalDebt(uint256 reserveId, address user) returns (uint256)` (view)\n\n### AaveV4HubABI\n\n- `getAssetId(address underlying) returns (uint256)` (view)\n- `getAssetCount() returns (uint256)` (view)\n- `getAssetLiquidity(uint256 assetId) returns (uint256)` (view)\n- `isUnderlyingListed(address underlying) returns (bool)` (view)\n\n## Notes\n\n- Arc's market lists USDC, EURC, WETH and cirBTC. The Main Spoke carries all four; the Forex Spoke carries USDC and EURC\n- A chain can carry several Hubs, and a Spoke draws on one or more of them: `getReserveId(hub, assetId)` needs the Hub the asset lives in. Base carries only an equities market (tokenized stocks and USDC) with no core hub\n- Each chain also has a Treasury Spoke, which collects fees; it is not a market and is not registered\n- Hub, Spokes and their implementations are upgradeable (EIP-1967) proxies\n- Addresses come from bgd-labs/aave-address-book (`AaveV4Ethereum`, `AaveV4Base`, `AaveV4Avalanche`, `AaveV4Arc`)\n",
9
+ "abracadabra": "# Abracadabra\n\nLending protocol that lets users borrow MIM stablecoin against yield-bearing collateral via isolated Cauldron markets built on DegenBox.\n\n## Category\n\ncdp | Chains: Ethereum, Arbitrum\n\n## Key Operations\n\n- **borrow**: Borrow MIM from a Cauldron\n- **repay**: Repay MIM debt\n- **addCollateral**: Add collateral to a Cauldron position\n- **removeCollateral**: Remove collateral from a Cauldron position\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/abracadabra\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Borrow MIM from Cauldron\nimport { CauldronABI as ICauldron } from \"./abis\";\nfunction main(\n cauldronAddress: Address,\n to: Address,\n amount: Uint256,\n): { part: Uint256; share: Uint256 } {\n const cauldron = ICauldron.at(cauldronAddress);\n return cauldron.borrow(to, amount);\n}\n\n// Repay MIM debt\nimport { CauldronABI as ICauldron } from \"./abis\";\nfunction main(cauldronAddress: Address, to: Address, part: Uint256): Uint256 {\n const cauldron = ICauldron.at(cauldronAddress);\n return cauldron.repay(to, 0, part);\n}\n\n// Add collateral\nimport { CauldronABI as ICauldron } from \"./abis\";\nfunction main(cauldronAddress: Address, to: Address, share: Uint256): Uint256 {\n const cauldron = ICauldron.at(cauldronAddress);\n cauldron.addCollateral(to, 0, share);\n return 1;\n}\n\n// Remove collateral\nimport { CauldronABI as ICauldron } from \"./abis\";\nfunction main(cauldronAddress: Address, to: Address, share: Uint256): Uint256 {\n const cauldron = ICauldron.at(cauldronAddress);\n cauldron.removeCollateral(to, share);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | degenBox | `0xd96f48665a1410C0cd669A88898ecA36B9Fc2cce` |\n| Ethereum | mim | `0x99D8a9C45b2ecA8864373A26D1459e3Dff1e17F3` |\n| Arbitrum | degenBox | `0x7C8FeF8eA9b1fE46A7689bfb8149341C90431D38` |\n| Arbitrum | mim | `0xFEa7a6a0B346362BF88A9e4A88416B77a57D6c2A` |\n\n## ABI Methods\n\n### CauldronABI\n\n- `borrow(address,uint256)` - Borrow MIM. Params: to (recipient), amount (MIM to borrow). Returns (part, share) - part is debt units, share is DegenBox shares\n- `repay(address,bool,uint256)` - Repay MIM debt. Params: to (whose debt to repay), skim (true=use DegenBox balance), part (debt part to repay). Returns amount repaid\n- `addCollateral(address,bool,uint256)` - Add collateral. Params: to (position owner), skim (true=use DegenBox balance), share (collateral shares to add)\n- `removeCollateral(address,uint256)` - Remove collateral. Params: to (recipient), share (collateral shares to remove)\n- `userCollateralShare(address)` - Query user's collateral. Params: user. Returns share amount\n- `userBorrowPart(address)` - Query user's debt. Params: user. Returns borrow part\n\n### DegenBoxABI\n\n- `deposit(address,address,address,uint256,uint256)` - Deposit tokens into DegenBox. Payable. Params: token, from, to, amount (0 if using share), share (0 if using amount). Returns (amountOut, shareOut)\n- `withdraw(address,address,address,uint256,uint256)` - Withdraw from DegenBox. Params: token, from, to, amount (0 if using share), share (0 if using amount). Returns (amountOut, shareOut)\n- `balanceOf(address,address)` - Query balance. Params: token, user. Returns share amount\n\n## Notes\n\n- Isolated Cauldron markets - each has specific collateral type and risk parameters\n- DegenBox is the underlying vault that holds all assets (BentoBox fork)\n- Amounts use \"part\" (debt accounting) and \"share\" (DegenBox shares) - not raw token amounts\n- skim=false means transfer tokens from caller; skim=true means use tokens already in DegenBox\n- Deposit collateral to DegenBox first, then addCollateral to a Cauldron\n- Common collateral: sSPELL, yv tokens, LP tokens, yield-bearing assets\n",
10
+ "across": "# Across\n\nOptimistic cross-chain bridge powered by UMA's optimistic oracle. Uses relayers for fast fills and canonical bridges for settlement.\n\n## Category\n\nbridge | Direction: L2-to-L2, L1-to-L2, L2-to-L1 | Chains: Ethereum (1), Arbitrum (42161), Optimism (10), Base (8453), Polygon (137), zkSync (324), Linea (59144), Mode (34443), Blast (81457), Scroll (534352), Arc (5042)\n\n## SauceScript Functions\n\n### bridge\n\nDeposit tokens into the SpokePool for a cross-chain transfer, through `depositV3`.\n\n```typescript\nimport { AcrossSpokePoolABI as ISpokePool } from \"./abis\";\n\nfunction main(\n spokePoolAddress: Address,\n token: Address,\n outputToken: Address,\n amount: Uint256,\n outputAmount: Uint256,\n destinationChainId: Uint256,\n recipient: Address,\n quoteTimestamp: Uint256,\n fillDeadline: Uint256,\n): Uint256 {\n const spokePool = ISpokePool.at(spokePoolAddress);\n spokePool.depositV3(\n ctx.msgSender(),\n recipient,\n token,\n outputToken,\n amount,\n outputAmount,\n destinationChainId,\n 0x0000000000000000000000000000000000000000,\n quoteTimestamp,\n fillDeadline,\n 0,\n \"\",\n );\n return 1;\n}\n```\n\n- `token` / `outputToken`: ERC-20 to bridge, and the token the recipient receives on the destination\n- `outputAmount`: amount the relayer delivers (input minus the quoted fees)\n- `quoteTimestamp`: the quote's timestamp; the SpokePool rejects one outside its `depositQuoteTimeBuffer`\n- `fillDeadline`: unix time after which the deposit can no longer be filled\n- `recipient`: Address to receive tokens on destination chain\n- Requires ERC-20 approval to the SpokePool\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | --------- | -------------------------------------------- |\n| Ethereum | hubPool | `0xc186fA914353c44b2E33eBE05f21846F1048bEda` |\n| Ethereum | spokePool | `0x5c7BCd6E7De5423a257D81B442095A1a6ced35C5` |\n| Arbitrum | spokePool | `0xe35e9842fceaCA96570B734083f4a58e8F7C5f2A` |\n| Optimism | spokePool | `0x6f26Bf09B1C792e3228e5467807a900A503c0281` |\n| Base | spokePool | `0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64` |\n| Polygon | spokePool | `0x9295ee1d8C5b022Be115A2AD3c30C72E34e7F096` |\n| zkSync | spokePool | `0xE0B015E54d54fc84a6cB9B666099c46adE9335FF` |\n| Linea | spokePool | `0x7E63A5f1a8F0B4d0934B2f2327DAED3F6bb2ee75` |\n| Mode | spokePool | `0x3baD7AD0728f9917d1Bf08af5782dCbD516cDd96` |\n| Blast | spokePool | `0x2D509190Ed0172ba588407D4c2df918F955Cc6E1` |\n| Scroll | spokePool | `0x3baD7AD0728f9917d1Bf08af5782dCbD516cDd96` |\n\n## ABI Reference\n\n### AcrossSpokePoolABI\n\n- `depositV3(address depositor, address recipient, address inputToken, address outputToken, uint256 inputAmount, uint256 outputAmount, uint256 destinationChainId, address exclusiveRelayer, uint32 quoteTimestamp, uint32 fillDeadline, uint32 exclusivityParameter, bytes message)` [payable] - EVM-address deposit. Supports cross-chain swaps (inputToken != outputToken), exclusive relayer, and arbitrary message passing\n- `deposit(bytes32 depositor, bytes32 recipient, bytes32 inputToken, bytes32 outputToken, uint256 inputAmount, uint256 outputAmount, uint256 destinationChainId, bytes32 exclusiveRelayer, uint32 quoteTimestamp, uint32 fillDeadline, uint32 exclusivityParameter, bytes message)` [payable] - The same deposit with every address as `bytes32`, so it can name non-EVM recipients and tokens. The legacy address-typed `deposit` no longer exists on the deployed SpokePools\n\n### AcrossHubPoolABI\n\n- `liquidityUtilizationCurrent(address l1Token) returns (uint256)` - Get current utilization rate. Not a view: it syncs pool balances first\n- `pooledTokens(address l1Token) returns (address lpToken, bool isEnabled, uint32 lastLpFeeUpdate, int256 utilizedReserves, uint256 liquidReserves, uint256 undistributedLpFees)` - Get pool token info (view)\n\n## Notes\n\n- Fast fills: relayers fill deposits on destination within minutes, then claim reimbursement via optimistic oracle\n- Finality: deposit confirmation on source chain, fill within 1-10 minutes typically\n- Requires ERC-20 approval to the SpokePool address on source chain\n- HubPool on Ethereum only -- SpokePools on all supported L2s\n- TVL: $500M+. Audited\n- On Arc (5042) the SpokePool's `wrappedNativeToken()` is the zero address, so deposit ERC-20s (USDC is `0x3600000000000000000000000000000000000000`), not native value\n",
11
+ "aerodrome-slipstream": "# Aerodrome Slipstream\n\nAerodrome's concentrated-liquidity pools (Uniswap V3-style, keyed by tick spacing rather than fee), on Base and, as Aero Lite, on Arc.\n\n## Category\n\ndex | Chains: Base (8453), Arc (5042)\n\n## SauceScript Functions\n\n### getPool\n\n```typescript\nimport { SlipstreamCLFactoryABI as ICLFactory } from \"./abis\";\n\nfunction main(\n factoryAddress: Address,\n tokenA: Address,\n tokenB: Address,\n tickSpacing: Uint256,\n): Address {\n const factory = ICLFactory.at(factoryAddress);\n return factory.getPool(tokenA, tokenB, tickSpacing);\n}\n```\n\n- Pools are keyed by `(tokenA, tokenB, tickSpacing)`. `tickSpacingToFee(tickSpacing)` gives a spacing's default fee\n- On Base, ask the factory of the generation the pool was created in: a pool exists under one CLFactory only (the WETH/USDC tick-spacing-100 pool is under the initial one)\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| ----- | --------------------------------------- | -------------------------------------------- |\n| Base | CLFactory (initial) | `0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A` |\n| Base | NonfungiblePositionManager (initial) | `0x827922686190790b37229fd06084350E74485b72` |\n| Base | CLFactory (Gauge Caps) | `0xaDe65c38CD4849aDBA595a4323a8C7DdfE89716a` |\n| Base | NonfungiblePositionManager (Gauge Caps) | `0xa990C6a764b73BF43cee5Bb40339c3322FB9D55F` |\n| Base | CLFactory (Gauges V3) | `0xf8f2eB4940CFE7d13603DDDD87f123820Fc061Ef` |\n| Base | NonfungiblePositionManager (Gauges V3) | `0xe1f8cd9AC4e4A65F54f38a5CdAfCA44f6dD68b53` |\n| Arc | CLFactory | `0xb89Df768aF2CFE637ceB352c587Fe8edAf491d03` |\n| Arc | NonfungiblePositionManager | `0xc84bB45D43CD25D02b83B4C085eaA4e08da8f473` |\n| Arc | Metarouter | `0x7275FA44c67BbA8d921422e600B4ed396209c886` |\n\nThe Base roles are `clFactory`/`nonfungiblePositionManager` (initial), `clFactoryGaugeCaps`/`nonfungiblePositionManagerGaugeCaps` and `clFactoryGaugesV3`/`nonfungiblePositionManagerGaugesV3`.\n\n## ABI Reference\n\n- `SlipstreamCLFactoryABI`: `getPool(address,address,int24) returns (address)`, `allPoolsLength() returns (uint256)`, `tickSpacingToFee(int24) returns (uint24)`\n- `SlipstreamPositionManagerABI`: `factory() returns (address)`, `positions(uint256)`\n- `AeroMetarouterABI`: `execute(bytes commands, bytes[] inputs, uint256 deadline)` - Aero's command-encoded router\n\n## Notes\n\n- Base's addresses are from the aerodrome-finance/slipstream README. Three generations are live there, and new gauges deploy from Gauges V3. Base has no Metarouter\n- The `aerodrome` module carries Aerodrome's basic (stable/volatile) pools on Base; this one carries only Slipstream. Velodrome's Slipstream on Optimism and the Superchain is not in either\n- Aero publishes no address table for Arc. Each address here is Sourcify-verified from the dromos-labs/metadex-public codebase, and the position manager reports `factory() == CLFactory`\n- No voter or gauges are deployed on Arc yet, so pools there earn swap fees only\n",
12
+ "aerodrome": "# Aerodrome\n\nThe central trading and liquidity marketplace on Base. Fork of Velodrome with ve(3,3) tokenomics, the largest DEX on Base by TVL ($1B+). Supports both stable and volatile pool types.\n\n## Category\n\ndex | Chains: Base\n\n## Key Operations\n\n- **swap**: Swap tokens with route-based routing specifying stable or volatile pool type\n- **addLiquidity**: Add liquidity to a stable or volatile pool\n- **removeLiquidity**: Remove liquidity from a stable or volatile pool\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/aerodrome\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { AerodromeRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenIn: Address,\n tokenOut: Address,\n stable: bool,\n factory: Address,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256[] {\n const router = IRouter.at(routerAddress);\n return router.swapExactTokensForTokens(\n amountIn,\n amountOutMin,\n [{ from: tokenIn, to: tokenOut, stable: stable, factory: factory }],\n recipient,\n 99999999999,\n );\n}\n```\n\n- `routerAddress`: Aerodrome Router address on Base\n- `tokenIn` / `tokenOut`: Input and output token addresses\n- `stable`: `true` for stable pools (pegged assets), `false` for volatile pools (uncorrelated assets)\n- `factory`: Pool factory address (`0x420DD381b31aEf6683db6B902084cB0FFECe40Da` on Base)\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n- Supports multi-hop routes array\n\n### addLiquidity\n\n```typescript\nimport { AerodromeRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n stable: bool,\n amountADesired: Uint256,\n amountBDesired: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256; liquidity: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.addLiquidity(\n tokenA,\n tokenB,\n stable,\n amountADesired,\n amountBDesired,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- `stable`: Must match the pool type you want to provide liquidity to\n- Both tokens must be approved to the router\n\n### removeLiquidity\n\n```typescript\nimport { AerodromeRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n stable: bool,\n liquidity: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.removeLiquidity(\n tokenA,\n tokenB,\n stable,\n liquidity,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- `liquidity`: Amount of LP tokens to burn\n- LP token must be approved to the router\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| ----- | ----------- | -------------------------------------------- |\n| Base | Router | `0xcF77a3Ba9A5CA399B7c97c74d54e5b1Beb874E43` |\n| Base | PoolFactory | `0x420DD381b31aEf6683db6B902084cB0FFECe40Da` |\n\n## ABI Methods\n\n### AerodromeRouterABI\n\n- `swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, tuple[](address from, address to, bool stable, address factory) routes, address to, uint256 deadline) -> uint256[] amounts` - Swap with route tuples specifying pool type per hop\n- `addLiquidity(address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB, uint256 liquidity)` - Add liquidity to a stable or volatile pool\n- `removeLiquidity(address tokenA, address tokenB, bool stable, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB)` - Remove liquidity from a pool\n\n### AerodromePoolFactoryABI\n\n- `getPool(address tokenA, address tokenB, bool stable) -> address pool` - Look up pool address (view)\n\n## Notes\n\n- Same interface as Velodrome (forked codebase); Aerodrome is Velodrome's Base deployment\n- Two pool types: `stable=true` (Curve-like invariant for pegged assets), `stable=false` (x*y=k for uncorrelated)\n- Fees: volatile pools ~0.3%, stable pools ~0.04% (governance-controlled)\n- ve(3,3) model: AERO holders vote-lock tokens to direct gauge emissions weekly\n- The dominant DEX on Base by TVL and volume; preferred for most Base swaps\n- LP tokens can be staked in gauges for AERO emissions\n- Routes include both `stable` flag and `factory` address per hop\n- This module is the basic (stable/volatile) pools only. Aerodrome's concentrated-liquidity Slipstream pools are the `aerodrome-slipstream` module\n",
13
+ "aevo": "# Aevo\n\nHigh-performance options and perpetuals exchange built on a custom OP Stack rollup. Off-chain orderbook with on-chain settlement.\n\n## Category\n\noptions | Chains: Ethereum (deposits)\n\n## Key Operations\n\n- **depositERC20**: Deposit ERC-20 tokens into Aevo L2 for trading\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/aevo\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit ERC-20 into Aevo\nimport { DepositContractABI as IDeposit } from \"./abis\";\nfunction main(\n depositAddress: Address,\n token: Address,\n l2Token: Address,\n amount: Uint256,\n minGasLimit: Uint256,\n): Uint256 {\n const deposit = IDeposit.at(depositAddress);\n deposit.depositERC20(token, l2Token, amount, minGasLimit, \"\");\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | --------------- | -------------------------------------------- |\n| Ethereum | depositContract | `0x4082C9647c098a6493Fb499EaE63b5ce3259C574` |\n\n## ABI Methods\n\n### DepositContractABI\n\nThe deposit contract is Aevo's OP Stack `L1StandardBridge`, so these are the standard bridge entry points.\n\n- `depositERC20(address l1Token, address l2Token, uint256 amount, uint32 minGasLimit, bytes extraData)` - Deposit ERC-20 tokens to Aevo L2. `l2Token` is the token's Aevo L2 counterpart; `minGasLimit` is the L2 execution gas. Approve token to depositContract first\n- `depositETH(uint32 minGasLimit, bytes extraData)` - Deposit ETH to Aevo L2. Payable (send ETH as msg.value)\n\n## Notes\n\n- Custom OP Stack rollup with off-chain orderbook for sub-second matching\n- Supports options and perpetual futures trading\n- Deposits are on Ethereum L1, trading happens on Aevo L2\n- Withdrawals processed by the rollup bridge (takes ~7 days for L2 to L1)\n- Approve ERC-20 tokens to depositContract before calling depositERC20\n",
14
+ "alchemix": "# Alchemix\n\nSelf-repaying loan protocol. Deposit yield-bearing collateral to borrow synthetic assets (alUSD, alETH) that repay themselves over time via yield.\n\n## Category\n\ncdp | Chains: Ethereum\n\n## Key Operations\n\n- **deposit**: Deposit yield-bearing token as collateral\n- **withdraw**: Withdraw collateral\n- **mint**: Borrow synthetic asset (alUSD or alETH) against collateral\n- **burn**: Repay synthetic asset debt\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/alchemix\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit yield-bearing collateral\nimport { AlchemistABI as IAlchemist } from \"./abis\";\nfunction main(\n alchemistAddress: Address,\n yieldToken: Address,\n amount: Uint256,\n recipient: Address,\n): Uint256 {\n const alchemist = IAlchemist.at(alchemistAddress);\n return alchemist.deposit(yieldToken, amount, recipient);\n}\n\n// Withdraw collateral\nimport { AlchemistABI as IAlchemist } from \"./abis\";\nfunction main(\n alchemistAddress: Address,\n yieldToken: Address,\n shares: Uint256,\n recipient: Address,\n): Uint256 {\n const alchemist = IAlchemist.at(alchemistAddress);\n return alchemist.withdraw(yieldToken, shares, recipient);\n}\n\n// Borrow (mint) synthetic asset\nimport { AlchemistABI as IAlchemist } from \"./abis\";\nfunction main(alchemistAddress: Address, amount: Uint256, recipient: Address): Uint256 {\n const alchemist = IAlchemist.at(alchemistAddress);\n alchemist.mint(amount, recipient);\n return 1;\n}\n\n// Repay (burn) synthetic asset\nimport { AlchemistABI as IAlchemist } from \"./abis\";\nfunction main(alchemistAddress: Address, amount: Uint256, recipient: Address): Uint256 {\n const alchemist = IAlchemist.at(alchemistAddress);\n return alchemist.burn(amount, recipient);\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------------- | -------------------------------------------- |\n| Ethereum | alchemistAlUSD | `0x5C6374a2ac4EBC38DeA0Fc1F8716e5Ea1ADD94dd` |\n| Ethereum | alchemistAlETH | `0x062Bf725dC4cDF947aa79Ca2aaCCD4F385b13b5c` |\n| Ethereum | alUSD | `0xBC6DA0FE9aD5f3b0d58160288917AA56653660E9` |\n| Ethereum | alETH | `0x0100546F2cD4C9D97f798fFC9755E47865FF7Ee6` |\n\n## ABI Methods\n\n### AlchemistABI\n\n- `deposit(address,uint256,address)` - Deposit yield-bearing collateral. Params: yieldToken (e.g. yvDAI, yvUSDC), amount, recipient. Returns shares\n- `withdraw(address,uint256,address)` - Withdraw collateral. Params: yieldToken, shares (deposit shares to burn), recipient. Returns amountWithdrawn\n- `mint(uint256,address)` - Borrow synthetic asset. Params: amount (alUSD/alETH to mint), recipient. Max borrow = 50% of collateral value\n- `burn(uint256,address)` - Repay debt by burning synthetic. Params: amount (alUSD/alETH to burn), recipient (whose debt to repay). Returns uint256\n- `liquidate(address,uint256,uint256)` - Liquidate undercollateralized position. Params: yieldToken, shares, minimumAmountOut. Returns uint256\n- `accounts(address)` - Query account info. Params: owner. Returns (debt as int256, depositedTokens as address[])\n\n## Notes\n\n- Self-repaying: yield from deposited collateral automatically reduces debt over time\n- Two Alchemist contracts: alchemistAlUSD (for USD synthetics) and alchemistAlETH (for ETH synthetics)\n- Max LTV: 50% - can borrow up to half the value of deposited collateral\n- yieldToken is the yield-bearing version (e.g. yvDAI, aDAI, stETH), not the base token\n- Approve yieldToken to the appropriate Alchemist contract before depositing\n- debt is int256 because it can be negative (overpaid/surplus)\n",
15
+ "ambient": "# Ambient\n\nSingle-contract DEX (formerly CrocSwap) with ambient (full-range) and concentrated liquidity in one unified pool. Extremely gas-efficient architecture where all liquidity lives in one contract.\n\n## Category\n\ndex | Chains: Ethereum, Scroll\n\n## Key Operations\n\n- **swap**: Swap tokens via the CrocSwapDex contract with base/quote pair addressing\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/ambient\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { CrocSwapDexABI as ICrocSwapDex } from \"./abis\";\n\nfunction main(\n dexAddress: Address,\n base: Address,\n quote: Address,\n poolIdx: Uint256,\n isBuy: bool,\n inBaseQty: bool,\n qty: Uint256,\n minOut: Uint256,\n): { baseFlow: Uint256; quoteFlow: Uint256 } {\n const dex = ICrocSwapDex.at(dexAddress);\n return dex.swap(base, quote, poolIdx, isBuy, inBaseQty, qty, 0, 0, minOut, 0);\n}\n```\n\n- `dexAddress`: CrocSwapDex contract address (`0xAaAaAAAaA24eEeb8d57D431224f73832bC34f688` on Ethereum, `0xaaaaAAAACB71BF2C8CaE522EA5fa455571A74106` on Scroll)\n- `base`: Base token address (lower address of the pair by convention)\n- `quote`: Quote token address (higher address of the pair)\n- `poolIdx`: Pool index identifying the pool type (e.g., `420` for standard pools on Ethereum)\n- `isBuy`: `true` = buy base with quote (swap quote->base); `false` = sell base for quote (swap base->quote)\n- `inBaseQty`: `true` = qty is denominated in base token; `false` = qty is in quote token\n- `qty`: Amount to swap (in wei)\n- `minOut`: Minimum output for slippage protection\n- Additional params set to `0`: `tip` (optional tip), `limitPrice` (no price limit), `reserveFlags` (no reserve usage)\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ----------- | -------------------------------------------- |\n| Ethereum | CrocSwapDex | `0xAaAaAAAaA24eEeb8d57D431224f73832bC34f688` |\n| Scroll | CrocSwapDex | `0xaaaaAAAACB71BF2C8CaE522EA5fa455571A74106` |\n\n## ABI Methods\n\n### CrocSwapDexABI\n\n- `swap(address base, address quote, uint256 poolIdx, bool isBuy, bool inBaseQty, uint128 qty, uint16 tip, uint128 limitPrice, uint128 minOut, uint8 reserveFlags) -> (int128 baseFlow, int128 quoteFlow)` - Execute a swap with full parameter control. Returns signed token flows (negative = tokens out from user)\n- `userCmd(uint16 callpath, bytes cmd) -> bytes result` - Execute arbitrary protocol commands (advanced: liquidity operations, governance, etc.)\n\n## Notes\n\n- Single contract holds ALL liquidity (similar to Balancer V2 Vault and Uniswap V4 PoolManager)\n- Same contract address on both Ethereum and Scroll\n- `poolIdx` identifies the pool type: different pool indices have different fee rates and tick spacing\n- Common pool indices: `420` (standard on Ethereum), `36000` (stable pairs on Scroll)\n- `isBuy` + `inBaseQty` together determine the exact swap semantics\n- `tip`: Optional tip in basis points for priority execution (usually `0`)\n- `limitPrice`: Price limit as sqrt price Q64.64 fixed-point (set to `0` for no limit)\n- `reserveFlags`: Bitmask for using surplus collateral (set to `0` for standard swaps)\n- `userCmd` is the universal command interface for all non-swap operations (adding/removing liquidity, etc.)\n- callpath `1` = liquidity operations, `3` = warm path operations\n- Gas-efficient for simple swaps; more complex for LP operations via `userCmd`\n- Input token must be ERC20-approved to the CrocSwapDex contract\n",
16
+ "arbitrum-bridge": "# Arbitrum Native Bridge\n\nOfficial Arbitrum L1-L2 gateway bridge. Routes tokens through the canonical Arbitrum rollup bridge with 7-day withdrawal finality.\n\n## Category\n\nnative L2 bridge | Direction: L1 to L2 (Ethereum to Arbitrum) | Chains: Ethereum (1), Arbitrum (42161)\n\n## SauceScript Functions\n\n### depositToL2\n\nDeposit ERC-20 tokens from Ethereum L1 to Arbitrum L2 via the Gateway Router.\n\n```typescript\nimport { ArbitrumL1GatewayRouterABI as IL1GatewayRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n token: Address,\n recipient: Address,\n amount: Uint256,\n maxGas: Uint256,\n gasPriceBid: Uint256,\n): bytes {\n const router = IL1GatewayRouter.at(routerAddress);\n return router.outboundTransfer(token, recipient, amount, maxGas, gasPriceBid, 0x00);\n}\n```\n\n- `token`: L1 ERC-20 token address to bridge\n- `recipient`: Address to receive tokens on Arbitrum L2\n- `amount`: Amount of tokens to deposit\n- `maxGas`: Maximum L2 gas for the deposit transaction (e.g. 300000). Excess is refunded\n- `gasPriceBid`: L2 gas price bid in wei. Use Arbitrum's `ArbGasInfo.getMinimumGasPrice()` or estimate\n- `_data`: Extra data, typically `0x00` for standard deposits. Used for custom gateway params\n- Requires ERC-20 approval to the appropriate gateway (use `getGateway(token)` to find it)\n- Requires ETH as msg.value to cover L2 execution costs (`maxGas * gasPriceBid + maxSubmissionCost`)\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | --------------- | -------------------------------------------- |\n| Ethereum | l1GatewayRouter | `0x72Ce9c846789fdB6fC1f34aC4AD25Dd9ef7031ef` |\n| Arbitrum | l2GatewayRouter | `0x5288c571Fd7aD117beA99bF60FE0846C4E84F933` |\n\n## ABI Reference\n\n### ArbitrumL1GatewayRouterABI\n\n- `outboundTransfer(address _token, address _to, uint256 _amount, uint256 _maxGas, uint256 _gasPriceBid, bytes _data) returns (bytes)` [payable] - Deposit tokens from L1 to L2. Routes to the correct gateway automatically based on the token\n- `getGateway(address _token) returns (address)` - Look up the gateway contract for a specific token (view). Approve tokens to this address, not the router\n\n## Notes\n\n- **L1 to L2 only** via this contract. For L2 to L1 withdrawals, use `ArbSys.sendTxToL1()` on Arbitrum (takes 7 days)\n- The router auto-routes tokens to the correct gateway (standard, custom, or WETH gateway)\n- **Approval target**: approve tokens to the gateway returned by `getGateway(token)`, NOT to the router itself\n- `msg.value` must cover: `maxSubmissionCost + (maxGas * gasPriceBid)` for L2 execution\n- L1 to L2 deposits finalize in ~10-15 minutes (after L1 finality + sequencer inclusion)\n- L2 to L1 withdrawals require 7-day challenge period before funds can be claimed on L1\n- For ETH deposits, send ETH directly to the Arbitrum Delayed Inbox (no token approval needed)\n- Canonical bridge -- no third-party risk, secured by the Arbitrum rollup itself\n- Audited\n",
17
+ "arrakis": "# Arrakis Finance\n\nAutomated liquidity management protocol for Uniswap V3. Provides vaults that actively manage concentrated liquidity positions with rebalancing.\n\n## Category\n\nyield | Chains: Ethereum\n\n## Key Operations\n\n- **addLiquidity**: Add liquidity to an Arrakis vault via router (tuple params)\n- **removeLiquidity**: Remove liquidity from vault via router (tuple params)\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/arrakis\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Add liquidity - NOTE: uses tuple params via router\nimport { ArrakisRouterABI as IArrakisRouter } from \"./abis\";\nfunction main(\n routerAddress: Address,\n vault: Address,\n receiver: Address,\n amount0Max: Uint256,\n amount1Max: Uint256,\n): Uint256 {\n const router = IArrakisRouter.at(routerAddress);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | factory | `0xEA1aFf9dbFfD1580F6b81A3ad3589E66652dB7D9` |\n| Ethereum | router | `0x6aC8Bab8B775a03b8B72B2940251432442f61B94` |\n\n## ABI Methods\n\n### ArrakisRouterABI\n\n- `addLiquidity(tuple)` [payable] - Add liquidity. Tuple: (amount0Max, amount1Max, amount0Min, amount1Min, amountSharesMin, vault, receiver, gauge). Returns (amount0, amount1, sharesReceived)\n- `removeLiquidity(tuple)` - Remove liquidity. Tuple: (burnAmount, amount0Min, amount1Min, vault, receiver, gauge, receiveETH). Returns (amount0, amount1)\n\n### ArrakisVaultABI\n\n- `totalSupply()` - Total vault shares outstanding\n- `balanceOf(address)` - Query vault share balance\n- `token0()` - First token address\n- `token1()` - Second token address\n\n## Notes\n\n- TVL: $50M+. Manages UniV3 concentrated liquidity positions automatically\n- Both addLiquidity and removeLiquidity take struct/tuple params via the router\n- Approve both token0 and token1 to the router before adding liquidity\n- Vault shares represent proportional ownership of the managed position\n- gauge param can be zero address if not staking in a gauge\n- The vault itself does not report its underlying amounts; ArrakisV2Helper's `totalUnderlying(vault)` does\n",
18
+ "axelar": "# Axelar\n\nUniversal cross-chain communication protocol with decentralized validator set. Supports GMP (General Message Passing) and ITS (Interchain Token Service).\n\n## Category\n\ncross-chain messaging + bridge | Direction: any-to-any | Chains: Ethereum (1), Arbitrum (42161), Optimism (10), Base (8453), Polygon (137), Avalanche (43114)\n\n## SauceScript Functions\n\n### sendToken\n\nSend tokens cross-chain via the Axelar Gateway.\n\n```typescript\nimport { AxelarGatewayABI as IGateway } from \"./abis\";\n\nfunction main(\n gatewayAddress: Address,\n destinationChain: string,\n destinationAddress: string,\n symbol: string,\n amount: Uint256,\n): Uint256 {\n const gateway = IGateway.at(gatewayAddress);\n gateway.sendToken(destinationChain, destinationAddress, symbol, amount);\n return 1;\n}\n```\n\n- `destinationChain`: Chain name as string (e.g. \"ethereum\", \"arbitrum\", \"base\")\n- `destinationAddress`: Recipient address as string\n- `symbol`: Token symbol as string (e.g. \"axlUSDC\", \"WETH\")\n- Requires ERC-20 approval to the Gateway\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| --------- | ---------- | -------------------------------------------- |\n| Ethereum | gateway | `0x4F4495243837681061C4743b74B3eEdf548D56A5` |\n| Ethereum | gasService | `0x2d5d7d31F671F86C782533cc367F14109a082712` |\n| Ethereum | its | `0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C` |\n| Arbitrum | gateway | `0xe432150cce91c13a887f7D836923d5597adD8E31` |\n| Arbitrum | its | `0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C` |\n| Optimism | gateway | `0xe432150cce91c13a887f7D836923d5597adD8E31` |\n| Optimism | its | `0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C` |\n| Base | gateway | `0xe432150cce91c13a887f7D836923d5597adD8E31` |\n| Base | its | `0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C` |\n| Polygon | gateway | `0x6f015F16De9fC8791b234eF68D486d2bF203FBA8` |\n| Polygon | its | `0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C` |\n| Avalanche | gateway | `0x5029C0EFf6C34351a0CEc334542cDb22c7928f78` |\n| Avalanche | its | `0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C` |\n\n## ABI Reference\n\n### AxelarGatewayABI\n\n- `callContract(string destinationChain, string contractAddress, bytes payload)` - Send arbitrary message to destination contract (GMP)\n- `callContractWithToken(string destinationChain, string contractAddress, bytes payload, string symbol, uint256 amount)` - Send message + tokens together\n- `sendToken(string destinationChain, string destinationAddress, string symbol, uint256 amount)` - Send tokens to destination address\n- `tokenAddresses(string symbol) returns (address)` - Look up token address by symbol (view)\n\n### AxelarGasServiceABI\n\n- `payNativeGasForContractCall(address sender, string destinationChain, string destinationAddress, bytes payload, address refundAddress)` [payable] - Pre-pay gas for GMP execution on destination chain\n\n### AxelarITSABI\n\n- `interchainTransfer(bytes32 tokenId, string destinationChain, bytes destinationAddress, uint256 amount, bytes metadata, uint256 gasValue)` [payable] - Transfer ITS-registered tokens cross-chain\n\n## Notes\n\n- Uses chain name strings for destination (e.g. \"ethereum\", \"arbitrum\", \"Polygon\") -- NOT chain IDs\n- `sendToken`: Simple token transfer. `callContract`: GMP message. `callContractWithToken`: Both\n- GMP calls require pre-paying gas via GasService or including gasValue in ITS calls\n- ITS (Interchain Token Service) enables native cross-chain tokens without wrapping\n- Same ITS address (`0xB5FB...`) across all chains\n- `tokenAddresses(symbol)` to look up the local address of an Axelar-supported token\n- Finality: typically 2-5 minutes depending on source chain\n- TVL: $800M+. Audited\n",
19
+ "balancer-v2": "# Balancer V2\n\nGeneralized AMM with weighted pools, single Vault architecture, and flash loans. Supports custom pool types (weighted, stable, linear, composable stable) and multi-token pools with up to 8 tokens per pool.\n\n## Category\n\ndex | Chains: Ethereum, Polygon, Arbitrum, Optimism, Gnosis, Avalanche, Base, BSC\n\n## Key Operations\n\n- **swap**: Execute a single swap through the Vault specifying pool ID and assets\n- **addLiquidity**: Join a pool by depositing tokens via the Vault\n- **removeLiquidity**: Exit a pool by withdrawing tokens via the Vault\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/balancer-v2\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { BalancerV2VaultABI as IVault } from \"./abis\";\n\nfunction main(\n vaultAddress: Address,\n poolId: Uint256,\n assetIn: Address,\n assetOut: Address,\n amount: Uint256,\n limit: Uint256,\n sender: Address,\n recipient: Address,\n): Uint256 {\n const vault = IVault.at(vaultAddress);\n return vault.swap(\n {\n poolId: poolId,\n kind: 0,\n assetIn: assetIn,\n assetOut: assetOut,\n amount: amount,\n userData: 0x00,\n },\n { sender: sender, fromInternalBalance: false, recipient: recipient, toInternalBalance: false },\n limit,\n 99999999999,\n );\n}\n```\n\n- `vaultAddress`: The Balancer V2 Vault (same address on ALL chains: `0xBA12222222228d8Ba445958a75a0704d566BF2C8`)\n- `poolId`: bytes32 identifier for the specific pool (encodes pool address + pool type + nonce)\n- `assetIn` / `assetOut`: Token addresses to swap between\n- `amount`: Input amount when `kind=0` (GIVEN_IN) or output amount when `kind=1` (GIVEN_OUT)\n- `limit`: Maximum input (GIVEN_OUT) or minimum output (GIVEN_IN) for slippage protection\n- `sender`: Address providing the input tokens (must have approved the Vault)\n- `recipient`: Address receiving the output tokens\n- `userData`: Extra data for the pool (usually `0x00` for swaps)\n- `fromInternalBalance` / `toInternalBalance`: Use Vault internal balances (set false for standard swaps)\n\n### addLiquidity\n\n```typescript\nimport { BalancerV2VaultABI as IVault } from \"./abis\";\n\nfunction main(\n vaultAddress: Address,\n poolId: Uint256,\n sender: Address,\n recipient: Address,\n userData: bytes,\n): Uint256 {\n const vault = IVault.at(vaultAddress);\n vault.joinPool(poolId, sender, recipient, {\n assets: [],\n maxAmountsIn: [],\n userData: userData,\n fromInternalBalance: false,\n });\n return 1;\n}\n```\n\n- `userData`: ABI-encoded join type and amounts. Join types vary by pool kind (e.g., EXACT_TOKENS_IN_FOR_BPT_OUT, TOKEN_IN_FOR_EXACT_BPT_OUT)\n- `assets`: Array of token addresses in the pool (must match pool composition order)\n- `maxAmountsIn`: Maximum amounts to deposit per token (slippage protection)\n\n### removeLiquidity\n\n```typescript\nimport { BalancerV2VaultABI as IVault } from \"./abis\";\n\nfunction main(\n vaultAddress: Address,\n poolId: Uint256,\n sender: Address,\n recipient: Address,\n userData: bytes,\n): Uint256 {\n const vault = IVault.at(vaultAddress);\n vault.exitPool(poolId, sender, recipient, {\n assets: [],\n minAmountsOut: [],\n userData: userData,\n toInternalBalance: false,\n });\n return 1;\n}\n```\n\n- `userData`: ABI-encoded exit type and amounts. Exit types: EXACT_BPT_IN_FOR_ONE_TOKEN_OUT, EXACT_BPT_IN_FOR_TOKENS_OUT, BPT_IN_FOR_EXACT_TOKENS_OUT\n- `minAmountsOut`: Minimum amounts to receive per token (slippage protection)\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| --------- | -------- | -------------------------------------------- |\n| Ethereum | Vault | `0xBA12222222228d8Ba445958a75a0704d566BF2C8` |\n| Polygon | Vault | `0xBA12222222228d8Ba445958a75a0704d566BF2C8` |\n| Arbitrum | Vault | `0xBA12222222228d8Ba445958a75a0704d566BF2C8` |\n| Optimism | Vault | `0xBA12222222228d8Ba445958a75a0704d566BF2C8` |\n| Gnosis | Vault | `0xBA12222222228d8Ba445958a75a0704d566BF2C8` |\n| Avalanche | Vault | `0xBA12222222228d8Ba445958a75a0704d566BF2C8` |\n| Base | Vault | `0xBA12222222228d8Ba445958a75a0704d566BF2C8` |\n| BSC | Vault | `0xBA12222222228d8Ba445958a75a0704d566BF2C8` |\n\n## ABI Methods\n\n### BalancerV2VaultABI\n\n- `swap(tuple(bytes32 poolId, uint8 kind, address assetIn, address assetOut, uint256 amount, bytes userData), tuple(address sender, bool fromInternalBalance, address recipient, bool toInternalBalance), uint256 limit, uint256 deadline) -> uint256 amountCalculated` - Execute a single swap. `kind`: 0=GIVEN_IN, 1=GIVEN_OUT\n- `batchSwap(uint8 kind, tuple[](bytes32 poolId, uint256 assetInIndex, uint256 assetOutIndex, uint256 amount, bytes userData), address[] assets, tuple(address sender, bool fromInternalBalance, address recipient, bool toInternalBalance), int256[] limits, uint256 deadline) -> int256[] assetDeltas` - Execute multi-hop swap through multiple pools in one transaction\n- `joinPool(bytes32 poolId, address sender, address recipient, tuple(address[] assets, uint256[] maxAmountsIn, bytes userData, bool fromInternalBalance))` - Deposit tokens into a pool\n- `exitPool(bytes32 poolId, address sender, address recipient, tuple(address[] assets, uint256[] minAmountsOut, bytes userData, bool toInternalBalance))` - Withdraw tokens from a pool\n- `flashLoan(address recipient, address[] tokens, uint256[] amounts, bytes userData)` - Flash loan from the Vault (zero fee for Balancer pools)\n- `getPoolTokens(bytes32 poolId) -> (address[] tokens, uint256[] balances, uint256 lastChangeBlock)` - Query pool token composition and balances (view)\n\n## Notes\n\n- Single Vault contract holds ALL pool liquidity (same address `0xBA12...` on every chain)\n- Pools are identified by `bytes32 poolId`, NOT by contract address\n- The Vault model means tokens only need to be approved to ONE contract for all Balancer pools\n- Weighted pools: custom token weights (e.g., 80/20 ETH/USDC); Stable pools: pegged assets; Linear pools: wrapping yield-bearing tokens\n- `batchSwap` is gas-efficient for multi-hop trades since tokens only move between Vault internal accounts\n- Flash loans from Balancer Vault are zero-fee when the swap route stays within Balancer pools\n- Internal balances: users can keep tokens in the Vault to save gas on repeated trades\n- `userData` encoding varies by pool type - check Balancer docs for the specific pool's join/exit types\n- Use Balancer for multi-token pools (3+ tokens), weighted index exposure, or flash loans\n",
20
+ "base-bridge": "# Base Native Bridge\n\nOfficial Base L1StandardBridge for depositing ETH and ERC-20 tokens from Ethereum to Base. OP Stack architecture with 7-day withdrawal finality.\n\n## Category\n\nnative L2 bridge | Direction: L1 to L2 (Ethereum to Base) | Chains: Ethereum (1), Base (8453)\n\n## SauceScript Functions\n\n### depositETH\n\nDeposit ETH from Ethereum L1 to Base L2.\n\n```typescript\nimport { BaseL1StandardBridgeABI as IL1StandardBridge } from \"./abis\";\n\nfunction main(bridgeAddress: Address): Uint256 {\n const bridge = IL1StandardBridge.at(bridgeAddress);\n bridge.depositETH(200000, 0x00);\n return 1;\n}\n```\n\n- ETH amount is sent as `msg.value`\n- `_minGasLimit`: Minimum gas for the L2 deposit execution (200000 is a safe default)\n- `_extraData`: Optional extra data (typically `0x00`)\n\n### depositERC20\n\nDeposit ERC-20 tokens from Ethereum L1 to Base L2.\n\n```typescript\nimport { BaseL1StandardBridgeABI as IL1StandardBridge } from \"./abis\";\n\nfunction main(\n bridgeAddress: Address,\n l1Token: Address,\n l2Token: Address,\n amount: Uint256,\n): Uint256 {\n const bridge = IL1StandardBridge.at(bridgeAddress);\n bridge.depositERC20(l1Token, l2Token, amount, 200000, 0x00);\n return 1;\n}\n```\n\n- `l1Token`: Token address on Ethereum L1\n- `l2Token`: Corresponding token address on Base L2 (must be the official bridged representation)\n- `amount`: Amount of tokens to deposit\n- `_minGasLimit`: Minimum gas for L2 execution (200000 is a safe default)\n- `_extraData`: Optional extra data (typically `0x00`)\n- Requires ERC-20 approval to the L1StandardBridge\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | ---------------- | -------------------------------------------- |\n| Ethereum | l1StandardBridge | `0x3154Cf16ccdb4C6d922629664174b904d80F2C35` |\n| Base | l2StandardBridge | `0x4200000000000000000000000000000000000010` |\n\n## ABI Reference\n\n### BaseL1StandardBridgeABI\n\n- `depositETH(uint32 _minGasLimit, bytes _extraData)` [payable] - Deposit ETH to your own address on Base. Amount = msg.value\n- `depositERC20(address _l1Token, address _l2Token, uint256 _amount, uint32 _minGasLimit, bytes _extraData)` - Deposit ERC-20 tokens to your own address on Base\n- `depositETHTo(address _to, uint32 _minGasLimit, bytes _extraData)` [payable] - Deposit ETH to a specific recipient on Base\n- `depositERC20To(address _l1Token, address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData)` - Deposit ERC-20 tokens to a specific recipient on Base\n\n## Notes\n\n- **L1 to L2 only** via this contract. For L2 to L1 withdrawals, use the L2StandardBridge on Base (takes 7 days)\n- OP Stack architecture -- same bridge pattern as Optimism, Mode, Zora\n- `depositETH` / `depositERC20` send to `msg.sender` on L2. Use `depositETHTo` / `depositERC20To` to specify a different recipient\n- L1 to L2 deposits finalize in ~2-5 minutes (after L1 inclusion + sequencer processing)\n- L2 to L1 withdrawals require 7-day challenge period (optimistic rollup security)\n- `_l2Token` must be the official bridged token representation on Base -- incorrect L2 token address will cause deposit to fail\n- Canonical bridge -- no third-party risk, secured by the Base (OP Stack) rollup itself\n- L2StandardBridge is at a predefined address: `0x4200000000000000000000000000000000000010`\n- Audited\n",
21
+ "baseswap": "# BaseSwap\n\nBase-native DEX with UniV2-style constant product pools (x*y=k). Features yield farming, launchpad, and NFT marketplace. A simple and straightforward fork of Uniswap V2 on Base.\n\n## Category\n\ndex | Chains: Base\n\n## Key Operations\n\n- **swap**: Swap exact input tokens through a routing path\n- **addLiquidity**: Deposit two tokens to mint LP tokens\n- **removeLiquidity**: Burn LP tokens to withdraw underlying tokens\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/baseswap\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { BaseSwapRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n path: Address[],\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256[] {\n const router = IRouter.at(routerAddress);\n return router.swapExactTokensForTokens(amountIn, amountOutMin, path, recipient, 99999999999);\n}\n```\n\n- `routerAddress`: BaseSwap V2 Router on Base (`0x327Df1E6de05895d2ab08513aaDD9313Fe505d86`)\n- `path`: Ordered token address array for the swap route\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n\n### addLiquidity\n\n```typescript\nimport { BaseSwapRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n amountADesired: Uint256,\n amountBDesired: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256; liquidity: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.addLiquidity(\n tokenA,\n tokenB,\n amountADesired,\n amountBDesired,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- Both tokens must be approved to the router\n\n### removeLiquidity\n\n```typescript\nimport { BaseSwapRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n liquidity: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.removeLiquidity(\n tokenA,\n tokenB,\n liquidity,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- LP token must be approved to the router\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| ----- | --------- | -------------------------------------------- |\n| Base | V2 Router | `0x327Df1E6de05895d2ab08513aaDD9313Fe505d86` |\n\n## ABI Methods\n\n### BaseSwapRouterABI\n\n- `swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) -> uint256[] amounts` - Swap exact input along path\n- `addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB, uint256 liquidity)` - Add liquidity and mint LP tokens\n- `removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB)` - Burn LP tokens for underlying\n\n## Notes\n\n- Standard Uniswap V2 fork interface; 0.3% fee per swap\n- Base-only deployment\n- For most Base swaps, Aerodrome has higher liquidity; use BaseSwap for pairs where Aerodrome has less depth or when BSWAP farming rewards are active\n- Both tokens must be ERC20-approved to the Router before swap/addLiquidity\n",
22
+ "beefy": "# Beefy Finance\n\nMulti-chain yield optimizer. Auto-compounds rewards from LP tokens and other yield sources across many chains.\n\n## Category\n\nyield | Chains: Ethereum, BSC, Polygon, Arbitrum, Optimism, Base, Avalanche\n\n## Key Operations\n\n- **deposit**: Deposit want tokens into Beefy vault\n- **depositAll**: Deposit entire balance of want token\n- **withdraw**: Withdraw by specifying share amount\n- **withdrawAll**: Withdraw entire position\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/beefy\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit into Beefy vault\nimport { BeefyVaultABI as IBeefyVault } from \"./abis\";\nfunction main(vaultAddress: Address, amount: Uint256): Uint256 {\n const vault = IBeefyVault.at(vaultAddress);\n vault.deposit(amount);\n return 1;\n}\n\n// Deposit entire balance\nimport { BeefyVaultABI as IBeefyVault } from \"./abis\";\nfunction main(vaultAddress: Address): Uint256 {\n const vault = IBeefyVault.at(vaultAddress);\n vault.depositAll();\n return 1;\n}\n\n// Withdraw shares\nimport { BeefyVaultABI as IBeefyVault } from \"./abis\";\nfunction main(vaultAddress: Address, shares: Uint256): Uint256 {\n const vault = IBeefyVault.at(vaultAddress);\n vault.withdraw(shares);\n return 1;\n}\n\n// Withdraw all\nimport { BeefyVaultABI as IBeefyVault } from \"./abis\";\nfunction main(vaultAddress: Address): Uint256 {\n const vault = IBeefyVault.at(vaultAddress);\n vault.withdrawAll();\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| --------- | -------- | -------------------------------------------- |\n| Ethereum | BIFI | `0xB1F1ee126e9c96231Cc3d3fAD7C08b4cf873b1f1` |\n| BSC | BIFI | `0xCa3F508B8e4Dd382eE878A314789373D80A5190A` |\n| Polygon | BIFI | `0xFbdd194376de19a88F4A68671C339563c427310d` |\n| Arbitrum | BIFI | `0x99C409E5f62E4bd2AC142f17caFb6810B8F0BAAE` |\n| Optimism | BIFI | `0x4E720DD3Ac5CFe1e1fbDE4935f386Bb1C66F4642` |\n| Base | BIFI | `0xc55E93C62874D8100dBd2DfE307EDc1036ad5434` |\n| Avalanche | BIFI | `0xd6070ae98b8069de6B494332d1A1a81B6179D960` |\n\n## ABI Methods\n\n### BeefyVaultABI\n\n- `deposit(uint256)` - Deposit want tokens, receive mooTokens (vault shares)\n- `depositAll()` - Deposit entire want token balance\n- `withdraw(uint256)` - Withdraw by burning shares\n- `withdrawAll()` - Withdraw entire position\n- `getPricePerFullShare()` - Current share price (18 decimals)\n- `balance()` - Total want tokens in vault\n- `balanceOf(address)` - Query mooToken (share) balance\n- `want()` - Address of the underlying want token\n\n## Notes\n\n- TVL: $300M+. Each vault has a unique address per strategy\n- Approve want token to vault before depositing\n- Use want() to discover which token a vault accepts\n- getPricePerFullShare() returns the exchange rate between shares and want tokens\n- Auto-compounds rewards - no manual claiming needed\n",
23
+ "benqi": "# Benqi\n\nLeading lending and borrowing protocol on Avalanche. Compound V2 fork with additional liquid staking (sAVAX) functionality.\n\n## Category\n\nlending | Chains: Avalanche (43114)\n\n## SauceScript Functions\n\n### supply\n\nSupply assets by minting qiTokens. Exchange rate grows as interest accrues.\n\n```typescript\nimport { QiTokenABI as IQiToken } from \"./abis\";\n\nfunction main(qiTokenAddress: Address, amount: Uint256): Uint256 {\n const qiToken = IQiToken.at(qiTokenAddress);\n return qiToken.mint(amount);\n}\n```\n\n- `qiTokenAddress`: The qiToken market contract (each asset has its own qiToken)\n- Returns 0 on success, error code on failure\n- Requires ERC-20 approval of underlying to the qiToken\n\n### withdraw\n\nWithdraw underlying assets by specifying the exact amount.\n\n```typescript\nimport { QiTokenABI as IQiToken } from \"./abis\";\n\nfunction main(qiTokenAddress: Address, amount: Uint256): Uint256 {\n const qiToken = IQiToken.at(qiTokenAddress);\n return qiToken.redeemUnderlying(amount);\n}\n```\n\n### borrow\n\nBorrow assets against qiToken collateral. Must call enterMarkets first.\n\n```typescript\nimport { QiTokenABI as IQiToken } from \"./abis\";\n\nfunction main(qiTokenAddress: Address, amount: Uint256): Uint256 {\n const qiToken = IQiToken.at(qiTokenAddress);\n return qiToken.borrow(amount);\n}\n```\n\n- Must enable collateral via `BenqiComptroller.enterMarkets([qiTokenAddress])` first\n\n### repay\n\nRepay borrowed assets.\n\n```typescript\nimport { QiTokenABI as IQiToken } from \"./abis\";\n\nfunction main(qiTokenAddress: Address, amount: Uint256): Uint256 {\n const qiToken = IQiToken.at(qiTokenAddress);\n return qiToken.repayBorrow(amount);\n}\n```\n\n- Requires ERC-20 approval of underlying to the qiToken\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| --------- | ----------- | -------------------------------------------- |\n| Avalanche | comptroller | `0x486Af39519B4Dc9a7fCcd318217352830E8AD9b4` |\n\n## ABI Reference\n\n### QiTokenABI\n\n- `mint(uint256 mintAmount) returns (uint256)` - Supply underlying, receive qiTokens\n- `redeem(uint256 redeemTokens) returns (uint256)` - Redeem qiTokens for underlying\n- `redeemUnderlying(uint256 redeemAmount) returns (uint256)` - Redeem exact underlying amount\n- `borrow(uint256 borrowAmount) returns (uint256)` - Borrow underlying\n- `repayBorrow(uint256 repayAmount) returns (uint256)` - Repay borrow debt\n\n### BenqiComptrollerABI\n\n- `enterMarkets(address[] qiTokens) returns (uint256[])` - Enable qiTokens as collateral\n- `exitMarket(address qiToken) returns (uint256)` - Remove qiToken from collateral\n\n## Notes\n\n- Same interface as Compound V2 (forked codebase)\n- Must call `enterMarkets` on Comptroller before borrowing against any market\n- Also offers sAVAX liquid staking product (separate contract)\n- Return values: 0 = success, non-zero = error code\n- Avalanche-only deployment. TVL: $500M+. Audited\n",
24
+ "camelot": "# Camelot\n\nNative Arbitrum DEX with dual AMM: V2 constant product pools (with native fee-on-transfer token support) and V3 concentrated liquidity pools (Algebra-based with dynamic fees, no fixed fee tiers).\n\n## Category\n\ndex | Chains: Arbitrum\n\n## Key Operations\n\n- **swapV2**: Swap via V2 router with fee-on-transfer token support and referral tracking\n- **swapV3**: Swap via V3 concentrated liquidity router (Algebra-based, dynamic fees)\n- **addLiquidity**: Add liquidity to V2 pools\n- **removeLiquidity**: Remove liquidity from V2 pools\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/camelot\";\n```\n\n## SauceScript Examples\n\n### swapV2\n\n```typescript\nimport { CamelotV2RouterABI as ICamelotRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n path: Address[],\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n referrer: Address,\n): Uint256 {\n const router = ICamelotRouter.at(routerAddress);\n router.swapExactTokensForTokensSupportingFeeOnTransferTokens(\n amountIn,\n amountOutMin,\n path,\n recipient,\n referrer,\n 99999999999,\n );\n return 1;\n}\n```\n\n- `routerAddress`: Camelot V2 Router on Arbitrum\n- `path`: Ordered token address array for the swap route\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n- `referrer`: Address of the referrer for fee sharing (use zero address if none)\n- This method supports fee-on-transfer (rebasing) tokens natively\n\n### swapV3\n\n```typescript\nimport { CamelotV3SwapRouterABI as ICamelotV3Router } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenIn: Address,\n tokenOut: Address,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256 {\n const router = ICamelotV3Router.at(routerAddress);\n return router.exactInputSingle({\n tokenIn: tokenIn,\n tokenOut: tokenOut,\n recipient: recipient,\n deadline: 99999999999,\n amountIn: amountIn,\n amountOutMinimum: amountOutMin,\n limitSqrtPrice: 0,\n });\n}\n```\n\n- `routerAddress`: Camelot V3 SwapRouter on Arbitrum\n- No `fee` parameter needed: Camelot V3 uses dynamic fees (Algebra-based), not fixed fee tiers\n- `limitSqrtPrice`: Set to `0` for no price limit\n\n### addLiquidity\n\n```typescript\nimport { CamelotV2RouterABI as ICamelotRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n amountADesired: Uint256,\n amountBDesired: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256; liquidity: Uint256 } {\n const router = ICamelotRouter.at(routerAddress);\n return router.addLiquidity(\n tokenA,\n tokenB,\n amountADesired,\n amountBDesired,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- Both tokens must be approved to the V2 router\n\n### removeLiquidity\n\n```typescript\nimport { CamelotV2RouterABI as ICamelotRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n liquidity: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256 } {\n const router = ICamelotRouter.at(routerAddress);\n return router.removeLiquidity(\n tokenA,\n tokenB,\n liquidity,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- LP token must be approved to the V2 router\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------- | -------------------------------------------- |\n| Arbitrum | V2 Factory | `0x6EcCab422D763aC031210895C81787E87B43A652` |\n| Arbitrum | V2 Router | `0xc873fEcbd354f5A56E00E710B90EF4201db2448d` |\n| Arbitrum | V3 Factory | `0x1a3c9B1d2F0529D97f2afC5136Cc23e58f1FD35B` |\n| Arbitrum | V3 SwapRouter | `0x1F721E2E82F6676FCE4eA07A5958cF098D339e18` |\n\n## ABI Methods\n\n### CamelotV2RouterABI\n\n- `swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, address referrer, uint256 deadline)` - V2 swap with fee-on-transfer token support and referral. Note: no return value\n- `addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB, uint256 liquidity)` - Add V2 LP\n- `removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB)` - Remove V2 LP\n\n### CamelotV3SwapRouterABI\n\n- `exactInputSingle(tuple(address tokenIn, address tokenOut, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 limitSqrtPrice)) -> uint256 amountOut` - V3 concentrated liquidity swap with dynamic fees\n\n## Notes\n\n- V2 router uses `swapExactTokensForTokensSupportingFeeOnTransferTokens` (not standard `swapExactTokensForTokens`) which natively handles rebasing/tax tokens\n- V2 router includes a `referrer` parameter for referral fee sharing (unique to Camelot)\n- V3 uses Algebra protocol (dynamic fees that adjust based on volatility, NOT fixed fee tiers like Uniswap V3)\n- V3 uses `limitSqrtPrice` instead of `sqrtPriceLimitX96`\n- Arbitrum-only deployment; the native DEX for Arbitrum ecosystem projects\n",
25
+ "cbeth": "# Coinbase Wrapped Staked ETH\n\nCoinbase's liquid staking token for Ethereum. cbETH represents staked ETH plus accrued staking rewards. Non-rebasing.\n\n## Category\n\nliquid-staking | Chains: Ethereum, Base\n\n## Key Operations\n\n- **transfer**: Transfer cbETH tokens\n- **approve**: Approve spender for cbETH\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/cbeth\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Transfer cbETH\nimport { transfer } from \"@sauce/token\";\nfunction main(cbethAddress: Address, to: Address, amount: Uint256): Uint256 {\n transfer(cbethAddress, to, amount);\n return 1;\n}\n\n// Approve cbETH\nimport { approve } from \"@sauce/token\";\nfunction main(cbethAddress: Address, spender: Address, amount: Uint256): Uint256 {\n approve(cbethAddress, spender, amount);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | cbETH | `0xBe9895146f7AF43049ca1c1AE358B0541Ea49704` |\n| Base | cbETH | `0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22` |\n\n## ABI Methods\n\n### CbETHABI\n\n- `mint(address to, uint256 amount) returns (bool)` - Mint cbETH (restricted to Coinbase's minters)\n- `exchangeRate()` - Current cbETH/ETH exchange rate (Ethereum only; Base cbETH is a bridged token without it)\n- `balanceOf(address)` - Query cbETH balance\n- `approve(address,uint256)` - Approve spender\n- `transfer(address,uint256)` - Transfer cbETH\n\n## Notes\n\n- TVL: $2.5B+. Non-rebasing - exchange rate increases over time\n- Minted by Coinbase (mint is permissioned). On-chain operations are transfer/approve\n- Compatible with EigenLayer restaking (cbETH strategy available)\n- Available natively on Base L2\n",
26
+ "celer": "# Celer Network\n\nMulti-chain bridging protocol using SGN (State Guardian Network) for cross-chain message validation and token transfers.\n\n## Category\n\nbridge | Direction: any-to-any (L1-to-L2, L2-to-L2, L2-to-L1) | Chains: Ethereum (1), Arbitrum (42161), Optimism (10), Polygon (137), BSC (56), Avalanche (43114)\n\n## SauceScript Functions\n\n### bridge\n\nSend ERC-20 tokens cross-chain via cBridge.\n\n```typescript\nimport { CelerBridgeABI as IBridge } from \"./abis\";\n\nfunction main(\n bridgeAddress: Address,\n receiver: Address,\n token: Address,\n amount: Uint256,\n dstChainId: Uint256,\n maxSlippage: Uint256,\n): Uint256 {\n const bridge = IBridge.at(bridgeAddress);\n bridge.send(receiver, token, amount, dstChainId, 0, maxSlippage);\n return 1;\n}\n```\n\n- `receiver`: Address to receive tokens on destination chain\n- `token`: ERC-20 token to bridge\n- `dstChainId`: Destination EVM chain ID (as uint64)\n- `nonce`: Set to 0 (auto-generated)\n- `maxSlippage`: Maximum slippage in basis points (e.g. 500 = 5%). Applied during pool-based bridging\n- Requires ERC-20 approval to the Bridge\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| --------- | -------- | -------------------------------------------- |\n| Ethereum | bridge | `0x5427FEFA711Eff984124bFBB1AB6fbf5E3DA1820` |\n| Arbitrum | bridge | `0x1619DE6B6B20eD217a58d00f37B9d47C7663feca` |\n| Optimism | bridge | `0x9D39Fc627A6d9d9F8C831c16995b209548cc3401` |\n| Polygon | bridge | `0x88DCDC47D2f83a99CF0000FDF667A468bB958a78` |\n| BSC | bridge | `0xdd90E5E87A2081Dcf0391920868eBc2FFB81a1aF` |\n| Avalanche | bridge | `0xef3c714c9425a8F3697A9C969Dc1af30ba82e5d4` |\n\n## ABI Reference\n\n### CelerBridgeABI\n\n- `send(address _receiver, address _token, uint256 _amount, uint64 _dstChainId, uint64 _nonce, uint32 _maxSlippage)` - Send ERC-20 tokens cross-chain via liquidity pool\n- `sendNative(address _receiver, uint256 _amount, uint64 _dstChainId, uint64 _nonce, uint32 _maxSlippage)` [payable] - Send native token (ETH/BNB/etc.) cross-chain\n\n## Notes\n\n- `send` for ERC-20 tokens, `sendNative` for native tokens (ETH, BNB, AVAX, etc.)\n- `nonce` is used for unique transfer identification -- can set to 0 or use block.timestamp\n- `maxSlippage` is in basis points (1 = 0.01%, 100 = 1%, 5000 = 50%)\n- Uses SGN validators to verify cross-chain messages\n- Finality: typically 5-20 minutes depending on chain confirmation requirements\n- Requires ERC-20 approval to the Bridge address\n- TVL: $150M+. Audited\n",
27
+ "chainlink-ccip": "# Chainlink CCIP\n\nCross-Chain Interoperability Protocol by Chainlink. Enterprise-grade cross-chain messaging with DON (Decentralized Oracle Network) security and token transfers.\n\n## Category\n\ncross-chain messaging + token transfer | Direction: any-to-any | Chains: Ethereum (1), Arbitrum (42161), Optimism (10), Base (8453), Polygon (137), Arc (5042)\n\n## SauceScript Functions\n\n### sendMessage\n\nSend a cross-chain message via CCIP Router.\n\n```typescript\nimport { CCIPRouterABI as ICCIPRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n destinationChainSelector: Uint256,\n receiver: bytes,\n data: bytes,\n): Uint256 {\n const router = ICCIPRouter.at(routerAddress);\n return router.ccipSend(destinationChainSelector, {\n receiver: receiver,\n data: data,\n tokenAmounts: [],\n feeToken: 0x0000000000000000000000000000000000000000,\n extraArgs: 0x00,\n });\n}\n```\n\n- `destinationChainSelector`: CCIP chain selector (NOT EVM chain ID). These are unique uint64 identifiers per chain\n- `receiver`: ABI-encoded destination address (bytes, not raw address)\n- `data`: Arbitrary message payload (bytes)\n- `tokenAmounts`: Array of `{token, amount}` tuples for cross-chain token transfers. Empty array `[]` for message-only\n- `feeToken`: Address of token to pay fees in. `address(0)` = pay in native token (ETH). Can also use LINK token address\n- `extraArgs`: Optional encoded extra arguments (gas limits, etc.). `0x00` for defaults\n- Requires native token (ETH) as msg.value when `feeToken` is `address(0)`\n- Requires ERC-20 approval to the Router for any tokens in `tokenAmounts`\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | router | `0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D` |\n| Arbitrum | router | `0x141fa059441E0ca23ce184B6A78bafD2A517DdE8` |\n| Optimism | router | `0x3206695CaE29952f4b0c22a169725a865bc8Ce0f` |\n| Base | router | `0x881e3A65B4d4a04dD529061dd0071cf975F58bCD` |\n| Polygon | router | `0x849c5ED5a80F5B408Dd4969b78c2C8fdf0565Bfe` |\n\n## ABI Reference\n\n### CCIPRouterABI\n\n- `ccipSend(uint64 destinationChainSelector, EVM2AnyMessage message) returns (bytes32 messageId)` [payable] - Send cross-chain message and/or tokens. Returns message ID for tracking\n- `getFee(uint64 destinationChainSelector, EVM2AnyMessage message) returns (uint256 fee)` - Estimate fee for a CCIP message before sending (view)\n- `isChainSupported(uint64 chainSelector) returns (bool)` - Check if a destination chain selector is supported (view)\n\nEVM2AnyMessage tuple: `(bytes receiver, bytes data, EVMTokenAmount[] tokenAmounts, address feeToken, bytes extraArgs)`\nEVMTokenAmount tuple: `(address token, uint256 amount)`\n\n## Notes\n\n- Uses CCIP chain selectors (uint64), NOT EVM chain IDs. Each supported chain has a unique selector\n- Fees can be paid in native token (ETH) or LINK token\n- Use `getFee()` to estimate costs before sending\n- Supports both message-only and message+token transfers in a single call\n- DON-based security with Chainlink oracle network -- no external validators needed\n- Finality: typically 5-20 minutes depending on source chain finality\n- Rate limits apply per lane (source-destination pair)\n- TVL: $1B+. Audited\n- On Arc (5042) a native-paid fee is USDC at 18 decimals, from the same balance as the USDC ERC-20 `0x3600…0000`. The router's `getWrappedNative()` is `0x8DFa585699CB46ca2a5fA649700f09839B4b8743` (`CCIP_USDC`, a WETH9-style wrapper over native USDC), CCIP's own fee token rather than a canonical wrapped native\n",
28
+ "chainlink": "# Chainlink\n\nIndustry-standard decentralized oracle network providing price feeds, VRF randomness, automation, and cross-chain interoperability (CCIP).\n\n## Category\n\noracle | Chains: Ethereum, Arc\n\n## Key Operations\n\n- **getLatestPrice**: Read latest price from a Chainlink price feed aggregator\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/chainlink\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Get latest price from feed\nimport { AggregatorV3ABI as IAggregatorV3 } from \"./abis\";\nfunction main(feedAddress: Address): {\n roundId: Uint256;\n answer: Uint256;\n startedAt: Uint256;\n updatedAt: Uint256;\n answeredInRound: Uint256;\n} {\n const feed = IAggregatorV3.at(feedAddress);\n return feed.latestRoundData();\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ---------------- | -------------------------------------------- |\n| Ethereum | ethUsdFeed | `0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419` |\n| Ethereum | feedRegistry | `0x47Fb2585D2C56Fe188D0E6ec628a38b74fCeeeDf` |\n| Ethereum | vrfV2Coordinator | `0x271682DEB8C4E0901D1a1550aD2e64D568E69909` |\n\n## ABI Methods\n\n### AggregatorV3ABI\n\n- `latestRoundData()` - Get latest price data. Returns tuple: (roundId uint80, answer int256, startedAt uint256, updatedAt uint256, answeredInRound uint80). answer is the price with feed-specific decimals\n- `decimals()` - Get price feed decimal precision. Returns uint8 (usually 8 for USD feeds, 18 for ETH feeds)\n\n### FeedRegistryABI\n\n- `latestRoundData(address,address)` - Get latest price for a base/quote pair. Params: base (token address), quote (denomination address, use 0x348... for USD). Returns same tuple as AggregatorV3\n- `getFeed(address,address)` - Look up aggregator address for a pair. Params: base, quote. Returns aggregator address\n\n## Notes\n\n- Price feeds return answer in int256 with feed-specific decimals (usually 8 for USD pairs)\n- Always check updatedAt timestamp for staleness - stale prices can cause issues\n- Feed Registry is Ethereum-only; on L2s, use individual feed addresses directly\n- VRF provides verifiable randomness for on-chain applications\n- Common feed addresses vary by chain - check Chainlink docs for specific chain deployments\n",
29
+ "circle-gateway": "# Circle Gateway\n\nCircle's chain-abstracted USDC balance. Deposit USDC into the GatewayWallet on one chain, then mint it on another chain through the GatewayMinter with a Circle-signed attestation.\n\n## Category\n\ncross-chain | Chains: Ethereum (1), Optimism (10), Polygon (137), Unichain (130), Sonic (146), Sei (1329), Base (8453), Arbitrum (42161), Avalanche (43114), Arc (5042)\n\n## SauceScript Functions\n\n### deposit\n\nDeposit a supported token (USDC) into the caller's Gateway balance.\n\n```typescript\nimport { GatewayWalletABI as IGatewayWallet } from \"./abis\";\n\nfunction main(walletAddress: Address, token: Address, amount: Uint256): Uint256 {\n const wallet = IGatewayWallet.at(walletAddress);\n wallet.deposit(token, amount);\n return 1;\n}\n```\n\n- `token`: must satisfy `isTokenSupported(token)`: the chain's native (Circle-issued) USDC, which on Arc is USDC's ERC-20 interface `0x3600000000000000000000000000000000000000`\n- `amount`: token units (6 decimals for USDC), never Arc's 18-decimal native units\n- The depositor must first `approve` the GatewayWallet for `amount`\n\n### availableBalance\n\nRead the balance a depositor can spend through Gateway.\n\n```typescript\nimport { GatewayWalletABI as IGatewayWallet } from \"./abis\";\n\nfunction main(walletAddress: Address, token: Address, depositor: Address): Uint256 {\n const wallet = IGatewayWallet.at(walletAddress);\n return wallet.availableBalance(token, depositor);\n}\n```\n\n### gatewayMint\n\nMint on the destination chain from an attestation Circle's Gateway API returned.\n\n```typescript\nimport { GatewayMinterABI as IGatewayMinter } from \"./abis\";\n\nfunction main(minterAddress: Address, attestationPayload: bytes, signature: bytes): Uint256 {\n const minter = IGatewayMinter.at(minterAddress);\n minter.gatewayMint(attestationPayload, signature);\n return 1;\n}\n```\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| ----------------- | ------------- | -------------------------------------------- |\n| Every chain above | GatewayWallet | `0x77777777Dcc4d5A8B6E418Fd04D8997ef11000eE` |\n| Every chain above | GatewayMinter | `0x2222222d7164433c4C09B0b0D809a9b52C04C205` |\n\n| Chain | Circle domain |\n| --------- | ------------- |\n| Ethereum | 0 |\n| Avalanche | 1 |\n| Optimism | 2 |\n| Arbitrum | 3 |\n| Base | 6 |\n| Polygon | 7 |\n| Unichain | 10 |\n| Sonic | 13 |\n| Sei | 16 |\n| Arc | 26 |\n\n## ABI Reference\n\n### GatewayWalletABI\n\n- `deposit(address token, uint256 value)` - Deposit into the caller's own Gateway balance\n- `depositFor(address token, address depositor, uint256 value)` - Deposit into another depositor's balance\n- `totalBalance(address token, address depositor) returns (uint256)` - Available plus withdrawing (view)\n- `availableBalance(address token, address depositor) returns (uint256)` - Spendable balance (view)\n- `isTokenSupported(address token) returns (bool)` (view)\n- `domain() returns (uint32)` - This chain's Circle domain, as in the table above (view)\n\n### GatewayMinterABI\n\n- `gatewayMint(bytes attestationPayload, bytes signature)` - Mint from a Circle-signed attestation\n- `isTokenSupported(address token) returns (bool)` (view)\n- `domain() returns (uint32)` (view)\n\n## Notes\n\n- Gateway uses Circle domain ids, the same ids as CCTP (Arc is 26), not EVM chain ids\n- Spending a Gateway balance on another chain is off-chain first: sign a burn intent, submit it to Circle's Gateway API, then call `gatewayMint` with the returned attestation\n- Both contracts are upgradeable (EIP-1967) proxies. Arc's Minter runs a different, smaller implementation from the other chains' that dispatches the same functions\n- Circle also runs Gateway on HyperEVM (domain 19) and World Chain (14), which are not SDK chains. It has no Solana mainnet deployment\n",
30
+ "compound-v2": "# Compound V2\n\nLegacy algorithmic money market protocol on Ethereum. Pioneered cToken model where deposits mint interest-bearing tokens.\n\n## Category\n\nlending | Chains: Ethereum (1)\n\n## SauceScript Functions\n\n### supply\n\nSupply assets by minting cTokens. The cToken exchange rate increases over time as interest accrues.\n\n```typescript\nimport { CErc20ABI as ICErc20 } from \"./abis\";\n\nfunction main(cTokenAddress: Address, amount: Uint256): Uint256 {\n const cToken = ICErc20.at(cTokenAddress);\n return cToken.mint(amount);\n}\n```\n\n- `cTokenAddress`: The cToken market contract (e.g. cUSDC, cETH)\n- `amount`: Amount of underlying token to supply\n- Returns 0 on success, error code on failure\n- Requires ERC-20 approval of the underlying token to the cToken address\n\n### withdraw\n\nWithdraw by specifying the amount of underlying tokens to receive.\n\n```typescript\nimport { CErc20ABI as ICErc20 } from \"./abis\";\n\nfunction main(cTokenAddress: Address, amount: Uint256): Uint256 {\n const cToken = ICErc20.at(cTokenAddress);\n return cToken.redeemUnderlying(amount);\n}\n```\n\n- `amount`: Amount of underlying tokens to withdraw\n- Returns 0 on success, error code on failure\n\n### borrow\n\nBorrow assets against supplied collateral. Must call `enterMarkets` on Comptroller first.\n\n```typescript\nimport { CErc20ABI as ICErc20 } from \"./abis\";\n\nfunction main(cTokenAddress: Address, amount: Uint256): Uint256 {\n const cToken = ICErc20.at(cTokenAddress);\n return cToken.borrow(amount);\n}\n```\n\n- `amount`: Amount of underlying to borrow\n- Must have collateral enabled via Comptroller.enterMarkets first\n\n### repay\n\nRepay borrowed assets.\n\n```typescript\nimport { CErc20ABI as ICErc20 } from \"./abis\";\n\nfunction main(cTokenAddress: Address, amount: Uint256): Uint256 {\n const cToken = ICErc20.at(cTokenAddress);\n return cToken.repayBorrow(amount);\n}\n```\n\n- `amount`: Amount to repay. Use `type(uint256).max` to repay full debt\n- Requires ERC-20 approval of the underlying token to the cToken\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | ----------- | -------------------------------------------- |\n| Ethereum | comptroller | `0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B` |\n| Ethereum | cETH | `0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5` |\n| Ethereum | cUSDC | `0x39AA39c021dfbaE8faC545936693aC917d5E7563` |\n\n## ABI Reference\n\n### CErc20ABI\n\n- `mint(uint256 mintAmount) returns (uint256)` - Supply underlying, receive cTokens. Returns 0 on success\n- `redeem(uint256 redeemTokens) returns (uint256)` - Redeem cTokens for underlying (specify cToken amount)\n- `redeemUnderlying(uint256 redeemAmount) returns (uint256)` - Redeem for exact underlying amount\n- `borrow(uint256 borrowAmount) returns (uint256)` - Borrow underlying tokens\n- `repayBorrow(uint256 repayAmount) returns (uint256)` - Repay borrow debt\n- `balanceOfUnderlying(address owner) returns (uint256)` - Get underlying balance including accrued interest. Not a view: it accrues interest first, so it cannot be STATICCALLed\n- `borrowBalanceCurrent(address account) returns (uint256)` - Get current borrow balance with interest. Not a view: it accrues interest first\n\n### ComptrollerABI\n\n- `enterMarkets(address[] cTokens) returns (uint256[])` - Enable cTokens as collateral. Must call before borrowing\n- `exitMarket(address cToken) returns (uint256)` - Remove cToken from collateral (fails if would cause shortfall)\n\n## Notes\n\n- Must call `Comptroller.enterMarkets([cTokenAddress])` before borrowing against a market\n- Return values: 0 = success, non-zero = error code (e.g. 3 = COMPTROLLER_REJECTION)\n- cToken exchange rate grows over time -- holding cTokens earns interest automatically\n- Each asset has its own cToken contract (not a shared pool like Aave)\n- Legacy protocol -- consider Compound V3 (Comet) for new deployments\n- TVL: $1B+. Audited\n",
31
+ "compound-v3": "# Compound V3\n\nSingle-asset lending protocol (Comet) with isolated markets per base asset. Each market has one borrowable asset and multiple collateral assets.\n\n## Category\n\nlending | Chains: Ethereum (1), Arbitrum (42161), Base (8453), Polygon (137), Optimism (10), Scroll (534352)\n\n## SauceScript Functions\n\n### supply\n\nSupply the base asset to earn interest, or supply collateral to enable borrowing.\n\n```typescript\nimport { CometABI as IComet } from \"./abis\";\n\nfunction main(cometAddress: Address, asset: Address, amount: Uint256): Uint256 {\n const comet = IComet.at(cometAddress);\n comet.supply(asset, amount);\n return 1;\n}\n```\n\n- `cometAddress`: The specific Comet market (e.g. cUSDCv3, cWETHv3)\n- `asset`: If base asset (e.g. USDC) -- earns interest. If collateral asset -- enables borrowing\n- Requires ERC-20 approval to the Comet address\n\n### withdraw\n\nWithdraw base asset or collateral. If withdrawing more base than supplied, creates a borrow position.\n\n```typescript\nimport { CometABI as IComet } from \"./abis\";\n\nfunction main(cometAddress: Address, asset: Address, amount: Uint256): Uint256 {\n const comet = IComet.at(cometAddress);\n comet.withdraw(asset, amount);\n return 1;\n}\n```\n\n- Withdrawing base asset beyond your supply automatically borrows\n\n### supplyTo\n\nSupply assets on behalf of another address.\n\n```typescript\nimport { CometABI as IComet } from \"./abis\";\n\nfunction main(cometAddress: Address, dst: Address, asset: Address, amount: Uint256): Uint256 {\n const comet = IComet.at(cometAddress);\n comet.supplyTo(dst, asset, amount);\n return 1;\n}\n```\n\n- `dst`: Destination address that receives the supply position\n\n### withdrawTo\n\nWithdraw assets to a specific address.\n\n```typescript\nimport { CometABI as IComet } from \"./abis\";\n\nfunction main(cometAddress: Address, to: Address, asset: Address, amount: Uint256): Uint256 {\n const comet = IComet.at(cometAddress);\n comet.withdrawTo(to, asset, amount);\n return 1;\n}\n```\n\n- `to`: Address that receives the withdrawn tokens\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | cUSDCv3 | `0xc3d688B66703497DAA19211EEdff47f25384cdc3` |\n| Ethereum | cWETHv3 | `0xA17581A9E3356d9A858b789D68B4d866e593aE94` |\n| Ethereum | cUSDTv3 | `0x3Afdc9BCA9213A35503b077a6072F3D0d5AB0840` |\n| Arbitrum | cUSDCv3 | `0x9c4ec768c28520B50860ea7a15bd7213a9fF58bf` |\n| Arbitrum | cUSDTv3 | `0x6f7D514bbD4aFf3BcD1140B7344b32f063dEe486` |\n| Base | cUSDCv3 | `0xb125E6687d4313864e53df431d5425969c15Eb2F` |\n| Base | cWETHv3 | `0x46e6b214b524310239732D51387075E0e70970bf` |\n| Polygon | cUSDCv3 | `0xF25212E676D1F7F89Cd72fFEe66158f541246445` |\n| Optimism | cUSDCv3 | `0x2e44e174f7D53F0212823acC11C01A11d58c5bCB` |\n| Scroll | cUSDCv3 | `0xB2f97c1Bd3bf02f5e74d13f02E3e26F93D77CE44` |\n\n## ABI Reference\n\n### CometABI\n\n- `supply(address asset, uint256 amount)` - Supply base asset (earns interest) or collateral asset\n- `supplyTo(address dst, address asset, uint256 amount)` - Supply on behalf of another address\n- `withdraw(address asset, uint256 amount)` - Withdraw base or collateral. Excess withdrawal borrows automatically\n- `withdrawTo(address to, address asset, uint256 amount)` - Withdraw to specific recipient address\n- `balanceOf(address account) returns (uint256)` - Get base asset supply balance (view)\n- `borrowBalanceOf(address account) returns (uint256)` - Get outstanding borrow balance (view)\n\n## Notes\n\n- No separate borrow function -- withdrawing more base than supplied automatically borrows\n- Each Comet market has ONE base asset (e.g. USDC) and multiple collateral assets\n- No interest rate mode selection -- all borrows are variable rate\n- Supply/withdraw of collateral does not earn interest, only the base asset earns\n- Market names indicate the base asset: cUSDCv3 = USDC base, cWETHv3 = WETH base\n- All supply operations require ERC-20 approval to the Comet address\n- TVL: $3.5B+. Audited\n",
32
+ "connext": "# Connext (Everclear)\n\nCross-chain liquidity protocol rebranded as Everclear. Uses intents and a clearing layer for capital-efficient cross-chain transfers.\n\n## Category\n\nbridge | Direction: any-to-any (L2-to-L2, L1-to-L2, L2-to-L1) | Chains: Ethereum (1), Arbitrum (42161), Optimism (10), Base (8453)\n\n## SauceScript Functions\n\n### bridge\n\nCreate a new cross-chain intent via EverclearSpoke.\n\n```typescript\nimport { EverclearSpokeABI as IEverclearSpoke } from \"./abis\";\n\nfunction main(\n spokeAddress: Address,\n destinations: Uint256[],\n recipient: Address,\n inputAsset: Address,\n outputAsset: Address,\n amount: Uint256,\n amountOutMin: Uint256,\n): Uint256 {\n const spoke = IEverclearSpoke.at(spokeAddress);\n const created = spoke.newIntent(\n destinations,\n recipient,\n inputAsset,\n outputAsset,\n amount,\n amountOutMin,\n 86400,\n \"\",\n );\n return created.intentId;\n}\n```\n\n- `destinations`: Array of destination domain IDs (uint32[]) -- can specify multiple possible destinations\n- `recipient`: Address to receive tokens on destination\n- `inputAsset`: Token to send on source chain\n- `outputAsset`: Token to receive on destination chain (can differ from input for cross-chain swaps)\n- `amountOutMin`: Minimum amount the recipient must receive\n- `ttl`: Time-to-live in seconds (86400 = 24 hours). Intent expires if unfilled\n- Requires ERC-20 approval to the EverclearSpoke\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | -------------- | -------------------------------------------- |\n| Ethereum | everclearSpoke | `0xa05A3380889115bf313f1Db9d5f335157Be4D816` |\n| Arbitrum | everclearSpoke | `0xa05A3380889115bf313f1Db9d5f335157Be4D816` |\n| Optimism | everclearSpoke | `0xa05A3380889115bf313f1Db9d5f335157Be4D816` |\n| Base | everclearSpoke | `0xa05A3380889115bf313f1Db9d5f335157Be4D816` |\n\n## ABI Reference\n\n### EverclearSpokeABI\n\n- `newIntent(uint32[] destinations, address receiver, address inputAsset, address outputAsset, uint256 amount, uint256 amountOutMin, uint48 ttl, bytes data) returns (bytes32 intentId, Intent intent)` - Create a cross-chain transfer intent. Solvers compete to fill the intent on the destination chain. A `bytes32`-typed overload takes non-EVM receivers and assets\n\n## Notes\n\n- Intent-based architecture: users express desired outcome, solvers compete to fill\n- Rebranded from Connext to Everclear -- same contracts\n- Same EverclearSpoke address deployed across all chains\n- Uses domain IDs (uint32) for destination chains, NOT EVM chain IDs\n- Supports cross-chain swaps (inputAsset != outputAsset)\n- `ttl` determines how long the intent is valid -- unfilled intents can be cancelled after expiry\n- Finality: typically 2-15 minutes depending on solver activity\n- Requires ERC-20 approval to the EverclearSpoke\n- TVL: $50M+. Audited\n",
33
+ "convex": "# Convex Finance\n\nYield optimizer for Curve Finance LP tokens. Deposit Curve LP tokens to earn boosted CRV rewards plus CVX incentives without needing to lock CRV.\n\n## Category\n\nyield | Chains: Ethereum\n\n## Key Operations\n\n- **deposit**: Deposit Curve LP tokens into Convex pool (with auto-staking)\n- **withdraw**: Withdraw Curve LP tokens from Convex pool\n- **getReward**: Claim accumulated CRV + CVX + extra rewards\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/convex\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit Curve LP into Convex (auto-stake in reward pool)\nimport { BoosterABI as IBooster } from \"./abis\";\nfunction main(boosterAddress: Address, pid: Uint256, amount: Uint256): Uint256 {\n const booster = IBooster.at(boosterAddress);\n booster.deposit(pid, amount, true);\n return 1;\n}\n\n// Withdraw Curve LP from Convex\nimport { BoosterABI as IBooster } from \"./abis\";\nfunction main(boosterAddress: Address, pid: Uint256, amount: Uint256): Uint256 {\n const booster = IBooster.at(boosterAddress);\n booster.withdraw(pid, amount);\n return 1;\n}\n\n// Claim rewards from reward pool\nimport { BaseRewardPoolABI as IBaseRewardPool } from \"./abis\";\nfunction main(rewardPoolAddress: Address, account: Address): Uint256 {\n const pool = IBaseRewardPool.at(rewardPoolAddress);\n pool.getReward(account, true);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------- | -------------------------------------------- |\n| Ethereum | booster | `0xF403C135812408BFbE8713b5A23a04b3D48AAE31` |\n| Ethereum | cvxRewardPool | `0xCF50b810E57Ac33B91dCF525C6ddd9881B139332` |\n\n## ABI Methods\n\n### BoosterABI\n\n- `deposit(uint256,uint256,bool)` - Deposit LP tokens. Params: pool ID (pid), amount, stake in reward pool (true recommended)\n- `withdraw(uint256,uint256)` - Withdraw LP tokens. Params: pool ID, amount\n- `poolLength()` - Total number of pools\n- `poolInfo(uint256)` - Get pool info: (lptoken, token, gauge, crvRewards, stash, shutdown)\n\n### BaseRewardPoolABI\n\n- `getReward(address,bool)` - Claim rewards. Params: account, claimExtras (true = claim extra reward tokens too)\n- `earned(address)` - Query pending CRV rewards\n- `balanceOf(address)` - Query staked balance in reward pool\n- `withdrawAndUnwrap(uint256,bool)` - Withdraw and unwrap in one tx. Params: amount, claim rewards\n\n## Notes\n\n- TVL: $2B+. Pool IDs (pid) are sequential integers\n- Third param in deposit = auto-stake in reward pool (always pass true for yield)\n- Each pool has its own BaseRewardPool contract (get from poolInfo.crvRewards)\n- Approve Curve LP token to Booster before depositing\n- getReward with claimExtras=true claims CRV + CVX + any extra reward tokens\n",
34
+ "cowswap": "# CoW Swap\n\nMEV-protected DEX aggregator using batch auctions and Coincidence of Wants (CoW) to find optimal prices while protecting users from frontrunning.\n\n## Category\n\naggregator | Chains: Ethereum, Arbitrum\n\n## Key Operations\n\n- **preSignOrder**: Pre-sign an order on-chain for execution by solvers\n- **invalidateOrder**: Cancel/invalidate a pending order\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/cowswap\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Pre-sign order on-chain\nimport { GPv2SettlementABI as IGPv2Settlement } from \"./abis\";\nfunction main(settlementAddress: Address, orderUid: bytes): Uint256 {\n const settlement = IGPv2Settlement.at(settlementAddress);\n settlement.setPreSignature(orderUid, true);\n return 1;\n}\n\n// Invalidate/cancel order\nimport { GPv2SettlementABI as IGPv2Settlement } from \"./abis\";\nfunction main(settlementAddress: Address, orderUid: bytes): Uint256 {\n const settlement = IGPv2Settlement.at(settlementAddress);\n settlement.invalidateOrder(orderUid);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------------- | -------------------------------------------- |\n| Ethereum | gpv2Settlement | `0x9008D19f58AAbD9eD0D60971565AA8510560ab41` |\n| Arbitrum | gpv2Settlement | `0x9008D19f58AAbD9eD0D60971565AA8510560ab41` |\n\n## ABI Methods\n\n### GPv2SettlementABI\n\n- `setPreSignature(bytes,bool)` - Pre-sign order on-chain. Params: orderUid (unique order identifier bytes), signed (true to sign, false to unsign). Used for smart contract wallets that cannot sign off-chain\n- `invalidateOrder(bytes)` - Invalidate/cancel a pending order. Params: orderUid (order to cancel)\n\n## Notes\n\n- MEV-protected: batch auctions match Coincidence of Wants (overlapping orders) first\n- Orders are typically signed off-chain and submitted to CoW Protocol API\n- setPreSignature is for smart contracts/multisigs that cannot produce ECDSA signatures\n- orderUid encodes: order hash + owner address + validTo timestamp\n- Same settlement contract on both Ethereum and Arbitrum\n- Approve tokens to the GPv2VaultRelayer (not settlement contract) before trading\n",
35
+ "crvusd": "# crvUSD\n\nCurve Finance native stablecoin using LLAMMA (Lending-Liquidating AMM Algorithm) for soft liquidations.\n\n## Category\n\ncdp | Chains: Ethereum\n\n## Key Operations\n\n- **transfer**: Transfer crvUSD tokens\n- **approve**: Approve crvUSD token spender\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/crvusd\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Transfer crvUSD\nimport { transfer } from \"@sauce/token\";\nfunction main(crvusdAddress: Address, to: Address, amount: Uint256): Uint256 {\n transfer(crvusdAddress, to, amount);\n return 1;\n}\n\n// Approve crvUSD spender\nimport { approve } from \"@sauce/token\";\nfunction main(crvusdAddress: Address, spender: Address, amount: Uint256): Uint256 {\n approve(crvusdAddress, spender, amount);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | crvusd | `0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E` |\n\n## ABI Methods\n\n### CrvUSDERC20ABI\n\n- `transfer(address,uint256)` - Transfer crvUSD. Params: to, amount. Returns bool\n- `approve(address,uint256)` - Approve spender. Params: spender, amount. Returns bool\n- `balanceOf(address)` - Query balance. Params: account. Returns uint256\n\n## Notes\n\n- TVL: $500M+. LLAMMA provides soft liquidations - collateral gradually converted to crvUSD during price drops\n- Soft liquidation = collateral is progressively swapped rather than instant liquidation\n- Borrowing happens through Curve lending controllers (per-market contracts)\n- Supported collateral includes ETH, wstETH, sfrxETH, tBTC, wBTC\n- crvUSD has a peg keeper mechanism to maintain $1 peg via Curve pools\n",
36
+ "curve": "# Curve Finance\n\nStableSwap AMM optimized for low-slippage swaps between pegged assets (stablecoins, wrapped tokens). Uses a specialized invariant that provides near-zero slippage for like-kind assets while maintaining AMM properties.\n\n## Category\n\ndex | Chains: Ethereum, Arbitrum, Optimism, Base, Polygon, Avalanche, Fantom, Gnosis\n\n## Key Operations\n\n- **swap**: Exchange tokens within a pool using index-based routing\n- **addLiquidity**: Add liquidity with flexible token amounts (can be imbalanced)\n- **removeLiquidity**: Remove liquidity proportionally or single-sided\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/curve\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { CurveStableSwapABI as IStableSwap } from \"./abis\";\n\nfunction main(\n poolAddress: Address,\n i: Uint256,\n j: Uint256,\n amountIn: Uint256,\n minAmountOut: Uint256,\n): Uint256 {\n const pool = IStableSwap.at(poolAddress);\n return pool.exchange(i, j, amountIn, minAmountOut);\n}\n```\n\n- `poolAddress`: The specific Curve pool contract address (each pool is a separate contract)\n- `i`: Index of the input token within the pool (0-based)\n- `j`: Index of the output token within the pool (0-based)\n- `amountIn`: Exact amount of input token (in wei)\n- `minAmountOut`: Minimum output for slippage protection\n- Token indices vary per pool\n- For StableSwap-NG pools. 3pool's `exchange` returns nothing, so reading back a `uint256` reverts there: use `CurveThreePoolABI` for 3pool\n\n### addLiquidity\n\n```typescript\nimport { CurveStableSwapABI as IStableSwap } from \"./abis\";\n\nfunction main(poolAddress: Address, amounts: Uint256[], minMintAmount: Uint256): Uint256 {\n const pool = IStableSwap.at(poolAddress);\n return pool.add_liquidity(amounts, minMintAmount);\n}\n```\n\n- `amounts`: Array of deposit amounts for each token in pool order (can include zeros for imbalanced deposits)\n- `minMintAmount`: Minimum LP tokens to receive (slippage protection)\n- All deposited tokens must be approved to the pool contract\n\n### removeLiquidity\n\n```typescript\nimport { CurveStableSwapABI as IStableSwap } from \"./abis\";\n\nfunction main(poolAddress: Address, amount: Uint256, minAmounts: Uint256[]): Uint256[] {\n const pool = IStableSwap.at(poolAddress);\n return pool.remove_liquidity(amount, minAmounts);\n}\n```\n\n- `amount`: Amount of LP tokens to burn\n- `minAmounts`: Minimum amounts of each token to receive (array in pool token order)\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| --------- | --------------------- | -------------------------------------------- |\n| Ethereum | RouterNG | `0x16C6521Dff6baB339122a0FE25a9116693265353` |\n| Ethereum | AddressProvider | `0x0000000022D53366457F9d5E68Ec105046FC4383` |\n| Ethereum | CRV Token | `0xD533a949740bb3306d119CC777fa900bA034cd52` |\n| Ethereum | 3pool (DAI/USDC/USDT) | `0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7` |\n| Arbitrum | RouterNG | `0x2191718CD32d02B8E60BAdFFeA33E4B5DD9A0A0D` |\n| Arbitrum | AddressProvider | `0x0000000022D53366457F9d5E68Ec105046FC4383` |\n| Optimism | RouterNG | `0x0DCDED3545D565bA3B19E683431381007245d983` |\n| Base | RouterNG | `0x4f37A9d177470499A2dD084621020b023fcffc1F` |\n| Polygon | AddressProvider | `0x0000000022D53366457F9d5E68Ec105046FC4383` |\n| Avalanche | AddressProvider | `0x0000000022D53366457F9d5E68Ec105046FC4383` |\n| Fantom | AddressProvider | `0x0000000022D53366457F9d5E68Ec105046FC4383` |\n| Gnosis | AddressProvider | `0x0000000022D53366457F9d5E68Ec105046FC4383` |\n\n## ABI Methods\n\n### CurveStableSwapABI\n\nThe StableSwap-NG pool interface (plain and meta pools). Classic pools such as 3pool have their own shape: see `CurveThreePoolABI` below.\n\n- `exchange(int128 i, int128 j, uint256 dx, uint256 min_dy) -> uint256` - Swap between two tokens in the pool by index\n- `exchange_underlying(int128 i, int128 j, uint256 dx, uint256 min_dy) -> uint256` - Swap between underlying tokens (metapools only)\n- `add_liquidity(uint256[] amounts, uint256 min_mint_amount) -> uint256` - Deposit tokens and receive LP tokens (can be imbalanced)\n- `remove_liquidity(uint256 _amount, uint256[] min_amounts) -> uint256[]` - Burn LP tokens and withdraw all tokens proportionally\n- `remove_liquidity_one_coin(uint256 _token_amount, int128 i, uint256 min_amount) -> uint256` - Burn LP tokens and withdraw as a single token\n- `get_dy(int128 i, int128 j, uint256 dx) -> uint256` - Quote: estimate output for a given input (view)\n- `get_virtual_price() -> uint256` - Get the virtual price of the LP token (view, useful for pricing)\n\n### CurveThreePoolABI\n\n3pool (`threePool` in the addresses), a classic StableSwap pool. Its liquidity arrays are fixed-size, and its state-changing functions return nothing: read amounts as balance changes.\n\n- `exchange(int128 i, int128 j, uint256 dx, uint256 min_dy)` - Swap between two of DAI(0), USDC(1), USDT(2)\n- `add_liquidity(uint256[3] amounts, uint256 min_mint_amount)` - Deposit tokens and receive 3CRV\n- `remove_liquidity(uint256 _amount, uint256[3] min_amounts)` - Burn 3CRV and withdraw all three tokens proportionally\n- `remove_liquidity_one_coin(uint256 _token_amount, int128 i, uint256 min_amount)` - Burn 3CRV and withdraw one token\n- `get_dy(int128 i, int128 j, uint256 dx) -> uint256` - Quote (view)\n- `get_virtual_price() -> uint256` - Virtual price of 3CRV (view)\n\n### CurveRouterNGABI\n\n- `exchange(address[11] _route, uint256[5][5] _swap_params, uint256 _amount, uint256 _expected, address[5] _pools) -> uint256` - Multi-pool routed swap for optimal execution\n- `exchange(address[11] _route, uint256[5][5] _swap_params, uint256 _amount, uint256 _min_dy, address[5] _pools, address _receiver) -> uint256` - The same routed swap, paying `_receiver` instead of the caller\n- `get_dy(address[11] _route, uint256[5][5] _swap_params, uint256 _amount, address[5] _pools) -> uint256` - Quote routed swap output (view)\n\n### CurveAddressProviderABI\n\n- `get_registry() -> address` - Get the main registry contract address (view)\n- `get_address(uint256 _id) -> address` - Get a specific system contract by ID (view)\n\n## Notes\n\n- Pool tokens are indexed (i, j) not addressed; you must know the token order for each pool\n- Common pool token orders: 3pool = [DAI(0), USDC(1), USDT(2)]\n- `exchange_underlying` is used for metapools or lending pools where tokens wrap underlying assets\n- `remove_liquidity_one_coin` is useful for single-sided withdrawal (higher slippage than proportional)\n- Each pool is a separate contract; use the AddressProvider or registry to discover pools\n- RouterNG enables cross-pool routing for multi-hop swaps across different pools\n- Curve excels at stablecoin swaps (much lower slippage than Uniswap for like-kind pairs)\n- The `get_virtual_price` never decreases and represents the LP token value growth over time\n- Tokens must be ERC20-approved to the pool contract (not a router) for direct pool swaps\n- For Router NG swaps, approve tokens to the Router NG contract\n",
37
+ "debridge": "# deBridge\n\nCross-chain trading infrastructure with DLN (DeBridge Liquidity Network). Supports limit orders and market makers for cross-chain swaps.\n\n## Category\n\nbridge + cross-chain trading | Direction: any-to-any | Chains: Ethereum (1), Arbitrum (42161), Optimism (10), Base (8453), Polygon (137), BSC (56), Avalanche (43114), Arc (5042)\n\n## SauceScript Functions\n\n### bridge\n\nCreate a cross-chain order via DLN (DeBridge Liquidity Network).\n\n```typescript\nimport { DlnSourceABI as IDlnSource } from \"./abis\";\n\nfunction main(\n dlnSourceAddress: Address,\n giveToken: Address,\n giveAmount: Uint256,\n takeToken: bytes,\n takeAmount: Uint256,\n takeChainId: Uint256,\n receiver: bytes,\n): Uint256 {\n const dln = IDlnSource.at(dlnSourceAddress);\n return dln.createOrder(\n {\n giveTokenAddress: giveToken,\n giveAmount: giveAmount,\n takeTokenAddress: takeToken,\n takeAmount: takeAmount,\n takeChainId: takeChainId,\n receiverDst: receiver,\n givePatchAuthoritySrc: ctx.msgSender(),\n orderAuthorityAddressDst: receiver,\n allowedTakerDst: 0x00,\n externalCall: 0x00,\n allowedCancelBeneficiarySrc: 0x00,\n },\n 0x00,\n 0,\n 0x00,\n );\n}\n```\n\n- `giveToken`: ERC-20 token address to send on source chain\n- `giveAmount`: Amount of source token to send\n- `takeToken`: Token address on destination chain (as bytes, since it may be on a non-EVM chain)\n- `takeAmount`: Minimum amount to receive on destination. Set slightly below `giveAmount` to account for market maker spread\n- `takeChainId`: Destination chain ID (uses EVM chain IDs)\n- `receiver`: Recipient address on destination chain (as bytes)\n- `givePatchAuthoritySrc`: Address allowed to increase give amount (set to `msg.sender`)\n- `orderAuthorityAddressDst`: Address that can cancel/modify order on destination (set to `receiver`)\n- `allowedTakerDst`: Restrict which market maker can fill (empty `0x00` = any taker)\n- `externalCall`: Optional calldata to execute on destination after fill\n- `allowedCancelBeneficiarySrc`: Restrict who receives refund on cancellation (empty `0x00` = order creator)\n- Requires ERC-20 approval to DlnSource\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| --------- | -------------- | -------------------------------------------- |\n| Ethereum | dlnSource | `0xeF4fB24aD0916217251F553c0596F8Edc630EB66` |\n| Ethereum | dlnDestination | `0xE7351Fd770A37282b91D153Ee690B63579D6dd7f` |\n| Arbitrum | dlnSource | `0xeF4fB24aD0916217251F553c0596F8Edc630EB66` |\n| Arbitrum | dlnDestination | `0xE7351Fd770A37282b91D153Ee690B63579D6dd7f` |\n| Optimism | dlnSource | `0xeF4fB24aD0916217251F553c0596F8Edc630EB66` |\n| Optimism | dlnDestination | `0xE7351Fd770A37282b91D153Ee690B63579D6dd7f` |\n| Base | dlnSource | `0xeF4fB24aD0916217251F553c0596F8Edc630EB66` |\n| Base | dlnDestination | `0xE7351Fd770A37282b91D153Ee690B63579D6dd7f` |\n| Polygon | dlnSource | `0xeF4fB24aD0916217251F553c0596F8Edc630EB66` |\n| Polygon | dlnDestination | `0xE7351Fd770A37282b91D153Ee690B63579D6dd7f` |\n| BSC | dlnSource | `0xeF4fB24aD0916217251F553c0596F8Edc630EB66` |\n| BSC | dlnDestination | `0xE7351Fd770A37282b91D153Ee690B63579D6dd7f` |\n| Avalanche | dlnSource | `0xeF4fB24aD0916217251F553c0596F8Edc630EB66` |\n| Avalanche | dlnDestination | `0xE7351Fd770A37282b91D153Ee690B63579D6dd7f` |\n\n## ABI Reference\n\n### DlnSourceABI\n\n- `createOrder(OrderCreation _orderCreation, bytes _affiliateFee, uint32 _referralCode, bytes _permitEnvelope) returns (bytes32 orderId)` [payable] - Create a cross-chain limit order. Market makers compete to fill on destination\n\nOrderCreation tuple: `(address giveTokenAddress, uint256 giveAmount, bytes takeTokenAddress, uint256 takeAmount, uint256 takeChainId, bytes receiverDst, address givePatchAuthoritySrc, bytes orderAuthorityAddressDst, bytes allowedTakerDst, bytes externalCall, bytes allowedCancelBeneficiarySrc)`\n\n### DlnDestinationABI\n\n- `fulfillOrder(Order _order, uint256 _fulFillAmount, bytes32 _orderId, bytes _permitEnvelope, address _unlockAuthority)` [payable] - Fill an order on the destination chain (called by market makers/solvers)\n\nOrder tuple: `(uint64 makerOrderNonce, bytes makerSrc, uint256 giveChainId, bytes giveTokenAddress, uint256 giveAmount, uint256 takeChainId, bytes receiverDst, address takeTokenAddress, uint256 takeAmount, bytes givePatchAuthoritySrc, address orderAuthorityAddressDst, bytes allowedTakerDst, bytes allowedCancelBeneficiarySrc, bytes externalCall)`\n\n## Notes\n\n- Intent/order-based architecture: users create orders specifying desired outcome, market makers compete to fill\n- Uses EVM chain IDs for destination (unlike LayerZero/Wormhole which use their own IDs)\n- Same DlnSource and DlnDestination addresses deployed across all supported chains\n- `takeAmount` should be set slightly below market rate to incentivize market makers\n- Supports cross-chain swaps natively (giveToken and takeToken can be different assets)\n- `externalCall` enables arbitrary contract execution on destination after the fill\n- Finality: typically 1-5 minutes (market maker fills immediately, then settles asynchronously)\n- Requires ERC-20 approval to DlnSource for the give token\n- TVL: $200M+. Audited\n- On Arc (5042) the DLN `globalFixedNativeFee()` is `1000000000000000000` wei, which is 1 USDC: Arc's native coin is USDC at 18 decimals, paid from the same balance as the USDC ERC-20 `0x3600…0000` (read 2026-09-28)\n",
38
+ "dodo": "# DODO\n\nProactive Market Maker (PMM) DEX with capital-efficient liquidity provision. Unlike constant product AMMs, DODO uses oracle-guided pricing to concentrate liquidity near market price. Features single-token LP, customizable price curves, and smart routing across DODO pools.\n\n## Category\n\ndex | Chains: Ethereum, BSC\n\n## Key Operations\n\n- **swap**: Swap tokens via DODO V2 Proxy with pair-based routing\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/dodo\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { DODOV2ProxyABI as IDODOProxy } from \"./abis\";\n\nfunction main(\n proxyAddress: Address,\n fromToken: Address,\n toToken: Address,\n fromAmount: Uint256,\n minReturn: Uint256,\n dodoPairs: Address[],\n direction: Uint256,\n): Uint256 {\n const proxy = IDODOProxy.at(proxyAddress);\n return proxy.dodoSwapV2TokenToToken(\n fromToken,\n toToken,\n fromAmount,\n minReturn,\n dodoPairs,\n direction,\n false,\n 99999999999,\n );\n}\n```\n\n- `proxyAddress`: DODO V2 Proxy address for the target chain\n- `fromToken`: Input token address\n- `toToken`: Output token address\n- `fromAmount`: Exact input amount (in wei)\n- `minReturn`: Minimum output for slippage protection\n- `dodoPairs`: Array of DODO pool addresses to route through (ordered for the swap path)\n- `direction`: Bitmask encoding which side of each pool to use. Each bit represents a pool: `0` = sell base token, `1` = sell quote token. For a single pool, use `0` or `1`. For multi-pool, combine bits (e.g., `0b01` = first pool sell quote, second pool sell base)\n- `isIncentive`: Set to `false` (incentive mining flag, usually disabled)\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | V2 Proxy | `0xa356867fDCeA8e71AEaf87805808803806231FDc` |\n| BSC | V2 Proxy | `0x8F8Dd7DB1bDA5eD3da8C9dAf3bFA471c12d58486` |\n\n## ABI Methods\n\n### DODOV2ProxyABI\n\n- `dodoSwapV2TokenToToken(address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] dodoPairs, uint256 directions, bool isIncentive, uint256 deadLine) -> uint256 returnAmount` - Execute a token-to-token swap through one or more DODO pools\n\n## Notes\n\n- PMM (Proactive Market Maker) provides better capital efficiency than constant product by concentrating liquidity near oracle price\n- `dodoPairs` is an array of DODO pool addresses defining the swap route (each pool has a base token and a quote token)\n- `directions` is a bitmask: for each pool in the path, a bit value of `0` means \"sell base token\" and `1` means \"sell quote token\". The least significant bit corresponds to the first pool\n- For a single-pool swap: if you're selling the base token of that pool, `directions = 0`; if selling the quote token, `directions = 1`\n- `isIncentive`: Flag for DODO mining incentives, typically set to `false`\n- Pool discovery requires off-chain lookup via DODO's API or subgraph to find the right pool addresses\n- Input token must be ERC20-approved to the V2 Proxy contract\n- DODO also supports single-token LP (provide only one side of liquidity) which is unique among AMMs\n",
39
+ "eigenlayer": "# EigenLayer\n\nRestaking protocol that enables staked ETH to secure additional protocols (AVS). Deposit LSTs into strategies to earn restaking rewards on top of staking yield.\n\n## Category\n\nrestaking | Chains: Ethereum\n\n## Key Operations\n\n- **depositIntoStrategy**: Deposit LSTs (stETH, rETH, cbETH) into a restaking strategy\n- **delegateTo**: Delegate restaked assets to an operator (via DelegationManager)\n- **undelegate**: Undelegate from an operator, initiating withdrawal\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/eigenlayer\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit LST into restaking strategy\nimport { StrategyManagerABI as IStrategyManager } from \"./abis\";\nfunction main(\n strategyManagerAddress: Address,\n strategy: Address,\n token: Address,\n amount: Uint256,\n): Uint256 {\n const sm = IStrategyManager.at(strategyManagerAddress);\n return sm.depositIntoStrategy(strategy, token, amount);\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ----------------- | -------------------------------------------- |\n| Ethereum | strategyManager | `0x858646372CC42E1A627fcE94aa7A7033e7CF075A` |\n| Ethereum | delegationManager | `0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A` |\n| Ethereum | stETHStrategy | `0x93c4b944D05dfe6df7645A86cd2206016c51564D` |\n| Ethereum | rETHStrategy | `0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2` |\n| Ethereum | cbETHStrategy | `0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc` |\n\n## ABI Methods\n\n### StrategyManagerABI\n\n- `depositIntoStrategy(address,address,uint256)` - Deposit token into strategy. Params: strategy address, token address, amount. Returns shares\n- `stakerDepositShares(address staker, address strategy)` - Query staker's deposit shares in a strategy (renamed from `stakerStrategyShares`)\n\n### DelegationManagerABI\n\n- `delegateTo(address,tuple,bytes32)` - Delegate to operator. Tuple is (signature bytes, expiry uint256). Use empty sig + max expiry\n- `undelegate(address)` - Undelegate staker. Returns withdrawal root bytes32[]\n- `isDelegated(address)` - Check if address is delegated to an operator\n\n### StrategyABI\n\n- `sharesToUnderlyingView(uint256)` - Convert shares to underlying token amount\n- `underlyingToSharesView(uint256)` - Convert underlying amount to shares\n\n## Notes\n\n- TVL: $13B+. Foundation of the restaking ecosystem\n- Approve LST token to StrategyManager before depositing\n- Each LST has its own strategy contract (stETH, rETH, cbETH listed above)\n- Withdrawal has a 7-day delay period after undelegating\n- delegateTo requires approverSignatureAndExpiry tuple - use empty bytes + far-future expiry for typical cases\n",
40
+ "ens": "# ENS\n\nEthereum Name Service - the decentralized naming system for wallets, websites, and resources. Maps human-readable names to Ethereum addresses.\n\n## Category\n\ninfrastructure | Chains: Ethereum\n\n## Key Operations\n\n- **setResolver**: Set the resolver contract for an ENS name\n- **setOwner**: Transfer ownership of an ENS name\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/ens\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Set resolver for ENS name\nimport { ENSRegistryABI as IENSRegistry } from \"./abis\";\nfunction main(registryAddress: Address, node: Uint256, resolver: Address): Uint256 {\n const registry = IENSRegistry.at(registryAddress);\n registry.setResolver(node, resolver);\n return 1;\n}\n\n// Transfer ENS name ownership\nimport { ENSRegistryABI as IENSRegistry } from \"./abis\";\nfunction main(registryAddress: Address, node: Uint256, owner: Address): Uint256 {\n const registry = IENSRegistry.at(registryAddress);\n registry.setOwner(node, owner);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------- | -------------------------------------------- |\n| Ethereum | registry | `0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e` |\n| Ethereum | baseRegistrar | `0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85` |\n\n## ABI Methods\n\n### ENSRegistryABI\n\n- `owner(bytes32)` - Query owner of a name node. Params: node (namehash). Returns owner address\n- `resolver(bytes32)` - Query resolver of a name node. Params: node. Returns resolver address\n- `setOwner(bytes32,address)` - Transfer name ownership. Params: node, owner (new owner)\n- `setResolver(bytes32,address)` - Set resolver contract. Params: node, resolver (new resolver)\n\n### BaseRegistrarABI\n\n- `nameExpires(uint256)` - Check when a .eth name expires. Params: id (label hash as uint256). Returns expiry timestamp\n- `reclaim(uint256,address)` - Reclaim ENS registry ownership. Params: id (label hash), owner. Only callable by registrant\n\n## Notes\n\n- node = namehash of the ENS name (e.g. namehash(\"vitalik.eth\") = keccak256 chain)\n- .eth names are ERC-721 NFTs held in the baseRegistrar contract\n- Resolver contract stores the address/content records for a name\n- Only the owner of a node can setResolver or setOwner\n- Registration/renewal happens via the ETHRegistrarController (not in this ABI set)\n",
41
+ "erc20": "# ERC-20\n\nThe standard interface for fungible tokens on EVM chains (EIP-20). Defines transfer, approve, transferFrom, balanceOf, allowance, totalSupply, name, symbol, and decimals.\n\n## Category\n\ninfrastructure | Chains: (standard interface, any chain)\n\n## Key Operations\n\n- **transfer**: Send tokens to an address\n- **approve**: Authorize a spender to transfer tokens on your behalf\n- **transferFrom**: Transfer tokens from one address to another (requires approval)\n- **balanceOf**: Query token balance of an address\n- **allowance**: Query remaining approved amount for a spender\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/erc20\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Transfer tokens\nimport { transfer } from \"@sauce/token\";\nfunction main(token: Address, to: Address, amount: Uint256): Uint256 {\n transfer(token, to, amount);\n return 1;\n}\n\n// Approve spender\nimport { approve } from \"@sauce/token\";\nfunction main(token: Address, spender: Address, amount: Uint256): Uint256 {\n approve(token, spender, amount);\n return 1;\n}\n\n// Transfer from (requires prior approval)\nimport { transferFrom } from \"@sauce/token\";\nfunction main(token: Address, from: Address, to: Address, amount: Uint256): Uint256 {\n transferFrom(token, from, to, amount);\n return 1;\n}\n\n// Check balance\nimport { ERC20ABI as IERC20 } from \"./abis\";\nfunction main(token: Address, account: Address): Uint256 {\n const t = IERC20.at(token);\n return t.balanceOf(account);\n}\n\n// Storage-based transfer (demonstrates storage, crypto, abi encode, events)\nfunction balanceSlot(account: Address): Uint256 {\n return crypto.keccak256(abi.encode(account, 1));\n}\nfunction main(to: Address, amount: Uint256): Uint256 {\n const from = ctx.msgSender();\n const fromSlot = balanceSlot(from);\n const fromBalance = evm.sload(fromSlot);\n if (fromBalance < amount) throw \"insufficient balance\";\n evm.sstore(fromSlot, fromBalance - amount);\n const toSlot = balanceSlot(to);\n evm.sstore(toSlot, evm.sload(toSlot) + amount);\n log(abi.encode(from, to, amount), crypto.keccak256(\"Transfer(address,address,uint256)\"));\n return 1;\n}\n```\n\n## ABI Methods\n\n### ERC20ABI\n\n- `transfer(address,uint256)` - Transfer tokens. Params: to (recipient), amount (token amount). Returns bool success\n- `approve(address,uint256)` - Approve spender. Params: spender (authorized address), amount (max transfer amount). Returns bool success\n- `transferFrom(address,address,uint256)` - Transfer from approved address. Params: from (source), to (destination), amount. Returns bool success\n- `balanceOf(address)` - Query balance. Params: account. Returns uint256 balance\n- `allowance(address,address)` - Query allowance. Params: owner, spender. Returns uint256 remaining allowance\n- `totalSupply()` - Total token supply. Returns uint256\n- `name()` - Token name. Returns string\n- `symbol()` - Token symbol. Returns string\n- `decimals()` - Token decimals. Returns uint8 (typically 18; USDC/USDT use 6)\n\n### Events\n\n- `Transfer(address indexed from, address indexed to, uint256 value)` - Emitted on transfer and transferFrom\n- `Approval(address indexed owner, address indexed spender, uint256 value)` - Emitted on approve\n\n## Notes\n\n- Standard interface (EIP-20) - not a specific deployment, no fixed addresses\n- Every fungible token on every EVM chain implements this interface\n- approve before transferFrom: spender must be approved by the owner first\n- Common pattern: approve max (type(uint256).max) for DeFi interactions, or use exact amounts for security\n- decimals varies: most tokens use 18, USDC/USDT use 6, WBTC uses 8\n- Some tokens (USDT) do not return bool from transfer/approve. The writes above are `@sauce/token`'s, which follow OpenZeppelin SafeERC20: empty returndata is accepted from a contract, a `false` return reverts, and `approve` resets a non-zero allowance to zero first. They return nothing, since a refused write reverts the program\n- `ERC20ABI.at(token).transfer(...)` is the raw ABI call and is NOT SafeERC20: it reverts on a token that returns nothing and accepts one that returns `false`. Use it only when that is what you mean\n- The storageTransfer example demonstrates how to implement ERC-20 logic entirely in SauceScript using storage operations\n",
42
+ "erc3156": "# ERC-3156\n\nStandard interface for flash loans (EIP-3156). Provides flashLoan, flashFee, and maxFlashLoan functions for any conforming lender.\n\n## Category\n\ninfrastructure | Chains: (standard interface, any chain)\n\n## Key Operations\n\n- **flashFee**: Query the fee for a flash loan of a specific token and amount\n- **maxFlashLoan**: Query the maximum flash loan amount for a token\n- **flashLoan**: Execute a flash loan (borrow and repay in same transaction)\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/erc3156\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Query flash loan fee\nimport { FlashLenderABI as IFlashLender } from \"./abis\";\nfunction main(lenderAddress: Address, token: Address, amount: Uint256): Uint256 {\n const lender = IFlashLender.at(lenderAddress);\n return lender.flashFee(token, amount);\n}\n\n// Query max flash loan amount\nimport { FlashLenderABI as IFlashLender } from \"./abis\";\nfunction main(lenderAddress: Address, token: Address): Uint256 {\n const lender = IFlashLender.at(lenderAddress);\n return lender.maxFlashLoan(token);\n}\n```\n\n## ABI Methods\n\n### FlashLenderABI\n\n- `flashLoan(address,address,uint256,bytes)` - Execute flash loan. Params: receiver (contract that receives tokens and implements IERC3156FlashBorrower), token (ERC-20 to borrow), amount (borrow amount), data (arbitrary data passed to receiver callback). Returns bool success\n- `flashFee(address,uint256)` - Query fee for flash loan. Params: token, amount. Returns fee in token units\n- `maxFlashLoan(address)` - Query max borrowable amount. Params: token. Returns max amount (0 if token not supported)\n\n## Notes\n\n- Standard interface (EIP-3156), not a specific deployment - no fixed addresses\n- Aave V3, Maker (sDAI), Uniswap V3, and Balancer all implement ERC-3156\n- Receiver contract must implement `onFlashLoan(address,address,uint256,uint256,bytes)` callback\n- Must approve lender to pull back amount + fee before callback returns\n- Flash loan must be fully repaid within the same transaction (atomic)\n- Fee varies by implementation: Aave charges 0.05-0.09%, Balancer charges 0%, Maker varies\n",
43
+ "erc4626": "# ERC-4626\n\nStandard interface for tokenized vaults (EIP-4626). Provides deposit, withdraw, mint, redeem and preview functions for any conforming vault.\n\n## Category\n\nyield | Chains: (standard interface, any chain)\n\n## Key Operations\n\n- **deposit**: Deposit underlying assets, receive vault shares\n- **withdraw**: Withdraw by specifying asset amount to receive\n- **redeem**: Withdraw by specifying share amount to burn\n- **mint**: Mint exact number of shares by depositing required assets\n- **previewDeposit**: Preview how many shares a deposit would yield\n- **previewWithdraw**: Preview how many shares would be burned for a withdrawal\n- **convertToShares**: Convert asset amount to equivalent shares\n- **convertToAssets**: Convert share amount to equivalent assets\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/erc4626\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit assets into vault\nimport { VaultABI as IVault } from \"./abis\";\nfunction main(vaultAddress: Address, assets: Uint256, receiver: Address): Uint256 {\n const vault = IVault.at(vaultAddress);\n return vault.deposit(assets, receiver);\n}\n\n// Withdraw assets from vault\nimport { VaultABI as IVault } from \"./abis\";\nfunction main(vaultAddress: Address, assets: Uint256, receiver: Address, owner: Address): Uint256 {\n const vault = IVault.at(vaultAddress);\n return vault.withdraw(assets, receiver, owner);\n}\n\n// Redeem shares for assets\nimport { VaultABI as IVault } from \"./abis\";\nfunction main(vaultAddress: Address, shares: Uint256, receiver: Address, owner: Address): Uint256 {\n const vault = IVault.at(vaultAddress);\n return vault.redeem(shares, receiver, owner);\n}\n\n// Preview deposit\nimport { VaultABI as IVault } from \"./abis\";\nfunction main(vaultAddress: Address, assets: Uint256): Uint256 {\n const vault = IVault.at(vaultAddress);\n return vault.previewDeposit(assets);\n}\n\n// Convert assets to shares\nimport { VaultABI as IVault } from \"./abis\";\nfunction main(vaultAddress: Address, assets: Uint256): Uint256 {\n const vault = IVault.at(vaultAddress);\n return vault.convertToShares(assets);\n}\n```\n\n## ABI Methods\n\n### VaultABI\n\n- `deposit(uint256,address)` - Deposit assets. Params: assets (underlying token amount), receiver (share recipient). Returns shares minted\n- `mint(uint256,address)` - Mint exact shares. Params: shares (exact shares to mint), receiver. Returns assets required\n- `withdraw(uint256,address,address)` - Withdraw by asset amount. Params: assets (amount to withdraw), receiver, owner (share owner). Returns shares burned\n- `redeem(uint256,address,address)` - Redeem shares. Params: shares (to burn), receiver, owner. Returns assets received\n- `totalAssets()` - Total assets managed by vault. Returns uint256\n- `convertToShares(uint256)` - Convert assets to shares (current rate). Params: assets. Returns shares\n- `convertToAssets(uint256)` - Convert shares to assets (current rate). Params: shares. Returns assets\n- `previewDeposit(uint256)` - Preview deposit (includes fees). Params: assets. Returns shares\n- `previewMint(uint256)` - Preview mint cost. Params: shares. Returns assets needed\n- `previewWithdraw(uint256)` - Preview withdrawal. Params: assets. Returns shares to burn\n- `previewRedeem(uint256)` - Preview redemption. Params: shares. Returns assets received\n- `maxDeposit(address)` - Max deposit allowed. Params: receiver. Returns max assets\n- `maxMint(address)` - Max mint allowed. Params: receiver. Returns max shares\n- `maxWithdraw(address)` - Max withdrawal allowed. Params: owner. Returns max assets\n- `maxRedeem(address)` - Max redemption allowed. Params: owner. Returns max shares\n- `asset()` - Underlying asset address. Returns address\n\n## Notes\n\n- Standard interface (EIP-4626) - protocols that implement it: sDAI, sfrxETH, pufETH, Yearn V3, sUSDe, Beefy vaults\n- deposit/withdraw operate in asset terms; mint/redeem operate in share terms\n- preview* functions account for fees; convert* are pure exchange rate calculations\n- Approve the underlying asset to the vault before calling deposit\n- owner parameter in withdraw/redeem allows withdrawal on behalf of another address (requires approval)\n- Share price typically increases over time as yield accrues\n",
44
+ "ethena": "# Ethena\n\nSynthetic dollar protocol providing USDe, a crypto-native dollar backed by delta-neutral positions. sUSDe offers yield from staking and funding rates.\n\n## Category\n\ncdp | Chains: Ethereum\n\n## Key Operations\n\n- **stakeUSDe**: Stake USDe to receive sUSDe (yield-bearing)\n- **cooldownAssets**: Start cooldown period to unstake (by asset amount)\n- **cooldownShares**: Start cooldown period to unstake (by share amount)\n- **unstake**: Complete unstake after cooldown period\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/ethena\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Stake USDe for sUSDe\nimport { StakedUSDeABI as IStakedUSDe } from \"./abis\";\nfunction main(susdeAddress: Address, amount: Uint256, receiver: Address): Uint256 {\n const susde = IStakedUSDe.at(susdeAddress);\n return susde.deposit(amount, receiver);\n}\n\n// Start cooldown to unstake\nimport { StakedUSDeABI as IStakedUSDe } from \"./abis\";\nfunction main(susdeAddress: Address, assets: Uint256): Uint256 {\n const susde = IStakedUSDe.at(susdeAddress);\n return susde.cooldownAssets(assets);\n}\n\n// Complete unstake after cooldown\nimport { StakedUSDeABI as IStakedUSDe } from \"./abis\";\nfunction main(susdeAddress: Address, receiver: Address): Uint256 {\n const susde = IStakedUSDe.at(susdeAddress);\n susde.unstake(receiver);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | usde | `0x4c9EDD5852cd905f086C759E8383e09bff1e68b3` |\n| Ethereum | susde | `0x9D39A5DE30e57443BfF2A8307A4256c8797A3497` |\n\n## ABI Methods\n\n### StakedUSDeABI (ERC-4626 + cooldown)\n\n- `deposit(uint256,address)` - Stake USDe, receive sUSDe. Params: assets (USDe amount), receiver. Returns shares (sUSDe minted)\n- `withdraw(uint256,address,address)` - Withdraw by asset amount (after cooldown). Params: assets, receiver, owner. Returns shares burned\n- `redeem(uint256,address,address)` - Redeem by share amount (after cooldown). Params: shares, receiver, owner. Returns assets\n- `cooldownAssets(uint256)` - Start cooldown by specifying USDe amount. Params: assets. Returns shares that will be burned\n- `cooldownShares(uint256)` - Start cooldown by specifying sUSDe amount. Params: shares. Returns assets that will be received\n- `unstake(address)` - Complete unstake after cooldown. Params: receiver (address to receive USDe)\n\n### USDeABI\n\n- `approve(address,uint256)` - Approve USDe spender. Params: spender, amount. Returns bool\n\n## Notes\n\n- TVL: $3B+. Yield comes from ETH staking rewards + perpetual funding rates\n- 7-day cooldown period required before unstaking\n- Flow: deposit (stake) -> cooldownAssets/cooldownShares (start cooldown) -> unstake (after 7 days)\n- Approve USDe to sUSDe contract before depositing\n- sUSDe appreciates against USDe as yield accrues\n",
45
+ "etherfi": "# ether.fi\n\nDecentralized, non-custodial liquid restaking protocol. Stake ETH to receive eETH (rebasing), or wrap it as weETH (non-rebasing) for DeFi composability. Natively restaked via EigenLayer.\n\n## Category\n\nrestaking | Chains: Ethereum\n\n## Key Operations\n\n- **deposit**: Stake ETH and receive eETH\n- **wrap**: Wrap eETH into weETH (non-rebasing)\n- **unwrap**: Unwrap weETH back to eETH\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/etherfi\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit ETH for eETH\nimport { LiquidityPoolABI as ILiquidityPool } from \"./abis\";\nfunction main(liquidityPoolAddress: Address): Uint256 {\n const pool = ILiquidityPool.at(liquidityPoolAddress);\n return pool.deposit();\n}\n\n// Wrap eETH to weETH\nimport { WeETHABI as IWeETH } from \"./abis\";\nfunction main(weethAddress: Address, amount: Uint256): Uint256 {\n const weeth = IWeETH.at(weethAddress);\n return weeth.wrap(amount);\n}\n\n// Unwrap weETH to eETH\nimport { WeETHABI as IWeETH } from \"./abis\";\nfunction main(weethAddress: Address, amount: Uint256): Uint256 {\n const weeth = IWeETH.at(weethAddress);\n return weeth.unwrap(amount);\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------- | -------------------------------------------- |\n| Ethereum | eETH | `0x35fA164735182de50811E8e2E824cFb9B6118ac2` |\n| Ethereum | weETH | `0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee` |\n| Ethereum | liquidityPool | `0x308861A430be4cce5502d0A12724771Fc6DaF216` |\n\n## ABI Methods\n\n### LiquidityPoolABI\n\n- `deposit()` - Stake ETH (payable), receive eETH. Returns shares minted\n\n### WeETHABI\n\n- `wrap(uint256)` - Wrap eETH amount into weETH. Requires eETH approval\n- `unwrap(uint256)` - Unwrap weETH back to eETH\n- `getEETHByWeETH(uint256)` - Preview eETH for weETH amount\n- `getWeETHByeETH(uint256)` - Preview weETH for eETH amount (note the lower-case `e`)\n- `balanceOf(address)` - Query weETH balance\n\n### EETHABI\n\n- `balanceOf(address)` - Query eETH balance\n- `approve(address,uint256)` - Approve eETH spending\n\n## Notes\n\n- TVL: $5.8B+. Largest liquid restaking protocol\n- eETH rebases like stETH. Use weETH for DeFi (Aave, Pendle, etc.)\n- deposit() is payable - send ETH as msg.value\n- Approve eETH to weETH contract before wrapping\n- Natively restaked on EigenLayer for additional AVS yield\n",
46
+ "euler-v2": "# Euler V2\n\nModular lending platform built on the Ethereum Vault Connector (EVC). Supports permissionless vault creation with customizable risk parameters.\n\n## Category\n\nlending | Chains: Ethereum (1)\n\n## SauceScript Functions\n\n### deposit\n\nDeposit assets into an EVault. Returns shares representing the deposit.\n\n```typescript\nimport { EVaultABI as IEVault } from \"./abis\";\n\nfunction main(vaultAddress: Address, amount: Uint256, receiver: Address): Uint256 {\n const vault = IEVault.at(vaultAddress);\n return vault.deposit(amount, receiver);\n}\n```\n\n- `vaultAddress`: Specific EVault address (each vault has its own asset and risk params)\n- `receiver`: Address that receives the vault shares\n- Returns the number of shares minted\n- Requires ERC-20 approval of the underlying asset to the vault\n\n### withdraw\n\nWithdraw assets from an EVault by specifying underlying amount.\n\n```typescript\nimport { EVaultABI as IEVault } from \"./abis\";\n\nfunction main(vaultAddress: Address, amount: Uint256, receiver: Address, owner: Address): Uint256 {\n const vault = IEVault.at(vaultAddress);\n return vault.withdraw(amount, receiver, owner);\n}\n```\n\n- `owner`: Address whose shares are burned (must be msg.sender or have allowance)\n- Returns the number of shares burned\n\n### borrow\n\nBorrow assets from an EVault. Must have collateral enabled via EVC first.\n\n```typescript\nimport { EVaultABI as IEVault } from \"./abis\";\n\nfunction main(vaultAddress: Address, amount: Uint256, receiver: Address): Uint256 {\n const vault = IEVault.at(vaultAddress);\n return vault.borrow(amount, receiver);\n}\n```\n\n- Must enable collateral and controller on EVC before borrowing\n- Returns the number of debt shares created\n\n### repay\n\nRepay borrowed assets to reduce debt.\n\n```typescript\nimport { EVaultABI as IEVault } from \"./abis\";\n\nfunction main(vaultAddress: Address, amount: Uint256, receiver: Address): Uint256 {\n const vault = IEVault.at(vaultAddress);\n return vault.repay(amount, receiver);\n}\n```\n\n- `receiver`: Address whose debt is being repaid\n- Requires ERC-20 approval of the underlying to the vault\n- Returns the number of debt shares burned\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | ---------------------- | -------------------------------------------- |\n| Ethereum | ethereumVaultConnector | `0x0C9a3dd6b8F28529d72d7f9cE918D493519EE383` |\n\n## ABI Reference\n\n### EVaultABI\n\n- `deposit(uint256 amount, address receiver) returns (uint256 shares)` - Deposit underlying, receive vault shares\n- `withdraw(uint256 amount, address receiver, address owner) returns (uint256 shares)` - Withdraw underlying by amount\n- `borrow(uint256 amount, address receiver) returns (uint256 shares)` - Borrow underlying tokens\n- `repay(uint256 amount, address receiver) returns (uint256 shares)` - Repay borrowed debt\n- `redeem(uint256 shares, address receiver, address owner) returns (uint256 amount)` - Redeem vault shares for underlying\n\n### EVCABI\n\n- `enableCollateral(address account, address vault)` - Enable an EVault as collateral for an account\n- `enableController(address account, address vault)` - Enable an EVault as debt controller for an account\n\n## Notes\n\n- ERC-4626 compatible vault interface (deposit/withdraw/redeem)\n- Must call `EVC.enableCollateral(account, collateralVault)` AND `EVC.enableController(account, borrowVault)` before borrowing\n- Each EVault is a separate market with its own underlying asset and risk parameters\n- Vaults are permissionlessly created -- always verify vault parameters before depositing\n- Rebuilt from scratch after V1 exploit -- new architecture based on EVC\n- TVL: $1B+. Audited\n",
47
+ "fenix": "# Fenix\n\nBlast-native ve(3,3) DEX and liquidity hub. Solidly-fork with concentrated liquidity and gauge voting, leveraging Blast's native yield on ETH and USDB for enhanced LP returns.\n\n## Category\n\ndex | Chains: Blast\n\n## Key Operations\n\n- **swap**: Swap tokens with route-based routing specifying stable or volatile pool type\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/fenix\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { FenixRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenIn: Address,\n tokenOut: Address,\n stable: bool,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256[] {\n const router = IRouter.at(routerAddress);\n return router.swapExactTokensForTokens(\n amountIn,\n amountOutMin,\n [{ from: tokenIn, to: tokenOut, stable: stable }],\n recipient,\n 99999999999,\n );\n}\n```\n\n- `routerAddress`: Fenix Router on Blast (`0xbD571125856975DBfC2E9b6d1DE496D614D7BAEE`)\n- `tokenIn` / `tokenOut`: Input and output token addresses\n- `stable`: `true` for stable pools (pegged assets like USDB/USDC), `false` for volatile pools\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n- Routes support multi-hop: `[{from: A, to: B, stable: false}, {from: B, to: C, stable: true}]`\n- Note: Fenix routes do NOT include a `factory` field (unlike Velodrome/Aerodrome)\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| ----- | -------- | -------------------------------------------- |\n| Blast | Router | `0xbD571125856975DBfC2E9b6d1DE496D614D7BAEE` |\n\n## ABI Methods\n\n### FenixRouterABI\n\n- `swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, tuple[](address from, address to, bool stable) routes, address to, uint256 deadline) -> uint256[] amounts` - Swap with route tuples specifying pool type per hop\n- `addLiquidity(address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB, uint256 liquidity)` - Add liquidity to a stable or volatile pool\n\n## Notes\n\n- Solidly-fork routes contain `{from, to, stable}` tuples (NO `factory` field)\n- Two pool types: `stable=true` for correlated assets, `stable=false` for uncorrelated\n- ve(3,3) model: FNX token holders vote-lock to direct gauge emissions\n- Blast-only deployment; leverages Blast's native yield on ETH and USDB for additional LP returns\n- For concentrated liquidity swaps on Blast, consider Thruster (Uniswap V3 fork)\n- LP tokens can be staked in gauges for FNX emissions\n- Input token must be ERC20-approved to the Router\n",
48
+ "fluid": "# Fluid\n\nLiquidity layer that unifies lending and DEX liquidity. Deposited assets simultaneously serve as lending collateral and DEX liquidity.\n\n## Category\n\nlending | Chains: Ethereum (1), Arbitrum (42161)\n\n## SauceScript Functions\n\nThe Liquidity layer (`liquidity` below) has no user-level deposit or borrow function: its only entry point, `operate`, is restricted to Fluid's own protocols. Users lend through **fTokens** (ERC-4626 vaults such as fUSDC) and borrow through **Vaults**.\n\n### deposit\n\nDeposit the fToken's underlying asset and receive fToken shares.\n\n```typescript\nimport { FluidLendingABI as IFToken } from \"./abis\";\n\nfunction main(fTokenAddress: Address, amount: Uint256, to: Address): Uint256 {\n const fToken = IFToken.at(fTokenAddress);\n return fToken.deposit(amount, to);\n}\n```\n\n- `fTokenAddress`: the fToken for the asset (e.g. fUSDC `0x9Fb7b4477576Fe5B32be4C1843aFB1e55F251B33` on Ethereum)\n- `to`: Address that receives the shares\n- Returns the shares minted\n- Requires ERC-20 approval of the underlying to the fToken\n\n### withdraw\n\nWithdraw an amount of the underlying asset, burning the owner's shares.\n\n```typescript\nimport { FluidLendingABI as IFToken } from \"./abis\";\n\nfunction main(fTokenAddress: Address, amount: Uint256, to: Address, owner: Address): Uint256 {\n const fToken = IFToken.at(fTokenAddress);\n return fToken.withdraw(amount, to, owner);\n}\n```\n\n- Returns the shares burned\n\n### borrow\n\nBorrow from a Vault position: `operate` with a positive debt delta.\n\n```typescript\nimport { FluidVaultABI as IFluidVault } from \"./abis\";\n\nfunction main(vaultAddress: Address, nftId: Uint256, amount: Uint256, to: Address): Uint256 {\n const vault = IFluidVault.at(vaultAddress);\n vault.operate(nftId, 0, amount, to);\n return 1;\n}\n```\n\n- `nftId`: the position NFT (0 opens a new position)\n- The position must hold enough collateral (a positive `newCol` delta deposits it)\n\n### repay\n\nRepay a Vault position's debt: `operate` with a negative debt delta.\n\n```typescript\nimport { FluidVaultABI as IFluidVault } from \"./abis\";\n\nfunction main(\n vaultAddress: Address,\n nftId: Uint256,\n negativeDebtDelta: Uint256,\n to: Address,\n): Uint256 {\n const vault = IFluidVault.at(vaultAddress);\n vault.operate(nftId, 0, negativeDebtDelta, to);\n return 1;\n}\n```\n\n- `negativeDebtDelta`: the repayment as a negative `int256`, passed in two's complement (`2**256 - amount`)\n- Requires ERC-20 approval of the debt token to the Vault\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | --------- | -------------------------------------------- |\n| Ethereum | liquidity | `0x52Aa899454998Be5b000Ad077a46Bbe360F4e497` |\n| Arbitrum | liquidity | `0x52Aa899454998Be5b000Ad077a46Bbe360F4e497` |\n\n## ABI Reference\n\n### FluidLendingABI (an fToken)\n\n- `deposit(uint256 assets, address receiver) returns (uint256 shares)` - ERC-4626 deposit\n- `withdraw(uint256 assets, address receiver, address owner) returns (uint256 shares)` - ERC-4626 withdraw\n- `redeem(uint256 shares, address receiver, address owner) returns (uint256 assets)` - ERC-4626 redeem\n- `asset() returns (address)` - The underlying token\n\n### FluidVaultABI (a Vault)\n\n- `operate(uint256 nftId, int256 newCol, int256 newDebt, address to) returns (uint256, int256, int256)` [payable] - Change a position's collateral and debt in one call; positive deltas deposit/borrow, negative ones withdraw/repay\n\n## Notes\n\n- Novel architecture: deposited assets serve dual purpose as lending collateral AND DEX liquidity\n- No interest rate mode selection -- all rates are algorithmically determined\n- Same contract address on Ethereum and Arbitrum\n- Built by the Instadapp team\n- All deposit/repay operations require ERC-20 approval (to the fToken or Vault)\n- TVL: $1B+. Audited\n",
49
+ "frax-ether": "# Frax Ether\n\nFrax Finance's liquid staking derivative. Two tokens: frxETH (pegged 1:1 to ETH) and sfrxETH (yield-bearing ERC-4626 vault token that accrues staking yield).\n\n## Category\n\nliquid-staking | Chains: Ethereum\n\n## Key Operations\n\n- **submitAndDeposit**: Stake ETH and deposit directly into sfrxETH vault (one-step)\n- **deposit**: Deposit frxETH into sfrxETH vault\n- **redeem**: Redeem sfrxETH shares for frxETH\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/frax-ether\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Stake ETH and get sfrxETH directly\nimport { FrxETHMinterABI as IFrxETHMinter } from \"./abis\";\nfunction main(minterAddress: Address, recipient: Address): Uint256 {\n const minter = IFrxETHMinter.at(minterAddress);\n return minter.submitAndDeposit(recipient);\n}\n\n// Deposit frxETH into sfrxETH vault\nimport { SfrxETHABI as ISfrxETH } from \"./abis\";\nfunction main(sfrxethAddress: Address, assets: Uint256, receiver: Address): Uint256 {\n const sfrxeth = ISfrxETH.at(sfrxethAddress);\n return sfrxeth.deposit(assets, receiver);\n}\n\n// Redeem sfrxETH for frxETH\nimport { SfrxETHABI as ISfrxETH } from \"./abis\";\nfunction main(\n sfrxethAddress: Address,\n shares: Uint256,\n receiver: Address,\n owner: Address,\n): Uint256 {\n const sfrxeth = ISfrxETH.at(sfrxethAddress);\n return sfrxeth.redeem(shares, receiver, owner);\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------ | -------------------------------------------- |\n| Ethereum | sfrxETH | `0xac3E018457B222d93114458476f3E3416Abbe38F` |\n| Ethereum | frxETHMinter | `0xbAFA44EFE7901E04E39Dad13167D089C559c1138` |\n\n## ABI Methods\n\n### FrxETHMinterABI\n\n- `submitAndDeposit(address)` - Stake ETH (payable) and auto-deposit into sfrxETH vault. Returns sfrxETH shares\n\n### SfrxETHABI (ERC-4626)\n\n- `deposit(uint256,address)` - Deposit frxETH, receive sfrxETH shares\n- `redeem(uint256,address,address)` - Redeem sfrxETH shares for frxETH. Params: shares, receiver, owner\n- `convertToShares(uint256)` - Preview shares for frxETH amount\n- `convertToAssets(uint256)` - Preview frxETH for sfrxETH amount\n- `balanceOf(address)` - Query sfrxETH balance\n\n## Notes\n\n- TVL: $700M+. sfrxETH is ERC-4626 compliant (same interface as Yearn V3, pufETH)\n- submitAndDeposit() is payable - send ETH as msg.value. One-step ETH -> sfrxETH\n- frxETH does not earn yield on its own - must be deposited into sfrxETH vault\n- Approve frxETH to sfrxETH contract before calling deposit()\n",
50
+ "frax": "# Frax Finance\n\nFractional-algorithmic stablecoin protocol with FRAX stablecoin, sFRAX staking, and FXS governance.\n\n## Category\n\ncdp | Chains: Ethereum\n\n## Key Operations\n\n- **transfer**: Transfer FRAX tokens\n- **approve**: Approve FRAX token spender\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/frax\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Transfer FRAX\nimport { transfer } from \"@sauce/token\";\nfunction main(fraxAddress: Address, to: Address, amount: Uint256): Uint256 {\n transfer(fraxAddress, to, amount);\n return 1;\n}\n\n// Approve FRAX spender\nimport { approve } from \"@sauce/token\";\nfunction main(fraxAddress: Address, spender: Address, amount: Uint256): Uint256 {\n approve(fraxAddress, spender, amount);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | frax | `0x853d955aCEf822Db058eb8505911ED77F175b99e` |\n\n## ABI Methods\n\n### FraxERC20ABI\n\n- `transfer(address,uint256)` - Transfer FRAX. Params: to, amount. Returns bool\n- `approve(address,uint256)` - Approve spender. Params: spender, amount. Returns bool\n- `balanceOf(address)` - Query balance. Params: account. Returns uint256\n\n## Notes\n\n- TVL: $1B+. V1 was fractional-algorithmic, V2 (Frax v3) is fully collateralized\n- FXS is the governance/value accrual token\n- sFRAX is the staked FRAX vault (ERC-4626) for earning yield - see frax-ether module for sfrxETH\n- Frax ecosystem includes: FRAX (stablecoin), frxETH/sfrxETH (liquid staking), FPI (inflation-pegged)\n",
51
+ "gains-network": "# Gains Network\n\nDecentralized leveraged trading platform (gTrade) supporting crypto, forex, and stocks with synthetic leverage up to 1000x on forex pairs. Diamond proxy architecture.\n\n## Category\n\nperpetuals | Chains: Arbitrum, Polygon\n\n## Key Operations\n\n- **closeTradeMarket**: Close an open trade at market price\n- **updateStopLoss**: Update stop loss on an open trade\n- **updateTakeProfit**: Update take profit on an open trade\n\n## SDK Usage\n\n```typescript\nimport {\n protocolInfo,\n deployments,\n sauceFunctions,\n} from \"@eco-incorp/sauce/protocols/gains-network\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Close trade at market price\nimport { DiamondABI as IDiamond } from \"./abis\";\nfunction main(diamondAddress: Address, index: Uint256, expectedPrice: Uint256): Uint256 {\n const diamond = IDiamond.at(diamondAddress);\n diamond.closeTradeMarket(index, expectedPrice);\n return 1;\n}\n\n// Update stop loss\nimport { DiamondABI as IDiamond } from \"./abis\";\nfunction main(diamondAddress: Address, index: Uint256, newSl: Uint256): Uint256 {\n const diamond = IDiamond.at(diamondAddress);\n diamond.updateSl(index, newSl);\n return 1;\n}\n\n// Update take profit\nimport { DiamondABI as IDiamond } from \"./abis\";\nfunction main(diamondAddress: Address, index: Uint256, newTp: Uint256): Uint256 {\n const diamond = IDiamond.at(diamondAddress);\n diamond.updateTp(index, newTp);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Arbitrum | diamond | `0xFF162c694eAA571f685030649814282eA457f169` |\n| Arbitrum | gns | `0x18c11FD286C5EC11c3b683Caa813B77f5163A122` |\n| Polygon | diamond | `0x209A9A01980377916851af2cA075C2b170452018` |\n\n## ABI Methods\n\n### DiamondABI\n\nThese are the multi-collateral Diamond's (v8+) signatures. A trade is addressed by the trader's own `index` (their Nth trade), not by `(pairIndex, index)`.\n\n- `openTrade(Trade trade, uint16 maxSlippageP, address referrer)` - Open a trade. Trade: `(address user, uint32 index, uint16 pairIndex, uint24 leverage, bool long, bool isOpen, uint8 collateralIndex, uint8 tradeType, uint120 collateralAmount, uint64 openPrice, uint64 tp, uint64 sl, bool isCounterTrade, uint160 positionSizeToken, uint24 __placeholder)`\n- `closeTradeMarket(uint32 index, uint64 expectedPrice)` - Close at market\n- `updateSl(uint32 index, uint64 newSl)` - Update stop loss\n- `updateTp(uint32 index, uint64 newTp)` - Update take profit\n\n## Notes\n\n- TVL: $50M+. Up to 1000x leverage on forex, 250x on crypto\n- Diamond proxy pattern - single contract for all operations\n- pairIndex identifies the trading pair (0=BTC/USD, 1=ETH/USD, etc.)\n- index identifies one of the trader's trades (a trader can have several)\n- openTrade uses complex tuple param for trade parameters\n",
52
+ "gamma": "# Gamma Strategies\n\nActive concentrated liquidity management protocol. Manages Uniswap V3, Algebra, and other CL DEX positions with automated rebalancing via Hypervisor vaults.\n\n## Category\n\nyield | Chains: Ethereum, Polygon\n\n## Key Operations\n\n- **deposit**: Deposit token pair into Gamma Hypervisor via UniProxy\n- **withdraw**: Withdraw liquidity from Hypervisor\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/gamma\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit into Gamma Hypervisor\nimport { UniProxyABI as IUniProxy } from \"./abis\";\nfunction main(\n uniProxyAddress: Address,\n deposit0: Uint256,\n deposit1: Uint256,\n to: Address,\n pos: Address,\n): Uint256 {\n const proxy = IUniProxy.at(uniProxyAddress);\n return proxy.deposit(deposit0, deposit1, to, pos, [0, 0, 0, 0]);\n}\n\n// Withdraw from Hypervisor\nimport { HypervisorABI as IHypervisor } from \"./abis\";\nfunction main(hypervisorAddress: Address, shares: Uint256, to: Address, from: Address): Uint256 {\n const hv = IHypervisor.at(hypervisorAddress);\n hv.withdraw(shares, to, from, [0, 0, 0, 0]);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | ------------------------------------------------------------------------------------------ |\n| Ethereum | uniProxy | `0xf5bfa20f4a77933fee0c7bb7f39e7642a070d599` (an earlier release: use `UniProxyLegacyABI`) |\n| Polygon | uniProxy | `0xA42d55074869491D60Ac05490376B74cF19B00e6` |\n\n## ABI Methods\n\n### UniProxyABI\n\n- `deposit(uint256,uint256,address,address,uint256[4])` - Deposit tokens. Params: deposit0, deposit1, to (receiver), pos (hypervisor address), minIn[4] (slippage, use [0,0,0,0])\n- `getDepositAmount(address,address,uint256)` - Preview required token1 amount for given token0 deposit. Params: pos, token, deposit amount. Returns (amountStart, amountEnd)\n\n### UniProxyLegacyABI\n\nThe Ethereum UniProxy is an earlier release; its `deposit` has no `minIn` (the `depositLegacy` template calls it).\n\n- `deposit(uint256,uint256,address,address)` - Deposit tokens. Params: deposit0, deposit1, to (receiver), pos (hypervisor address). Returns shares\n- `getDepositAmount(address,address,uint256)` - As on the current UniProxy\n\n### HypervisorABI\n\n- `withdraw(uint256,address,address,uint256[4])` - Withdraw by burning shares. Params: shares, to, from, minAmounts[4]. Returns (amount0, amount1)\n- `balanceOf(address)` - Query Hypervisor share balance\n- `totalSupply()` - Total shares outstanding\n- `getTotalAmounts()` - Total (amount0, amount1) managed\n\n## Notes\n\n- TVL: $200M+. Each Hypervisor is a vault for a specific token pair\n- Deposit via UniProxy (not directly on Hypervisor) - UniProxy handles deposit ratio enforcement\n- Use getDepositAmount() to find correct token1 amount for your token0 deposit\n- The uint256[4] minIn/minAmounts array provides slippage protection (use zeros for no limit)\n- Approve both token0 and token1 to UniProxy before depositing\n",
53
+ "gelato": "# Gelato Network\n\nWeb3 automation network for scheduling and executing smart contract functions and off-chain computations.\n\n## Category\n\ninfrastructure | Chains: Ethereum, Arbitrum, Optimism, Polygon, BSC, Avalanche, Base\n\n## Key Operations\n\n- **createTask**: Create an automated task for scheduled execution\n- **cancelTask**: Cancel an existing automated task\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/gelato\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Create automated task\nimport { GelatoAutomateABI as IAutomate } from \"./abis\";\nfunction main(\n automateAddress: Address,\n execAddress: Address,\n execData: bytes,\n moduleData: { modules: Uint256[]; args: bytes[] },\n feeToken: Address,\n): Uint256 {\n const automate = IAutomate.at(automateAddress);\n return automate.createTask(execAddress, execData, moduleData, feeToken);\n}\n\n// Cancel task\nimport { GelatoAutomateABI as IAutomate } from \"./abis\";\nfunction main(automateAddress: Address, taskId: Uint256): Uint256 {\n const automate = IAutomate.at(automateAddress);\n automate.cancelTask(taskId);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| ------------ | -------- | -------------------------------------------- |\n| All 7 chains | automate | `0x2A6C106ae13B558BB9E2Ec64Bd2f1f7BEFF3A5E0` |\n\n## ABI Methods\n\n### GelatoAutomateABI\n\n- `createTask(address,bytes,tuple,address)` - Create automated task. Params: execAddress (contract to call), execDataOrSelector (function calldata or selector), moduleData (tuple: {modules uint8[], args bytes[]} - configures trigger conditions), feeToken (payment token, address(0) for ETH). Returns taskId\n - Module types: 0=Resolver (custom check), 1=Time (interval), 2=Proxy, 3=SingleExec\n - args[] contains encoded config for each module\n- `cancelTask(bytes32)` - Cancel a task. Params: taskId (returned from createTask)\n\n## Notes\n\n- Same address across all 7 chains\n- Supports time-based triggers, event-based triggers, and custom resolver conditions\n- Gelato bots execute tasks when conditions are met, paid via prepaid balance or task fee\n- moduleData configures when the task should execute (time interval, resolver function, etc.)\n- feeToken: use address(0) for ETH, or an ERC-20 address for token payment\n",
54
+ "gho": "# GHO\n\nAave-native decentralized stablecoin minted against Aave V3 collateral. Multi-collateral, transparent, and governed by Aave DAO.\n\n## Category\n\ncdp | Chains: Ethereum\n\n## Key Operations\n\n- **transfer**: Transfer GHO tokens\n- **approve**: Approve GHO token spender\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/gho\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Transfer GHO\nimport { transfer } from \"@sauce/token\";\nfunction main(ghoAddress: Address, to: Address, amount: Uint256): Uint256 {\n transfer(ghoAddress, to, amount);\n return 1;\n}\n\n// Approve GHO spender\nimport { approve } from \"@sauce/token\";\nfunction main(ghoAddress: Address, spender: Address, amount: Uint256): Uint256 {\n approve(ghoAddress, spender, amount);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | gho | `0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f` |\n\n## ABI Methods\n\n### GhoTokenABI\n\n- `transfer(address,uint256)` - Transfer GHO. Params: to, amount. Returns bool\n- `approve(address,uint256)` - Approve spender. Params: spender, amount. Returns bool\n- `balanceOf(address)` - Query balance. Params: account. Returns uint256\n\n## Notes\n\n- Minted via Aave V3 borrow (use Aave V3 Pool.borrow with GHO token address)\n- Facilitator-based model - Aave V3 Pool is the primary facilitator\n- GHO has a variable borrow rate set by Aave governance\n- stkAAVE holders get a discount on GHO borrow rate\n- To mint GHO: supply collateral to Aave V3, then borrow GHO\n- To repay: use Aave V3 Pool.repay with GHO token address\n",
55
+ "gmx-v1": "# GMX V1\n\nDecentralized perpetual exchange with multi-asset liquidity pool (GLP). Supports leverage trading up to 50x with low swap fees and zero price impact trades.\n\n## Category\n\nperpetuals | Chains: Arbitrum, Avalanche\n\n## Key Operations\n\n- **openPosition**: Open/increase leveraged position via PositionRouter\n- **closePosition**: Close/decrease leveraged position\n- **swap**: Swap tokens via GMX Router\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/gmx-v1\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Open leveraged long position\nimport { PositionRouterABI as IPositionRouter } from \"./abis\";\nfunction main(\n positionRouterAddress: Address,\n path: Address[],\n indexToken: Address,\n amountIn: Uint256,\n sizeDelta: Uint256,\n isLong: bool,\n): Uint256 {\n const positionRouter = IPositionRouter.at(positionRouterAddress);\n positionRouter.createIncreasePosition(\n path,\n indexToken,\n amountIn,\n 0,\n sizeDelta,\n isLong,\n 0,\n 200000000000000,\n 0x0000000000000000000000000000000000000000000000000000000000000000,\n 0x0000000000000000000000000000000000000000,\n );\n return 1;\n}\n\n// Close position\nimport { PositionRouterABI as IPositionRouter } from \"./abis\";\nfunction main(\n positionRouterAddress: Address,\n path: Address[],\n indexToken: Address,\n collateralDelta: Uint256,\n sizeDelta: Uint256,\n isLong: bool,\n receiver: Address,\n): Uint256 {\n const positionRouter = IPositionRouter.at(positionRouterAddress);\n positionRouter.createDecreasePosition(\n path,\n indexToken,\n collateralDelta,\n sizeDelta,\n isLong,\n receiver,\n 0,\n 0,\n 200000000000000,\n false,\n 0x0000000000000000000000000000000000000000,\n );\n return 1;\n}\n\n// Swap tokens\nimport { RouterABI as IRouter } from \"./abis\";\nfunction main(\n routerAddress: Address,\n path: Address[],\n amountIn: Uint256,\n minOut: Uint256,\n receiver: Address,\n): Uint256 {\n const router = IRouter.at(routerAddress);\n router.swap(path, amountIn, minOut, receiver);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| --------- | -------------- | -------------------------------------------- |\n| Arbitrum | vault | `0x489ee077994B6658eAfA855C308275EAd8097C4A` |\n| Arbitrum | router | `0xaBBc5F99639c9B6bCb58544ddf04EFA6802F4064` |\n| Arbitrum | positionRouter | `0xb87a436B93fFE9D75c5cFA7bAcFff96430b09868` |\n| Arbitrum | glp | `0x4277f8F2c384827B5273592FF7CeBd9f2C1ac258` |\n| Avalanche | vault | `0x9ab2De34A33fB459b538c43f251eB825645e8595` |\n| Avalanche | router | `0x5F719c2F1095F7B9fc68a68e35B51194f4b6abe8` |\n\n## ABI Methods\n\n### PositionRouterABI\n\n- `createIncreasePosition(address[],address,uint256,uint256,uint256,bool,uint256,uint256,bytes32,address) returns (bytes32)` - Open/increase. Params: path, indexToken, amountIn, minOut, sizeDelta, isLong, acceptablePrice, executionFee, referralCode, callbackTarget (zero for none). Returns the request key\n- `createDecreasePosition(address[],address,uint256,uint256,bool,address,uint256,uint256,uint256,bool,address) returns (bytes32)` - Close/decrease. Params: path, indexToken, collateralDelta, sizeDelta, isLong, receiver, acceptablePrice, minOut, executionFee, withdrawETH, callbackTarget (zero for none). Returns the request key\n\n### RouterABI\n\n- `approvePlugin(address)` - Approve PositionRouter as plugin (required once)\n- `swap(address[],uint256,uint256,address)` - Swap tokens. Params: path, amountIn, minOut, receiver\n\n### VaultABI\n\n- `swap(address,address,address)` - Direct swap (internal)\n- `increasePosition(address,address,address,uint256,bool)` - Direct increase (internal)\n- `decreasePosition(address,address,address,uint256,uint256,bool,address)` - Direct decrease (internal)\n\n## Notes\n\n- TVL: $500M+. Execution fee of 200000000000000 wei (0.0002 ETH) required for position requests\n- Must call router.approvePlugin(positionRouter) once before using position operations\n- Path: for longs, path=[collateral]. For shorts, path=[stablecoin]. For swaps, path=[tokenIn, tokenOut]\n- sizeDelta is position size in USD with 30 decimals\n- acceptablePrice: 0 for market price\n",
56
+ "gmx-v2": "# GMX V2\n\nNext generation of GMX perpetual exchange with isolated markets, improved risk management, and GM liquidity tokens replacing GLP.\n\n## Category\n\nperpetuals | Chains: Arbitrum\n\n## Key Operations\n\n- **createOrder**: Create a market/limit order for trading (complex tuple params)\n- **sendTokens**: Send tokens via ExchangeRouter (used before creating orders)\n- **cancelOrder**: Cancel a pending order by key\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/gmx-v2\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Create a market order\nimport { ExchangeRouterABI as IExchangeRouter } from \"./abis\";\nfunction main(\n exchangeRouterAddress: Address,\n receiver: Address,\n cancellationReceiver: Address,\n market: Address,\n initialCollateralToken: Address,\n sizeDeltaUsd: Uint256,\n initialCollateralDeltaAmount: Uint256,\n triggerPrice: Uint256,\n acceptablePrice: Uint256,\n executionFee: Uint256,\n minOutputAmount: Uint256,\n orderType: Uint256,\n isLong: bool,\n): Uint256 {\n const router = IExchangeRouter.at(exchangeRouterAddress);\n const result = router.createOrder({\n addresses: {\n receiver: receiver,\n cancellationReceiver: cancellationReceiver,\n callbackContract: 0x0000000000000000000000000000000000000000,\n uiFeeReceiver: 0x0000000000000000000000000000000000000000,\n market: market,\n initialCollateralToken: initialCollateralToken,\n swapPath: [],\n },\n numbers: {\n sizeDeltaUsd: sizeDeltaUsd,\n initialCollateralDeltaAmount: initialCollateralDeltaAmount,\n triggerPrice: triggerPrice,\n acceptablePrice: acceptablePrice,\n executionFee: executionFee,\n callbackGasLimit: 0,\n minOutputAmount: minOutputAmount,\n validFromTime: 0,\n },\n orderType: orderType,\n decreasePositionSwapType: 0,\n isLong: isLong,\n shouldUnwrapNativeToken: false,\n autoCancel: false,\n referralCode: 0x0000000000000000000000000000000000000000000000000000000000000000,\n dataList: [],\n });\n return result;\n}\n\n// Send tokens to market vault before creating order\nimport { ExchangeRouterABI as IExchangeRouter } from \"./abis\";\nfunction main(\n exchangeRouterAddress: Address,\n token: Address,\n receiver: Address,\n amount: Uint256,\n): Uint256 {\n const router = IExchangeRouter.at(exchangeRouterAddress);\n router.sendTokens(token, receiver, amount);\n return 1;\n}\n\n// Cancel pending order\nimport { ExchangeRouterABI as IExchangeRouter } from \"./abis\";\nfunction main(exchangeRouterAddress: Address, orderKey: Uint256): Uint256 {\n const router = IExchangeRouter.at(exchangeRouterAddress);\n router.cancelOrder(orderKey);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------------- | -------------------------------------------- |\n| Arbitrum | exchangeRouter | `0x7dE39FF2e232A2203196788d37e234cF8F1b83f1` |\n| Arbitrum | dataStore | `0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8` |\n\n## ABI Methods\n\n### ExchangeRouterABI\n\n- `createOrder(tuple)` - Create order. Returns order key (bytes32). See CreateOrderParams struct below\n- `cancelOrder(bytes32)` - Cancel pending order by key\n- `sendTokens(address,address,uint256)` - Send tokens to vault. Must be called before createOrder\n\n### CreateOrderParams Struct\n\n- **addresses**: { receiver, cancellationReceiver, callbackContract, uiFeeReceiver, market, initialCollateralToken, swapPath[] }\n- **numbers**: { sizeDeltaUsd, initialCollateralDeltaAmount, triggerPrice, acceptablePrice, executionFee, callbackGasLimit, minOutputAmount, validFromTime }\n- **flags and extras**: orderType, decreasePositionSwapType, isLong, shouldUnwrapNativeToken, autoCancel, referralCode (bytes32), dataList (bytes32[])\n- **orderType**: 0=MarketSwap, 1=LimitSwap, 2=MarketIncrease, 3=LimitIncrease, 4=MarketDecrease, 5=LimitDecrease, 6=StopLossDecrease\n- **isLong**: true for long, false for short\n\n## Notes\n\n- TVL: $800M+. Isolated markets with separate GM tokens per trading pair\n- Order flow: 1) sendTokens to market vault, 2) createOrder with execution fee\n- GMX redeploys the ExchangeRouter on upgrades and revokes the old one; the listed router is the one RoleStore currently grants CONTROLLER\n- executionFee is paid in ETH (msg.value) to cover keeper gas costs\n- sizeDeltaUsd is in USD with 30 decimals (1 USD = 1e30)\n- Each market has its own address - query dataStore for market info\n",
57
+ "harvest": "# Harvest Finance\n\nYield farming protocol that automatically compounds rewards across DeFi strategies via Vault+Strategy pattern.\n\n## Category\n\nyield | Chains: Ethereum\n\n## Key Operations\n\n- **deposit**: Deposit tokens into Harvest vault\n- **withdraw**: Withdraw tokens from vault\n- **getPricePerFullShare**: Query vault share price\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/harvest\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit into Harvest vault\nimport { VaultABI as IVault } from \"./abis\";\n\nfunction main(vaultAddress: Address, amount: Uint256): Uint256 {\n const vault = IVault.at(vaultAddress);\n vault.deposit(amount);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ---------- | -------------------------------------------- |\n| Ethereum | controller | `0x222412af183BCeAdEFd72e4Cb1b71f1889953b1C` |\n| Ethereum | farm | `0xa0246c9032bC3A600820415aE600c6388619A14D` |\n\n## ABI Methods\n\n- `deposit(uint256) returns (uint256)` - Deposit tokens\n- `withdraw(uint256) returns (uint256)` - Withdraw shares\n- `getPricePerFullShare()` - Get share price\n\n## Notes\n\n- FARM token for governance. Auto-compounds strategy rewards.\n",
58
+ "hegic": "# Hegic\n\nOn-chain options trading protocol allowing users to buy call and put options on ETH and BTC with simplified UX.\n\n## Category\n\noptions | Chains: Arbitrum\n\n## Key Operations\n\n- **exerciseOption**: Exercise an options position to claim profit\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/hegic\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Exercise option: the OperationalTreasury pays off the position to `account`\nimport { HegicABI as IHegic } from \"./abis\";\nfunction main(treasuryAddress: Address, optionId: Uint256, account: Address): Uint256 {\n const treasury = IHegic.at(treasuryAddress);\n treasury.payOff(optionId, account);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------------- | ---------------------------------------------------------- |\n| Arbitrum | hegic | `0x431402e8b9dE9aa016C743880e04E517074D8cEC` (HEGIC token) |\n| Arbitrum | operationalTreasury | `0xec096ea6eB9aa5ea689b0CF00882366E92377371` |\n\n## ABI Methods\n\n### HegicABI\n\n- `payOff(uint256 positionID, address account)` - Exercise an option by ID on the OperationalTreasury; the payout goes to `account`\n\n## Notes\n\n- Simplified options UX - no order books, instant settlement\n- Supports ETH and BTC options on Arbitrum\n- Options are represented as NFTs with unique IDs\n- Exercise is only profitable if option is in-the-money at time of exercise\n",
59
+ "hop": "# Hop Protocol\n\nToken bridge for rollups using bonders for fast withdrawals. Supports ETH, USDC, USDT, DAI, and MATIC bridging across L2s.\n\n## Category\n\nbridge | Direction: L1-to-L2 (sendToL2), L2-to-L2/L1 (swapAndSend) | Chains: Ethereum (1), Arbitrum (42161), Optimism (10), Polygon (137), Base (8453)\n\n## SauceScript Functions\n\n### bridgeFromL1\n\nSend tokens from Ethereum L1 to an L2 via the Hop L1Bridge.\n\n```typescript\nimport { HopL1BridgeABI as IL1Bridge } from \"./abis\";\n\nfunction main(\n bridgeAddress: Address,\n chainId: Uint256,\n recipient: Address,\n amount: Uint256,\n amountOutMin: Uint256,\n): Uint256 {\n const bridge = IL1Bridge.at(bridgeAddress);\n bridge.sendToL2(\n chainId,\n recipient,\n amount,\n amountOutMin,\n 99999999999,\n 0x0000000000000000000000000000000000000000,\n 0,\n );\n return 1;\n}\n```\n\n- `bridgeAddress`: Token-specific L1Bridge (e.g. l1EthBridge for ETH, l1UsdcBridge for USDC)\n- `chainId`: EVM chain ID of destination L2\n- `amountOutMin`: Minimum tokens to receive after AMM swap on L2 (slippage protection)\n- `deadline`: Set to far future (99999999999) to avoid expiry\n- `relayer`/`relayerFee`: Set to zero for standard transfers\n- Requires ERC-20 approval to the L1Bridge for ERC-20 tokens, or send ETH as msg.value\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | --------------------- | -------------------------------------------- |\n| Ethereum | l1EthBridge | `0xb8901acb165ed027e32754e0ffe830802919727f` |\n| Ethereum | l1UsdcBridge | `0x3666f603Cc164936C1b87e207F36BEBa4AC5f18a` |\n| Arbitrum | l2AmmWrapper (WETH) | `0x33ceb27b39d2Bb7D2e61F7564d3Df29344020417` |\n| Optimism | l2AmmWrapper (WETH) | `0x86cA30bEF97fB651b8d866D45503684b90cb3312` |\n| Polygon | l2AmmWrapper (USDC.e) | `0x76b22b8C1079A44F1211D867D68b1eda76a635A7` |\n| Base | l2AmmWrapper (WETH) | `0x10541b07d8Ad2647Dc6cD67abd4c03575dade261` |\n\n## ABI Reference\n\n### HopL1BridgeABI\n\n- `sendToL2(uint256 chainId, address recipient, uint256 amount, uint256 amountOutMin, uint256 deadline, address relayer, uint256 relayerFee)` [payable] - Bridge tokens from L1 to L2\n\n### HopL2AmmWrapperABI\n\n- `swapAndSend(uint256 chainId, address recipient, uint256 amount, uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 destinationAmountOutMin, uint256 destinationDeadline)` [payable] - Bridge tokens from L2 to another L2 or back to L1. Swaps canonical token to hToken, sends via bonder\n\n## Notes\n\n- L1-to-L2: Uses `sendToL2` on token-specific L1Bridge contracts\n- L2-to-L2 or L2-to-L1: Uses `swapAndSend` on L2AmmWrapper (swaps canonical token to hToken for bridging)\n- Each supported token has separate bridge contracts on L1 and AMM wrappers on L2\n- Bonders provide fast liquidity on destination (minutes), settle via canonical bridge later\n- `bonderFee` on L2 must be obtained from Hop API or SDK\n- Finality: minutes with bonder, 7+ days without bonder (canonical path)\n- TVL: $50M+. Audited\n",
60
+ "hyperlane": "# Hyperlane\n\nPermissionless interchain messaging protocol. Supports modular security with ISMs (Interchain Security Modules) across 150+ chains.\n\n## Category\n\ncross-chain messaging | Direction: any-to-any | Chains: Ethereum (1), Arbitrum (42161), Optimism (10), Base (8453), Polygon (137), Avalanche (43114), BSC (56), Arc (5042)\n\n## SauceScript Functions\n\n### dispatch\n\nSend a cross-chain message via Hyperlane Mailbox.\n\n```typescript\nimport { HyperlaneMailboxABI as IMailbox } from \"./abis\";\n\nfunction main(\n mailboxAddress: Address,\n destinationDomain: Uint256,\n recipientAddress: Uint256,\n messageBody: bytes,\n): Uint256 {\n const mailbox = IMailbox.at(mailboxAddress);\n return mailbox.dispatch(destinationDomain, recipientAddress, messageBody);\n}\n```\n\n- `destinationDomain`: Hyperlane domain ID (NOT EVM chain ID). Each chain has a unique uint32 domain identifier\n- `recipientAddress`: Destination contract address as bytes32 (left-padded with zeros)\n- `messageBody`: Arbitrary message payload (bytes)\n- Requires native token (ETH) as msg.value for interchain gas payment\n- Use `quoteDispatch()` to estimate fees before sending\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| --------- | -------- | -------------------------------------------- |\n| Ethereum | mailbox | `0xc005dc82818d67AF737725bD4bf75435d065D239` |\n| Arbitrum | mailbox | `0x979Ca5202784112f4738403dBec5D0F3B9daabB9` |\n| Optimism | mailbox | `0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D` |\n| Base | mailbox | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` |\n| Polygon | mailbox | `0x5d934f4e2f797775e53561bB72aca21ba36B96BB` |\n| Avalanche | mailbox | `0xFf06aFcaABaDDd1fb08371f9ccA15D73D51FeBD6` |\n| BSC | mailbox | `0x2971b9Aec44bE4eb673DF1B88cDB57b96eefe8a4` |\n\n## ABI Reference\n\n### HyperlaneMailboxABI\n\n- `dispatch(uint32 _destinationDomain, bytes32 _recipientAddress, bytes _messageBody) returns (bytes32)` [payable] - Send interchain message. Returns message ID\n- `quoteDispatch(uint32 _destinationDomain, bytes32 _recipientAddress, bytes _messageBody) returns (uint256)` - Quote fee for dispatching a message (view)\n- `process(bytes _metadata, bytes _message)` [payable] - Process an inbound message on the destination chain (called by relayers)\n- `delivered(bytes32 _id) returns (bool)` - Check if a message has been delivered (view)\n\n## Notes\n\n- This is a messaging protocol, not a direct token bridge. Token bridging uses Warp Routes built on top of Hyperlane\n- Uses domain IDs (uint32), NOT EVM chain IDs. Common domains: Ethereum=1, Arbitrum=42161, Optimism=10 (may differ from EVM chain IDs)\n- Permissionless: anyone can deploy Hyperlane to a new chain without governance approval\n- Modular security via ISMs (Interchain Security Modules) -- apps choose their own security model\n- Use `quoteDispatch()` to estimate fees before sending\n- `delivered()` to check if a message has already been processed on the destination\n- Finality: depends on ISM configuration, typically 1-5 minutes\n- TVL: $200M+. Audited\n- On Arc (5042) interchain gas is paid in native USDC at 18 decimals, from the same balance as the USDC ERC-20 `0x3600…0000`. A transfer of the whole USDC balance cannot also pay its gas. Hyperlane's CCTP-backed USDC warp route on Arc is `0x16BF93e259ee7f7074453a2948379C35C6851b71` (its `quoteGasPayment(8453)` was about 0.054 USDC on 2026-09-28)\n",
61
+ "index": "# Sauce SDK Protocol Index\n\nMaster reference for all protocols in the Sauce SDK. Use this to find the right protocol for any DeFi operation.\n\n## SDK Usage\n\n```typescript\n// Import specific protocol\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/{slug}\";\n\n// Query the registry\nimport {\n getProtocol,\n listProtocols,\n getProtocolsByCategory,\n getProtocolsByChain,\n} from \"@eco-incorp/sauce/protocols\";\n\nconst aave = getProtocol(\"aave-v3\"); // Single protocol by slug\nconst dexes = getProtocolsByCategory(\"dex\"); // All DEXes\nconst baseProt = getProtocolsByChain(8453); // All protocols on Base\n```\n\nEach protocol module exports: `protocolInfo`, `deployments`, `abis`, and SauceScript functions.\n\n---\n\n## Protocol Registry\n\n### DEX (29 protocols)\n\n| Slug | Name | Chains | Key Operations |\n| ---------------------- | -------------------- | ----------------------------------------------- | ---------------------------------------------------------------- |\n| `uniswap-v2` | Uniswap V2 | ETH, ARB, OP, BASE, BSC, AVAX, POLY, BLAST, ARC | swap, addLiquidity, removeLiquidity |\n| `uniswap-v3` | Uniswap V3 | ETH, ARB, OP, BASE, BSC, AVAX, POLY, CELO, ARC | swap (exactInputSingle), addLiquidity (mint), removeLiquidity |\n| `uniswap-v4` | Uniswap V4 | ETH, ARB, OP, BASE, BSC, AVAX, POLY, BLAST, ARC | swap (UniversalRouter), modifyLiquidities |\n| `sushiswap-v2` | SushiSwap V2 | ETH, ARB, POLY, BSC, AVAX, FTM, OP | swap, addLiquidity, removeLiquidity |\n| `curve` | Curve Finance | ETH, ARB, OP, BASE, POLY, AVAX, FTM, GNOSIS | exchange (by index), add_liquidity, remove_liquidity |\n| `balancer-v2` | Balancer V2 | ETH, POLY, ARB, OP, GNOSIS, AVAX, BASE, BSC | swap (Vault), joinPool, exitPool, flashLoan |\n| `pancakeswap-v2` | PancakeSwap V2 | BSC, ETH, ARB, BASE, LINEA, opBNB | swap, addLiquidity, removeLiquidity |\n| `pancakeswap-v3` | PancakeSwap V3 | BSC, ETH, ARB, BASE, LINEA | swap (exactInputSingle) |\n| `velodrome` | Velodrome | OP | swap (stable/volatile routes), addLiquidity, removeLiquidity |\n| `aerodrome` | Aerodrome | BASE | swap (stable/volatile routes), addLiquidity, removeLiquidity |\n| `camelot` | Camelot | ARB | swapV2, swapV3 (exactInputSingle), addLiquidity, removeLiquidity |\n| `trader-joe` | Trader Joe | AVAX, ARB, BSC | swap (Liquidity Book path) |\n| `kyberswap` | KyberSwap | ETH, ARB, OP, POLY, BSC, AVAX, BASE, ARC | swap (Elastic + Meta Aggregation) |\n| `quickswap` | QuickSwap | POLY | swapV2, swapV3, addLiquidity, removeLiquidity |\n| `maverick` | Maverick | ETH, ARB, BASE | swap (exactInputSingle with pool+tokenAIn) |\n| `ambient` | Ambient | ETH, SCROLL | swap (CrocSwapDex) |\n| `dodo` | DODO | ETH, BSC | swap (dodoSwapV2TokenToToken) |\n| `syncswap` | SyncSwap | zkSync | swap (path-based with encoded data) |\n| `baseswap` | BaseSwap | BASE | swap, addLiquidity, removeLiquidity |\n| `thruster` | Thruster | BLAST | swap (exactInputSingle) |\n| `spookyswap` | SpookySwap | FTM | swap, addLiquidity, removeLiquidity |\n| `thena` | Thena | BSC | swap (stable/volatile routes) |\n| `ramses` | Ramses | ARB | swap (stable/volatile routes) |\n| `fenix` | Fenix | BLAST | swap (stable/volatile routes) |\n| `lynex` | Lynex | LINEA | swap (stable/volatile routes) |\n| `kim` | Kim | MODE | swap (token path, Camelot-style router) |\n| `synthra-v3` | Synthra V3 | ARC | swap (SwapRouter02 exactInputSingle) |\n| `unitflow-v3` | UnitFlow V3 | ARC | swap (exactInputSingle with deadline) |\n| `aerodrome-slipstream` | Aerodrome Slipstream | BASE, ARC | getPool (tick-spacing keyed CL pools) |\n\n### Lending (17 protocols)\n\n| Slug | Name | Chains | Key Operations |\n| ------------- | ----------- | --------------------------------------------------------------- | -------------------------------------------------------------- |\n| `aave-v3` | Aave V3 | ETH, POLY, ARB, OP, AVAX, BASE, BSC, SCROLL, FTM, GNOSIS, METIS | supply, withdraw, borrow, repay, flashLoanSimple |\n| `aave-v2` | Aave V2 | ETH, POLY, AVAX | deposit, withdraw, borrow, repay |\n| `aave-v4` | Aave V4 | ETH, BASE, AVAX, ARC | supply, withdraw, borrow, repay (Spoke, by reserve id) |\n| `compound-v3` | Compound V3 | ETH, ARB, BASE, POLY, OP, SCROLL | supply, withdraw (Comet per base asset) |\n| `compound-v2` | Compound V2 | ETH | mint, redeemUnderlying, borrow, repayBorrow (cToken) |\n| `morpho-blue` | Morpho Blue | ETH, BASE, ARC | supply, withdraw, borrow, repay, supplyCollateral |\n| `spark` | Spark | ETH | supply, withdraw, borrow, repay (Aave V3 fork, MakerDAO) |\n| `euler-v2` | Euler V2 | ETH | deposit, withdraw, borrow, repay (ERC-4626 vaults + EVC) |\n| `fluid` | Fluid | ETH, ARB | deposit, withdraw, borrow, repay (unified liquidity) |\n| `radiant` | Radiant | ARB | deposit, withdraw, borrow, repay (Aave V2 fork) |\n| `moonwell` | Moonwell | BASE | mint, redeemUnderlying, borrow, repayBorrow (Compound V2 fork) |\n| `benqi` | Benqi | AVAX | mint, redeemUnderlying, borrow, repayBorrow (Compound V2 fork) |\n| `venus` | Venus | BSC | mint, redeemUnderlying, borrow, repayBorrow (Compound V2 fork) |\n| `seamless` | Seamless | BASE | supply, withdraw, borrow, repay (Aave V3 fork + ILMs) |\n| `silo` | Silo | ETH, ARB | deposit, withdraw, borrow, repay (isolated Silos) |\n| `layerbank` | LayerBank | SCROLL | supply, redeemUnderlying, borrow, repayBorrow (via Core) |\n| `zerolend` | ZeroLend | zkSync | supply, withdraw, borrow, repay (Aave V3 fork) |\n\n### Bridges (23 protocols)\n\n| Slug | Name | Type | Key Operations |\n| ----------------- | ------------------- | ----------------------------- | ------------------------------------------- |\n| `stargate` | Stargate | Omnichain bridge (LayerZero) | swap (native asset bridging) |\n| `across` | Across | Optimistic bridge (UMA) | deposit (fast relayer fills) |\n| `hop` | Hop Protocol | Rollup bridge | sendToL2, swapAndSend |\n| `synapse` | Synapse | Multi-chain bridge + DEX | bridge, bridgeAndSwap |\n| `celer` | Celer Network | SGN bridge | send (cross-chain transfer) |\n| `connext` | Connext (Everclear) | Intent-based bridge | newIntent (cross-chain transfer) |\n| `debridge` | deBridge | DLN bridge | send (cross-chain with market makers) |\n| `lifi` | LI.FI | Bridge + DEX aggregator | swapAndBridge |\n| `socket` | Socket | Bridge aggregator | bridge (optimal route selection) |\n| `squid` | Squid Router | Cross-chain router (Axelar) | route (one-click cross-chain) |\n| `layerzero` | LayerZero | Messaging protocol | send (OFT, arbitrary messages) |\n| `wormhole` | Wormhole | Messaging protocol | transferTokens |\n| `axelar` | Axelar | Messaging protocol | callContract, sendToken |\n| `chainlink-ccip` | Chainlink CCIP | Messaging protocol | ccipSend |\n| `hyperlane` | Hyperlane | Messaging protocol | dispatch |\n| `circle-gateway` | Circle Gateway | Chain-abstracted USDC balance | deposit, gatewayMint |\n| `arbitrum-bridge` | Arbitrum Bridge | Native L2 bridge | depositETH, deposit (7-day withdrawal) |\n| `optimism-bridge` | Optimism Bridge | Native L2 bridge | depositETH, depositERC20 (7-day withdrawal) |\n| `base-bridge` | Base Bridge | Native L2 bridge | depositETH, depositERC20 (7-day withdrawal) |\n| `polygon-bridge` | Polygon Bridge | Native bridge | depositEtherFor, depositFor |\n| `scroll-bridge` | Scroll Bridge | Native zkEVM bridge | depositETH, depositERC20 (ZK finality) |\n| `linea-bridge` | Linea Bridge | Native zkEVM bridge | sendMessage (ZK finality) |\n| `zksync-bridge` | zkSync Bridge | Native zkEVM bridge | requestL2Transaction (ZK finality) |\n\n### Liquid Staking & Restaking (12 protocols)\n\n| Slug | Name | Category | Token | Key Operations |\n| ------------- | -------------- | -------------- | ------------ | ------------------------------------- |\n| `lido` | Lido | liquid-staking | stETH/wstETH | submit (stake ETH), wrap/unwrap |\n| `rocket-pool` | Rocket Pool | liquid-staking | rETH | deposit (stake ETH) |\n| `cbeth` | Coinbase cbETH | liquid-staking | cbETH | wrap/unwrap |\n| `frax-ether` | Frax Ether | liquid-staking | sfrxETH | deposit, withdraw |\n| `swell` | Swell | liquid-staking | swETH/rswETH | deposit |\n| `stader` | Stader | liquid-staking | ETHx | deposit |\n| `mantle-meth` | Mantle mETH | liquid-staking | mETH | stake |\n| `eigenlayer` | EigenLayer | restaking | - | depositIntoStrategy, queueWithdrawals |\n| `etherfi` | ether.fi | restaking | eETH/weETH | deposit, wrap |\n| `renzo` | Renzo | restaking | ezETH | deposit |\n| `kelp` | Kelp DAO | restaking | rsETH | depositAsset |\n| `puffer` | Puffer Finance | restaking | pufETH | deposit |\n\n### Yield & Vaults (10 protocols)\n\n| Slug | Name | Chains | Key Operations |\n| ----------- | ---------------- | ------------------------ | ---------------------------------------- |\n| `pendle` | Pendle | ETH, ARB, OP, BSC | swapExactTokenForPt, swapExactTokenForYt |\n| `convex` | Convex Finance | ETH | deposit, withdraw (Curve LP boosting) |\n| `yearn-v3` | Yearn V3 | ETH, ARB, BASE, POLY | deposit, withdraw (ERC-4626 vaults) |\n| `beefy` | Beefy Finance | Multi-chain | deposit, withdraw (auto-compounding) |\n| `arrakis` | Arrakis Finance | ETH, POLY, OP, ARB, BASE | deposit, withdraw (Uni V3 LP management) |\n| `gamma` | Gamma Strategies | Multi-chain | deposit, withdraw (concentrated LP) |\n| `harvest` | Harvest Finance | ETH | deposit, withdraw (auto-compounding) |\n| `sommelier` | Sommelier | ETH | deposit, withdraw (ERC-4626 Cellars) |\n| `olympus` | Olympus DAO | ETH | stake, unstake (OHM) |\n| `tokemak` | Tokemak | ETH | deposit, withdraw (Autopools) |\n\n### Derivatives (13 protocols)\n\n| Slug | Name | Category | Chains | Key Operations |\n| -------------------- | ------------------ | ---------- | --------- | ----------------------------------------- |\n| `gmx-v1` | GMX V1 | perpetuals | ARB, AVAX | swap, increasePosition, decreasePosition |\n| `gmx-v2` | GMX V2 | perpetuals | ARB | createOrder (GM markets) |\n| `synthetix-v3` | Synthetix V3 | synthetics | BASE, OP | delegateCollateral, mintUsd |\n| `gains-network` | Gains Network | perpetuals | ARB, POLY | openTrade, closeTrade (up to 1000x forex) |\n| `vertex` | Vertex | perpetuals | ARB | placeOrder (spot+perps+money markets) |\n| `level-finance` | Level Finance | perpetuals | BSC, ARB | addLiquidity, openPosition |\n| `perpetual-protocol` | Perpetual Protocol | perpetuals | OP | openPosition (vAMM) |\n| `mux-protocol` | MUX Protocol | perpetuals | ARB | openPosition (aggregated) |\n| `premia` | Premia | options | ARB | exercise, settle (v3 option pools) |\n| `hegic` | Hegic | options | ARB | createHedge (ETH/BTC options) |\n| `opyn` | Opyn | options | ETH | openVault (Squeeth power perps) |\n| `thales` | Thales | options | OP | buyFromAMM (positional markets) |\n| `aevo` | Aevo | options | Aevo L2 | deposit (off-chain orderbook) |\n\n### Aggregators (6 protocols)\n\n| Slug | Name | Chains | Key Operations |\n| ---------------------- | ------------- | ----------------------------------- | ------------------------------------ |\n| `oneinch` | 1inch | ETH, ARB, OP, BASE, BSC, AVAX, POLY | swap (optimal routing), limitOrder |\n| `paraswap` | ParaSwap | ETH, ARB, OP, BASE, BSC, AVAX, POLY | swap (multiSwap, megaSwap) |\n| `zerox` | 0x Protocol | ETH, ARB, OP, BASE, BSC, AVAX, POLY | transformERC20 |\n| `cowswap` | CoW Swap | ETH, GNOSIS, ARB | swap (batch auction, MEV protection) |\n| `openocean` | OpenOcean | Multi-chain | swap (cross-chain routing) |\n| `kyberswap-aggregator` | KyberSwap Agg | Multi-chain | swap (meta aggregation) |\n\n### CDPs & Stablecoins (10 protocols)\n\n| Slug | Name | Stablecoin | Key Operations |\n| ------------- | ------------ | ----------- | ---------------------------------------------- |\n| `maker` | Maker | DAI/USDS | open vault, draw DAI, deposit sDAI |\n| `liquity-v1` | Liquity V1 | LUSD | openTrove, closeTrove (interest-free, 110% CR) |\n| `liquity-v2` | Liquity V2 | BOLD | openTrove (user-set rates, multi-collateral) |\n| `ethena` | Ethena | USDe/sUSDe | mint USDe, stake as sUSDe |\n| `gho` | GHO | GHO | borrow GHO via Aave V3 collateral |\n| `frax` | Frax Finance | FRAX | mint/redeem FRAX, stake sFRAX |\n| `crvusd` | crvUSD | crvUSD | create_loan, repay (LLAMMA soft liquidations) |\n| `reflexer` | Reflexer | RAI | openSafe, generateDebt (non-pegged) |\n| `abracadabra` | Abracadabra | MIM | borrow MIM via Cauldrons |\n| `alchemix` | Alchemix | alUSD/alETH | deposit, borrow (self-repaying loans) |\n\n### Oracles (2 protocols)\n\n| Slug | Name | Key Operations |\n| ----------- | ------------ | ------------------------------------------------------- |\n| `chainlink` | Chainlink | latestRoundData (price feeds), requestRandomWords (VRF) |\n| `pyth` | Pyth Network | updatePriceFeeds, getPrice (pull-based oracle) |\n\n### Standards (2 protocols)\n\n| Slug | Name | Category | Key Operations |\n| --------- | -------- | -------------- | -------------------------------------------------------------------- |\n| `erc3156` | ERC-3156 | infrastructure | flashLoan, flashFee, maxFlashLoan (standard flash loan interface) |\n| `erc4626` | ERC-4626 | yield | deposit, mint, withdraw, redeem (standard tokenized vault interface) |\n\n### Infrastructure (7 protocols)\n\n| Slug | Name | Key Operations |\n| ----------- | ------------- | --------------------------------------------------------------------- |\n| `erc20` | ERC-20 | transfer, approve, transferFrom, balanceOf (standard token interface) |\n| `permit2` | Permit2 | permit, transferFrom (universal token approvals) |\n| `safe` | Safe (Gnosis) | execTransaction (multi-sig wallet) |\n| `ens` | ENS | setAddr, resolve (name resolution) |\n| `seaport` | Seaport | fulfillOrder (NFT marketplace) |\n| `gelato` | Gelato | createTask (smart contract automation) |\n| `instadapp` | Instadapp | flashLoan, getRoutes (flash loan aggregator) |\n\n### Payments & Streaming (2 protocols)\n\n| Slug | Name | Key Operations |\n| ------------ | ---------- | ---------------------------------------------- |\n| `sablier` | Sablier | createWithDurations (token streaming, vesting) |\n| `superfluid` | Superfluid | createFlow (real-time per-second payments) |\n\n---\n\n## Quick Reference by Operation\n\n### \"I need to swap tokens\"\n\n1. **Single DEX**: Use the chain's dominant DEX (Uniswap V3 on ETH, Aerodrome on BASE, Velodrome on OP, Camelot on ARB)\n2. **Best price**: Use an aggregator (`oneinch`, `paraswap`, `cowswap`, `zerox`)\n3. **Stablecoin swap**: Use `curve` for lowest slippage between pegged assets\n4. **Cross-chain swap**: Use `lifi`, `squid`, or `socket` for bridge+swap in one tx\n\n### \"I need to lend/borrow\"\n\n1. **Multi-chain**: `aave-v3` (most chains), `compound-v3` (major chains), `aave-v4` (hub-and-spoke: ETH, BASE, AVAX, ARC)\n2. **Ethereum-only**: `morpho-blue` (gas-efficient), `spark` (best DAI rates), `euler-v2` (modular)\n3. **Chain-specific**: `moonwell` (Base), `benqi` (Avalanche), `venus` (BSC), `zerolend` (zkSync)\n4. **Isolated risk**: `silo` (pair-based isolation), `morpho-blue` (market-level isolation)\n\n### \"I need to bridge tokens\"\n\n1. **Fast**: `across` (relayer-based, minutes), `stargate` (LayerZero, minutes)\n2. **Cheapest**: Native bridges (`arbitrum-bridge`, `optimism-bridge`, `base-bridge`) but 7-day withdrawals\n3. **Best route**: `lifi`, `socket`, or `squid` (bridge aggregators)\n4. **Arbitrary messages**: `layerzero`, `wormhole`, `axelar`, `chainlink-ccip`, `hyperlane`\n5. **USDC across chains**: `circle-gateway` (one USDC balance, minted on the destination by Circle attestation)\n\n### \"I need to stake ETH\"\n\n1. **Liquid staking**: `lido` (stETH, largest), `rocket-pool` (rETH, decentralized), `cbeth` (Coinbase)\n2. **Restaking**: `eigenlayer` (restake LSTs), `etherfi` (eETH), `renzo` (ezETH), `kelp` (rsETH)\n\n### \"I need yield optimization\"\n\n1. **Yield trading**: `pendle` (split PT/YT, trade future yield)\n2. **Auto-compounding**: `beefy` (multi-chain), `yearn-v3` (ETH), `convex` (Curve LP)\n3. **LP management**: `arrakis`, `gamma` (automated Uni V3 positions)\n\n### \"I need to trade perpetuals/options\"\n\n1. **Perps**: `gmx-v2` (ARB), `gains-network` (up to 1000x), `vertex` (orderbook)\n2. **Options**: `premia` (AMM), `aevo` (orderbook), `hegic` (simplified)\n\n### \"I need a stablecoin/CDP\"\n\n1. **Overcollateralized**: `maker` (DAI), `liquity-v1` (LUSD, interest-free), `crvusd` (soft liquidations)\n2. **Synthetic dollar**: `ethena` (USDe, delta-neutral), `frax` (FRAX)\n3. **Self-repaying**: `alchemix` (alUSD/alETH)\n\n---\n\n## Chain Coverage\n\n| Chain | Chain ID | Top Protocols |\n| --------- | -------- | ------------------------------------------------------------------------------------- |\n| Ethereum | 1 | uniswap-v3, aave-v3, curve, balancer-v2, lido, maker, morpho-blue |\n| Arbitrum | 42161 | uniswap-v3, aave-v3, gmx-v2, camelot, radiant, silo |\n| Base | 8453 | aerodrome, uniswap-v3, aave-v3, compound-v3, moonwell, seamless |\n| Optimism | 10 | velodrome, uniswap-v3, aave-v3, synthetix-v3, thales |\n| Polygon | 137 | quickswap, aave-v3, uniswap-v3, compound-v3, balancer-v2 |\n| BSC | 56 | pancakeswap-v2, venus, thena, pancakeswap-v3, dodo |\n| Avalanche | 43114 | trader-joe, aave-v3, benqi, curve, sushiswap-v2 |\n| Blast | 81457 | thruster, fenix, uniswap-v4 |\n| zkSync | 324 | syncswap, zerolend |\n| Scroll | 534352 | ambient, layerbank, aave-v3 |\n| Fantom | 250 | spookyswap, sushiswap-v2, aave-v3 |\n| Linea | 59144 | lynex, pancakeswap-v3 |\n| Mode | 34443 | kim |\n| Arc | 5042 | uniswap-v3, uniswap-v4, aave-v4, morpho-blue, circle-gateway, synthra-v3, unitflow-v3 |\n\n---\n\n## Per-Protocol Skill Files\n\nDetailed skill files with SauceScript examples, contract addresses, and ABI signatures are at:\n`@eco-incorp/sauce/skills/{slug}.md` (or `sdk/src/skills/{slug}.md` in the repo)\n\nLoad the specific protocol file when you need full implementation details.\n",
62
+ "instadapp": "# Instadapp\n\nFlash loan aggregator that routes across Aave, Maker, Balancer and other sources to find the cheapest flash loan.\n\n## Category\n\ninfrastructure | Chains: Ethereum\n\n## Key Operations\n\n- **getRoutes**: Query available flash loan routes and their IDs\n- **flashLoan**: Execute a flash loan via optimal route\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/instadapp\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Get available flash loan routes\nimport { FlashAggregatorABI as IFlashAggregator } from \"./abis\";\nfunction main(aggregatorAddress: Address): Uint256 {\n const aggregator = IFlashAggregator.at(aggregatorAddress);\n aggregator.getRoutes();\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------------- | -------------------------------------------- |\n| Ethereum | flashloanAggregator | `0xE6054aE0Dba269560061D736e7510Ce64fCD517d` |\n\n## ABI Methods\n\n### FlashAggregatorABI\n\n- `flashLoan(address[],uint256[],uint256,bytes,bytes)` - Execute flash loan. Params: tokens (array of token addresses), amounts (array of borrow amounts), route (route ID from getRoutes), data (callback data for the receiver), extraData (additional route-specific data)\n- `getRoutes()` - List available flash loan routes. Returns routes (uint16[] of available route IDs). Pure function\n\n## Notes\n\n- Aggregates flash loans from: Aave V2/V3, Maker, Balancer, Compound, and others\n- Each route has a different fee structure - use getRoutes to find available options\n- route parameter selects which underlying protocol to borrow from\n- Callback pattern: your contract must implement the receiver interface to repay\n- Flash loans must be repaid within the same transaction (atomic)\n",
63
+ "kelp": "# Kelp DAO\n\nLiquid restaking protocol built on EigenLayer. Deposit LSTs (stETH, ETHx, etc.) and receive rsETH, a non-rebasing liquid restaked token.\n\n## Category\n\nrestaking | Chains: Ethereum\n\n## Key Operations\n\n- **depositAsset**: Deposit LST to receive rsETH\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/kelp\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit LST for rsETH\nimport { LRTDepositPoolABI as ILRTDepositPool } from \"./abis\";\nfunction main(\n depositPoolAddress: Address,\n asset: Address,\n depositAmount: Uint256,\n minRSETHAmountExpected: Uint256,\n): Uint256 {\n const pool = ILRTDepositPool.at(depositPoolAddress);\n pool.depositAsset(asset, depositAmount, minRSETHAmountExpected, \"\");\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------------- | -------------------------------------------- |\n| Ethereum | rsETH | `0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7` |\n| Ethereum | lrtDepositPool | `0x036676389e48133B63a802f8635AD39E752D375D` |\n\n## ABI Methods\n\n### LRTDepositPoolABI\n\n- `depositAsset(address,uint256,uint256,string)` - Deposit LST for rsETH. Params: asset address, deposit amount, minimum rsETH expected, referral string (pass empty \"\")\n- `getRsETHAmountToMint(address,uint256)` - Preview rsETH amount for a given LST deposit\n\n### RsETHABI\n\n- `balanceOf(address)` - Query rsETH balance\n- `approve(address,uint256)` - Approve rsETH spending\n\n## Notes\n\n- TVL: $2B+. Accepts stETH, ETHx, and other LSTs\n- Approve the LST to lrtDepositPool before depositing\n- minRSETHAmountExpected provides slippage protection\n- Use getRsETHAmountToMint() to preview output before depositing\n",
64
+ "kim": "# Kim\n\nMode-native DEX. Its V2 router is a Camelot fork: swaps take a plain token path and a referrer, and support fee-on-transfer tokens. The primary trading venue on Mode Network with farming incentives.\n\n## Category\n\ndex | Chains: Mode\n\n## Key Operations\n\n- **swap**: Swap tokens along a token path\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/kim\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { KimRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenIn: Address,\n tokenOut: Address,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256 {\n const router = IRouter.at(routerAddress);\n router.swapExactTokensForTokensSupportingFeeOnTransferTokens(\n amountIn,\n amountOutMin,\n [tokenIn, tokenOut],\n recipient,\n 0x0000000000000000000000000000000000000000,\n 99999999999,\n );\n return 1;\n}\n```\n\n- `routerAddress`: Kim Router on Mode (`0x5D61c537393cf21893BE619E36fC94cd73C77DD3`)\n- `tokenIn` / `tokenOut`: Input and output token addresses; a longer path swaps through intermediate tokens\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n- The swap returns nothing: measure the output as the recipient's balance change\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| ----- | --------- | -------------------------------------------- |\n| Mode | V2 Router | `0x5D61c537393cf21893BE619E36fC94cd73C77DD3` |\n\n## ABI Methods\n\n### KimRouterABI\n\n- `swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, address referrer, uint256 deadline)` - Swap along a token path. `referrer` may be the zero address\n- `addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB, uint256 liquidity)` - Add liquidity to a pair\n\n## Notes\n\n- Mode-only deployment; the dominant DEX on Mode Network\n- Mode Network features native yield sharing via Sequencer Fee Sharing (SFS)\n- LP tokens can be staked for farming rewards\n- Input token must be ERC20-approved to the Router\n",
65
+ "kyberswap-aggregator": "# KyberSwap Aggregator\n\nMeta aggregator that routes through multiple aggregators and DEXes for optimal swap execution.\n\n## Category\n\naggregator | Chains: Ethereum, Arbitrum, BSC, Polygon, Optimism, Avalanche, Base, Fantom, Linea, Scroll, zkSync, Arc\n\n## Key Operations\n\n- **swap**: Execute swap via meta aggregation router\n\n## SDK Usage\n\n```typescript\nimport {\n protocolInfo,\n deployments,\n sauceFunctions,\n} from \"@eco-incorp/sauce/protocols/kyberswap-aggregator\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Swap via KyberSwap meta aggregator\nimport { KyberSwapMetaAggregationRouterABI as IMetaAggregationRouter } from \"./abis\";\nfunction main(\n routerAddress: Address,\n callTarget: Address,\n approveTarget: Address,\n targetData: bytes,\n srcToken: Address,\n dstToken: Address,\n dstReceiver: Address,\n amount: Uint256,\n minReturnAmount: Uint256,\n clientData: bytes,\n): { returnAmount: Uint256; gasUsed: Uint256 } {\n const router = IMetaAggregationRouter.at(routerAddress);\n return router.swap({\n callTarget: callTarget,\n approveTarget: approveTarget,\n targetData: targetData,\n desc: {\n srcToken: srcToken,\n dstToken: dstToken,\n srcReceivers: [],\n srcAmounts: [],\n feeReceivers: [],\n feeAmounts: [],\n dstReceiver: dstReceiver,\n amount: amount,\n minReturnAmount: minReturnAmount,\n flags: 0,\n permit: 0x00,\n },\n clientData: clientData,\n });\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| ------------- | --------------------- | -------------------------------------------- |\n| 11 EVM chains | metaAggregationRouter | `0x6131B5fae19EA4f9D964eAc0408E4408b66337b5` |\n| zkSync | metaAggregationRouter | `0x3F95eF3f2eAca871858dbE20A93c01daF6C2e923` |\n\n## ABI Methods\n\n### KyberSwapMetaAggregationRouterABI\n\n- `swap(tuple)` - Execute meta-aggregated swap. Payable. Returns (returnAmount, gasUsed). Execution tuple:\n - `callTarget` (address) - Underlying aggregator/DEX contract to call\n - `approveTarget` (address) - Contract to approve tokens to (may differ from callTarget)\n - `targetData` (bytes) - Calldata for the underlying aggregator\n - `desc` (tuple) - Swap description:\n - `srcToken`, `dstToken` - Token addresses\n - `srcReceivers` (address[]), `srcAmounts` (uint256[]) - Fee split receivers/amounts\n - `feeReceivers` (address[]), `feeAmounts` (uint256[]) - Additional fee receivers\n - `dstReceiver` - Output token recipient\n - `amount` - Input amount\n - `minReturnAmount` - Minimum output (slippage protection)\n - `flags` - Behavior flags\n - `permit` (bytes) - EIP-2612 permit data\n - `clientData` (bytes) - Client tracking data\n\n## Notes\n\n- TVL: $500M+. Same address on 11 of its 12 chains; zkSync's differs\n- Meta-aggregates across 1inch, 0x, ParaSwap, and other aggregators\n- Route computation via KyberSwap API - callTarget/targetData come from API response\n- Approve srcToken to metaAggregationRouter before swapping\n- On Arc (5042) the router at this address is a smaller build than Ethereum's (13724 vs 18652 bytes, a different owner, no `swapGeneric`/whitelist functions). Its `swap` has the same selector, struct and outputs (Blockscout-verified `MetaAggregationRouterV2`), and Kyber's Arc API builds calldata that decodes under this ABI. Native input uses the `0xEeee…EEeE` sentinel with `msg.value` in Arc's 18-decimal native USDC; Kyber's own routes use the ERC-20 `0x3600…0000` with 6-decimal amounts\n",
66
+ "kyberswap": "# KyberSwap\n\nMulti-chain DEX with concentrated liquidity protocol (KyberSwap Elastic) and a meta-aggregation router that routes across multiple DEXes for best execution. Features dynamic fees and anti-sniping protection.\n\n## Category\n\ndex | Chains: Ethereum, Arbitrum, Optimism, Polygon, BSC, Avalanche, Base, Arc\n\n## Key Operations\n\n- **swap**: Exact input single swap via Elastic Router (concentrated liquidity)\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/kyberswap\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { KyberSwapElasticRouterABI as IElasticRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenIn: Address,\n tokenOut: Address,\n fee: Uint256,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256 {\n const router = IElasticRouter.at(routerAddress);\n return router.swapExactInputSingle({\n tokenIn: tokenIn,\n tokenOut: tokenOut,\n fee: fee,\n recipient: recipient,\n deadline: 99999999999,\n amountIn: amountIn,\n minAmountOut: amountOutMin,\n limitSqrtP: 0,\n });\n}\n```\n\n- `routerAddress`: KyberSwap Elastic Router address (`0xC1e7dFE73E1598E3910EF4C7845B68A9Ab6F4c83` on every listed chain except Base, which has no Elastic deployment here)\n- `tokenIn` / `tokenOut`: Input and output token addresses\n- `fee`: Pool fee tier (similar to Uniswap V3 but with KyberSwap's own tiers)\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection (named `minAmountOut` not `amountOutMinimum`)\n- `recipient`: Address to receive output tokens\n- `limitSqrtP`: Price limit (set to `0` for no limit; named `limitSqrtP` not `sqrtPriceLimitX96`)\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| --------- | ------------------ | -------------------------------------------- |\n| Ethereum | Elastic Factory | `0xC7a590291e07B9fe9E64b86c58fD8fC764308C4A` |\n| Ethereum | Elastic Router | `0xC1e7dFE73E1598E3910EF4C7845B68A9Ab6F4c83` |\n| Ethereum | Meta Agg Router V2 | `0x6131B5fae19EA4f9D964eAc0408E4408b66337b5` |\n| Arbitrum | Elastic Factory | `0x5F1dddbf348aC2fbe22a163e30F99F9ECE3DD50a` |\n| Arbitrum | Elastic Router | `0xC1e7dFE73E1598E3910EF4C7845B68A9Ab6F4c83` |\n| Arbitrum | Meta Agg Router V2 | `0x6131B5fae19EA4f9D964eAc0408E4408b66337b5` |\n| Optimism | Elastic Factory | `0x5F1dddbf348aC2fbe22a163e30F99F9ECE3DD50a` |\n| Optimism | Elastic Router | `0xC1e7dFE73E1598E3910EF4C7845B68A9Ab6F4c83` |\n| Optimism | Meta Agg Router V2 | `0x6131B5fae19EA4f9D964eAc0408E4408b66337b5` |\n| Polygon | Elastic Factory | `0x5F1dddbf348aC2fbe22a163e30F99F9ECE3DD50a` |\n| Polygon | Elastic Router | `0xC1e7dFE73E1598E3910EF4C7845B68A9Ab6F4c83` |\n| Polygon | Meta Agg Router V2 | `0x6131B5fae19EA4f9D964eAc0408E4408b66337b5` |\n| BSC | Elastic Factory | `0x5F1dddbf348aC2fbe22a163e30F99F9ECE3DD50a` |\n| BSC | Elastic Router | `0xC1e7dFE73E1598E3910EF4C7845B68A9Ab6F4c83` |\n| BSC | Meta Agg Router V2 | `0x6131B5fae19EA4f9D964eAc0408E4408b66337b5` |\n| Avalanche | Elastic Factory | `0x5F1dddbf348aC2fbe22a163e30F99F9ECE3DD50a` |\n| Avalanche | Elastic Router | `0xC1e7dFE73E1598E3910EF4C7845B68A9Ab6F4c83` |\n| Avalanche | Meta Agg Router V2 | `0x6131B5fae19EA4f9D964eAc0408E4408b66337b5` |\n| Base | Meta Agg Router V2 | `0x6131B5fae19EA4f9D964eAc0408E4408b66337b5` |\n| Arc | Meta Agg Router V2 | `0x6131B5fae19EA4f9D964eAc0408E4408b66337b5` |\n\n## ABI Methods\n\n### KyberSwapElasticRouterABI\n\n- `swapExactInputSingle(tuple(address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 minAmountOut, uint160 limitSqrtP)) -> uint256 amountOut` - Single-hop exact input swap via Elastic pools\n\n### KyberSwapMetaAggregationRouterABI\n\n- `swap(tuple(address callTarget, address approveTarget, bytes targetData, tuple(address srcToken, address dstToken, address[] srcReceivers, uint256[] srcAmounts, address[] feeReceivers, uint256[] feeAmounts, address dstReceiver, uint256 amount, uint256 minReturnAmount, uint256 flags, bytes permit) desc, bytes clientData)) -> (uint256 returnAmount, uint256 gasUsed)` - Execute a swap via the meta-aggregation router (routes across multiple DEXes for best price). The execution struct comes from the KyberSwap API\n\n## Notes\n\n- Elastic Router naming differs from Uniswap V3: `minAmountOut` (not `amountOutMinimum`), `limitSqrtP` (not `sqrtPriceLimitX96`)\n- The Elastic Router address is the same on its 6 chains, and the Meta Agg Router address on all 8\n- Meta Aggregation Router routes across multiple DEXes (not just KyberSwap pools) for best execution price\n- The `data` field in the Meta Agg Router swap must be pre-encoded from KyberSwap's API\n- Input token must be ERC20-approved to the Elastic Router for direct swaps\n- For Meta Agg swaps, approve to the `approveTarget` address returned by the API\n- On Arc (5042) only the Meta Aggregation Router is deployed (no Elastic), and it is a smaller build than Ethereum's at the same address: 13724 vs 18652 bytes, a different owner, and no `swapGeneric`/whitelist functions. Its `swap` has the same selector, struct and outputs (Blockscout-verified `MetaAggregationRouterV2`), and Kyber's Arc API builds calldata that decodes under this ABI. Native input uses the `0xEeee…EEeE` sentinel with `msg.value` in Arc's 18-decimal native USDC; Kyber's own routes use the ERC-20 `0x3600…0000` with 6-decimal amounts\n",
67
+ "layerbank": "# LayerBank\n\nLeading lending protocol on Scroll. Compound-style markets (lTokens), but every user action goes through the Core contract, which names the market.\n\n## Category\n\nlending | Chains: Scroll (534352)\n\n## SauceScript Functions\n\n### supply\n\nSupply underlying to a market through Core; Core mints the lTokens to the caller.\n\n```typescript\nimport { LayerBankCoreABI as ICore } from \"./abis\";\n\nfunction main(coreAddress: Address, lTokenAddress: Address, amount: Uint256): Uint256 {\n const core = ICore.at(coreAddress);\n return core.supply(lTokenAddress, amount);\n}\n```\n\n- `lTokenAddress`: The lToken market contract (each asset has its own lToken)\n- Returns the lTokens minted\n- Requires ERC-20 approval of underlying to the lToken\n\n### withdraw\n\nRedeem an exact amount of underlying.\n\n```typescript\nimport { LayerBankCoreABI as ICore } from \"./abis\";\n\nfunction main(coreAddress: Address, lTokenAddress: Address, amount: Uint256): Uint256 {\n const core = ICore.at(coreAddress);\n return core.redeemUnderlying(lTokenAddress, amount);\n}\n```\n\n### borrow\n\nBorrow from a market against entered collateral.\n\n```typescript\nimport { LayerBankCoreABI as ICore } from \"./abis\";\n\nfunction main(coreAddress: Address, lTokenAddress: Address, amount: Uint256): Uint256 {\n const core = ICore.at(coreAddress);\n core.borrow(lTokenAddress, amount);\n return 1;\n}\n```\n\n- Must enable collateral via `core.enterMarkets([lTokenAddress])` first\n\n### repay\n\nRepay borrowed assets.\n\n```typescript\nimport { LayerBankCoreABI as ICore } from \"./abis\";\n\nfunction main(coreAddress: Address, lTokenAddress: Address, amount: Uint256): Uint256 {\n const core = ICore.at(coreAddress);\n core.repayBorrow(lTokenAddress, amount);\n return 1;\n}\n```\n\n- Requires ERC-20 approval of underlying to the lToken\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| ------ | -------- | -------------------------------------------- |\n| Scroll | core | `0xEC53c830f4444a8A56455c6836b5D2aA794289Aa` |\n\n## ABI Reference\n\n### LayerBankCoreABI\n\n- `enterMarkets(address[] lTokens)` - Enable lTokens as collateral\n- `exitMarket(address lToken)` - Remove lToken from collateral\n- `supply(address lToken, uint256 uAmount) returns (uint256)` [payable] - Supply underlying, receive lTokens\n- `redeemToken(address lToken, uint256 lAmount) returns (uint256)` - Redeem lTokens for underlying\n- `redeemUnderlying(address lToken, uint256 uAmount) returns (uint256)` - Redeem an exact underlying amount\n- `borrow(address lToken, uint256 amount)` - Borrow underlying\n- `repayBorrow(address lToken, uint256 amount)` [payable] - Repay borrow debt\n\n### LTokenABI (read side)\n\n- `balanceOf(address account) returns (uint256)` - lToken balance\n- `underlyingBalanceOf(address account) returns (uint256)` - Underlying value of the balance\n- `borrowBalanceOf(address account) returns (uint256)` - Outstanding borrow\n- `exchangeRate() returns (uint256)` - lToken/underlying exchange rate\n- `underlying() returns (address)` - The market's underlying token\n\n## Notes\n\n- Unlike Compound V2, the lToken's own supply/borrow/redeem functions are callable only by Core\n- Must call `enterMarkets` on Core before borrowing against any market\n- Scroll-only deployment. TVL: $200M+. Audited\n",
68
+ "layerzero": "# LayerZero\n\nOmnichain interoperability protocol enabling cross-chain messaging. Powers OFT tokens and arbitrary message passing across 50+ chains.\n\n## Category\n\ncross-chain messaging | Direction: any-to-any | Chains: Ethereum (1), Arbitrum (42161), Optimism (10), Base (8453), Polygon (137), BSC (56), Avalanche (43114), zkSync (324), Linea (59144), Scroll (534352), Arc (5042)\n\n## SauceScript Functions\n\n### sendMessage\n\nSend a cross-chain message via LayerZero Endpoint V2.\n\n```typescript\nimport { LayerZeroEndpointV2ABI as IEndpointV2 } from \"./abis\";\n\nfunction main(\n endpointAddress: Address,\n dstEid: Uint256,\n receiver: Uint256,\n message: bytes,\n): { guid: Uint256; nonce: Uint256; fee: { nativeFee: Uint256; lzTokenFee: Uint256 } } {\n const endpoint = IEndpointV2.at(endpointAddress);\n return endpoint.send(\n { dstEid: dstEid, receiver: receiver, message: message, options: 0x00, payInLzToken: false },\n ctx.msgSender(),\n );\n}\n```\n\n- `dstEid`: LayerZero endpoint ID for destination chain (NOT the EVM chain ID)\n- `receiver`: Destination contract address as bytes32 (left-padded)\n- `message`: Arbitrary message payload\n- `options`: Execution options (gas limits, etc.). Use `0x00` for defaults\n- `payInLzToken`: false = pay fees in native token, true = pay in ZRO token\n- Requires native token (ETH) for messaging fees (sent as msg.value)\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| --------- | ---------- | -------------------------------------------- |\n| Ethereum | endpointV2 | `0x1a44076050125825900e736c501f859c50fE728c` |\n| Arbitrum | endpointV2 | `0x1a44076050125825900e736c501f859c50fE728c` |\n| Optimism | endpointV2 | `0x1a44076050125825900e736c501f859c50fE728c` |\n| Base | endpointV2 | `0x1a44076050125825900e736c501f859c50fE728c` |\n| Polygon | endpointV2 | `0x1a44076050125825900e736c501f859c50fE728c` |\n| BSC | endpointV2 | `0x1a44076050125825900e736c501f859c50fE728c` |\n| Avalanche | endpointV2 | `0x1a44076050125825900e736c501f859c50fE728c` |\n| zkSync | endpointV2 | `0xd07C30aF3Ff30D96BDc9c6044958230Eb797DDBF` |\n| Linea | endpointV2 | `0x1a44076050125825900e736c501f859c50fE728c` |\n| Scroll | endpointV2 | `0x1a44076050125825900e736c501f859c50fE728c` |\n\n## ABI Reference\n\n### LayerZeroEndpointV2ABI\n\n- `send(MessagingParams _params, address _refundAddress) returns (MessagingReceipt receipt)` [payable] - Send omnichain message. Pay fees as msg.value (native token)\n- `quote(MessagingParams _params, address _sender) returns (MessagingFee fee)` - Quote messaging fee before sending (view)\n\nMessagingParams tuple: `(uint32 dstEid, bytes32 receiver, bytes message, bytes options, bool payInLzToken)`\nMessagingFee tuple: `(uint256 nativeFee, uint256 lzTokenFee)`\n\n## Notes\n\n- This is a messaging protocol, not a direct token bridge. Token bridging is done via OFT (Omnichain Fungible Token) contracts built on top of LayerZero\n- Uses endpoint IDs (dstEid) for chain identification, NOT EVM chain IDs\n- Same endpoint address across most chains (except zkSync)\n- Use `quote` to estimate fees before sending\n- Finality: depends on DVN (Decentralized Verifier Network) configuration, typically 1-5 minutes\n- Powers Stargate V2, OFT tokens, and many cross-chain dApps\n- TVL: $5B+ (across protocols built on LayerZero). Audited\n- On Arc (5042, eid 30417) the messaging fee `msg.value` is native USDC at 18 decimals, from the same balance as the USDC ERC-20 `0x3600…0000`\n",
69
+ "level-finance": "# Level Finance\n\nDecentralized perpetual exchange with risk-tranched liquidity pools. Senior (low risk), Mezzanine (medium), and Junior (high risk/reward) tranches.\n\n## Category\n\nperpetuals | Chains: BSC, Arbitrum\n\n## Key Operations\n\n- **addLiquidity**: Add liquidity to a specific risk tranche\n- **removeLiquidity**: Remove liquidity from a tranche\n\n## SDK Usage\n\n```typescript\nimport {\n protocolInfo,\n deployments,\n sauceFunctions,\n} from \"@eco-incorp/sauce/protocols/level-finance\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Add liquidity to tranche\nimport { LiquidityPoolABI as ILiquidityPool } from \"./abis\";\nfunction main(\n poolAddress: Address,\n tranche: Address,\n token: Address,\n amountIn: Uint256,\n minLpAmount: Uint256,\n to: Address,\n): Uint256 {\n const pool = ILiquidityPool.at(poolAddress);\n pool.addLiquidity(tranche, token, amountIn, minLpAmount, to);\n return 1;\n}\n\n// Remove liquidity from tranche\nimport { LiquidityPoolABI as ILiquidityPool } from \"./abis\";\nfunction main(\n poolAddress: Address,\n tranche: Address,\n tokenOut: Address,\n lpAmount: Uint256,\n minOut: Uint256,\n to: Address,\n): Uint256 {\n const pool = ILiquidityPool.at(poolAddress);\n pool.removeLiquidity(tranche, tokenOut, lpAmount, minOut, to);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------- | -------------------------------------------- |\n| BSC | liquidityPool | `0xA5aBFB56a78D2BD4689b25B8A77fd49Bb0675874` |\n| Arbitrum | liquidityPool | `0x32B7bF19cb8b95C27E644183837813d4b595dcc6` |\n\n## ABI Methods\n\n### LiquidityPoolABI\n\n- `addLiquidity(address,address,uint256,uint256,address)` - Add liquidity. Params: tranche address, token, amountIn, minLpAmount, to (receives the LP tokens)\n- `removeLiquidity(address,address,uint256,uint256,address)` - Remove liquidity. Params: tranche, tokenOut, lpAmount, minOut, to (receives tokenOut)\n- `swap(address,address,uint256,address,bytes)` - Swap tokens. Params: tokenIn, tokenOut, minOut, to, extradata\n\n## Notes\n\n- Risk-tranched pools: Senior (low risk, lower yield), Mezzanine (medium), Junior (high risk, higher yield)\n- Each tranche has its own LP token address\n- Approve input token to liquidityPool before adding liquidity\n- minLpAmount/minOut provide slippage protection\n",
70
+ "lido": "# Lido\n\nThe largest liquid staking protocol for Ethereum. Stake ETH and receive stETH, a rebasing liquid staking token. wstETH is the non-rebasing wrapped version for DeFi composability.\n\n## Category\n\nliquid-staking | Chains: Ethereum, Arbitrum\n\n## Key Operations\n\n- **submit**: Stake ETH and receive stETH (rebasing)\n- **wrap**: Wrap stETH into wstETH (non-rebasing, DeFi-compatible)\n- **unwrap**: Unwrap wstETH back to stETH\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/lido\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Stake ETH for stETH\nimport { LidoABI as ILido } from \"./abis\";\nfunction main(lidoAddress: Address): Uint256 {\n const lido = ILido.at(lidoAddress);\n return lido.submit(0x0000000000000000000000000000000000000000);\n}\n\n// Wrap stETH to wstETH\nimport { WstETHABI as IWstETH } from \"./abis\";\nfunction main(wstethAddress: Address, amount: Uint256): Uint256 {\n const wsteth = IWstETH.at(wstethAddress);\n return wsteth.wrap(amount);\n}\n\n// Unwrap wstETH to stETH\nimport { WstETHABI as IWstETH } from \"./abis\";\nfunction main(wstethAddress: Address, amount: Uint256): Uint256 {\n const wsteth = IWstETH.at(wstethAddress);\n return wsteth.unwrap(amount);\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------------------------------------------------------- |\n| Ethereum | stETH | `0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84` |\n| Ethereum | wstETH | `0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0` |\n| Arbitrum | wstETH | `0x5979D7b546E38E414F7E9822514be443A4800529` (bridged token: transfers only, no wrap/unwrap) |\n\n## ABI Methods\n\n### LidoABI (stETH)\n\n- `submit(address)` - Stake ETH (payable), receive stETH. Address param is referral (use zero address). Send ETH as msg.value\n- `balanceOf(address)` - Query stETH balance (rebases daily)\n- `approve(address,uint256)` - Approve stETH spending\n\n### WstETHABI\n\n- `wrap(uint256)` - Wrap stETH amount into wstETH. Requires stETH approval first\n- `unwrap(uint256)` - Unwrap wstETH amount back to stETH\n- `getStETHByWstETH(uint256)` - Preview stETH amount for wstETH input\n- `getWstETHByStETH(uint256)` - Preview wstETH amount for stETH input\n\n## Notes\n\n- TVL: $27.5B+. Largest DeFi protocol by TVL\n- stETH rebases daily (balance increases). wstETH does not rebase (exchange rate increases instead)\n- Always use wstETH for DeFi integrations (Aave, Uniswap, etc.) since rebasing tokens cause issues\n- submit() requires ETH sent as msg.value. The referral parameter can be zero address\n- Approve stETH to wstETH contract before calling wrap()\n",
71
+ "lifi": "# LI.FI\n\nMulti-chain bridge and DEX aggregator via LiFiDiamond proxy. Routes through optimal bridges and DEXes for cross-chain swaps.\n\n## Category\n\nbridge aggregator | Direction: any-to-any | Chains: Ethereum (1), Arbitrum (42161), Optimism (10), Base (8453), Polygon (137), BSC (56), Avalanche (43114), Gnosis (100), Fantom (250), Arc (5042)\n\n## SauceScript Functions\n\n### bridge\n\nBridge tokens cross-chain via the LI.FI Diamond's Across V4 facet. Each underlying bridge has its own facet entry point (`startBridgeTokensVia<Bridge>`), with a bridge-specific second struct.\n\n```typescript\nimport { LiFiDiamondABI as ILiFiDiamond } from \"./abis\";\n\nfunction main(\n diamondAddress: Address,\n transactionId: Uint256,\n sendingAsset: Address,\n receivingAsset: Address,\n receiver: Address,\n amount: Uint256,\n outputAmount: Uint256,\n destinationChainId: Uint256,\n quoteTimestamp: Uint256,\n fillDeadline: Uint256,\n): Uint256 {\n const lifi = ILiFiDiamond.at(diamondAddress);\n lifi.startBridgeTokensViaAcrossV4(\n {\n transactionId: transactionId,\n bridge: \"acrossV4\",\n integrator: \"sauce\",\n referrer: 0x0000000000000000000000000000000000000000,\n sendingAssetId: sendingAsset,\n receiver: receiver,\n minAmount: amount,\n destinationChainId: destinationChainId,\n hasSourceSwaps: false,\n hasDestinationCall: false,\n },\n {\n receiverAddress: receiver,\n refundAddress: receiver,\n sendingAssetId: sendingAsset,\n receivingAssetId: receivingAsset,\n outputAmount: outputAmount,\n outputAmountMultiplier: 0,\n exclusiveRelayer: 0,\n quoteTimestamp: quoteTimestamp,\n fillDeadline: fillDeadline,\n exclusivityParameter: 0,\n message: \"\",\n },\n );\n return 1;\n}\n```\n\n- `transactionId`: Unique identifier for tracking this bridge transaction (bytes32)\n- `integrator`: Integration partner identifier (e.g. \"sauce\")\n- `referrer`: Referral address for fee sharing. `address(0)` for none\n- `sendingAssetId` / `receivingAssetId`: token sent, and token received on the destination\n- `minAmount` / `outputAmount`: amount bridged, and the amount the Across relayer delivers\n- `quoteTimestamp` / `fillDeadline`: the Across quote's timestamp and fill deadline\n- `hasSourceSwaps` / `hasDestinationCall`: `true` only with pre-bridge swaps or a destination call\n- Requires ERC-20 approval to the LiFi Diamond\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| --------- | ----------- | -------------------------------------------- |\n| Ethereum | lifiDiamond | `0x1231DEB6f5749EF6cE6943a275A1D3E7486F4EaE` |\n| Arbitrum | lifiDiamond | `0x1231DEB6f5749EF6cE6943a275A1D3E7486F4EaE` |\n| Optimism | lifiDiamond | `0x1231DEB6f5749EF6cE6943a275A1D3E7486F4EaE` |\n| Base | lifiDiamond | `0x1231DEB6f5749EF6cE6943a275A1D3E7486F4EaE` |\n| Polygon | lifiDiamond | `0x1231DEB6f5749EF6cE6943a275A1D3E7486F4EaE` |\n| BSC | lifiDiamond | `0x1231DEB6f5749EF6cE6943a275A1D3E7486F4EaE` |\n| Avalanche | lifiDiamond | `0x1231DEB6f5749EF6cE6943a275A1D3E7486F4EaE` |\n| Gnosis | lifiDiamond | `0x1231DEB6f5749EF6cE6943a275A1D3E7486F4EaE` |\n| Fantom | lifiDiamond | `0x1231DEB6f5749EF6cE6943a275A1D3E7486F4EaE` |\n\n## ABI Reference\n\n### LiFiDiamondABI\n\n- `startBridgeTokensViaAcrossV4(BridgeData _bridgeData, AcrossV4Data _acrossData)` [payable] - Bridge through Across V4 (AcrossFacetV4)\n- `extractBridgeData(bytes data) returns (BridgeData bridgeData)` - Decode bridge data from raw calldata (pure)\n\nAcrossV4Data tuple: `(bytes32 receiverAddress, bytes32 refundAddress, bytes32 sendingAssetId, bytes32 receivingAssetId, uint256 outputAmount, uint128 outputAmountMultiplier, bytes32 exclusiveRelayer, uint32 quoteTimestamp, uint32 fillDeadline, uint32 exclusivityParameter, bytes message)`\n\nBridgeData tuple: `(bytes32 transactionId, string bridge, string integrator, address referrer, address sendingAssetId, address receiver, uint256 minAmount, uint256 destinationChainId, bool hasSourceSwaps, bool hasDestinationCall)`\n\n## Notes\n\n- LI.FI is a bridge **aggregator** -- it routes through underlying bridges (Across, Stargate, Hop, cBridge, etc.)\n- Uses a Diamond proxy pattern (EIP-2535) so the contract address is the same across all chains\n- Same Diamond address (`0x1231DEB6...`) deployed on all supported chains\n- Uses standard EVM chain IDs for `destinationChainId`\n- The `bridge` field in BridgeData specifies which underlying bridge to use\n- `hasSourceSwaps` / `hasDestinationCall` enable swap-then-bridge or bridge-then-execute patterns\n- Requires ERC-20 approval to the LiFi Diamond address\n- Finality depends on the underlying bridge selected (varies from 1 minute to 20 minutes)\n- TVL: $300M+. Audited\n",
72
+ "linea-bridge": "# Linea Native Bridge\n\nOfficial Linea zkEVM bridge via L1MessageService. Deposits ETH from Ethereum to Linea with ZK proof-based finality.\n\n## Category\n\nnative L2 bridge | Direction: L1 to L2 (Ethereum to Linea) | Chains: Ethereum (1), Linea (59144)\n\n## SauceScript Functions\n\n### bridgeETH\n\nBridge ETH from Ethereum L1 to Linea L2 via the message service.\n\n```typescript\nimport { LineaL1MessageServiceABI as IL1MessageService } from \"./abis\";\n\nfunction main(messageServiceAddress: Address, recipient: Address, fee: Uint256): Uint256 {\n const service = IL1MessageService.at(messageServiceAddress);\n service.sendMessage(recipient, fee, 0x00);\n return 1;\n}\n```\n\n- `recipient`: Address to receive ETH on Linea L2\n- `fee`: Fee for the postman (relayer) to deliver the message on L2. Set to 0 for self-claim\n- `_calldata`: Optional calldata to execute on L2 when message is delivered. `0x00` for simple ETH transfers\n- ETH amount (minus fee) is sent as `msg.value`\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | ---------------- | -------------------------------------------- |\n| Ethereum | l1MessageService | `0xd19d4B5d358258f05D7B411E21A1460D11B0876F` |\n| Linea | l2MessageService | `0x508Ca82Df566dCD1B0DE8296e70a96332cD644ec` |\n\n## ABI Reference\n\n### LineaL1MessageServiceABI\n\n- `sendMessage(address _to, uint256 _fee, bytes _calldata)` [payable] - Send ETH and/or message from L1 to L2. `msg.value` = amount to bridge + fee\n- `claimMessage(address _from, address _to, uint256 _fee, uint256 _value, address _feeRecipient, bytes _calldata, uint256 _nonce)` - Claim a message on the destination side (called by relayers or self-claim)\n\n## Notes\n\n- **L1 to L2** via L1MessageService. L2 to L1 via L2MessageService on Linea\n- `sendMessage` is a general-purpose L1-to-L2 message sender -- ETH transfer is implicit via msg.value\n- The `_fee` parameter incentivizes postmen (relayers) to deliver the message. Set to 0 and self-claim via `claimMessage`\n- `_calldata` enables arbitrary contract execution on L2 when the message is delivered\n- zkEVM architecture -- finality with ZK proofs (typically 8-32 hours for proof generation)\n- L2 to L1 withdrawals also require ZK proof finalization\n- For ERC-20 bridging, use the Linea Token Bridge contracts (separate from the message service)\n- Canonical bridge -- no third-party risk, secured by Linea's ZK proving system (Consensys)\n- Audited\n",
73
+ "liquity-v1": "# Liquity V1\n\nDecentralized borrowing protocol offering interest-free loans against ETH collateral. Issues LUSD stablecoin with minimum 110% collateral ratio.\n\n## Category\n\ncdp | Chains: Ethereum\n\n## Key Operations\n\n- **closeTrove**: Close an existing Trove (repay all debt and withdraw collateral)\n- **repayLUSD**: Repay LUSD debt on an open Trove\n- **openTrove**: Open a new Trove by depositing ETH and borrowing LUSD\n- **adjustTrove**: Adjust Trove collateral and/or debt\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/liquity-v1\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Close Trove\nimport { BorrowerOperationsABI as IBorrowerOperations } from \"./abis\";\nfunction main(borrowerOpsAddress: Address): Uint256 {\n const borrowerOps = IBorrowerOperations.at(borrowerOpsAddress);\n borrowerOps.closeTrove();\n return 1;\n}\n\n// Repay LUSD debt\nimport { BorrowerOperationsABI as IBorrowerOperations } from \"./abis\";\nfunction main(borrowerOpsAddress: Address, amount: Uint256): Uint256 {\n const borrowerOps = IBorrowerOperations.at(borrowerOpsAddress);\n borrowerOps.repayLUSD(\n amount,\n 0x0000000000000000000000000000000000000000,\n 0x0000000000000000000000000000000000000000,\n );\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------------ | -------------------------------------------- |\n| Ethereum | lusd | `0x5f98805A4E8be255a32880FDeC7F6728C6568bA0` |\n| Ethereum | borrowerOperations | `0x24179CD81c9e782A4096035f7eC97fB8B783e007` |\n\n## ABI Methods\n\n### BorrowerOperationsABI\n\n- `openTrove(uint256,uint256,address,address)` - Open new Trove. Payable (send ETH as collateral). Params: maxFeePercentage (max borrowing fee, e.g. 5e16 = 5%), LUSDAmount (LUSD to borrow), upperHint (sorted troves hint), lowerHint (sorted troves hint)\n- `closeTrove()` - Close Trove. Must repay all LUSD debt first. Returns all ETH collateral\n- `adjustTrove(uint256,uint256,uint256,bool,address,address)` - Adjust Trove. Payable (send ETH to add collateral). Params: maxFeePercentage, collWithdrawal (ETH to withdraw), LUSDChange (LUSD amount to change), isDebtIncrease (true=borrow more, false=repay), upperHint, lowerHint\n- `repayLUSD(uint256,address,address)` - Repay LUSD debt. Params: LUSDAmount, upperHint, lowerHint (sorted-trove hints; the zero address is valid)\n\n## Notes\n\n- TVL: $500M+. Interest-free loans with one-time borrowing fee (0.5% - 5%)\n- Minimum collateral ratio: 110%. Below this, Trove can be liquidated\n- Hint addresses (upperHint, lowerHint) optimize sorted trove list insertion - use Liquity frontend SDK to compute\n- Minimum debt: 2000 LUSD (including 200 LUSD gas reserve)\n- closeTrove requires repaying all debt including the 200 LUSD gas reserve\n",
74
+ "liquity-v2": "# Liquity V2\n\nNext generation of Liquity protocol with user-set interest rates, multi-collateral support, and the BOLD stablecoin.\n\n## Category\n\ncdp | Chains: Ethereum\n\n## Key Operations\n\n- **transfer**: Transfer BOLD tokens\n- **approve**: Approve BOLD token spender\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/liquity-v2\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Transfer BOLD\nimport { transfer } from \"@sauce/token\";\nfunction main(boldAddress: Address, to: Address, amount: Uint256): Uint256 {\n transfer(boldAddress, to, amount);\n return 1;\n}\n\n// Approve BOLD spender\nimport { approve } from \"@sauce/token\";\nfunction main(boldAddress: Address, spender: Address, amount: Uint256): Uint256 {\n approve(boldAddress, spender, amount);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | bold | `0x6440f144b7e50D6a8439336510312d2F54beB01D` |\n\n## ABI Methods\n\n### BoldTokenABI\n\n- `transfer(address,uint256)` - Transfer BOLD tokens. Params: to, amount. Returns bool\n- `approve(address,uint256)` - Approve spender. Params: spender, amount. Returns bool\n- `balanceOf(address)` - Query balance. Params: account. Returns uint256\n\n## Notes\n\n- User-set interest rates - borrowers choose their own rate (higher rate = lower liquidation risk)\n- Multi-collateral: ETH, wstETH, rETH, and other LSTs\n- BOLD is fully redeemable 1:1 for collateral at any time\n- Successor to Liquity V1 with improved capital efficiency\n",
75
+ "lynex": "# Lynex\n\nLinea-native ve(3,3) DEX and liquidity marketplace. Solidly-fork with gauge voting and support for both stable and volatile pool types on the Linea zkEVM network.\n\n## Category\n\ndex | Chains: Linea\n\n## Key Operations\n\n- **swap**: Swap tokens with route-based routing specifying stable or volatile pool type\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/lynex\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { LynexRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenIn: Address,\n tokenOut: Address,\n stable: bool,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256[] {\n const router = IRouter.at(routerAddress);\n return router.swapExactTokensForTokens(\n amountIn,\n amountOutMin,\n [{ from: tokenIn, to: tokenOut, stable: stable }],\n recipient,\n 99999999999,\n );\n}\n```\n\n- `routerAddress`: Lynex Router on Linea (`0x610D2f07b7EdC67565160F587F37636194C34E74`)\n- `tokenIn` / `tokenOut`: Input and output token addresses\n- `stable`: `true` for stable pools (pegged assets), `false` for volatile pools (uncorrelated)\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n- Routes support multi-hop: `[{from: A, to: B, stable: false}, {from: B, to: C, stable: true}]`\n- Note: Lynex routes do NOT include a `factory` field (unlike Velodrome/Aerodrome)\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| ----- | -------- | -------------------------------------------- |\n| Linea | Router | `0x610D2f07b7EdC67565160F587F37636194C34E74` |\n\n## ABI Methods\n\n### LynexRouterABI\n\n- `swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, tuple[](address from, address to, bool stable) routes, address to, uint256 deadline) -> uint256[] amounts` - Swap with route tuples specifying pool type per hop\n- `addLiquidity(address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB, uint256 liquidity)` - Add liquidity to a stable or volatile pool\n\n## Notes\n\n- Solidly-fork routes contain `{from, to, stable}` tuples (NO `factory` field)\n- Two pool types: `stable=true` for correlated assets, `stable=false` for uncorrelated\n- ve(3,3) model: LYNX token holders vote-lock to direct gauge emissions\n- Linea-only deployment; the dominant DEX on Linea zkEVM\n- LP tokens can be staked in gauges for LYNX emissions\n- Input token must be ERC20-approved to the Router\n",
76
+ "maker": "# Maker\n\nDecentralized credit protocol behind DAI and USDS stablecoins. Users deposit collateral into Vaults to mint/borrow DAI. Includes the DAI Savings Rate (DSR) via sDAI.\n\n## Category\n\ncdp | Chains: Ethereum\n\n## Key Operations\n\n- **depositToSDAI**: Deposit DAI into Savings DAI vault (ERC-4626)\n- **withdrawFromSDAI**: Withdraw DAI from sDAI vault by asset amount\n- **redeemFromSDAI**: Redeem sDAI shares for DAI\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/maker\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit DAI into sDAI\nimport { SavingsDaiABI as ISavingsDai } from \"./abis\";\nfunction main(sDAIAddress: Address, amount: Uint256, receiver: Address): Uint256 {\n const sDAI = ISavingsDai.at(sDAIAddress);\n return sDAI.deposit(amount, receiver);\n}\n\n// Withdraw DAI from sDAI\nimport { SavingsDaiABI as ISavingsDai } from \"./abis\";\nfunction main(sDAIAddress: Address, amount: Uint256, receiver: Address, owner: Address): Uint256 {\n const sDAI = ISavingsDai.at(sDAIAddress);\n return sDAI.withdraw(amount, receiver, owner);\n}\n\n// Redeem sDAI shares for DAI\nimport { SavingsDaiABI as ISavingsDai } from \"./abis\";\nfunction main(sDAIAddress: Address, shares: Uint256, receiver: Address, owner: Address): Uint256 {\n const sDAI = ISavingsDai.at(sDAIAddress);\n return sDAI.redeem(shares, receiver, owner);\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | dai | `0x6B175474E89094C44Da98b954EedeAC495271d0F` |\n| Ethereum | usds | `0xdC035D45d973E3EC169d2276DDab16f1e407384F` |\n| Ethereum | sDAI | `0x83F20F44975D03b1b09e64809B757c47f942BEeA` |\n| Ethereum | vat | `0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B` |\n| Ethereum | pot | `0x197E90f9FAD81970bA7976f33CbD77088E5D7cf7` |\n\n## ABI Methods\n\n### SavingsDaiABI (ERC-4626)\n\n- `deposit(uint256,address)` - Deposit DAI, receive sDAI shares. Params: assets (DAI amount), receiver. Returns shares minted\n- `withdraw(uint256,address,address)` - Withdraw by DAI amount. Params: assets (DAI to withdraw), receiver, owner. Returns shares burned\n- `redeem(uint256,address,address)` - Redeem sDAI shares. Params: shares (sDAI to burn), receiver, owner. Returns assets (DAI received)\n- `convertToShares(uint256)` - Preview DAI to sDAI conversion. Params: assets. Returns shares\n- `convertToAssets(uint256)` - Preview sDAI to DAI conversion. Params: shares. Returns assets\n\n### PotABI (DSR Engine)\n\n- `join(uint256)` - Join DAI savings (internal). Params: wad (DAI amount in 18 decimals)\n- `exit(uint256)` - Exit DAI savings (internal). Params: wad\n- `chi()` - Current accumulated DSR rate (view). Returns rate accumulator (ray, 27 decimals)\n- `dsr()` - Current DSR per-second rate (view). Returns rate (ray)\n\n## Notes\n\n- TVL: $8B+. sDAI is the preferred way to earn DSR yield (ERC-4626 compliant)\n- DSR yield accrues automatically - sDAI appreciates against DAI over time\n- Approve DAI to sDAI contract before depositing\n- Pot is the internal DSR accumulator - chi() tracks the accumulated rate\n- USDS is the rebranded DAI stablecoin\n",
77
+ "mantle-meth": "# Mantle mETH\n\nMantle's liquid staking token for Ethereum. Stake ETH and receive mETH, a non-rebasing token that accrues staking rewards over time.\n\n## Category\n\nliquid-staking | Chains: Ethereum\n\n## Key Operations\n\n- **stake**: Stake ETH for mETH with minimum output check\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/mantle-meth\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Stake ETH for mETH\nimport { METHStakingABI as IStaking } from \"./abis\";\nfunction main(stakingAddress: Address, minMETHAmount: Uint256): Uint256 {\n const staking = IStaking.at(stakingAddress);\n staking.stake(minMETHAmount);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | mETH | `0xd5F7838F5C461fefF7FE49ea5ebaF7728bB0ADfa` |\n| Ethereum | staking | `0xe3cBd06D7dadB3F4e6557bAb7EdD924CD1489E8f` |\n\n## ABI Methods\n\n### METHStakingABI\n\nThe Staking contract (`staking`), not the token.\n\n- `stake(uint256)` - Stake ETH (payable), receive mETH. Param: minMETHAmount for slippage protection\n- `mETHToETH(uint256)` - Convert mETH amount to ETH value\n- `ethToMETH(uint256)` - Convert ETH amount to mETH value\n\n### METHABI\n\nThe mETH token (`mETH`).\n\n- `balanceOf(address)` - Query mETH balance\n- `approve(address,uint256)` - Approve mETH spending\n\n## Notes\n\n- TVL: $1.5B+. Non-rebasing token backed by Mantle treasury\n- stake() is payable - send ETH as msg.value\n- minMETHAmount param provides slippage protection\n- Use mETHToETH()/ethToMETH() to preview exchange rates\n",
78
+ "maverick": "# Maverick\n\nDynamic distribution AMM with directional liquidity positioning. Allows LPs to follow price movements automatically with customizable bin strategies. Uses pool addresses directly (no path routing).\n\n## Category\n\ndex | Chains: Ethereum, Arbitrum, Base\n\n## Key Operations\n\n- **swap**: Exact input single swap via V2 Router, specifying pool address and direction\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/maverick\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { MaverickV2RouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n pool: Address,\n tokenAIn: bool,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256 {\n const router = IRouter.at(routerAddress);\n return router.exactInputSingle(recipient, pool, tokenAIn, amountIn, amountOutMin);\n}\n```\n\n- `routerAddress`: Maverick V2 Router address for the target chain\n- `pool`: The specific pool contract address (must be obtained from factory or known in advance)\n- `tokenAIn`: `true` to swap tokenA for tokenB, `false` to swap tokenB for tokenA\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n- Note: parameter order is `(recipient, pool, tokenAIn, amountIn, amountOutMin)` - recipient comes FIRST\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ---------- | -------------------------------------------- |\n| Ethereum | V2 Router | `0x62e31802c6145A2D5E842EeD8efe01fC224422fA` |\n| Ethereum | V2 Factory | `0x0A7e848Aca42d879EF06507Fca0E7b33A0a63c1e` |\n| Arbitrum | V2 Router | `0x5c3b380e5Aeec389d1014Da3Eb372FA2C9e0fc76` |\n| Base | V2 Router | `0x5eDEd0d7E76C563FF081Ca01D9d12D6B404Df527` |\n\n## ABI Methods\n\n### MaverickV2RouterABI\n\n- `exactInputSingle(address recipient, address pool, bool tokenAIn, uint256 amountIn, uint256 amountOutMinimum) -> uint256 amountOut` - Swap exact input in a specific pool\n- `exactOutputSingle(address recipient, address pool, bool tokenAIn, uint256 amountOut, uint256 amountInMaximum) -> (uint256 amountIn, uint256 amountOut)` - Swap to get exact output from a specific pool\n\n### MaverickV2FactoryABI\n\n- `lookup(address tokenA, address tokenB, uint256 startIndex, uint256 endIndex) -> address[] pools` - Look up a page of the pools for a token pair (view)\n\n## Notes\n\n- Uses `tokenAIn` bool instead of separate token addresses to specify swap direction within a pool\n- Pool address must be provided directly (no built-in path routing like Uniswap)\n- Use `factory.lookup(tokenA, tokenB, 0, n)` to discover available pools for a pair\n- Parameter order is unusual: `recipient` is the FIRST parameter, not the last\n- Maverick's key innovation is directional LP strategies: bins can be configured to move with price in one direction\n- LP modes: Static (like Uniswap V3), Right (follow price up), Left (follow price down), Both (follow both)\n- Input token must be ERC20-approved to the V2 Router\n",
79
+ "moonwell": "# Moonwell\n\nLeading lending protocol on Base. Compound V2 fork with governance and safety module features.\n\n## Category\n\nlending | Chains: Base (8453)\n\n## SauceScript Functions\n\n### supply\n\nSupply assets by minting mTokens. Exchange rate grows as interest accrues.\n\n```typescript\nimport { MTokenABI as IMToken } from \"./abis\";\n\nfunction main(mTokenAddress: Address, amount: Uint256): Uint256 {\n const mToken = IMToken.at(mTokenAddress);\n return mToken.mint(amount);\n}\n```\n\n- `mTokenAddress`: The mToken market contract (each asset has its own mToken)\n- Returns 0 on success, error code on failure\n- Requires ERC-20 approval of underlying to the mToken\n\n### withdraw\n\nWithdraw underlying assets by specifying the exact amount.\n\n```typescript\nimport { MTokenABI as IMToken } from \"./abis\";\n\nfunction main(mTokenAddress: Address, amount: Uint256): Uint256 {\n const mToken = IMToken.at(mTokenAddress);\n return mToken.redeemUnderlying(amount);\n}\n```\n\n### borrow\n\nBorrow assets against mToken collateral. Must call enterMarkets first.\n\n```typescript\nimport { MTokenABI as IMToken } from \"./abis\";\n\nfunction main(mTokenAddress: Address, amount: Uint256): Uint256 {\n const mToken = IMToken.at(mTokenAddress);\n return mToken.borrow(amount);\n}\n```\n\n- Must enable collateral via `MoonwellComptroller.enterMarkets([mTokenAddress])` first\n\n### repay\n\nRepay borrowed assets.\n\n```typescript\nimport { MTokenABI as IMToken } from \"./abis\";\n\nfunction main(mTokenAddress: Address, amount: Uint256): Uint256 {\n const mToken = IMToken.at(mTokenAddress);\n return mToken.repayBorrow(amount);\n}\n```\n\n- Requires ERC-20 approval of underlying to the mToken\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| ----- | ----------- | -------------------------------------------- |\n| Base | comptroller | `0xfBb21d0380beE3312B33c4353c8936a0F13EF26C` |\n\n## ABI Reference\n\n### MTokenABI\n\n- `mint(uint256 mintAmount) returns (uint256)` - Supply underlying, receive mTokens\n- `redeem(uint256 redeemTokens) returns (uint256)` - Redeem mTokens for underlying\n- `redeemUnderlying(uint256 redeemAmount) returns (uint256)` - Redeem exact underlying amount\n- `borrow(uint256 borrowAmount) returns (uint256)` - Borrow underlying\n- `repayBorrow(uint256 repayAmount) returns (uint256)` - Repay borrow debt\n\n### MoonwellComptrollerABI\n\n- `enterMarkets(address[] mTokens) returns (uint256[])` - Enable mTokens as collateral\n- `exitMarket(address mToken) returns (uint256)` - Remove mToken from collateral\n\n## Notes\n\n- Same interface as Compound V2 (forked codebase)\n- Must call `enterMarkets` on Comptroller before borrowing against any market\n- Return values: 0 = success, non-zero = error code\n- Base-only deployment. TVL: $500M+. Audited\n",
80
+ "morpho-blue": "# Morpho Blue\n\nMinimal and gas-efficient lending primitive with permissionless market creation. Markets are defined by a unique (loanToken, collateralToken, oracle, IRM, LLTV) tuple.\n\n## Category\n\nlending | Chains: Ethereum (1), Base (8453), Arc (5042)\n\n## SauceScript Functions\n\n### supply\n\nSupply loan tokens to a specific market. Earns interest from borrowers.\n\n```typescript\nimport { MorphoABI as IMorpho } from \"./abis\";\n\nfunction main(\n morphoAddress: Address,\n loanToken: Address,\n collateralToken: Address,\n oracle: Address,\n irm: Address,\n lltv: Uint256,\n amount: Uint256,\n onBehalf: Address,\n): Uint256 {\n const morpho = IMorpho.at(morphoAddress);\n morpho.supply(\n {\n loanToken: loanToken,\n collateralToken: collateralToken,\n oracle: oracle,\n irm: irm,\n lltv: lltv,\n },\n amount,\n 0,\n onBehalf,\n 0x00,\n );\n return 1;\n}\n```\n\n- All 5 marketParams fields (loanToken, collateralToken, oracle, irm, lltv) identify the market\n- `amount`: Supply by assets (set shares param to 0)\n- `onBehalf`: Address that receives the supply position\n- `data`: Callback data, use `0x00` for no callback\n- Requires ERC-20 approval of loanToken to the Morpho address\n\n### withdraw\n\nWithdraw supplied loan tokens from a market.\n\n```typescript\nimport { MorphoABI as IMorpho } from \"./abis\";\n\nfunction main(\n morphoAddress: Address,\n loanToken: Address,\n collateralToken: Address,\n oracle: Address,\n irm: Address,\n lltv: Uint256,\n amount: Uint256,\n onBehalf: Address,\n receiver: Address,\n): Uint256 {\n const morpho = IMorpho.at(morphoAddress);\n morpho.withdraw(\n {\n loanToken: loanToken,\n collateralToken: collateralToken,\n oracle: oracle,\n irm: irm,\n lltv: lltv,\n },\n amount,\n 0,\n onBehalf,\n receiver,\n );\n return 1;\n}\n```\n\n- `receiver`: Address that receives the withdrawn tokens\n\n### borrow\n\nBorrow loan tokens against supplied collateral.\n\n```typescript\nimport { MorphoABI as IMorpho } from \"./abis\";\n\nfunction main(\n morphoAddress: Address,\n loanToken: Address,\n collateralToken: Address,\n oracle: Address,\n irm: Address,\n lltv: Uint256,\n amount: Uint256,\n onBehalf: Address,\n receiver: Address,\n): Uint256 {\n const morpho = IMorpho.at(morphoAddress);\n morpho.borrow(\n {\n loanToken: loanToken,\n collateralToken: collateralToken,\n oracle: oracle,\n irm: irm,\n lltv: lltv,\n },\n amount,\n 0,\n onBehalf,\n receiver,\n );\n return 1;\n}\n```\n\n- Must have sufficient collateral supplied via `supplyCollateral` first\n\n### repay\n\nRepay borrowed loan tokens.\n\n```typescript\nimport { MorphoABI as IMorpho } from \"./abis\";\n\nfunction main(\n morphoAddress: Address,\n loanToken: Address,\n collateralToken: Address,\n oracle: Address,\n irm: Address,\n lltv: Uint256,\n amount: Uint256,\n onBehalf: Address,\n): Uint256 {\n const morpho = IMorpho.at(morphoAddress);\n morpho.repay(\n {\n loanToken: loanToken,\n collateralToken: collateralToken,\n oracle: oracle,\n irm: irm,\n lltv: lltv,\n },\n amount,\n 0,\n onBehalf,\n 0x00,\n );\n return 1;\n}\n```\n\n- Requires ERC-20 approval of loanToken to the Morpho address\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | morpho | `0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb` |\n| Ethereum | bundler3 | `0x6566194141eefa99Af43Bb5Aa71460Ca2Dc90245` |\n| Base | morpho | `0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb` |\n\n## ABI Reference\n\n### MorphoABI\n\n- `supply(MarketParams marketParams, uint256 assets, uint256 shares, address onBehalf, bytes data) returns (uint256 assetsSupplied, uint256 sharesSupplied)` - Supply loan tokens (specify assets OR shares, set other to 0)\n- `withdraw(MarketParams marketParams, uint256 assets, uint256 shares, address onBehalf, address receiver) returns (uint256 assetsWithdrawn, uint256 sharesWithdrawn)` - Withdraw loan tokens\n- `borrow(MarketParams marketParams, uint256 assets, uint256 shares, address onBehalf, address receiver) returns (uint256 assetsBorrowed, uint256 sharesBorrowed)` - Borrow loan tokens\n- `repay(MarketParams marketParams, uint256 assets, uint256 shares, address onBehalf, bytes data) returns (uint256 assetsRepaid, uint256 sharesRepaid)` - Repay borrowed debt\n- `supplyCollateral(MarketParams marketParams, uint256 assets, address onBehalf, bytes data)` - Supply collateral tokens (required before borrowing)\n- `withdrawCollateral(MarketParams marketParams, uint256 assets, address onBehalf, address receiver)` - Withdraw collateral tokens\n\nMarketParams tuple: `(address loanToken, address collateralToken, address oracle, address irm, uint256 lltv)`\n\n## Notes\n\n- Markets are identified by the full marketParams tuple, not an address or ID\n- Pass amount in `assets` param and set `shares` to 0 for standard operations\n- Each market is fully isolated -- no cross-market risk contagion\n- `lltv` is the Liquidation Loan-to-Value ratio (e.g. 86% = 860000000000000000)\n- Supply collateral is separate from supplying loan tokens -- collateral does not earn interest\n- Bundler3 contract allows batching multiple Morpho operations in a single transaction\n- Same Morpho address on both Ethereum and Base\n- TVL: $6B+. Audited\n",
81
+ "mux-protocol": "# MUX Protocol\n\nLeveraged trading aggregator on Arbitrum. Routes trades across multiple perpetual DEXs for best execution with shared liquidity pool.\n\n## Category\n\nperpetuals | Chains: Arbitrum\n\n## Key Operations\n\n- **addLiquidity**: Place an order adding liquidity to the MUX pool (receive MLP tokens)\n- **removeLiquidity**: Place an order removing liquidity (burn MLP tokens)\n- **placePositionOrder3**: Place a leveraged position order\n- **cancelOrder**: Cancel a pending order\n\n## SDK Usage\n\n```typescript\nimport {\n protocolInfo,\n deployments,\n sauceFunctions,\n} from \"@eco-incorp/sauce/protocols/mux-protocol\";\n```\n\n## SauceScript Examples\n\nLiquidity moves through OrderBook orders that MUX brokers fill; the LiquidityPool's own add/remove functions are callable only by the OrderBook.\n\n```typescript\n// Add liquidity: a liquidity order that deposits `rawAmount` of asset `assetId`\nimport { OrderBookABI as IOrderBook } from \"./abis\";\nfunction main(orderBookAddress: Address, assetId: Uint256, rawAmount: Uint256): Uint256 {\n const orderBook = IOrderBook.at(orderBookAddress);\n orderBook.placeLiquidityOrder(assetId, rawAmount, true);\n return 1;\n}\n\n// Remove liquidity: a liquidity order that burns `mlpAmount` MLP for asset `assetId`\nimport { OrderBookABI as IOrderBook } from \"./abis\";\nfunction main(orderBookAddress: Address, assetId: Uint256, mlpAmount: Uint256): Uint256 {\n const orderBook = IOrderBook.at(orderBookAddress);\n orderBook.placeLiquidityOrder(assetId, mlpAmount, false);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------- | -------------------------------------------- |\n| Arbitrum | orderBook | `0xa19fD5aB6C8DCffa2A295F78a5Bb4aC543AAF5e3` |\n| Arbitrum | liquidityPool | `0x3e0199792Ce69DC29A0a36146bFa68bd7C8D6633` |\n\n## ABI Methods\n\n### OrderBookABI\n\n- `placeLiquidityOrder(uint8 assetId, uint96 rawAmount, bool isAdding)` [payable] - Order to add (`isAdding`) or remove liquidity. Adding: approve the asset to the OrderBook first; removing: `rawAmount` is MLP\n- `placePositionOrder3(bytes32 subAccountId, uint96 collateralAmount, uint96 size, uint96 price, uint8 profitTokenId, uint8 flags, uint32 deadline, bytes32 referralCode, (uint96 tpPrice, uint96 slPrice, uint8 tpslProfitTokenId, uint32 tpslDeadline) extra)` [payable] - Place a leveraged position order (with optional TP/SL)\n- `cancelOrder(uint64 orderId)` - Cancel pending order\n\n### LiquidityPoolABI\n\n- `depositCollateral(bytes32 subAccountId, uint256 rawAmount)` - Deposit collateral into a sub-account\n- `getAssetAddress(uint8 assetId) returns (address)` - Token address of an asset id\n- `getSubAccount(bytes32 subAccountId) returns (uint96 collateral, uint96 size, uint32 lastIncreasedTime, uint96 entryPrice, uint128 entryFunding)` - A sub-account's position\n\n## Notes\n\n- Aggregates perpetual DEXs (GMX, Gains, etc.) for optimal trade execution\n- subAccountId (bytes32) encodes: account address + collateral token ID + asset ID + isLong flag\n- tokenId is a uint8 index identifying the collateral asset (0=ETH, 1=BTC, etc.)\n- MLP is the liquidity provider token\n- Position orders require ETH execution fee sent as msg.value\n",
82
+ "olympus": "# Olympus DAO\n\nDecentralized reserve currency protocol. OHM staking and bonding mechanism with protocol-owned liquidity and treasury management.\n\n## Category\n\nstaking | Chains: Ethereum\n\n## Key Operations\n\n- **stake**: Stake OHM tokens\n- **unstake**: Unstake OHM tokens\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/olympus\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Stake OHM\nimport { StakingABI as IStaking } from \"./abis\";\n\nfunction main(stakingAddress: Address, to: Address, amount: Uint256): Uint256 {\n const staking = IStaking.at(stakingAddress);\n return staking.stake(to, amount, 1, 1);\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | ohm | `0x64aa3364F17a4D01c6f1751Fd97C2BD3D7e7f1D5` |\n| Ethereum | staking | `0xB63cac384247597756545b500253ff8E607a8020` |\n\n## ABI Methods\n\n- `stake(address,uint256,bool,bool)` - Stake OHM\n- `unstake(address,uint256,bool,bool)` - Unstake OHM\n\n## Notes\n\n- Protocol-owned liquidity model. Rebase mechanism for staking rewards.\n",
83
+ "oneinch": "# 1inch\n\nLeading DEX aggregator that finds optimal swap routes across multiple liquidity sources. Supports limit orders and Fusion mode for gasless swaps.\n\n## Category\n\naggregator | Chains: Ethereum, Arbitrum, Optimism, Base, Polygon, BSC, Avalanche\n\n## Key Operations\n\n- **unoswap**: Single-source optimized swap via AggregationRouter\n- **swap**: Multi-source aggregated swap with custom routing\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/oneinch\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Unoswap (single-source swap)\nimport { AggregationRouterV6ABI as IAggregationRouterV6 } from \"./abis\";\nfunction main(\n routerAddress: Address,\n srcToken: Address,\n amount: Uint256,\n minReturn: Uint256,\n dex: Uint256,\n): Uint256 {\n const router = IAggregationRouterV6.at(routerAddress);\n return router.unoswap(srcToken, amount, minReturn, dex);\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| --------- | ------------------- | -------------------------------------------- |\n| Ethereum | aggregationRouterV6 | `0x111111125421cA6dc452d289314280a0f8842A65` |\n| Arbitrum | aggregationRouterV6 | `0x111111125421cA6dc452d289314280a0f8842A65` |\n| Optimism | aggregationRouterV6 | `0x111111125421cA6dc452d289314280a0f8842A65` |\n| Base | aggregationRouterV6 | `0x111111125421cA6dc452d289314280a0f8842A65` |\n| Polygon | aggregationRouterV6 | `0x111111125421cA6dc452d289314280a0f8842A65` |\n| BSC | aggregationRouterV6 | `0x111111125421cA6dc452d289314280a0f8842A65` |\n| Avalanche | aggregationRouterV6 | `0x111111125421cA6dc452d289314280a0f8842A65` |\n\n## ABI Methods\n\n### AggregationRouterV6ABI\n\n- `swap(address,tuple,bytes)` - Multi-source swap. Params: executor, desc (SwapDescription tuple: srcToken, dstToken, srcReceiver, dstReceiver, amount, minReturnAmount, flags), data (executor calldata). Payable. Returns (returnAmount, spentAmount)\n - SwapDescription tuple: `{ srcToken, dstToken, srcReceiver, dstReceiver, amount, minReturnAmount, flags }`\n- `unoswap(uint256,uint256,uint256,uint256)` - Single-pool optimized swap. Params: token (source token address as uint256), amount, minReturn, dex (pool address packed with protocol and direction flags). Returns returnAmount\n\n## Notes\n\n- Same contract address across all 7 chains\n- V6 router is the latest version\n- unoswap is gas-efficient for single-pool swaps; swap handles complex multi-hop routes\n- `dex` in unoswap packs the pool address with its protocol and swap-direction flags in the high bits\n- Fusion mode enables gasless swaps via order matching (off-chain, not in ABI)\n- Approve srcToken to aggregationRouterV6 before swapping\n",
84
+ "openocean": "# OpenOcean\n\nCross-chain DEX aggregator providing optimal swap routing across multiple DEXes and chains.\n\n## Category\n\naggregator | Chains: Ethereum, Arbitrum, Optimism, BSC, Polygon, Avalanche, Fantom\n\n## Key Operations\n\n- **swap**: Execute aggregated swap via OpenOcean Exchange\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/openocean\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Swap via OpenOcean\nimport { OpenOceanExchangeV2ABI as IOpenOceanExchange } from \"./abis\";\nfunction main(\n exchangeAddress: Address,\n caller: Address,\n srcToken: Address,\n dstToken: Address,\n srcReceiver: Address,\n dstReceiver: Address,\n amount: Uint256,\n minReturnAmount: Uint256,\n guaranteedAmount: Uint256,\n referrer: Address,\n calls: { target: Uint256; gasLimit: Uint256; value: Uint256; data: bytes }[],\n): Uint256 {\n const exchange = IOpenOceanExchange.at(exchangeAddress);\n return exchange.swap(\n caller,\n {\n srcToken: srcToken,\n dstToken: dstToken,\n srcReceiver: srcReceiver,\n dstReceiver: dstReceiver,\n amount: amount,\n minReturnAmount: minReturnAmount,\n guaranteedAmount: guaranteedAmount,\n flags: 0,\n referrer: referrer,\n permit: 0x00,\n },\n calls,\n );\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| --------- | ---------- | -------------------------------------------- |\n| Ethereum | exchangeV2 | `0x6352a56caadC4F1E25CD6c75970Fa768A3304e64` |\n| Arbitrum | exchangeV2 | `0x6352a56caadC4F1E25CD6c75970Fa768A3304e64` |\n| Optimism | exchangeV2 | `0x6352a56caadC4F1E25CD6c75970Fa768A3304e64` |\n| BSC | exchangeV2 | `0x6352a56caadC4F1E25CD6c75970Fa768A3304e64` |\n| Polygon | exchangeV2 | `0x6352a56caadC4F1E25CD6c75970Fa768A3304e64` |\n| Avalanche | exchangeV2 | `0x6352a56caadC4F1E25CD6c75970Fa768A3304e64` |\n| Fantom | exchangeV2 | `0x6352a56caadC4F1E25CD6c75970Fa768A3304e64` |\n\n## ABI Methods\n\n### OpenOceanExchangeV2ABI\n\n- `swap(address,tuple,tuple[])` - Execute aggregated swap. Payable. Params: caller (msg.sender or executor), desc (SwapDescription tuple), calls (CallDescription[]: `(uint256 target, uint256 gasLimit, uint256 value, bytes data)`). Returns returnAmount\n - SwapDescription tuple: `{ srcToken, dstToken, srcReceiver, dstReceiver, amount, minReturnAmount, guaranteedAmount, flags, referrer, permit }`\n - `srcReceiver` - address that receives srcToken from caller\n - `dstReceiver` - address that receives output tokens\n - `guaranteedAmount` - guaranteed minimum output (can differ from minReturnAmount)\n - `flags` - swap behavior flags (0 for default)\n - `permit` - EIP-2612 permit data (0x00 if pre-approved)\n\n## Notes\n\n- TVL: $200M+. Same contract address across all 7 supported chains\n- Route computation via OpenOcean API - calls parameter comes from API response\n- Approve srcToken to exchangeV2 before swapping\n- caller is typically msg.sender; srcReceiver receives tokens from the caller\n",
85
+ "optimism-bridge": "# Optimism Native Bridge\n\nOfficial Optimism L1StandardBridge for depositing ETH and ERC-20 tokens from Ethereum to Optimism. OP Stack architecture with 7-day withdrawal finality.\n\n## Category\n\nnative L2 bridge | Direction: L1 to L2 (Ethereum to Optimism) | Chains: Ethereum (1), Optimism (10)\n\n## SauceScript Functions\n\n### depositETH\n\nDeposit ETH from Ethereum L1 to Optimism L2.\n\n```typescript\nimport { OptimismL1StandardBridgeABI as IL1StandardBridge } from \"./abis\";\n\nfunction main(bridgeAddress: Address): Uint256 {\n const bridge = IL1StandardBridge.at(bridgeAddress);\n bridge.depositETH(200000, 0x00);\n return 1;\n}\n```\n\n- ETH amount is sent as `msg.value`\n- `_minGasLimit`: Minimum gas for the L2 deposit execution (200000 is a safe default)\n- `_extraData`: Optional extra data (typically `0x00`)\n\n### depositERC20\n\nDeposit ERC-20 tokens from Ethereum L1 to Optimism L2.\n\n```typescript\nimport { OptimismL1StandardBridgeABI as IL1StandardBridge } from \"./abis\";\n\nfunction main(\n bridgeAddress: Address,\n l1Token: Address,\n l2Token: Address,\n amount: Uint256,\n): Uint256 {\n const bridge = IL1StandardBridge.at(bridgeAddress);\n bridge.depositERC20(l1Token, l2Token, amount, 200000, 0x00);\n return 1;\n}\n```\n\n- `l1Token`: Token address on Ethereum L1\n- `l2Token`: Corresponding token address on Optimism L2 (must be the official bridged representation)\n- `amount`: Amount of tokens to deposit\n- `_minGasLimit`: Minimum gas for L2 execution (200000 is a safe default)\n- `_extraData`: Optional extra data (typically `0x00`)\n- Requires ERC-20 approval to the L1StandardBridge\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | ---------------- | -------------------------------------------- |\n| Ethereum | l1StandardBridge | `0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1` |\n| Optimism | l2StandardBridge | `0x4200000000000000000000000000000000000010` |\n\n## ABI Reference\n\n### OptimismL1StandardBridgeABI\n\n- `depositETH(uint32 _minGasLimit, bytes _extraData)` [payable] - Deposit ETH to your own address on L2. Amount = msg.value\n- `depositERC20(address _l1Token, address _l2Token, uint256 _amount, uint32 _minGasLimit, bytes _extraData)` - Deposit ERC-20 tokens to your own address on L2\n- `depositETHTo(address _to, uint32 _minGasLimit, bytes _extraData)` [payable] - Deposit ETH to a specific recipient on L2\n- `depositERC20To(address _l1Token, address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData)` - Deposit ERC-20 tokens to a specific recipient on L2\n\n## Notes\n\n- **L1 to L2 only** via this contract. For L2 to L1 withdrawals, use the L2StandardBridge on Optimism (takes 7 days)\n- OP Stack architecture -- same pattern used by Base, Mode, Zora, and other OP chains\n- `depositETH` / `depositERC20` send to `msg.sender` on L2. Use `depositETHTo` / `depositERC20To` to specify a different recipient\n- L1 to L2 deposits finalize in ~2-5 minutes (after L1 inclusion + sequencer processing)\n- L2 to L1 withdrawals require 7-day challenge period (optimistic rollup security)\n- `_l2Token` must be the official bridged token representation on Optimism -- incorrect L2 token address will cause deposit to fail\n- Canonical bridge -- no third-party risk, secured by the Optimism rollup itself\n- L2StandardBridge is at a predefined address: `0x4200000000000000000000000000000000000010`\n- Audited\n",
86
+ "opyn": "# Opyn\n\nDeFi options protocol known for Squeeth (squared ETH), a power perpetual that provides leveraged ETH exposure without liquidations.\n\n## Category\n\noptions | Chains: Ethereum\n\n## Key Operations\n\n- **burnSqueeth**: Burn oSQTH to close/reduce a squeeth position\n- **withdrawCollateral**: Withdraw ETH collateral from a vault\n- **mintSqueeth**: Mint oSQTH (open squeeth position) by depositing ETH collateral\n- **deposit**: Deposit additional ETH collateral to an existing vault\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/opyn\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Burn Squeeth to reduce position\nimport { ControllerABI as IController } from \"./abis\";\nfunction main(\n controllerAddress: Address,\n vaultId: Uint256,\n amount: Uint256,\n withdrawAmount: Uint256,\n): Uint256 {\n const controller = IController.at(controllerAddress);\n controller.burnPowerPerpAmount(vaultId, amount, withdrawAmount);\n return 1;\n}\n\n// Withdraw collateral from vault\nimport { ControllerABI as IController } from \"./abis\";\nfunction main(controllerAddress: Address, vaultId: Uint256, amount: Uint256): Uint256 {\n const controller = IController.at(controllerAddress);\n controller.withdraw(vaultId, amount);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ---------- | -------------------------------------------- |\n| Ethereum | controller | `0x64187ae08781B09368e6253F9E94951243A493D5` |\n| Ethereum | oSQTH | `0xf1B99e3E573A1a9C5E6B2Ce818b617F0E664E86B` |\n\n## ABI Methods\n\n### ControllerABI\n\n- `mintPowerPerpAmount(uint256,uint256,uint256)` - Mint oSQTH. Params: vaultId (0 to create new), powerPerpAmount (oSQTH to mint), uniTokenId (Uniswap LP NFT as collateral, 0 for ETH). Payable (send ETH as collateral). Returns (vaultId, wPowerPerpAmount)\n- `burnPowerPerpAmount(uint256,uint256,uint256) returns (uint256)` - Burn oSQTH to close position. Params: vaultId, powerPerpAmount (oSQTH to burn), withdrawAmount (ETH collateral to withdraw)\n- `deposit(uint256)` - Deposit additional ETH collateral. Params: vaultId. Payable (ETH sent = deposit amount)\n- `withdraw(uint256,uint256)` - Withdraw ETH collateral. Params: vaultId, amount (ETH to withdraw)\n\n## Notes\n\n- Squeeth = squared ETH exposure (ETH^2), providing leveraged upside without liquidations\n- Funding rate applies instead of liquidations - long positions pay short positions\n- oSQTH is the ERC-20 power perpetual token\n- Vaults hold ETH collateral backing minted oSQTH\n- vaultId=0 in mintPowerPerpAmount creates a new vault\n- Can use Uniswap V3 LP NFTs as collateral via uniTokenId parameter\n",
87
+ "pancakeswap-v2": "# PancakeSwap V2\n\nThe most popular DEX on BNB Chain using the constant product AMM model (x*y=k). Forked from Uniswap V2 with additional features like yield farming and lottery. Expanded to 6 chains.\n\n## Category\n\ndex | Chains: BSC, Ethereum, Arbitrum, Base, Linea, opBNB\n\n## Key Operations\n\n- **swap**: Swap exact input tokens through a routing path\n- **addLiquidity**: Deposit two tokens to mint CAKE-LP tokens\n- **removeLiquidity**: Burn LP tokens to withdraw underlying tokens\n\n## SDK Usage\n\n```typescript\nimport {\n protocolInfo,\n deployments,\n sauceFunctions,\n} from \"@eco-incorp/sauce/protocols/pancakeswap-v2\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { PancakeSwapV2RouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n path: Address[],\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256[] {\n const router = IRouter.at(routerAddress);\n return router.swapExactTokensForTokens(amountIn, amountOutMin, path, recipient, 99999999999);\n}\n```\n\n- `routerAddress`: PancakeSwap V2 Router for the target chain\n- `path`: Ordered token address array for the swap route\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n\n### addLiquidity\n\n```typescript\nimport { PancakeSwapV2RouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n amountADesired: Uint256,\n amountBDesired: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256; liquidity: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.addLiquidity(\n tokenA,\n tokenB,\n amountADesired,\n amountBDesired,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- `amountADesired` / `amountBDesired`: Ideal deposit amounts (router adjusts to maintain ratio)\n- `amountAMin` / `amountBMin`: Minimum deposits (slippage protection)\n- Both tokens must be approved to the router\n\n### removeLiquidity\n\n```typescript\nimport { PancakeSwapV2RouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n liquidity: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.removeLiquidity(\n tokenA,\n tokenB,\n liquidity,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- `liquidity`: Amount of LP tokens to burn\n- LP token must be approved to the router\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| BSC | Factory | `0xcA143Ce32Fe78f1f7019d7d551a6402fC5350c73` |\n| BSC | Router | `0x10ED43C718714eb63d5aA57B78B54704E256024E` |\n| Ethereum | Factory | `0x1097053Fd2ea711dad45caCcc45EfF7548fCB362` |\n| Ethereum | Router | `0xEfF92A263d31888d860bD50809A8D171709b7b1c` |\n| Arbitrum | Factory | `0x02a84c1b3BBD7401a5f7fa98a384EBC70bB5749E` |\n| Arbitrum | Router | `0x8cFe327CEc66d1C090Dd72bd0FF11d690C33a2Eb` |\n| Base | Factory | `0x02a84c1b3BBD7401a5f7fa98a384EBC70bB5749E` |\n| Base | Router | `0x8cFe327CEc66d1C090Dd72bd0FF11d690C33a2Eb` |\n| Linea | Factory | `0x02a84c1b3BBD7401a5f7fa98a384EBC70bB5749E` |\n| Linea | Router | `0x8cFe327CEc66d1C090Dd72bd0FF11d690C33a2Eb` |\n| opBNB | Factory | `0x02a84c1b3BBD7401a5f7fa98a384EBC70bB5749E` |\n| opBNB | Router | `0x8cFe327CEc66d1C090Dd72bd0FF11d690C33a2Eb` |\n\n## ABI Methods\n\n### PancakeSwapV2RouterABI\n\n- `swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) -> uint256[] amounts` - Swap exact input along path\n- `swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) -> uint256[] amounts` - Swap to get exact output\n- `addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB, uint256 liquidity)` - Add liquidity and mint LP tokens\n- `removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB)` - Burn LP tokens for underlying\n- `getAmountsOut(uint256 amountIn, address[] path) -> uint256[] amounts` - Quote output amounts (view)\n\n### PancakeSwapV2FactoryABI\n\n- `getPair(address tokenA, address tokenB) -> address pair` - Look up pair address (view)\n- `createPair(address tokenA, address tokenB) -> address pair` - Create a new pair\n\n## Notes\n\n- Same Uniswap V2 interface; 0.25% fee per swap (0.17% to LPs, 0.03% to treasury, 0.05% to CAKE buyback)\n- BSC Router address differs from other chains (BSC was the original deployment)\n- Arbitrum, Base, Linea, and opBNB share the same Factory and Router addresses\n- LP tokens can be staked in MasterChef for CAKE rewards\n- PancakeSwap is the default choice for BSC trading; use PancakeSwap V3 for concentrated liquidity\n",
88
+ "pancakeswap-v3": "# PancakeSwap V3\n\nConcentrated liquidity AMM on BNB Chain and multiple EVM chains. Built on Uniswap V3 architecture with custom fee tiers and farming integration via the SmartRouter.\n\n## Category\n\ndex | Chains: BSC, Ethereum, Arbitrum, Base, Linea\n\n## Key Operations\n\n- **swap**: Exact input single-hop swap with fee tier selection via SmartRouter\n\n## SDK Usage\n\n```typescript\nimport {\n protocolInfo,\n deployments,\n sauceFunctions,\n} from \"@eco-incorp/sauce/protocols/pancakeswap-v3\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { PancakeSwapV3SmartRouterABI as ISmartRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenIn: Address,\n tokenOut: Address,\n fee: Uint256,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256 {\n const router = ISmartRouter.at(routerAddress);\n return router.exactInputSingle({\n tokenIn: tokenIn,\n tokenOut: tokenOut,\n fee: fee,\n recipient: recipient,\n amountIn: amountIn,\n amountOutMinimum: amountOutMin,\n sqrtPriceLimitX96: 0,\n });\n}\n```\n\n- `routerAddress`: PancakeSwap V3 SmartRouter address for the target chain\n- `tokenIn` / `tokenOut`: Input and output token addresses\n- `fee`: Pool fee tier in hundredths of a bip. Common: `100` (0.01%), `500` (0.05%), `2500` (0.25%), `10000` (1%)\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n- `sqrtPriceLimitX96`: Set to `0` to accept any price\n- Note: SmartRouter does NOT include a `deadline` param in the struct (unlike Uniswap V3)\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ----------- | -------------------------------------------- |\n| BSC | Factory | `0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865` |\n| BSC | SmartRouter | `0x13f4EA83D0bd40E75C8222255bc855a974568Dd4` |\n| BSC | NFPM | `0x46A15B0b27311cedF172AB29E4f4766fbE7F4364` |\n| Ethereum | Factory | `0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865` |\n| Ethereum | SmartRouter | `0x13f4EA83D0bd40E75C8222255bc855a974568Dd4` |\n| Ethereum | NFPM | `0x46A15B0b27311cedF172AB29E4f4766fbE7F4364` |\n| Arbitrum | Factory | `0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865` |\n| Arbitrum | SmartRouter | `0x32226588378236Fd0c7c4053999F88aC0e5cAc77` |\n| Arbitrum | NFPM | `0x46A15B0b27311cedF172AB29E4f4766fbE7F4364` |\n| Base | Factory | `0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865` |\n| Base | SmartRouter | `0x678Aa4bF4E210cf2166753e054d5b7c31cc7fa86` |\n| Base | NFPM | `0x46A15B0b27311cedF172AB29E4f4766fbE7F4364` |\n| Linea | Factory | `0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865` |\n| Linea | SmartRouter | `0x678Aa4bF4E210cf2166753e054d5b7c31cc7fa86` |\n| Linea | NFPM | `0x46A15B0b27311cedF172AB29E4f4766fbE7F4364` |\n\n## ABI Methods\n\n### PancakeSwapV3SmartRouterABI\n\n- `exactInputSingle(tuple(address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96)) -> uint256 amountOut` - Single-hop swap with exact input amount\n- `exactOutputSingle(tuple(address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96)) -> uint256 amountIn` - Single-hop swap specifying exact output desired\n\n### PancakeSwapV3FactoryABI\n\n- `getPool(address tokenA, address tokenB, uint24 fee) -> address pool` - Look up pool address for token pair and fee tier (view)\n\n### PancakeSwapV3NFPMABI\n\n- `mint(tuple(address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Desired, uint256 amount1Desired, uint256 amount0Min, uint256 amount1Min, address recipient, uint256 deadline)) -> (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)` - Create new concentrated liquidity position NFT\n\n## Notes\n\n- Fee tiers may differ from Uniswap V3; PancakeSwap includes a 2500 (0.25%) tier\n- SmartRouter struct does NOT include `deadline` (unlike Uniswap V3's router)\n- Factory address is the same across all chains; SmartRouter addresses vary\n- NFPM address is consistent across all chains (`0x46A15B...`)\n- Input token must be ERC20-approved to the SmartRouter for swaps\n- Both tokens must be ERC20-approved to the NFPM for minting positions\n- Prefer V3 over V2 for major pairs on BSC for better capital efficiency\n",
89
+ "paraswap": "# ParaSwap\n\nMulti-chain DEX aggregator optimizing swap rates across decentralized exchanges. Supports limit orders and delta algorithm for MEV protection.\n\n## Category\n\naggregator | Chains: Ethereum, Arbitrum, Optimism, Polygon, BSC, Avalanche, Base\n\n## Key Operations\n\n- **simpleSwap**: Execute a simple single-path swap via Augustus router\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/paraswap\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Note: ParaSwap requires off-chain route computation via API before on-chain execution.\n// The simpleSwap function uses complex tuple params populated from API response.\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| --------- | ---------- | -------------------------------------------- |\n| Ethereum | augustusV5 | `0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57` |\n| Ethereum | augustusV6 | `0x6A000F20005980200259B80c5102003040001068` |\n| Arbitrum | augustusV5 | `0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57` |\n| Arbitrum | augustusV6 | `0x6A000F20005980200259B80c5102003040001068` |\n| Optimism | augustusV5 | `0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57` |\n| Polygon | augustusV5 | `0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57` |\n| BSC | augustusV5 | `0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57` |\n| Avalanche | augustusV5 | `0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57` |\n| Base | augustusV5 | `0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57` |\n\n## ABI Methods\n\n### AugustusV5ABI\n\n- `simpleSwap(tuple)` - Simple single-path swap. Payable. Returns receivedAmount. Tuple params:\n - `fromToken` (address) - Source token\n - `toToken` (address) - Destination token\n - `fromAmount` (uint256) - Input amount\n - `toAmount` (uint256) - Expected output\n - `expectedAmount` (uint256) - Expected amount for positive slippage tracking\n - `callees` (address[]) - DEX contracts to call\n - `exchangeData` (bytes) - Encoded calldata for each callee\n - `startIndexes` (uint256[]) - Byte offsets in exchangeData for each callee\n - `values` (uint256[]) - ETH values for each callee call\n - `beneficiary` (address) - Recipient of output tokens\n - `partner` (address) - Partner/referrer address\n - `feePercent` (uint256) - Fee percentage\n - `permit` (bytes) - EIP-2612 permit data (empty if pre-approved)\n - `deadline` (uint256) - Transaction deadline\n - `uuid` (bytes16) - Unique swap identifier\n\n## Notes\n\n- Augustus V5 and V6 both deployed on all chains\n- Delta algorithm protects against MEV/sandwich attacks\n- Route computation happens off-chain via ParaSwap API - callees/exchangeData come from API\n- Approve srcToken to Augustus contract before swapping\n- V6 is newer but V5 is more widely integrated\n",
90
+ "pendle": "# Pendle\n\nYield trading protocol that tokenizes future yield. Split yield-bearing assets into principal tokens (PT) and yield tokens (YT) for trading. PT = discounted principal (fixed yield), YT = future variable yield.\n\n## Category\n\nyield | Chains: Ethereum, Arbitrum\n\n## Key Operations\n\n- **swapExactTokenForPt**: Buy PT (principal token) - lock in fixed yield\n- **swapExactTokenForYt**: Buy YT (yield token) - speculate on variable yield\n- **addLiquiditySingleToken**: Add single-sided liquidity to a Pendle market\n- **removeLiquiditySingleToken**: Remove liquidity and receive single token\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/pendle\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Buy PT (fixed yield)\nimport { PendleRouterABI as IPendleRouter } from \"./abis\";\nfunction main(\n routerAddress: Address,\n receiver: Address,\n market: Address,\n minPtOut: Uint256,\n guessMin: Uint256,\n guessMax: Uint256,\n guessOffchain: Uint256,\n maxIteration: Uint256,\n eps: Uint256,\n tokenIn: Address,\n netTokenIn: Uint256,\n tokenMintSy: Address,\n): { netPtOut: Uint256; netSyFee: Uint256; netSyInterm: Uint256 } {\n const router = IPendleRouter.at(routerAddress);\n const result = router.swapExactTokenForPt(\n receiver,\n market,\n minPtOut,\n {\n guessMin: guessMin,\n guessMax: guessMax,\n guessOffchain: guessOffchain,\n maxIteration: maxIteration,\n eps: eps,\n },\n {\n tokenIn: tokenIn,\n netTokenIn: netTokenIn,\n tokenMintSy: tokenMintSy,\n pendleSwap: 0x0000000000000000000000000000000000000000,\n swapData: {\n swapType: 0,\n extRouter: 0x0000000000000000000000000000000000000000,\n extCalldata: 0x00,\n needScale: false,\n },\n },\n {\n limitRouter: 0x0000000000000000000000000000000000000000,\n epsSkipMarket: 0,\n normalFills: [],\n flashFills: [],\n optData: 0x00,\n },\n );\n return result;\n}\n\n// Remove liquidity\nimport { PendleRouterABI as IPendleRouter } from \"./abis\";\nfunction main(\n routerAddress: Address,\n receiver: Address,\n market: Address,\n netLpToRemove: Uint256,\n tokenOut: Address,\n minTokenOut: Uint256,\n tokenRedeemSy: Address,\n): { netTokenOut: Uint256; netSyFee: Uint256; netSyInterm: Uint256 } {\n const router = IPendleRouter.at(routerAddress);\n const result = router.removeLiquiditySingleToken(\n receiver,\n market,\n netLpToRemove,\n {\n tokenOut: tokenOut,\n minTokenOut: minTokenOut,\n tokenRedeemSy: tokenRedeemSy,\n pendleSwap: 0x0000000000000000000000000000000000000000,\n swapData: {\n swapType: 0,\n extRouter: 0x0000000000000000000000000000000000000000,\n extCalldata: 0x00,\n needScale: false,\n },\n },\n {\n limitRouter: 0x0000000000000000000000000000000000000000,\n epsSkipMarket: 0,\n normalFills: [],\n flashFills: [],\n optData: 0x00,\n },\n );\n return result;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | router | `0x888888888889758F76e7103c6CbF23ABbF58F946` |\n| Arbitrum | router | `0x888888888889758F76e7103c6CbF23ABbF58F946` |\n\n## ABI Methods\n\n### PendleRouterABI\n\n- `swapExactTokenForPt(address,address,uint256,tuple,tuple,tuple)` - Buy PT. Complex params: receiver, market, minPtOut, ApproxParams, TokenInput, LimitOrderData\n- `swapExactTokenForYt(address,address,uint256,tuple,tuple,tuple)` - Buy YT. Same param structure as swapExactTokenForPt\n- `addLiquiditySingleToken(address,address,uint256,tuple,tuple,tuple)` - Add single-sided liquidity. Params: receiver, market, minLpOut, ApproxParams, TokenInput, LimitOrderData\n- `removeLiquiditySingleToken(address,address,uint256,tuple,tuple)` - Remove liquidity. Params: receiver, market, netLpToRemove, TokenOutput, LimitOrderData\n\n### Param Structs\n\n- **ApproxParams**: { guessMin, guessMax, guessOffchain, maxIteration, eps } - Binary search params for PT/YT amount\n- **TokenInput**: { tokenIn, netTokenIn, tokenMintSy, pendleSwap, swapData } - Input token config\n- **TokenOutput**: { tokenOut, minTokenOut, tokenRedeemSy, pendleSwap, swapData } - Output token config\n- **SwapData**: { swapType, extRouter, extCalldata, needScale } - External swap config (use zeros for direct)\n- **LimitOrderData**: { limitRouter, epsSkipMarket, normalFills, flashFills, optData } - Limit orders (use zeros/empty)\n\n## Notes\n\n- TVL: $2.6B+. Markets have expiry dates - PT redeems at face value at maturity\n- All router methods use complex tuple params - see struct definitions above\n- For simple swaps without external routing: set pendleSwap to zero address, swapType to 0\n- For limit orders: set limitRouter to zero address, empty arrays for fills\n- ApproxParams eps is typically 1e15 (0.1%), maxIteration typically 256\n- tokenMintSy = the token that the SY (standardized yield) wrapper accepts\n",
91
+ "permit2": "# Permit2\n\nUniversal token approval infrastructure by Uniswap. Provides a single approval contract for all DeFi protocols, improving security and UX.\n\n## Category\n\ninfrastructure | Chains: Ethereum, Arbitrum, Optimism, Base, Polygon, BSC, Avalanche, Arc\n\n## Key Operations\n\n- **approve**: Set token allowance for a spender via Permit2\n- **transferFrom**: Transfer tokens using a Permit2 allowance\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/permit2\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Approve token via Permit2\nimport { Permit2ABI as IPermit2 } from \"./abis\";\nfunction main(\n permit2Address: Address,\n token: Address,\n spender: Address,\n amount: Uint256,\n expiration: Uint256,\n): Uint256 {\n const permit2 = IPermit2.at(permit2Address);\n permit2.approve(token, spender, amount, expiration);\n return 1;\n}\n\n// Transfer tokens using Permit2 allowance\nimport { Permit2ABI as IPermit2 } from \"./abis\";\nfunction main(\n permit2Address: Address,\n from: Address,\n to: Address,\n amount: Uint256,\n token: Address,\n): Uint256 {\n const permit2 = IPermit2.at(permit2Address);\n permit2.transferFrom(from, to, amount, token);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| ------------ | -------- | -------------------------------------------- |\n| All 7 chains | permit2 | `0x000000000022D473030F116dDEE9F6B43aC78BA3` |\n\n## ABI Methods\n\n### Permit2ABI\n\n- `approve(address,address,uint160,uint48)` - Set token allowance. Params: token, spender, amount (uint160 max), expiration (uint48 unix timestamp). No return value\n- `transferFrom(address,address,uint160,address)` - Transfer using allowance. Params: from, to, amount (uint160), token. No return value\n- `lockdown(tuple[])` - Revoke all approvals for specified token/spender pairs. Params: approvals (array of {token, spender} tuples). Emergency function to revoke compromised approvals\n\n## Notes\n\n- Same address on all 7 chains (deterministic CREATE2 deployment)\n- Approve once: ERC-20 approve to Permit2, then use Permit2 to manage per-protocol allowances\n- amount is uint160 (not uint256) - max value is type(uint160).max\n- expiration is uint48 unix timestamp - approvals auto-expire for security\n- Uniswap V3/V4, 1inch, and many protocols use Permit2 for token transfers\n- lockdown is an emergency function to batch-revoke compromised approvals\n",
92
+ "perpetual-protocol": "# Perpetual Protocol\n\nDecentralized perpetual futures exchange (Curie v2) on Optimism. Concentrated-liquidity virtual AMM with cross-margin trading.\n\n## Category\n\nperpetuals | Chains: Optimism\n\n## Key Operations\n\n- **deposit**: Deposit collateral into Vault for trading\n- **withdraw**: Withdraw collateral from Vault\n- **openPosition**: Open a leveraged perpetual position\n- **closePosition**: Close an existing perpetual position\n\n## SDK Usage\n\n```typescript\nimport {\n protocolInfo,\n deployments,\n sauceFunctions,\n} from \"@eco-incorp/sauce/protocols/perpetual-protocol\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit collateral\nimport { VaultABI as IVault } from \"./abis\";\nfunction main(vaultAddress: Address, token: Address, amount: Uint256): Uint256 {\n const vault = IVault.at(vaultAddress);\n vault.deposit(token, amount);\n return 1;\n}\n\n// Withdraw collateral\nimport { VaultABI as IVault } from \"./abis\";\nfunction main(vaultAddress: Address, token: Address, amount: Uint256): Uint256 {\n const vault = IVault.at(vaultAddress);\n vault.withdraw(token, amount);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------- | -------------------------------------------- |\n| Optimism | clearingHouse | `0x82ac2CE43e33683c58BE4cDc40975E73aA50f459` |\n| Optimism | vault | `0xAD7b4C162707E0B2b5f6fdDbD3f8538A5fbA0d60` |\n\n## ABI Methods\n\n### ClearingHouseABI\n\n- `openPosition((address,bool,bool,uint256,uint256,uint256,uint160,bytes32))` - Open leveraged position. One params struct: baseToken (market), isBaseToQuote (true=short, false=long), isExactInput (true=exact input amount), amount (trade amount), oppositeAmountBound (slippage limit), deadline (tx deadline), sqrtPriceLimitX96 (price limit, 0 for none), referralCode. Returns (base, quote)\n- `closePosition((address,uint160,uint256,uint256,bytes32))` - Close position. One params struct: baseToken, sqrtPriceLimitX96 (0 for market), oppositeAmountBound (slippage), deadline, referralCode. Returns (base, quote)\n- `getAccountValue(address)` - Get account value. Params: trader. Returns int256 value\n\n### VaultABI\n\n- `deposit(address,uint256)` - Deposit collateral. Params: token (USDC etc.), amount\n- `withdraw(address,uint256)` - Withdraw collateral. Params: token, amount\n- `getFreeCollateral(address)` - Query available collateral. Params: trader. Returns free collateral amount\n\n## Notes\n\n- Virtual AMM (vAMM) based pricing - no actual liquidity pools\n- Cross-margin trading - all positions share the same collateral\n- isBaseToQuote: true = short (sell base for quote), false = long (buy base with quote)\n- Deposit collateral to Vault first, then trade via ClearingHouse\n- sqrtPriceLimitX96 = 0 means no price limit (market order)\n",
93
+ "polygon-bridge": "# Polygon Native Bridge\n\nOfficial Polygon PoS bridge via RootChainManager. Supports ETH, ERC-20, ERC-721, and ERC-1155 deposits with checkpoint-based withdrawals.\n\n## Category\n\nnative L2 bridge | Direction: L1 to L2 (Ethereum to Polygon) | Chains: Ethereum (1), Polygon (137)\n\n## SauceScript Functions\n\n### depositETH\n\nDeposit ETH from Ethereum to Polygon (received as WETH on Polygon).\n\n```typescript\nimport { PolygonRootChainManagerABI as IRootChainManager } from \"./abis\";\n\nfunction main(rootChainManagerAddress: Address, recipient: Address): Uint256 {\n const manager = IRootChainManager.at(rootChainManagerAddress);\n manager.depositEtherFor(recipient);\n return 1;\n}\n```\n\n- `recipient`: Address to receive WETH on Polygon\n- ETH amount is sent as `msg.value`\n- ETH is received as WETH on Polygon (Polygon uses WMATIC as native token)\n\n### depositERC20\n\nDeposit ERC-20 tokens from Ethereum to Polygon.\n\n```typescript\nimport { PolygonRootChainManagerABI as IRootChainManager } from \"./abis\";\n\nfunction main(\n rootChainManagerAddress: Address,\n recipient: Address,\n rootToken: Address,\n depositData: bytes,\n): Uint256 {\n const manager = IRootChainManager.at(rootChainManagerAddress);\n manager.depositFor(recipient, rootToken, depositData);\n return 1;\n}\n```\n\n- `recipient`: Address to receive tokens on Polygon\n- `rootToken`: L1 (Ethereum) ERC-20 token address\n- `depositData`: ABI-encoded amount as bytes. Encode via `abi.encode(uint256 amount)`\n- Requires ERC-20 approval to the **ERC20Predicate** contract (NOT the RootChainManager)\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | ----------------- | -------------------------------------------- |\n| Ethereum | rootChainManager | `0xA0c68C638235ee32657e8f720a23ceC1bFc77C77` |\n| Ethereum | erc20Predicate | `0x40ec5B33f54e0E8A33A975908C5BA1c14e5BbbDf` |\n| Ethereum | etherPredicate | `0x8484Ef722627bf18ca5Ae6BcF031c23E6e922B30` |\n| Polygon | childChainManager | `0xA6FA4fB5f76172d178d61B04b0ecd319C5d1C0aa` |\n\n## ABI Reference\n\n### PolygonRootChainManagerABI\n\n- `depositEtherFor(address user)` [payable] - Deposit ETH to Polygon for a specified user. Received as WETH\n- `depositFor(address user, address rootToken, bytes depositData)` - Deposit ERC-20 tokens to Polygon. `depositData` = ABI-encoded amount\n- `exit(bytes inputData)` - Process a withdrawal on L1 using a burn proof from Polygon (checkpoint-based)\n\n## Notes\n\n- **L1 to L2** deposits via RootChainManager. **L2 to L1** withdrawals require burning tokens on Polygon, then calling `exit()` on L1 with the burn proof\n- **Approval target for ERC-20**: approve tokens to the **ERC20Predicate** (`0x40ec5B...`), NOT the RootChainManager\n- `depositData` for ERC-20 is `abi.encode(amount)` -- the amount encoded as a 32-byte uint256\n- ETH deposits are received as WETH on Polygon (Polygon's native token is MATIC)\n- L1 to L2 deposits finalize after the next Polygon checkpoint (~30-60 minutes)\n- L2 to L1 withdrawals require checkpoint inclusion + `exit()` call on Ethereum (~3 hours for checkpoint)\n- Supports ERC-20, ERC-721, and ERC-1155 via different predicate contracts\n- Canonical bridge -- no third-party risk, secured by the Polygon PoS validator set\n- Audited\n",
94
+ "premia": "# Premia\n\nDecentralized options protocol with an AMM-based pricing model and concentrated liquidity for options vaults.\n\n## Category\n\noptions | Chains: Arbitrum\n\n## Key Operations\n\n- **exercise**: Exercise a long options position to claim profit\n- **settle**: Settle a short options position after expiry\n- **trade**: Buy or sell options via the Premia AMM\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/premia\";\n```\n\n## SauceScript Examples\n\nPremia v3 has one pool contract per market (base, quote, strike, maturity, call/put), deployed by the PoolFactory; its `PoolDeployed` event names each pool. `exercise` and `settle` act on the caller's own position in that pool.\n\n```typescript\n// Exercise a long position after maturity\nimport { DiamondABI as IPool } from \"./abis\";\nfunction main(poolAddress: Address): { exerciseValue: Uint256; exerciseFee: Uint256 } {\n const pool = IPool.at(poolAddress);\n return pool.exercise();\n}\n\n// Settle a short position after maturity\nimport { DiamondABI as IPool } from \"./abis\";\nfunction main(poolAddress: Address): Uint256 {\n const pool = IPool.at(poolAddress);\n return pool.settle();\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ----------- | -------------------------------------------- |\n| Arbitrum | poolFactory | `0xAE4fB6622F25f397587F11638dA8CE88C27b5645` |\n\n## ABI Methods\n\n### DiamondABI (a Premia v3 pool)\n\n- `trade(uint256 size, bool isBuy, uint256 premiumLimit, address referrer) returns (uint256 totalPremium, (int256 collateral, int256 longs, int256 shorts) delta)` - Buy/sell options from the pool's AMM. `size` is 18-decimal\n- `exercise() returns (uint256 exerciseValue, uint256 exerciseFee)` - Exercise the caller's long position after maturity\n- `settle() returns (uint256 collateral)` - Settle the caller's short position after maturity\n\n## Notes\n\n- Each pool is a proxy routed through the pool Diamond's facets\n- Supports calls and puts on ETH, BTC, and other assets\n- Long token = bought option, short token = sold/written option\n- exercise returns the in-the-money value; settle returns remaining collateral to writers\n",
95
+ "puffer": "# Puffer Finance\n\nLiquid restaking protocol that issues pufETH via an ERC-4626 vault. Deposits are natively restaked via EigenLayer for additional yield.\n\n## Category\n\nrestaking | Chains: Ethereum\n\n## Key Operations\n\n- **deposit**: Deposit assets into PufferVault, receive pufETH shares\n- **redeem**: Redeem pufETH shares for underlying assets\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/puffer\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit into PufferVault\nimport { PufferVaultABI as IPufferVault } from \"./abis\";\nfunction main(pufferVaultAddress: Address, assets: Uint256, receiver: Address): Uint256 {\n const vault = IPufferVault.at(pufferVaultAddress);\n return vault.deposit(assets, receiver);\n}\n\n// Redeem pufETH shares\nimport { PufferVaultABI as IPufferVault } from \"./abis\";\nfunction main(\n pufferVaultAddress: Address,\n shares: Uint256,\n receiver: Address,\n owner: Address,\n): Uint256 {\n const vault = IPufferVault.at(pufferVaultAddress);\n return vault.redeem(shares, receiver, owner);\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------------------- | -------------------------------------------- |\n| Ethereum | pufETH / pufferVault | `0xD9A442856C234a39a81a089C06451EBAa4306a72` |\n\n## ABI Methods\n\n### PufferVaultABI (ERC-4626)\n\n- `deposit(uint256,address)` - Deposit assets, receive pufETH shares. Returns shares minted\n- `redeem(uint256,address,address)` - Redeem shares for assets. Params: shares, receiver, owner\n- `convertToShares(uint256)` - Preview shares for asset amount\n- `convertToAssets(uint256)` - Preview assets for share amount\n- `balanceOf(address)` - Query pufETH balance\n\n## Notes\n\n- TVL: $62M+. ERC-4626 vault interface (same as Yearn V3, sfrxETH, sDAI)\n- pufETH is non-rebasing - exchange rate increases over time\n- Natively restaked on EigenLayer\n- Standard ERC-4626 deposit/redeem pattern\n",
96
+ "pyth": "# Pyth Network\n\nHigh-fidelity oracle network providing low-latency price feeds from institutional sources. Uses pull-based model for efficient on-chain price updates.\n\n## Category\n\noracle | Chains: Ethereum\n\n## Key Operations\n\n- **getPrice**: Read price from Pyth oracle by price feed ID\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/pyth\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Get price by feed ID\nimport { PythOracleABI as IPythOracle } from \"./abis\";\nfunction main(\n oracleAddress: Address,\n priceId: Uint256,\n): { price: Uint256; conf: Uint256; expo: Uint256; publishTime: Uint256 } {\n const oracle = IPythOracle.at(oracleAddress);\n return oracle.getPrice(priceId);\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | oracle | `0x4305FB66699C3B2702D4d05CF36551390A4c69C6` |\n\n## ABI Methods\n\n### PythOracleABI\n\n- `getPrice(bytes32)` - Get price for a feed ID. Params: id (bytes32 price feed identifier). Returns Price tuple: (price int64, conf uint64, expo int32, publishTime uint256)\n - `price` - Latest price value\n - `conf` - Confidence interval (uncertainty)\n - `expo` - Price exponent (e.g. -8 means divide by 10^8)\n - `publishTime` - When price was published\n- `updatePriceFeeds(bytes[])` - Submit price updates on-chain. Payable (requires update fee). Params: updateData (Pyth price update VAAs from Hermes API)\n- `getUpdateFee(bytes[])` - Get fee required for price update. Params: updateData. Returns feeAmount in wei\n\n## Notes\n\n- Pull-based oracle: users must call updatePriceFeeds before reading prices\n- Sub-second latency from institutional market data providers\n- Actual price = price * 10^expo (e.g. price=12345, expo=-2 means $123.45)\n- Price feed IDs are bytes32 - see Pyth docs for specific feed IDs per asset\n- updatePriceFeeds requires sending ETH to pay the update fee (use getUpdateFee to check)\n- Get price update data from Pyth Hermes API off-chain, then submit on-chain\n",
97
+ "quickswap": "# QuickSwap\n\nThe leading DEX on Polygon with V2 (constant product, x*y=k) and V3 (Algebra-based concentrated liquidity with dynamic fees) pools. Low-fee trading powered by Polygon's infrastructure.\n\n## Category\n\ndex | Chains: Polygon\n\n## Key Operations\n\n- **swapV2**: Swap via V2 router with path routing\n- **swapV3**: Swap via V3 router with concentrated liquidity (Algebra, dynamic fees)\n- **addLiquidity**: Add liquidity to V2 pools\n- **removeLiquidity**: Remove liquidity from V2 pools\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/quickswap\";\n```\n\n## SauceScript Examples\n\n### swapV2\n\n```typescript\nimport { QuickSwapV2RouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n path: Address[],\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256[] {\n const router = IRouter.at(routerAddress);\n return router.swapExactTokensForTokens(amountIn, amountOutMin, path, recipient, 99999999999);\n}\n```\n\n- `routerAddress`: QuickSwap V2 Router on Polygon\n- `path`: Ordered token address array for the swap route\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n\n### swapV3\n\n```typescript\nimport { QuickSwapV3SwapRouterABI as ISwapRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenIn: Address,\n tokenOut: Address,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256 {\n const router = ISwapRouter.at(routerAddress);\n return router.exactInputSingle({\n tokenIn: tokenIn,\n tokenOut: tokenOut,\n recipient: recipient,\n deadline: 99999999999,\n amountIn: amountIn,\n amountOutMinimum: amountOutMin,\n limitSqrtPrice: 0,\n });\n}\n```\n\n- No `fee` parameter: QuickSwap V3 uses Algebra protocol with dynamic fees (not fixed fee tiers)\n- `limitSqrtPrice`: Set to `0` for no price limit\n\n### addLiquidity\n\n```typescript\nimport { QuickSwapV2RouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n amountADesired: Uint256,\n amountBDesired: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256; liquidity: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.addLiquidity(\n tokenA,\n tokenB,\n amountADesired,\n amountBDesired,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- Both tokens must be approved to the V2 router\n\n### removeLiquidity\n\n```typescript\nimport { QuickSwapV2RouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n liquidity: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.removeLiquidity(\n tokenA,\n tokenB,\n liquidity,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- LP token must be approved to the V2 router\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| ------- | ------------- | -------------------------------------------- |\n| Polygon | V2 Factory | `0x5757371414417b8C6CAad45bAeF941aBc7d3Ab32` |\n| Polygon | V2 Router | `0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff` |\n| Polygon | V3 Factory | `0x411b0fAcC3489691f28ad58c47006AF5E3Ab3A28` |\n| Polygon | V3 SwapRouter | `0xf5b509bB0909a69B1c207E495f687a596C168e12` |\n\n## ABI Methods\n\n### QuickSwapV2RouterABI\n\n- `swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) -> uint256[] amounts` - V2 swap exact input along path\n- `addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB, uint256 liquidity)` - Add V2 LP\n- `removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB)` - Remove V2 LP\n\n### QuickSwapV3SwapRouterABI\n\n- `exactInputSingle(tuple(address tokenIn, address tokenOut, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 limitSqrtPrice)) -> uint256 amountOut` - V3 concentrated liquidity swap with dynamic fees\n\n## Notes\n\n- V3 uses Algebra protocol (same as Camelot V3): dynamic fees that adjust based on volatility, NOT fixed fee tiers\n- V3 uses `limitSqrtPrice` instead of `sqrtPriceLimitX96`\n- Polygon-only deployment; the dominant DEX on Polygon alongside Uniswap V3\n- V2 uses standard Uniswap V2 interface with 0.3% fee\n- Prefer V3 for major pairs (better capital efficiency with dynamic fees)\n",
98
+ "radiant": "# Radiant\n\nOmnichain lending protocol on Arbitrum. Aave V2 fork with cross-chain lending capabilities via LayerZero. Requires dLP locking for emission eligibility.\n\n## Category\n\nlending | Chains: Arbitrum (42161)\n\n## SauceScript Functions\n\n### deposit\n\nDeposit assets to earn interest and receive rTokens.\n\n```typescript\nimport { RadiantLendingPoolABI as IRadiantLendingPool } from \"./abis\";\n\nfunction main(\n lendingPoolAddress: Address,\n asset: Address,\n amount: Uint256,\n onBehalfOf: Address,\n): Uint256 {\n const pool = IRadiantLendingPool.at(lendingPoolAddress);\n pool.deposit(asset, amount, onBehalfOf, 0);\n return 1;\n}\n```\n\n- `onBehalfOf`: Address that receives rTokens (use msg.sender for self)\n- Requires ERC-20 approval to the LendingPool\n\n### withdraw\n\nWithdraw deposited assets by burning rTokens.\n\n```typescript\nimport { RadiantLendingPoolABI as IRadiantLendingPool } from \"./abis\";\n\nfunction main(lendingPoolAddress: Address, asset: Address, amount: Uint256, to: Address): Uint256 {\n const pool = IRadiantLendingPool.at(lendingPoolAddress);\n return pool.withdraw(asset, amount, to);\n}\n```\n\n- `amount`: Use `type(uint256).max` to withdraw all\n- Returns actual withdrawn amount\n\n### borrow\n\nBorrow assets against deposited collateral.\n\n```typescript\nimport { RadiantLendingPoolABI as IRadiantLendingPool } from \"./abis\";\n\nfunction main(\n lendingPoolAddress: Address,\n asset: Address,\n amount: Uint256,\n interestRateMode: Uint256,\n onBehalfOf: Address,\n): Uint256 {\n const pool = IRadiantLendingPool.at(lendingPoolAddress);\n pool.borrow(asset, amount, interestRateMode, 0, onBehalfOf);\n return 1;\n}\n```\n\n- `interestRateMode`: 1 = stable, 2 = variable\n\n### repay\n\nRepay borrowed debt.\n\n```typescript\nimport { RadiantLendingPoolABI as IRadiantLendingPool } from \"./abis\";\n\nfunction main(\n lendingPoolAddress: Address,\n asset: Address,\n amount: Uint256,\n rateMode: Uint256,\n onBehalfOf: Address,\n): Uint256 {\n const pool = IRadiantLendingPool.at(lendingPoolAddress);\n return pool.repay(asset, amount, rateMode, onBehalfOf);\n}\n```\n\n- `rateMode`: Must match existing debt type (1 = stable, 2 = variable)\n- Requires ERC-20 approval to the LendingPool\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | ----------- | -------------------------------------------- |\n| Arbitrum | lendingPool | `0xF4B1486DD74D07706052A33d31d7c0AAFD0659E1` |\n\n## ABI Reference\n\n### RadiantLendingPoolABI\n\n- `deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)` - Deposit asset to earn interest\n- `withdraw(address asset, uint256 amount, address to) returns (uint256)` - Withdraw deposited asset\n- `borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf)` - Borrow against collateral\n- `repay(address asset, uint256 amount, uint256 rateMode, address onBehalfOf) returns (uint256)` - Repay borrowed debt\n\n## Notes\n\n- Same interface as Aave V2 (forked codebase) -- referralCode always 0\n- Requires dLP (dynamic liquidity provision) locking to be eligible for RDNT emissions\n- Users must lock at least 5% of deposit value in dLP to earn platform fees\n- interestRateMode: 1 = stable, 2 = variable\n- All deposit/repay operations require ERC-20 approval to LendingPool\n- Arbitrum-only deployment. TVL: $100M+. Audited\n",
99
+ "ramses": "# Ramses\n\nArbitrum-native ve(3,3) DEX with concentrated liquidity support. Features gauge voting, bribes, and protocol-owned liquidity mechanisms. Solidly-fork architecture.\n\n## Category\n\ndex | Chains: Arbitrum\n\n## Key Operations\n\n- **swap**: Swap tokens with route-based routing specifying stable or volatile pool type\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/ramses\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { RamsesRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenIn: Address,\n tokenOut: Address,\n stable: bool,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256[] {\n const router = IRouter.at(routerAddress);\n return router.swapExactTokensForTokens(\n amountIn,\n amountOutMin,\n [{ from: tokenIn, to: tokenOut, stable: stable }],\n recipient,\n 99999999999,\n );\n}\n```\n\n- `routerAddress`: Ramses Router on Arbitrum (`0xAAA87963EFeB6f7E0a2711F397663105Acb1805e`)\n- `tokenIn` / `tokenOut`: Input and output token addresses\n- `stable`: `true` for stable pools (pegged assets), `false` for volatile pools (uncorrelated)\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n- Routes support multi-hop: `[{from: A, to: B, stable: false}, {from: B, to: C, stable: true}]`\n- Note: Ramses routes do NOT include a `factory` field (unlike Velodrome/Aerodrome)\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Arbitrum | Router | `0xAAA87963EFeB6f7E0a2711F397663105Acb1805e` |\n\n## ABI Methods\n\n### RamsesRouterABI\n\n- `swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, tuple[](address from, address to, bool stable) routes, address to, uint256 deadline) -> uint256[] amounts` - Swap with route tuples specifying pool type per hop\n- `addLiquidity(address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB, uint256 liquidity)` - Add liquidity to a stable or volatile pool\n\n## Notes\n\n- Solidly-fork routes contain `{from, to, stable}` tuples (NO `factory` field, unlike Velodrome/Aerodrome)\n- Two pool types: `stable=true` for correlated assets, `stable=false` for uncorrelated\n- ve(3,3) model: RAM token holders vote-lock to direct gauge emissions and receive bribes\n- Arbitrum-only deployment; competes with Camelot on Arbitrum\n- Ramses also has concentrated liquidity pools (CL) but the SDK currently exposes the V2 Solidly interface\n- LP tokens can be staked in gauges for RAM emissions\n- Input token must be ERC20-approved to the Router\n",
100
+ "reflexer": "# Reflexer\n\nNon-pegged stablecoin protocol issuing RAI. Uses a PID controller to dampen RAI price volatility against ETH collateral.\n\n## Category\n\ncdp | Chains: Ethereum\n\n## Key Operations\n\n- **exitRai**: Exit RAI from the system (withdraw RAI tokens)\n- **joinRai**: Join RAI into the system (deposit RAI tokens)\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/reflexer\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Exit RAI from system\nimport { CoinJoinABI as ICoinJoin } from \"./abis\";\nfunction main(coinJoinAddress: Address, account: Address, amount: Uint256): Uint256 {\n const coinJoin = ICoinJoin.at(coinJoinAddress);\n coinJoin.exit(account, amount);\n return 1;\n}\n\n// Join RAI into system\nimport { CoinJoinABI as ICoinJoin } from \"./abis\";\nfunction main(coinJoinAddress: Address, account: Address, amount: Uint256): Uint256 {\n const coinJoin = ICoinJoin.at(coinJoinAddress);\n coinJoin.join(account, amount);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ---------- | -------------------------------------------- |\n| Ethereum | rai | `0x03ab458634910AaD20eF5f1C8ee96F1D6ac54919` |\n| Ethereum | safeEngine | `0xCC88a9d330da1133Df3A7bD823B95e52511A6962` |\n| Ethereum | ethJoin | `0x2D3cD7b81c93f188F3CB8aD87c8Acc73d6226e3a` |\n| Ethereum | coinJoin | `0x0A5653CCa4DB1B6E265F47CAf6969e64f1CFdC45` |\n\n## ABI Methods\n\n### SAFEEngineABI\n\n- `modifySAFECollateralization(bytes32,address,address,address,int256,int256)` - Modify SAFE position. Params: collateralType (bytes32 identifier), safe (SAFE owner), collateralSource, debtDestination, deltaCollateral (positive=add, negative=remove), deltaDebt (positive=borrow, negative=repay)\n- `safes(bytes32,address)` - Query SAFE position. Params: collateralType, safe address. Returns (lockedCollateral, generatedDebt)\n\n### CoinJoinABI\n\n- `join(address,uint256)` - Join RAI into system (deposit). Params: account, wad (RAI amount, 18 decimals)\n- `exit(address,uint256)` - Exit RAI from system (withdraw). Params: account, wad\n\n### ETHJoinABI\n\n- `join(address account, uint256 wad)` - Join WETH as collateral (the `ethJoin` deployment is a CollateralJoin for WETH; approve WETH first)\n- `exit(address,uint256)` - Exit ETH collateral. Params: account, wad (ETH amount)\n\n## Notes\n\n- RAI is non-pegged, floating around $3 - NOT a $1 stablecoin\n- PID controller adjusts the redemption rate to dampen RAI price volatility\n- Inspired by MakerDAO but with a non-pegged design philosophy\n- SAFEs (similar to MakerDAO Vaults) hold ETH collateral backing RAI debt\n- coinJoin converts between internal system debt units and external RAI ERC-20\n- ethJoin converts between ETH and internal collateral accounting\n",
101
+ "renzo": "# Renzo\n\nLiquid restaking protocol built on EigenLayer. Deposit ETH or LSTs and receive ezETH, a non-rebasing liquid restaked token.\n\n## Category\n\nrestaking | Chains: Ethereum\n\n## Key Operations\n\n- **depositETH**: Deposit ETH directly to receive ezETH\n- **deposit**: Deposit LST collateral (stETH, etc.) to receive ezETH\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/renzo\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit ETH for ezETH\nimport { RestakeManagerABI as IRestakeManager } from \"./abis\";\nfunction main(restakeManagerAddress: Address): Uint256 {\n const manager = IRestakeManager.at(restakeManagerAddress);\n manager.depositETH();\n return 1;\n}\n\n// Deposit LST for ezETH\nimport { RestakeManagerABI as IRestakeManager } from \"./abis\";\nfunction main(restakeManagerAddress: Address, collateralToken: Address, amount: Uint256): Uint256 {\n const manager = IRestakeManager.at(restakeManagerAddress);\n manager.deposit(collateralToken, amount);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------------- | -------------------------------------------- |\n| Ethereum | ezETH | `0xbf5495Efe5DB9ce00f80364C8B423567e58d2110` |\n| Ethereum | restakeManager | `0x74a09653A083691711cF8215a6ab074BB4e99ef5` |\n\n## ABI Methods\n\n### RestakeManagerABI\n\n- `deposit(address,uint256)` - Deposit LST collateral for ezETH (not payable). Approve token first\n- `depositETH()` - Deposit ETH (payable) for ezETH. Send ETH as msg.value\n\n### EzETHABI\n\n- `balanceOf(address)` - Query ezETH balance\n- `approve(address,uint256)` - Approve ezETH spending\n\n## Notes\n\n- TVL: $389M+. Built on EigenLayer restaking\n- ezETH is non-rebasing - value accrues over time\n- depositETH() is payable - send ETH as msg.value\n- For LST deposits, approve the collateral token to restakeManager first\n",
102
+ "rocket-pool": "# Rocket Pool\n\nDecentralised Ethereum liquid staking protocol. Stake ETH and receive rETH, a non-rebasing liquid staking token backed by a decentralized network of permissionless node operators.\n\n## Category\n\nliquid-staking | Chains: Ethereum\n\n## Key Operations\n\n- **deposit**: Stake ETH and receive rETH\n- **burn**: Burn rETH to redeem ETH (subject to pool liquidity)\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/rocket-pool\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit ETH for rETH\nimport { RocketDepositPoolABI as IRocketDepositPool } from \"./abis\";\nfunction main(depositPoolAddress: Address): Uint256 {\n const pool = IRocketDepositPool.at(depositPoolAddress);\n pool.deposit();\n return 1;\n}\n\n// Burn rETH back to ETH\nimport { RETHABI as IRETH } from \"./abis\";\nfunction main(rethAddress: Address, amount: Uint256): Uint256 {\n const reth = IRETH.at(rethAddress);\n reth.burn(amount);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ----------------- | -------------------------------------------- |\n| Ethereum | rETH | `0xae78736Cd615f374D3085123A210448E74Fc6393` |\n| Ethereum | rocketDepositPool | `0xDD3f50F8A6CafbE9b31a427582963f465E745AF8` |\n\n## ABI Methods\n\n### RocketDepositPoolABI\n\n- `deposit()` - Stake ETH (payable), receive rETH. Send ETH as msg.value\n\n### RETHABI\n\n- `getExchangeRate()` - Current rETH/ETH exchange rate (18 decimals)\n- `getRethValue(uint256)` - Convert ETH amount to rETH equivalent\n- `getEthValue(uint256)` - Convert rETH amount to ETH equivalent\n- `burn(uint256)` - Burn rETH to receive ETH. May fail if insufficient deposit pool liquidity\n- `balanceOf(address)` - Query rETH balance\n\n## Notes\n\n- TVL: $3B+. Most decentralized LST with permissionless node operators\n- rETH is non-rebasing: value increases over time relative to ETH\n- deposit() is payable - send ETH as msg.value, no parameters needed\n- burn() may fail if insufficient liquidity in the deposit pool\n- Exchange rate only goes up (barring slashing events)\n",
103
+ "sablier": "# Sablier\n\nToken streaming protocol for continuous payments. Supports linear, cliff, and dynamic vesting schedules with NFT-based stream ownership.\n\n## Category\n\npayments | Chains: Ethereum\n\n## Key Operations\n\n- **withdrawFromStream**: Withdraw accrued tokens from an active stream\n- **cancelStream**: Cancel a stream and return remaining tokens to sender\n- **createWithDurations**: Create a new linear stream with cliff and total duration\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/sablier\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Withdraw from stream\nimport { LockupLinearABI as ILockupLinear } from \"./abis\";\nfunction main(\n lockupLinearAddress: Address,\n streamId: Uint256,\n to: Address,\n amount: Uint256,\n): Uint256 {\n const lockup = ILockupLinear.at(lockupLinearAddress);\n lockup.withdraw(streamId, to, amount);\n return 1;\n}\n\n// Cancel stream\nimport { LockupLinearABI as ILockupLinear } from \"./abis\";\nfunction main(lockupLinearAddress: Address, streamId: Uint256): Uint256 {\n const lockup = ILockupLinear.at(lockupLinearAddress);\n lockup.cancel(streamId);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------ | -------------------------------------------- |\n| Ethereum | lockupLinear | `0xAFb979d9afAd1aD27C5eFf4E27226E3AB9e5dCC9` |\n\n## ABI Methods\n\n### LockupLinearABI\n\n- `createWithDurations(tuple)` - Create linear stream. Returns streamId. Params tuple:\n - `sender` (address) - Who funds the stream\n - `recipient` (address) - Who receives tokens\n - `totalAmount` (uint128) - Total tokens to stream\n - `asset` (address) - ERC-20 token to stream\n - `cancelable` (bool) - Whether sender can cancel\n - `transferable` (bool) - Whether stream NFT is transferable\n - `durations` (tuple) - `{ cliff (uint40), total (uint40) }` in seconds\n - `broker` (tuple) - `{ account (address), fee (uint256) }` - referral fee\n- `withdraw(uint256,address,uint128)` - Withdraw accrued tokens. Params: streamId, to (recipient), amount (tokens to withdraw, uint128)\n- `cancel(uint256)` - Cancel stream. Params: streamId. Returns unstreamed tokens to sender, accrued to recipient\n\n## Notes\n\n- Streams are ERC-721 NFTs - the stream recipient is the NFT owner\n- cliff: no tokens vest until cliff duration passes, then cliff amount vests immediately\n- Tokens accrue linearly between cliff and total duration\n- Only cancelable streams can be cancelled; non-cancelable streams run to completion\n- Approve the streaming asset to lockupLinear before createWithDurations\n- amount in withdraw is uint128, not uint256\n",
104
+ "safe": "# Safe\n\nThe most trusted multi-signature smart contract wallet, securing billions in digital assets. Supports programmable account abstraction and modular security.\n\n## Category\n\ninfrastructure | Chains: Ethereum, Arbitrum, Optimism, Base, Polygon, Arc\n\n## Key Operations\n\n- **getThreshold**: Query the signing threshold of a Safe multisig\n- **execTransaction**: Execute a transaction with collected signatures\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/safe\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Get Safe threshold\nimport { SafeABI as ISafe } from \"./abis\";\nfunction main(safeAddress: Address): Uint256 {\n const safe = ISafe.at(safeAddress);\n return safe.getThreshold();\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ---------- | -------------------------------------------- |\n| Ethereum | safeV141 | `0x41675C099F32341bf84BFc5382aF534df5C7461a` |\n| Ethereum | safeL2V130 | `0x3E5c63644E683549055b9Be8653de26E0B4CD36E` |\n| Arbitrum | safeL2V130 | `0x3E5c63644E683549055b9Be8653de26E0B4CD36E` |\n| Optimism | safeL2V130 | `0x3E5c63644E683549055b9Be8653de26E0B4CD36E` |\n| Base | safeL2V130 | `0x3E5c63644E683549055b9Be8653de26E0B4CD36E` |\n| Polygon | safeL2V130 | `0x3E5c63644E683549055b9Be8653de26E0B4CD36E` |\n\n## ABI Methods\n\n### SafeABI\n\n- `execTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes)` - Execute signed transaction. Payable. Params: to (target), value (ETH), data (calldata), operation (0=call, 1=delegatecall), safeTxGas, baseGas, gasPrice, gasToken (address(0) for ETH), refundReceiver, signatures (packed owner signatures). Returns success bool\n- `getOwners()` - List all Safe owners. Returns address[] of current owners\n- `getThreshold()` - Get signing threshold. Returns uint256 (M in M-of-N)\n\n## Notes\n\n- Secures $100B+ in assets across DeFi\n- safeV141 is for Ethereum L1; safeL2V130 is the L2-optimized version (emits events for cheaper indexing)\n- operation: 0 = CALL (normal), 1 = DELEGATECALL (execute in Safe context)\n- signatures are sorted by owner address, packed as 65 bytes each (r, s, v)\n- Modular: supports Guards (pre/post checks), Modules (extend functionality), and Fallback handlers\n",
105
+ "scroll-bridge": "# Scroll Native Bridge\n\nOfficial Scroll zkEVM bridge via L1ScrollMessenger and L1GatewayRouter. Deposits ETH and ERC-20 tokens with ZK proof-based finality.\n\n## Category\n\nnative L2 bridge | Direction: L1 to L2 (Ethereum to Scroll) | Chains: Ethereum (1), Scroll (534352)\n\n## SauceScript Functions\n\n### depositETH\n\nDeposit ETH from Ethereum L1 to Scroll L2.\n\n```typescript\nimport { ScrollL1GatewayRouterABI as IL1GatewayRouter } from \"./abis\";\n\nfunction main(gatewayRouterAddress: Address, amount: Uint256, gasLimit: Uint256): Uint256 {\n const router = IL1GatewayRouter.at(gatewayRouterAddress);\n router.depositETH(amount, gasLimit);\n return 1;\n}\n```\n\n- `amount`: Amount of ETH to deposit (also send as `msg.value`)\n- `gasLimit`: L2 gas limit for the deposit execution (e.g. 200000)\n- Requires ETH as msg.value covering amount + L2 gas fees\n\n### depositERC20\n\nDeposit ERC-20 tokens from Ethereum L1 to Scroll L2.\n\n```typescript\nimport { ScrollL1GatewayRouterABI as IL1GatewayRouter } from \"./abis\";\n\nfunction main(\n gatewayRouterAddress: Address,\n token: Address,\n amount: Uint256,\n gasLimit: Uint256,\n): Uint256 {\n const router = IL1GatewayRouter.at(gatewayRouterAddress);\n router.depositERC20(token, amount, gasLimit);\n return 1;\n}\n```\n\n- `token`: L1 ERC-20 token address\n- `amount`: Amount of tokens to deposit\n- `gasLimit`: L2 gas limit for the deposit execution (e.g. 200000)\n- Requires ERC-20 approval to the L1GatewayRouter\n- Requires ETH as msg.value for L2 gas fees\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | ----------------- | -------------------------------------------- |\n| Ethereum | l1ScrollMessenger | `0x6774Bcbd5ceCeF1336b5300fb5186a12DDD8b367` |\n| Ethereum | l1GatewayRouter | `0xF8B1378579659D8F7EE5f3C929c2f3E332E41Fd6` |\n| Scroll | l2ScrollMessenger | `0x781e90f1c8Fc4611c9b7497C3B47F99Ef6969CbC` |\n| Scroll | l2GatewayRouter | `0x4C0926FF5252A435FD19e10ED15e5a249Ba19d79` |\n\n## ABI Reference\n\n### ScrollL1GatewayRouterABI\n\n- `depositETH(uint256 _amount, uint256 _gasLimit)` [payable] - Deposit ETH to your own address on Scroll\n- `depositERC20(address _token, uint256 _amount, uint256 _gasLimit)` [payable] - Deposit ERC-20 tokens to your own address on Scroll\n\n### ScrollL1MessengerABI\n\n- `sendMessage(address to, uint256 value, bytes message, uint256 gasLimit)` [payable] - Send arbitrary message from L1 to L2 (low-level messaging)\n\n## Notes\n\n- **L1 to L2** via GatewayRouter (for token deposits) or L1ScrollMessenger (for arbitrary messages)\n- zkEVM architecture -- withdrawals finalize with ZK proofs (faster than optimistic rollups, typically hours not days)\n- GatewayRouter auto-routes tokens to the correct gateway (standard ERC-20, WETH, custom gateways)\n- `msg.value` must include gas fees for L2 execution (even for ERC-20 deposits)\n- L1 to L2 deposits finalize after ZK proof generation (~1-4 hours)\n- L2 to L1 withdrawals also require ZK proof finalization (~1-4 hours)\n- Canonical bridge -- no third-party risk, secured by Scroll's ZK proving system\n- Audited\n",
106
+ "seamless": "# Seamless\n\nNative lending and borrowing protocol on Base. Aave V3 fork with integrated leverage strategies (ILMs) for one-click leveraged yield.\n\n## Category\n\nlending | Chains: Base (8453)\n\n## SauceScript Functions\n\n### supply\n\nSupply assets to earn interest. Same interface as Aave V3.\n\n```typescript\nimport { SeamlessPoolABI as ISeamlessPool } from \"./abis\";\n\nfunction main(poolAddress: Address, asset: Address, amount: Uint256, onBehalfOf: Address): Uint256 {\n const pool = ISeamlessPool.at(poolAddress);\n pool.supply(asset, amount, onBehalfOf, 0);\n return 1;\n}\n```\n\n- `onBehalfOf`: Address receiving the supply tokens (use msg.sender for self)\n- Requires ERC-20 approval to the Pool\n\n### withdraw\n\nWithdraw supplied assets.\n\n```typescript\nimport { SeamlessPoolABI as ISeamlessPool } from \"./abis\";\n\nfunction main(poolAddress: Address, asset: Address, amount: Uint256, to: Address): Uint256 {\n const pool = ISeamlessPool.at(poolAddress);\n return pool.withdraw(asset, amount, to);\n}\n```\n\n- `amount`: Use `type(uint256).max` to withdraw all\n- Returns actual withdrawn amount\n\n### borrow\n\nBorrow assets against supplied collateral.\n\n```typescript\nimport { SeamlessPoolABI as ISeamlessPool } from \"./abis\";\n\nfunction main(\n poolAddress: Address,\n asset: Address,\n amount: Uint256,\n interestRateMode: Uint256,\n onBehalfOf: Address,\n): Uint256 {\n const pool = ISeamlessPool.at(poolAddress);\n pool.borrow(asset, amount, interestRateMode, 0, onBehalfOf);\n return 1;\n}\n```\n\n- `interestRateMode`: 2 = variable rate\n\n### repay\n\nRepay borrowed debt.\n\n```typescript\nimport { SeamlessPoolABI as ISeamlessPool } from \"./abis\";\n\nfunction main(\n poolAddress: Address,\n asset: Address,\n amount: Uint256,\n interestRateMode: Uint256,\n onBehalfOf: Address,\n): Uint256 {\n const pool = ISeamlessPool.at(poolAddress);\n return pool.repay(asset, amount, interestRateMode, onBehalfOf);\n}\n```\n\n- `amount`: Use `type(uint256).max` to repay full debt\n- Requires ERC-20 approval to the Pool\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| ----- | --------------------- | -------------------------------------------- |\n| Base | pool | `0x8F44Fd754285aa6A2b8B9B97739B79746e0475a7` |\n| Base | poolAddressesProvider | `0x0E02EB705be564c2bF0067928A8f8DD89a82B26E` |\n\n## ABI Reference\n\n### SeamlessPoolABI\n\n- `supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)` - Supply asset to earn interest\n- `withdraw(address asset, uint256 amount, address to) returns (uint256)` - Withdraw supplied asset\n- `borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf)` - Borrow against collateral\n- `repay(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf) returns (uint256)` - Repay debt\n\n## Notes\n\n- Same interface as Aave V3 (forked codebase) -- referralCode always 0\n- ILMs (Integrated Liquidity Markets) enable one-click leveraged positions on yield-bearing assets\n- interestRateMode: 2 = variable (stable rate not supported)\n- All supply/repay operations require ERC-20 approval to the Pool\n- Base-only deployment. TVL: $100M+. Audited\n",
107
+ "seaport": "# Seaport\n\nOpenSea's decentralized NFT marketplace protocol supporting flexible order types including English and Dutch auctions, collection offers, and trait-based offers.\n\n## Category\n\nnft-marketplace | Chains: Ethereum, Arbitrum, Optimism, Polygon, Base, Arc\n\n## Key Operations\n\n- **fulfillBasicOrder**: Fulfill a basic NFT buy/sell order\n- **cancel**: Cancel pending orders\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/seaport\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Note: Seaport orders require off-chain signature creation via seaport-js SDK.\n// On-chain fulfillment uses the signed order parameters.\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ---------- | -------------------------------------------- |\n| Ethereum | seaportV16 | `0x0000000000000068F116a894984e2DB1123eB395` |\n| Arbitrum | seaportV16 | `0x0000000000000068F116a894984e2DB1123eB395` |\n| Optimism | seaportV16 | `0x0000000000000068F116a894984e2DB1123eB395` |\n| Polygon | seaportV16 | `0x0000000000000068F116a894984e2DB1123eB395` |\n| Base | seaportV16 | `0x0000000000000068F116a894984e2DB1123eB395` |\n\n## ABI Methods\n\n### SeaportABI\n\n- `fulfillBasicOrder(tuple)` - Fulfill a basic order. Payable. Returns fulfilled bool. BasicOrderParameters tuple:\n - `considerationToken` (address) - Token to pay (address(0) for ETH)\n - `considerationIdentifier` (uint256) - Token ID (0 for ERC-20/ETH)\n - `considerationAmount` (uint256) - Payment amount\n - `offerer` (address) - Order creator\n - `zone` (address) - Zone contract for access control\n - `offerToken` (address) - NFT contract address\n - `offerIdentifier` (uint256) - NFT token ID\n - `offerAmount` (uint256) - NFT amount (1 for ERC-721)\n - `basicOrderType` (uint8) - Order type enum\n - `startTime`, `endTime` (uint256) - Order validity window\n - `zoneHash` (bytes32), `salt` (uint256) - Order uniqueness\n - `offererConduitKey`, `fulfillerConduitKey` (bytes32) - Conduit keys for token transfers\n - `totalOriginalAdditionalRecipients` (uint256) - Creator fees count\n - `additionalRecipients` (`(uint256 amount, address recipient)[]`) - Extra consideration recipients (fees)\n - `signature` (bytes) - Offerer's EIP-712 signature\n- `cancel(tuple[])` - Cancel orders. Params: orders (array of OrderComponents: offerer, zone, offer items, consideration items, orderType, startTime, endTime, zoneHash, salt, conduitKey, counter). Returns cancelled bool\n\n## Notes\n\n- Same address across all 5 chains\n- Zone-based access control for order restrictions\n- Conduits are approved transfer proxies - conduitKey=bytes32(0) for default\n- basicOrderType encodes: ERC-721/1155 + ETH/ERC-20 payment + buy/sell direction\n- Orders are signed off-chain, fulfilled on-chain - use seaport-js SDK for order creation\n",
108
+ "silo": "# Silo\n\nPermissionless lending protocol with isolated risk markets (Silos). Each Silo is a pair of two assets with independent risk parameters, preventing cross-market contagion.\n\n## Category\n\nlending | Chains: Ethereum (1), Arbitrum (42161)\n\n## SauceScript Functions\n\n### deposit\n\nDeposit assets into a Silo.\n\n```typescript\nimport { SiloABI as ISilo } from \"./abis\";\n\nfunction main(siloAddress: Address, asset: Address, amount: Uint256): Uint256 {\n const silo = ISilo.at(siloAddress);\n silo.deposit(asset, amount, false);\n return 1;\n}\n```\n\n- `siloAddress`: The specific Silo contract (use SiloRepository.getSilo to find it)\n- `asset`: Token to deposit\n- `collateralOnly`: `false` = standard deposit (can be borrowed by others), `true` = collateral-only (higher LTV but cannot be lent out)\n- Requires ERC-20 approval to the Silo\n\n### withdraw\n\nWithdraw deposited assets.\n\n```typescript\nimport { SiloABI as ISilo } from \"./abis\";\n\nfunction main(siloAddress: Address, asset: Address, amount: Uint256): Uint256 {\n const silo = ISilo.at(siloAddress);\n const result = silo.withdraw(asset, amount, false);\n return result.withdrawnAmount;\n}\n```\n\n- `collateralOnly`: Must match the deposit type\n- Returns actual amount withdrawn\n\n### borrow\n\nBorrow assets from a Silo against deposited collateral.\n\n```typescript\nimport { SiloABI as ISilo } from \"./abis\";\n\nfunction main(siloAddress: Address, asset: Address, amount: Uint256): Uint256 {\n const silo = ISilo.at(siloAddress);\n silo.borrow(asset, amount);\n return 1;\n}\n```\n\n- Must have collateral deposited in the same Silo first\n\n### repay\n\nRepay borrowed assets.\n\n```typescript\nimport { SiloABI as ISilo } from \"./abis\";\n\nfunction main(siloAddress: Address, asset: Address, amount: Uint256): Uint256 {\n const silo = ISilo.at(siloAddress);\n silo.repay(asset, amount);\n return 1;\n}\n```\n\n- Requires ERC-20 approval to the Silo\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | -------------- | -------------------------------------------- |\n| Ethereum | siloRepository | `0xbACBBefda6fD1FbF5a2d6A79916F4B6124eD2D49` |\n| Arbitrum | siloRepository | `0x8658047e48CC09161f4152c79155Dac1d710Ff0a` |\n\n## ABI Reference\n\n### SiloABI\n\n- `deposit(address asset, uint256 amount, bool collateralOnly) returns (uint256 collateralAmount, uint256 collateralShare)` - Deposit asset into Silo\n- `withdraw(address asset, uint256 amount, bool collateralOnly) returns (uint256 withdrawnAmount, uint256 withdrawnShare)` - Withdraw deposited asset\n- `borrow(address asset, uint256 amount) returns (uint256 debtAmount, uint256 debtShare)` - Borrow asset against collateral\n- `repay(address asset, uint256 amount) returns (uint256 repaidAmount, uint256 repaidShare)` - Repay borrowed debt\n\n### SiloRepositoryABI\n\n- `getSilo(address asset) returns (address silo)` - Look up Silo address for a given asset (view)\n\n## Notes\n\n- Each Silo is an isolated two-asset market -- risk from one market cannot spread to others\n- `collateralOnly = true` gives higher LTV but your deposit cannot be lent out to borrowers\n- Use `SiloRepository.getSilo(assetAddress)` to find the Silo contract for any asset\n- Same SiloRepository address on Ethereum and Arbitrum\n- All deposit/repay operations require ERC-20 approval\n- TVL: $200M+. Audited\n",
109
+ "socket": "# Socket\n\nCross-chain bridge aggregator that finds optimal routes across multiple bridges and DEXes for token transfers.\n\n## Category\n\nbridge aggregator | Direction: any-to-any | Chains: Ethereum (1), Arbitrum (42161), Optimism (10), Base (8453), Polygon (137), BSC (56), Avalanche (43114)\n\n## SauceScript Functions\n\n### bridge\n\nBridge tokens via Socket Gateway using a pre-computed route.\n\n```typescript\nimport { SocketGatewayABI as ISocketGateway } from \"./abis\";\n\nfunction main(gatewayAddress: Address, routeId: Uint256, bridgeData: bytes): Uint256 {\n const gateway = ISocketGateway.at(gatewayAddress);\n gateway.executeRoute(routeId, bridgeData);\n return 1;\n}\n```\n\n- `routeId`: Route identifier obtained from the Socket API. Each route corresponds to a specific bridge integration (uint32)\n- `bridgeData`: ABI-encoded bridge parameters specific to the selected route. Obtained from the Socket API\n- Socket requires off-chain route computation via their API before on-chain execution\n- Requires ERC-20 approval to the Socket Gateway\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| --------- | ------------- | -------------------------------------------- |\n| Ethereum | socketGateway | `0x3a23F943181408EAC424116Af7b7790c94Cb97a5` |\n| Arbitrum | socketGateway | `0x3a23F943181408EAC424116Af7b7790c94Cb97a5` |\n| Optimism | socketGateway | `0x3a23F943181408EAC424116Af7b7790c94Cb97a5` |\n| Base | socketGateway | `0x3a23F943181408EAC424116Af7b7790c94Cb97a5` |\n| Polygon | socketGateway | `0x3a23F943181408EAC424116Af7b7790c94Cb97a5` |\n| BSC | socketGateway | `0x3a23F943181408EAC424116Af7b7790c94Cb97a5` |\n| Avalanche | socketGateway | `0x3a23F943181408EAC424116Af7b7790c94Cb97a5` |\n\n## ABI Reference\n\n### SocketGatewayABI\n\n- `executeRoute(uint32 routeId, bytes routeData) returns (bytes result)` [payable] - Execute a route (bridge, swap, or combined). Returns result data\n\n## Notes\n\n- Socket is a bridge **aggregator** -- routes through underlying bridges (Across, Stargate, Hop, cBridge, Connext, etc.)\n- Two-step process: (1) call Socket API to get optimal route + encoded `bridgeData`, (2) execute on-chain via `executeRoute()`\n- There is no separate `bridge()` entry point: `executeRoute()` handles bridge, swap, and combined routes\n- Same Gateway address (`0x3a23F9...`) deployed across all supported chains\n- `routeId` identifies the specific bridge integration (each bridge has its own route handler contract)\n- The `bridgeData` is opaque -- generated by the Socket API based on token, amount, source/destination chains\n- Requires ERC-20 approval to the Socket Gateway address\n- Finality depends on the underlying bridge selected\n- TVL: $100M+. Audited\n",
110
+ "sommelier": "# Sommelier\n\nERC-4626 strategy vaults (Cellars) managed by off-chain strategists via Cosmos validators. Automated DeFi portfolio management.\n\n## Category\n\nyield | Chains: Ethereum\n\n## Key Operations\n\n- **deposit**: Deposit assets into Cellar vault\n- **withdraw**: Withdraw assets from Cellar\n- **redeem**: Redeem Cellar shares\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/sommelier\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit into Sommelier Cellar\nimport { CellarABI as ICellar } from \"./abis\";\n\nfunction main(cellarAddress: Address, assets: Uint256, receiver: Address): Uint256 {\n const cellar = ICellar.at(cellarAddress);\n return cellar.deposit(assets, receiver);\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------ | -------------------------------------------- |\n| Ethereum | cellarRouter | `0x6b7f87279982d919Bbf85182DDeAB179B366d8f2` |\n\n## ABI Methods\n\n- `deposit(uint256,address)` - Deposit assets\n- `withdraw(uint256,address,address)` - Withdraw assets\n- `redeem(uint256,address,address)` - Redeem shares\n\n## Notes\n\n- Cellars are ERC-4626 vaults. Strategies managed off-chain via Cosmos governance.\n",
111
+ "spark": "# Spark\n\nAave V3 fork operated by MakerDAO/Sky ecosystem. Offers competitive rates on DAI/USDS borrowing backed by the Maker protocol.\n\n## Category\n\nlending | Chains: Ethereum (1)\n\n## SauceScript Functions\n\n### supply\n\nSupply assets to earn interest. Same interface as Aave V3.\n\n```typescript\nimport { SparkPoolABI as ISparkPool } from \"./abis\";\n\nfunction main(poolAddress: Address, asset: Address, amount: Uint256, onBehalfOf: Address): Uint256 {\n const pool = ISparkPool.at(poolAddress);\n pool.supply(asset, amount, onBehalfOf, 0);\n return 1;\n}\n```\n\n- `asset`: ERC-20 token to supply (e.g. DAI, WETH, wstETH)\n- `onBehalfOf`: Address receiving the spTokens (use msg.sender for self)\n- Requires ERC-20 approval to the Pool\n\n### withdraw\n\nWithdraw supplied assets.\n\n```typescript\nimport { SparkPoolABI as ISparkPool } from \"./abis\";\n\nfunction main(poolAddress: Address, asset: Address, amount: Uint256, to: Address): Uint256 {\n const pool = ISparkPool.at(poolAddress);\n return pool.withdraw(asset, amount, to);\n}\n```\n\n- `amount`: Use `type(uint256).max` to withdraw entire balance\n- Returns actual withdrawn amount\n\n### borrow\n\nBorrow assets against supplied collateral.\n\n```typescript\nimport { SparkPoolABI as ISparkPool } from \"./abis\";\n\nfunction main(\n poolAddress: Address,\n asset: Address,\n amount: Uint256,\n interestRateMode: Uint256,\n onBehalfOf: Address,\n): Uint256 {\n const pool = ISparkPool.at(poolAddress);\n pool.borrow(asset, amount, interestRateMode, 0, onBehalfOf);\n return 1;\n}\n```\n\n- `interestRateMode`: 2 = variable rate (stable rate deprecated)\n- DAI/USDS borrow rates are subsidized by MakerDAO -- often lower than market rates\n\n### repay\n\nRepay borrowed debt.\n\n```typescript\nimport { SparkPoolABI as ISparkPool } from \"./abis\";\n\nfunction main(\n poolAddress: Address,\n asset: Address,\n amount: Uint256,\n interestRateMode: Uint256,\n onBehalfOf: Address,\n): Uint256 {\n const pool = ISparkPool.at(poolAddress);\n return pool.repay(asset, amount, interestRateMode, onBehalfOf);\n}\n```\n\n- `amount`: Use `type(uint256).max` to repay full debt\n- Requires ERC-20 approval to the Pool\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | --------------------- | -------------------------------------------- |\n| Ethereum | pool | `0xC13e21B648A5Ee794902342038FF3aDAB66BE987` |\n| Ethereum | poolAddressesProvider | `0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eE` |\n\n## ABI Reference\n\n### SparkPoolABI\n\n- `supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)` - Supply asset to earn interest\n- `withdraw(address asset, uint256 amount, address to) returns (uint256)` - Withdraw supplied asset\n- `borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf)` - Borrow against collateral\n- `repay(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf) returns (uint256)` - Repay debt\n\n## Notes\n\n- Same interface as Aave V3 (forked codebase) -- referralCode always 0\n- Competitive DAI/USDS borrow rates subsidized by MakerDAO/Sky\n- interestRateMode: 2 = variable (stable rate being phased out)\n- All supply/repay operations require ERC-20 approval to the Pool\n- Ethereum-only deployment. TVL: $5B+. Audited\n",
112
+ "spookyswap": "# SpookySwap\n\nThe largest DEX on Fantom with UniV2-style constant product pools (x*y=k). Features yield farming, cross-chain bridges, and limit orders. The default trading venue on the Fantom network.\n\n## Category\n\ndex | Chains: Fantom\n\n## Key Operations\n\n- **swap**: Swap exact input tokens through a routing path\n- **addLiquidity**: Deposit two tokens to mint LP tokens\n- **removeLiquidity**: Burn LP tokens to withdraw underlying tokens\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/spookyswap\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { SpookySwapRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n path: Address[],\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256[] {\n const router = IRouter.at(routerAddress);\n return router.swapExactTokensForTokens(amountIn, amountOutMin, path, recipient, 99999999999);\n}\n```\n\n- `routerAddress`: SpookySwap Router on Fantom (`0xF491e7B69E4244ad4002BC14e878a34207E38c29`)\n- `path`: Ordered token address array for the swap route\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n\n### addLiquidity\n\n```typescript\nimport { SpookySwapRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n amountADesired: Uint256,\n amountBDesired: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256; liquidity: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.addLiquidity(\n tokenA,\n tokenB,\n amountADesired,\n amountBDesired,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- Both tokens must be approved to the router\n\n### removeLiquidity\n\n```typescript\nimport { SpookySwapRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n liquidity: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.removeLiquidity(\n tokenA,\n tokenB,\n liquidity,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- LP token must be approved to the router\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| ------ | --------- | -------------------------------------------- |\n| Fantom | V2 Router | `0xF491e7B69E4244ad4002BC14e878a34207E38c29` |\n\n## ABI Methods\n\n### SpookySwapRouterABI\n\n- `swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) -> uint256[] amounts` - Swap exact input along path\n- `addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB, uint256 liquidity)` - Add liquidity and mint LP tokens\n- `removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB)` - Burn LP tokens for underlying\n\n## Notes\n\n- Standard Uniswap V2 fork interface; 0.2% fee per swap (lower than standard 0.3%)\n- Fantom-only deployment; the dominant DEX on Fantom\n- BOO token is the governance/staking token (stake for xBOO to earn fees)\n- SushiSwap is also deployed on Fantom as an alternative\n- Both tokens must be ERC20-approved to the Router before swap/addLiquidity\n",
113
+ "squid": "# Squid Router\n\nCross-chain liquidity router built on Axelar. Enables one-click cross-chain swaps combining bridge and DEX operations.\n\n## Category\n\nbridge aggregator | Direction: any-to-any | Chains: Ethereum (1), Arbitrum (42161), Optimism (10), Base (8453), Polygon (137), BSC (56), Avalanche (43114)\n\n## SauceScript Functions\n\n### bridge\n\nBridge tokens cross-chain via Squid Router.\n\n```typescript\nimport { SquidRouterABI as ISquidRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n amount: Uint256,\n bridgedTokenSymbol: string,\n destinationChain: string,\n destinationAddress: string,\n gasRefundRecipient: Address,\n): Uint256 {\n const router = ISquidRouter.at(routerAddress);\n router.bridgeCall(\n bridgedTokenSymbol,\n amount,\n destinationChain,\n destinationAddress,\n \"\",\n gasRefundRecipient,\n false,\n );\n return 1;\n}\n```\n\n- `amount`: Amount of tokens to bridge\n- `bridgedTokenSymbol`: Symbol of the Axelar gateway token to bridge (e.g. \"axlUSDC\", \"WETH\"); it selects the token\n- `destinationChain`: Axelar chain name string (e.g. \"ethereum\", \"arbitrum\", \"Polygon\")\n- `destinationAddress`: Recipient address on the destination chain (as string)\n- `payload` (5th argument): Optional calldata to execute on destination; empty for simple transfers\n- `gasRefundRecipient`: receives unused Axelar gas; `enableExpress` (last) opts into express delivery\n- Requires ERC-20 approval to the Squid Router\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| --------- | ----------- | -------------------------------------------- |\n| Ethereum | squidRouter | `0xce16F69375520ab01377ce7B88f5BA8C48F8D666` |\n| Arbitrum | squidRouter | `0xce16F69375520ab01377ce7B88f5BA8C48F8D666` |\n| Optimism | squidRouter | `0xce16F69375520ab01377ce7B88f5BA8C48F8D666` |\n| Base | squidRouter | `0xce16F69375520ab01377ce7B88f5BA8C48F8D666` |\n| Polygon | squidRouter | `0xce16F69375520ab01377ce7B88f5BA8C48F8D666` |\n| BSC | squidRouter | `0xce16F69375520ab01377ce7B88f5BA8C48F8D666` |\n| Avalanche | squidRouter | `0xce16F69375520ab01377ce7B88f5BA8C48F8D666` |\n\n## ABI Reference\n\n### SquidRouterABI\n\n- `bridgeCall(string bridgedTokenSymbol, uint256 amount, string destinationChain, string destinationAddress, bytes payload, address gasRefundRecipient, bool enableExpress)` [payable] - Bridge a gateway token by symbol, optionally executing `payload` on the destination\n- `callBridgeCall(address token, uint256 amount, ISquidMulticall.Call[] calls, string bridgedTokenSymbol, string destinationChain, string destinationAddress, bytes payload, address gasRefundRecipient, bool enableExpress)` [payable] - Run `calls` on the source chain (e.g. swap `token` into the bridged token), then bridge\n\nISquidMulticall.Call tuple: `(uint8 callType, address target, uint256 value, bytes callData, bytes payload)`\n\n## Notes\n\n- Built on Axelar GMP -- uses Axelar chain name strings for destination (e.g. \"ethereum\", \"arbitrum\", \"Polygon\")\n- `bridgeCall` for simple token bridges; `callBridgeCall` for swap-then-bridge (includes pre-bridge DEX swaps)\n- Same Router address (`0xce16F6...`) deployed across all supported chains\n- `bridgedTokenSymbol` must match the Axelar-registered symbol for the bridged asset\n- The `payload` parameter enables post-bridge execution on the destination chain\n- `callBridgeCall`'s `calls` array allows chaining multiple swap steps before the bridge\n- Requires ERC-20 approval to the Squid Router address\n- Finality: 2-5 minutes (depends on Axelar validator consensus)\n- TVL: $100M+. Audited\n",
114
+ "stader": "# Stader\n\nMulti-chain liquid staking protocol. ETHx is Stader's non-rebasing liquid staking token for Ethereum.\n\n## Category\n\nliquid-staking | Chains: Ethereum\n\n## Key Operations\n\n- **deposit**: Stake ETH to receive ETHx\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/stader\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Stake ETH for ETHx\nimport { StakePoolManagerABI as IStakePoolManager } from \"./abis\";\nfunction main(stakePoolManagerAddress: Address, receiver: Address): Uint256 {\n const pool = IStakePoolManager.at(stakePoolManagerAddress);\n return pool.deposit(receiver);\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ---------------- | -------------------------------------------- |\n| Ethereum | ETHx | `0xA35b1B31Ce002FBF2058D22F30f95D405200A15b` |\n| Ethereum | stakePoolManager | `0xcf5EA1b38380f6aF39068375516Daf40Ed70D299` |\n\n## ABI Methods\n\n### StakePoolManagerABI\n\n- `deposit(address)` - Stake ETH (payable), receive ETHx. Param: receiver address. Returns ETHx amount\n- `getExchangeRate()` - Current ETHx/ETH exchange rate\n\n### ETHxABI\n\n- `balanceOf(address)` - Query ETHx balance\n- `approve(address,uint256)` - Approve ETHx spending\n\n## Notes\n\n- TVL: $300M+. ETHx is non-rebasing (value accrues over time)\n- deposit() is payable - send ETH as msg.value, pass receiver address\n- Compatible with EigenLayer restaking (can deposit into stETH/ETHx strategies)\n",
115
+ "stargate": "# Stargate\n\nOmnichain liquidity transport protocol built on LayerZero. Provides native asset bridging with unified liquidity pools.\n\n## Category\n\nbridge | Direction: L2-to-L2, L1-to-L2, L2-to-L1 (any-to-any) | Chains: Ethereum (1), Arbitrum (42161), Base (8453)\n\n## SauceScript Functions\n\n### bridge\n\nSend tokens cross-chain via Stargate pool using LayerZero messaging.\n\n```typescript\nimport { StargatePoolABI as IStargatePool } from \"./abis\";\n\nfunction main(\n poolAddress: Address,\n dstEid: Uint256,\n recipient: Uint256,\n amount: Uint256,\n minAmount: Uint256,\n): {\n msgReceipt: { guid: Uint256; nonce: Uint256; fee: { nativeFee: Uint256; lzTokenFee: Uint256 } };\n oftReceipt: { amountSentLD: Uint256; amountReceivedLD: Uint256 };\n} {\n const pool = IStargatePool.at(poolAddress);\n return pool.send(\n {\n dstEid: dstEid,\n to: recipient,\n amountLD: amount,\n minAmountLD: minAmount,\n extraOptions: 0x00,\n composeMsg: 0x00,\n oftCmd: 0x00,\n },\n { nativeFee: ctx.msgValue(), lzTokenFee: 0 },\n ctx.msgSender(),\n );\n}\n```\n\n- `poolAddress`: Token-specific pool (e.g. poolUSDC, poolNative)\n- `dstEid`: LayerZero endpoint ID for destination chain (NOT the EVM chain ID)\n- `recipient`: Destination address as bytes32 (left-padded)\n- `amount`: Amount in token's native decimals (LD = local decimals)\n- `minAmount`: Minimum amount to receive on destination (slippage protection)\n- Requires native token (ETH) for LayerZero messaging fee (sent as msg.value)\n- Requires ERC-20 approval to the pool for non-native tokens\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | ---------- | -------------------------------------------- |\n| Ethereum | poolNative | `0x77b2043768d28E9C9aB44E1aBfC95944bcE57931` |\n| Ethereum | poolUSDC | `0xc026395860Db2d07ee33e05fE50ed7bD583189C7` |\n| Ethereum | poolUSDT | `0x933597a323Eb81cAe705C5bC29985172fd5A3973` |\n| Arbitrum | poolNative | `0xA45B5130f36CDcA45667738e2a258AB09f4A5f7F` |\n| Arbitrum | poolUSDC | `0xe8CDF27AcD73a434D661C84887215F7598e7d0d3` |\n| Base | poolNative | `0xdc181Bd607330aeeBEF6ea62e03e5e1Fb4B6F7C7` |\n| Base | poolUSDC | `0x27a16dc786820B16E5c9028b75B99F6f604b5d26` |\n\n## ABI Reference\n\n### StargatePoolABI\n\n- `send(SendParam _sendParam, MessagingFee _fee, address _refundAddress) returns (MessagingReceipt msgReceipt, OFTReceipt oftReceipt)` [payable] - Bridge tokens to destination chain\n- `quoteOFT(SendParam _sendParam) returns (OFTLimit oftLimit, OFTFeeDetail[] oftFeeDetails, OFTReceipt oftReceipt)` - Quote bridge limits, fees and the amount received (view)\n\nSendParam tuple: `(uint32 dstEid, bytes32 to, uint256 amountLD, uint256 minAmountLD, bytes extraOptions, bytes composeMsg, bytes oftCmd)`\nMessagingFee tuple: `(uint256 nativeFee, uint256 lzTokenFee)`\n\n## Notes\n\n- Uses LayerZero endpoint IDs (dstEid) for destination chains, NOT EVM chain IDs\n- Each token has its own pool contract (poolNative for ETH, poolUSDC for USDC, etc.)\n- Native token fees required for LayerZero messaging -- sent as msg.value\n- Unified liquidity pools across chains -- no wrapped tokens, receives native assets\n- Finality depends on LayerZero verification (typically 1-5 minutes)\n- Use `quoteOFT` to get fee estimates before sending\n- TVL: $400M+. Audited\n",
116
+ "superfluid": "# Superfluid\n\nProtocol for real-time finance enabling continuous token streams (per-second payments), distributions, and composable Super Tokens.\n\n## Category\n\npayments | Chains: Ethereum, Polygon, Arbitrum, Optimism, Base\n\n## Key Operations\n\n- **createFlow**: Create a continuous payment stream\n- **updateFlow**: Update the flow rate of an existing stream\n- **deleteFlow**: Stop/delete a payment stream\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/superfluid\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Create payment stream\nimport { CFAForwarderABI as ICFAForwarder } from \"./abis\";\nfunction main(\n forwarderAddress: Address,\n token: Address,\n sender: Address,\n receiver: Address,\n flowrate: Uint256,\n): Uint256 {\n const forwarder = ICFAForwarder.at(forwarderAddress);\n forwarder.createFlow(token, sender, receiver, flowrate, 0x00);\n return 1;\n}\n\n// Update flow rate\nimport { CFAForwarderABI as ICFAForwarder } from \"./abis\";\nfunction main(\n forwarderAddress: Address,\n token: Address,\n sender: Address,\n receiver: Address,\n flowrate: Uint256,\n): Uint256 {\n const forwarder = ICFAForwarder.at(forwarderAddress);\n forwarder.updateFlow(token, sender, receiver, flowrate, 0x00);\n return 1;\n}\n\n// Delete payment stream\nimport { CFAForwarderABI as ICFAForwarder } from \"./abis\";\nfunction main(\n forwarderAddress: Address,\n token: Address,\n sender: Address,\n receiver: Address,\n): Uint256 {\n const forwarder = ICFAForwarder.at(forwarderAddress);\n forwarder.deleteFlow(token, sender, receiver, 0x00);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------ | -------------------------------------------- |\n| Ethereum | host | `0x3E14dC1b13c488a8d5D310918780c983bD5982E7` |\n| Ethereum | cfaForwarder | `0xcfA132E353cB4E398080B9700609bb008eceB125` |\n| Polygon | host | `0x3E14dC1b13c488a8d5D310918780c983bD5982E7` |\n| Polygon | cfaForwarder | `0xcfA132E353cB4E398080B9700609bb008eceB125` |\n| Arbitrum | host | `0x3E14dC1b13c488a8d5D310918780c983bD5982E7` |\n| Arbitrum | cfaForwarder | `0xcfA132E353cB4E398080B9700609bb008eceB125` |\n| Optimism | host | `0x3E14dC1b13c488a8d5D310918780c983bD5982E7` |\n| Optimism | cfaForwarder | `0xcfA132E353cB4E398080B9700609bb008eceB125` |\n| Base | host | `0x3E14dC1b13c488a8d5D310918780c983bD5982E7` |\n| Base | cfaForwarder | `0xcfA132E353cB4E398080B9700609bb008eceB125` |\n\n## ABI Methods\n\n### CFAForwarderABI\n\n- `createFlow(address,address,address,int96,bytes)` - Create stream. Params: token (Super Token), sender, receiver, flowrate (tokens per second as int96), userData (arbitrary bytes, 0x00 for none). Returns bool\n- `updateFlow(address,address,address,int96,bytes)` - Update flow rate. Params: token, sender, receiver, flowrate (new rate), userData. Returns bool\n- `deleteFlow(address,address,address,bytes)` - Delete stream. Params: token, sender, receiver, userData. Returns bool\n\n## Notes\n\n- Flowrate is in tokens per second (int96) - e.g. 1e18 / (30 * 86400) for ~1 token/month\n- Uses Super Tokens - wrapped ERC-20s with streaming capability (wrap before streaming)\n- Same host and cfaForwarder addresses on all 5 chains\n- CFAForwarder is the simplified interface; host is the core protocol contract\n- Streams are continuous - balance updates every second without transactions\n- Sender must maintain sufficient Super Token balance; otherwise stream gets liquidated\n- userData allows passing arbitrary data for composability with other contracts\n",
117
+ "sushiswap-v2": "# SushiSwap V2\n\nCommunity-driven fork of Uniswap V2 with additional yield farming features and multi-chain deployment. Identical AMM interface to Uniswap V2 (x*y=k constant product) with broader L2 and alt-chain coverage.\n\n## Category\n\ndex | Chains: Ethereum, Arbitrum, Polygon, BSC, Avalanche, Fantom, Optimism\n\n## Key Operations\n\n- **swap**: Swap exact input tokens through a routing path\n- **addLiquidity**: Deposit two tokens to mint SLP (SushiSwap LP) tokens\n- **removeLiquidity**: Burn SLP tokens to withdraw underlying tokens\n\n## SDK Usage\n\n```typescript\nimport {\n protocolInfo,\n deployments,\n sauceFunctions,\n} from \"@eco-incorp/sauce/protocols/sushiswap-v2\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { SushiSwapV2RouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n path: Address[],\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256[] {\n const router = IRouter.at(routerAddress);\n return router.swapExactTokensForTokens(amountIn, amountOutMin, path, recipient, 99999999999);\n}\n```\n\n- `routerAddress`: SushiSwap Router address for the target chain\n- `path`: Ordered token address array for the swap route (e.g., `[tokenIn, WETH, tokenOut]`)\n- `amountIn`: Exact input token amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n\n### addLiquidity\n\n```typescript\nimport { SushiSwapV2RouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n amountADesired: Uint256,\n amountBDesired: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256; liquidity: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.addLiquidity(\n tokenA,\n tokenB,\n amountADesired,\n amountBDesired,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- `tokenA` / `tokenB`: Pair token addresses\n- `amountADesired` / `amountBDesired`: Ideal deposit amounts (router adjusts to maintain ratio)\n- `amountAMin` / `amountBMin`: Minimum deposits (slippage protection)\n- Both tokens must be approved to the router\n\n### removeLiquidity\n\n```typescript\nimport { SushiSwapV2RouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n liquidity: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.removeLiquidity(\n tokenA,\n tokenB,\n liquidity,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- `liquidity`: Amount of SLP tokens to burn\n- SLP token must be approved to the router\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| --------- | -------- | -------------------------------------------- |\n| Ethereum | Factory | `0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac` |\n| Ethereum | Router | `0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F` |\n| Arbitrum | Factory | `0xc35DADB65012eC5796536bD9864eD8773aBc74C4` |\n| Arbitrum | Router | `0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506` |\n| Polygon | Factory | `0xc35DADB65012eC5796536bD9864eD8773aBc74C4` |\n| Polygon | Router | `0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506` |\n| BSC | Factory | `0xc35DADB65012eC5796536bD9864eD8773aBc74C4` |\n| BSC | Router | `0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506` |\n| Avalanche | Factory | `0xc35DADB65012eC5796536bD9864eD8773aBc74C4` |\n| Avalanche | Router | `0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506` |\n| Fantom | Factory | `0xc35DADB65012eC5796536bD9864eD8773aBc74C4` |\n| Fantom | Router | `0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506` |\n| Optimism | Factory | `0xFbc12984689e5f15626Bad03Ad60160Fe98B303C` |\n| Optimism | Router | `0x2ABf469074dc0b54d793850807E6eb5Faf2625b1` |\n\n## ABI Methods\n\n### SushiSwapV2RouterABI\n\n- `swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) -> uint256[] amounts` - Swap exact input along path, returns amounts at each hop\n- `swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) -> uint256[] amounts` - Swap to get exact output amount\n- `addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB, uint256 liquidity)` - Add liquidity and mint SLP tokens\n- `removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB)` - Burn SLP tokens for underlying tokens\n- `getAmountsOut(uint256 amountIn, address[] path) -> uint256[] amounts` - Quote output amounts along path (view)\n\n### SushiSwapV2FactoryABI\n\n- `getPair(address tokenA, address tokenB) -> address pair` - Look up pair address (view)\n- `createPair(address tokenA, address tokenB) -> address pair` - Create a new pair\n\n## Notes\n\n- Interface is identical to Uniswap V2; same 0.3% fee per hop\n- Factory and Router addresses are consistent across Arbitrum, Polygon, BSC, Avalanche, and Fantom\n- SLP tokens can be staked in SushiSwap's MasterChef/MiniChef contracts for SUSHI rewards (not in SDK)\n- Both tokens must be ERC20-approved to the Router before swap/addLiquidity\n- Use SushiSwap when Uniswap V2 is not deployed on the target chain, or when SUSHI farming incentives are active\n",
118
+ "swell": "# Swell\n\nLiquid staking and restaking protocol for Ethereum. Offers swETH for liquid staking and rswETH for liquid restaking via EigenLayer.\n\n## Category\n\nliquid-staking | Chains: Ethereum\n\n## Key Operations\n\n- **stakeSwETH**: Deposit ETH for swETH (liquid staking)\n- **stakeRswETH**: Deposit ETH for rswETH (liquid restaking)\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/swell\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Stake ETH for swETH\nimport { SwETHABI as ISwETH } from \"./abis\";\nfunction main(swethAddress: Address): Uint256 {\n const sweth = ISwETH.at(swethAddress);\n sweth.deposit();\n return 1;\n}\n\n// Stake ETH for rswETH (restaking)\nimport { RswETHABI as IRswETH } from \"./abis\";\nfunction main(rswethAddress: Address): Uint256 {\n const rsweth = IRswETH.at(rswethAddress);\n rsweth.deposit();\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | -------- | -------------------------------------------- |\n| Ethereum | swETH | `0xf951E335afb289353dc249e82926178EaC7DEd78` |\n| Ethereum | rswETH | `0xFAe103DC9cf190eD75350761e95403b7b8aFa6c0` |\n\n## ABI Methods\n\n### SwETHABI\n\n- `deposit()` - Stake ETH (payable), receive swETH. Returns nothing: read the minted amount as a balance change\n- `swETHToETHRate()` - Current swETH/ETH exchange rate\n- `balanceOf(address)` - Query swETH balance\n\n### RswETHABI\n\n- `deposit()` - Stake ETH (payable), receive rswETH. Returns nothing: read the minted amount as a balance change\n- `rswETHToETHRate()` - Current rswETH/ETH exchange rate\n- `balanceOf(address)` - Query rswETH balance\n\n## Notes\n\n- TVL: $800M+. Both tokens are non-rebasing (value accrues)\n- swETH = standard liquid staking. rswETH = liquid restaking via EigenLayer\n- Both deposit() functions are payable - send ETH as msg.value\n",
119
+ "synapse": "# Synapse Protocol\n\nCross-chain bridge and DEX with multi-chain AMM pools. Supports token swaps and bridging via SynapseBridge and CCTP router.\n\n## Category\n\nbridge | Direction: any-to-any (L1-to-L2, L2-to-L2, L2-to-L1) | Chains: Ethereum (1), Arbitrum (42161), Optimism (10), Base (8453), Polygon (137), Avalanche (43114)\n\n## SauceScript Functions\n\n### bridge\n\nDeposit tokens for cross-chain transfer via SynapseBridge.\n\n```typescript\nimport { SynapseBridgeABI as ISynapseBridge } from \"./abis\";\n\nfunction main(\n bridgeAddress: Address,\n recipient: Address,\n chainId: Uint256,\n token: Address,\n amount: Uint256,\n): Uint256 {\n const bridge = ISynapseBridge.at(bridgeAddress);\n bridge.deposit(recipient, chainId, token, amount);\n return 1;\n}\n```\n\n- `chainId`: Destination EVM chain ID\n- `token`: ERC-20 token to bridge\n- Requires ERC-20 approval to the SynapseBridge\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| --------- | ------------- | -------------------------------------------- |\n| Ethereum | synapseBridge | `0x2796317b0fF8538F253012862c06787Adfb8cEB6` |\n| Ethereum | cctpRouter | `0x12715a66773BD9C54534a01aBF01d05F6B4Bd35E` |\n| Arbitrum | synapseBridge | `0x6F4e8eba4d337f874AB57478AcC2Cb5BacDc19c9` |\n| Optimism | synapseBridge | `0xAf41a65F786339e7911F4acDAD6BD49426F2Dc6b` |\n| Base | synapseBridge | `0xf07d1C752fAb503E47FEF309bf14fbDD3E867089` |\n| Polygon | synapseBridge | `0x8F5BBB2BB8c2Ee94639E55d5F41de9b4839C1280` |\n| Avalanche | synapseBridge | `0xC05e61d0E7a63D27546389B7aD62FdFf5A91aACE` |\n\n## ABI Reference\n\n### SynapseBridgeABI\n\n- `deposit(address to, uint256 chainId, address token, uint256 amount)` - Deposit tokens for bridging to destination chain\n- `depositAndSwap(address to, uint256 chainId, address token, uint256 amount, uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 minDy, uint256 deadline)` - Deposit with swap on destination (e.g. nUSD to USDC). Use token indices from the destination AMM pool\n- `redeem(address to, uint256 chainId, address token, uint256 amount)` - Redeem bridge tokens (for wrapped/synthetic assets like nUSD, nETH)\n\n## Notes\n\n- `deposit`: For canonical tokens supported directly by the bridge\n- `depositAndSwap`: For bridging with an automatic swap on destination (e.g. bridge nUSD, swap to USDC on arrival)\n- `redeem`: For synthetic bridge tokens (nUSD, nETH) -- burns on source, mints on destination\n- Also supports CCTP-based USDC bridging via separate cctpRouter contract\n- Finality: typically 5-15 minutes depending on route\n- Requires ERC-20 approval to the SynapseBridge\n- TVL: $100M+. Audited\n",
120
+ "syncswap": "# SyncSwap\n\nThe leading DEX on zkSync Era with optimized gas efficiency for the ZK rollup environment. Supports classic constant product pools and stable pools with native account abstraction support.\n\n## Category\n\ndex | Chains: zkSync\n\n## Key Operations\n\n- **swap**: Swap tokens via path-based routing with encoded swap data and step-based execution\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/syncswap\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { SyncSwapRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n pool: Address,\n tokenIn: Address,\n amountIn: Uint256,\n amountOutMin: Uint256,\n swapData: bytes,\n): { token: Address; amount: Uint256 } {\n const router = IRouter.at(routerAddress);\n const zeroAddr = 0x0000000000000000000000000000000000000000;\n return router.swap(\n [\n {\n steps: [{ pool: pool, data: swapData, callback: zeroAddr, callbackData: 0x00 }],\n tokenIn: tokenIn,\n amountIn: amountIn,\n },\n ],\n amountOutMin,\n 99999999999,\n );\n}\n```\n\n- `routerAddress`: SyncSwap Router on zkSync (`0x2da10A1e27bF85cEdD8FFb1AbBe97e53391C0295`)\n- `pool`: The specific pool contract address to swap through\n- `tokenIn`: Input token address\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `swapData`: ABI-encoded bytes containing `(address tokenIn, address recipient, uint8 withdrawMode)`. Withdraw modes: `0` = vault deposit, `1` = withdraw to wallet, `2` = unwrap WETH\n- `callback`: Set to zero address for standard swaps (no callback)\n- `callbackData`: Set to `0x00` for standard swaps\n- Supports multi-step paths: add more entries to the `steps` array for multi-hop\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| ------ | -------- | -------------------------------------------- |\n| zkSync | Router | `0x2da10A1e27bF85cEdD8FFb1AbBe97e53391C0295` |\n\n## ABI Methods\n\n### SyncSwapRouterABI\n\n- `swap(tuple[](tuple[](address pool, bytes data, address callback, bytes callbackData) steps, address tokenIn, uint256 amountIn) paths, uint256 amountOutMin, uint256 deadline) -> tuple(address token, uint256 amount) amountOut` - Execute a swap through one or more paths, each containing one or more pool steps\n\n## Notes\n\n- Swap data (`data` field in steps) must be ABI-encoded off-chain: `abi.encode(tokenIn, recipient, withdrawMode)`\n- `withdrawMode`: `0` = keep in vault (for chaining), `1` = withdraw to user wallet, `2` = unwrap WETH to native ETH\n- Each path can have multiple steps (multi-hop), and you can include multiple paths in one transaction\n- Steps support callbacks for flash-swap-like patterns (set to zero address for standard swaps)\n- Pool addresses must be discovered off-chain (via SyncSwap's factory or API)\n- zkSync-only deployment; optimized for zkSync Era's unique execution environment\n- Input token must be ERC20-approved to the Router\n",
121
+ "synthetix-v3": "# Synthetix V3\n\nModular liquidity protocol powering perpetual futures and synthetic assets on Base. Account-based system with collateral delegation to liquidity pools.\n\n## Category\n\nsynthetics | Chains: Base\n\n## Key Operations\n\n- **deposit**: Deposit collateral into an account\n- **withdraw**: Withdraw collateral from an account\n- **delegateCollateral**: Delegate collateral to a pool (via CoreProxy)\n- **commitOrder**: Commit a perps trade order (via PerpsMarketProxy)\n- **modifyCollateral**: Modify perps account collateral\n\n## SDK Usage\n\n```typescript\nimport {\n protocolInfo,\n deployments,\n sauceFunctions,\n} from \"@eco-incorp/sauce/protocols/synthetix-v3\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit collateral\nimport { CoreProxyABI as ICoreProxy } from \"./abis\";\nfunction main(\n coreProxyAddress: Address,\n accountId: Uint256,\n collateralType: Address,\n amount: Uint256,\n): Uint256 {\n const core = ICoreProxy.at(coreProxyAddress);\n core.deposit(accountId, collateralType, amount);\n return 1;\n}\n\n// Withdraw collateral\nimport { CoreProxyABI as ICoreProxy } from \"./abis\";\nfunction main(\n coreProxyAddress: Address,\n accountId: Uint256,\n collateralType: Address,\n amount: Uint256,\n): Uint256 {\n const core = ICoreProxy.at(coreProxyAddress);\n core.withdraw(accountId, collateralType, amount);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| ----- | ---------------- | -------------------------------------------- |\n| Base | coreProxy | `0x32C222A9A159782aFD7529c87FA34b96CA72C696` |\n| Base | perpsMarketProxy | `0x0A2AF931eFFd34b81ebcc57E3d3c9B1E1dE1C9Ce` |\n\n## ABI Methods\n\n### CoreProxyABI\n\n- `deposit(uint128,address,uint256)` - Deposit collateral. Params: accountId, collateralType, tokenAmount\n- `withdraw(uint128,address,uint256)` - Withdraw collateral. Same params as deposit\n- `delegateCollateral(uint128,uint128,address,uint256,uint256)` - Delegate to pool. Params: accountId, poolId, collateralType, amount, leverage\n\n### PerpsMarketProxyABI\n\n- `commitOrder(tuple)` - Commit perps order. Tuple: { marketId uint128, accountId uint128, sizeDelta int128, settlementStrategyId uint128, acceptablePrice uint256, trackingCode bytes32, referrer address }\n- `modifyCollateral(uint128,uint128,int256)` - Modify perps collateral. Params: accountId, synthMarketId, amountDelta (positive=add, negative=remove)\n\n## Notes\n\n- TVL: $300M+. Account-based system - create account NFT first\n- accountId is uint128, collateral ops use token amount in token decimals\n- delegateCollateral assigns collateral to a specific pool for earning fees\n- commitOrder sizeDelta: positive = long, negative = short\n- Settlement happens asynchronously via keepers after commitOrder\n",
122
+ "synthra-v3": "# Synthra V3\n\nConcentrated-liquidity spot DEX on Arc: a Uniswap V3 fork with renamed pool callbacks.\n\n## Category\n\ndex | Chains: Arc (5042)\n\n## SauceScript Functions\n\n### swap\n\nExact-input single-hop swap through SwapRouter02.\n\n```typescript\nimport { SynthraV3SwapRouter02ABI as ISwapRouter02 } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenIn: Address,\n tokenOut: Address,\n fee: Uint256,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256 {\n const router = ISwapRouter02.at(routerAddress);\n return router.exactInputSingle({\n tokenIn: tokenIn,\n tokenOut: tokenOut,\n fee: fee,\n recipient: recipient,\n amountIn: amountIn,\n amountOutMinimum: amountOutMin,\n sqrtPriceLimitX96: 0,\n });\n}\n```\n\n- SwapRouter02's params have no `deadline`\n- `tokenIn` must be `approve`d to the router\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| ----- | -------------------------- | -------------------------------------------- |\n| Arc | Factory | `0x6307fc239C7964942c1BfFE51930E55606619c74` |\n| Arc | SwapRouter02 | `0xa50eDe66a573eE5bB37E28AF5789B76aE5FEb828` |\n| Arc | QuoterV2 | `0x9c179A7335B3fc841F59Aa6a62daf6d5c61b65D7` |\n| Arc | NonfungiblePositionManager | `0x2743b771659fD9CE13970d7367e7e84AF6a31049` |\n\n## Notes\n\n- The external ABIs are Uniswap V3's (`getPool`, `exactInputSingle`, `quoteExactInputSingle`, `mint`, …), and the Arc bytecode dispatches every one of them\n- Pools call back `synthraV3SwapCallback` (`0x13abb0ca`) and `synthraV3MintCallback`, not the `uniswapV3*` callbacks, so a contract that swaps or mints against a Synthra pool directly must implement the renamed callbacks\n- On Arc there is no wrapped native token; pools pair against USDC's ERC-20 interface `0x3600…0000`\n- Addresses come from docs.synthra.org's contract-addresses page\n",
123
+ "thales": "# Thales\n\nPositional markets protocol built on Synthetix offering binary options, speed markets, and sports markets on Optimism.\n\n## Category\n\noptions | Chains: Optimism\n\n## Key Operations\n\n- **exerciseMarket**: Exercise a matured market position to claim payout\n- **buyFromAMM**: Buy positional tokens (UP/DOWN) from the Thales AMM\n- **createSpeedMarket**: Create a speed market position\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/thales\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Buy from AMM\nimport { ThalesAMMABI as IThalesAMM } from \"./abis\";\nfunction main(\n thalesAMMAddress: Address,\n market: Address,\n position: Uint256,\n amount: Uint256,\n expectedPayout: Uint256,\n slippage: Uint256,\n): Uint256 {\n const amm = IThalesAMM.at(thalesAMMAddress);\n return amm.buyFromAMM(market, position, amount, expectedPayout, slippage);\n}\n\n// Exercise a matured market: on the market itself\nimport { PositionalMarketABI as IPositionalMarket } from \"./abis\";\nfunction main(market: Address): Uint256 {\n const positionalMarket = IPositionalMarket.at(market);\n positionalMarket.exerciseOptions();\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | --------------- | -------------------------------------------- |\n| Optimism | thalesAMM | `0x278B5A44397c9D8E52743fEdec263c4760dc1A1A` |\n| Optimism | speedMarketsAMM | `0xE16B8a01490835EC1e76bAbbB3Cadd8921b32001` |\n\n## ABI Methods\n\n### ThalesAMMABI\n\n- `buyFromAMM(address,uint8,uint256,uint256,uint256) returns (uint256)` - Buy positional tokens. Params: market (market address), position (0=UP, 1=DOWN), amount (tokens to buy), expectedPayout (expected return), additionalSlippage (slippage tolerance). Returns the amount paid\n\n### PositionalMarketABI\n\n- `exerciseOptions() returns (uint256)` - Exercise the caller's positions in a matured market (called on the market, not the AMM)\n\n### SpeedMarketsAMMABI\n\n- `createNewMarket(CreateMarketParams) returns (address)` - Create a speed market. One struct: `(address user, bytes32 asset, uint64 strikeTime, uint64 delta, int64 strikePrice, uint64 strikePricePublishTime, uint8 oracleSource, uint8 direction, address collateral, uint256 collateralAmount, address referrer, uint256 skewImpact)`. Returns the market address\n\n## Notes\n\n- Position 0 = UP (price goes up), Position 1 = DOWN (price goes down)\n- Markets expire at set times - exercise only after maturation\n- Speed markets have short durations (minutes to hours)\n- Binary outcome: winning position gets payout, losing gets nothing\n- Approve sUSD/USDC to thalesAMM before buying\n",
124
+ "thena": "# Thena\n\nBSC-native liquidity layer with ve(3,3) tokenomics. Solidly-fork supporting both volatile (x*y=k) and stable (Curve-like) AMM pools with gauge voting for directing emissions.\n\n## Category\n\ndex | Chains: BSC\n\n## Key Operations\n\n- **swap**: Swap tokens with route-based routing specifying stable or volatile pool type\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/thena\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { ThenaRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenIn: Address,\n tokenOut: Address,\n stable: bool,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256[] {\n const router = IRouter.at(routerAddress);\n return router.swapExactTokensForTokens(\n amountIn,\n amountOutMin,\n [{ from: tokenIn, to: tokenOut, stable: stable }],\n recipient,\n 99999999999,\n );\n}\n```\n\n- `routerAddress`: Thena RouterV2 on BSC (`0xd4ae6eCA985340Dd434D38F470aCCce4DC78D109`)\n- `tokenIn` / `tokenOut`: Input and output token addresses\n- `stable`: `true` for stable pools (pegged assets), `false` for volatile pools (uncorrelated assets)\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n- Routes support multi-hop: `[{from: A, to: B, stable: false}, {from: B, to: C, stable: true}]`\n- Note: Thena routes do NOT include a `factory` field (unlike Velodrome/Aerodrome)\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| ----- | -------- | -------------------------------------------- |\n| BSC | RouterV2 | `0xd4ae6eCA985340Dd434D38F470aCCce4DC78D109` |\n\n## ABI Methods\n\n### ThenaRouterABI\n\n- `swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, tuple[](address from, address to, bool stable) routes, address to, uint256 deadline) -> uint256[] amounts` - Swap with route tuples specifying pool type per hop\n- `addLiquidity(address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB, uint256 liquidity)` - Add liquidity to a stable or volatile pool\n\n## Notes\n\n- Solidly-fork routes contain `{from, to, stable}` tuples (NO `factory` field, unlike Velodrome/Aerodrome)\n- Two pool types: `stable=true` for correlated assets, `stable=false` for uncorrelated\n- ve(3,3) model: THE token holders vote-lock to direct gauge emissions weekly\n- BSC-only deployment; competes with PancakeSwap on BSC\n- LP tokens can be staked in gauges for THE emissions\n- Input token must be ERC20-approved to the Router\n",
125
+ "thruster": "# Thruster\n\nBlast-native DEX with concentrated liquidity (V3-style) pools. Optimized for Blast's native yield on ETH and USDB, and gas rebate features. Fork of Uniswap V3 architecture.\n\n## Category\n\ndex | Chains: Blast\n\n## Key Operations\n\n- **swap**: Exact input single-hop swap with fee tier selection via V3 SwapRouter\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/thruster\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { ThrusterV3SwapRouterABI as ISwapRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenIn: Address,\n tokenOut: Address,\n fee: Uint256,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256 {\n const router = ISwapRouter.at(routerAddress);\n return router.exactInputSingle({\n tokenIn: tokenIn,\n tokenOut: tokenOut,\n fee: fee,\n recipient: recipient,\n deadline: 99999999999,\n amountIn: amountIn,\n amountOutMinimum: amountOutMin,\n sqrtPriceLimitX96: 0,\n });\n}\n```\n\n- `routerAddress`: Thruster V3 SwapRouter on Blast (`0x337827814155ECBf24D20231fCA4444F530c0555`)\n- `tokenIn` / `tokenOut`: Input and output token addresses\n- `fee`: Pool fee tier (standard Uniswap V3 tiers: `500`, `3000`, `10000`)\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n- `sqrtPriceLimitX96`: Set to `0` for no price limit\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| ----- | ------------- | -------------------------------------------- |\n| Blast | V3 SwapRouter | `0x337827814155ECBf24D20231fCA4444F530c0555` |\n\n## ABI Methods\n\n### ThrusterV3SwapRouterABI\n\n- `exactInputSingle(tuple(address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96)) -> uint256 amountOut` - Single-hop exact input swap\n\n## Notes\n\n- Standard Uniswap V3 fork interface with identical parameter naming\n- Blast-only deployment; the primary concentrated liquidity DEX on Blast\n- Leverages Blast's native yield: ETH and USDB in pools automatically earn native yield\n- Gas rebates from Blast's gas monetization feature benefit traders\n- Input token must be ERC20-approved to the V3 SwapRouter\n- For Blast DEX swaps, also consider Fenix (ve(3,3) Solidly-fork) for stable pairs\n",
126
+ "tokemak": "# Tokemak\n\nLiquidity routing protocol with Autopilot Autopools that automatically deploy and rebalance liquidity across DeFi destinations.\n\n## Category\n\nyield | Chains: Ethereum\n\n## Key Operations\n\n- **deposit**: Deposit assets into Autopool\n- **withdraw**: Withdraw assets from Autopool\n- **redeem**: Redeem Autopool shares\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/tokemak\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit into Tokemak Autopool\nimport { AutopoolABI as IAutopool } from \"./abis\";\n\nfunction main(autopoolAddress: Address, assets: Uint256, receiver: Address): Uint256 {\n const autopool = IAutopool.at(autopoolAddress);\n return autopool.deposit(assets, receiver);\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ---------------- | -------------------------------------------- |\n| Ethereum | toke | `0x2e9d63788249371f1DFC918a52f8d799F4a38C94` |\n| Ethereum | autopoolRegistry | `0x7E5828a3A6Ae75426d739E798140513A2E2964E4` |\n\n## ABI Methods\n\n- `deposit(uint256,address)` - Deposit assets\n- `withdraw(uint256,address,address)` - Withdraw assets\n- `redeem(uint256,address,address)` - Redeem shares\n\n## Notes\n\n- Autopools are ERC-4626 vaults. Autopilot automatically rebalances across DeFi venues.\n",
127
+ "trader-joe": "# Trader Joe\n\nLiquidity Book DEX with variable-width bins for concentrated liquidity. Uses discrete price bins instead of continuous curves, allowing LPs to concentrate liquidity at specific price points. Native to Avalanche with expansion to Arbitrum and BSC.\n\n## Category\n\ndex | Chains: Avalanche, Arbitrum, BSC\n\n## Key Operations\n\n- **swap**: Swap exact input tokens via Liquidity Book path routing\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/trader-joe\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { LBRouterABI as ILBRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n path: { pairBinSteps: Uint256[]; versions: Uint256[]; tokenPath: Address[] },\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256 {\n const router = ILBRouter.at(routerAddress);\n return router.swapExactTokensForTokens(amountIn, amountOutMin, path, recipient, 99999999999);\n}\n```\n\n- `routerAddress`: Liquidity Book Router address for the target chain\n- `path`: A **tuple** (NOT a simple address array) containing `{pairBinSteps: uint256[], versions: uint8[], tokenPath: address[]}`\n - `pairBinSteps`: Array of bin step sizes for each hop (determines price granularity per pair)\n - `versions`: Array of pool versions per hop (1=V1, 2=V2, 2.1=V2.1)\n - `tokenPath`: Ordered array of token addresses\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| --------- | ---------- | -------------------------------------------- |\n| Avalanche | LB Factory | `0xb43120c4745967fa9b93E79C149E66B0f2D6Fe0c` |\n| Avalanche | LB Router | `0x18556DA13313f3532c54711497A8FedAC273220E` |\n| Arbitrum | LB Router | `0x18556da13313f3532c54711497a8fedac273220e` |\n| BSC | LB Router | `0xb4315e873dBcf96Ffd0acd8EA43f689D8c20fB30` |\n\n## ABI Methods\n\n### LBRouterABI\n\n- `swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, tuple(uint256[] pairBinSteps, uint8[] versions, address[] tokenPath) path, address to, uint256 deadline) -> uint256 amountOut` - Swap exact input through LB path\n- `swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, tuple(uint256[] pairBinSteps, uint8[] versions, address[] tokenPath) path, address to, uint256 deadline) -> uint256[] amountsIn` - Swap to get exact output\n- `addLiquidity(tuple(address tokenX, address tokenY, uint256 binStep, uint256 amountX, uint256 amountY, uint256 amountXMin, uint256 amountYMin, uint256 activeIdDesired, uint256 idSlippage, int256[] deltaIds, uint256[] distributionX, uint256[] distributionY, address to, address refundTo, uint256 deadline)) -> (uint256 amountXAdded, uint256 amountYAdded, uint256 amountXLeft, uint256 amountYLeft, uint256[] depositIds, uint256[] liquidityMinted)` - Add liquidity with precise bin distribution control\n\n### LBFactoryABI\n\n- `getLBPairInformation(address tokenA, address tokenB, uint256 binStep) -> tuple(uint16 binStep, address LBPair, bool createdByOwner, bool ignoredForRouting)` - Look up LB pair info for a token pair and bin step (view)\n\n## Notes\n\n- Path is a **structured tuple** `{pairBinSteps, versions, tokenPath}`, NOT a simple address array like Uniswap V2\n- Bin steps define price granularity: smaller bin steps = finer price precision but more gas, larger = coarser but cheaper\n- Common bin steps: 1, 2, 5, 10, 15, 20, 25 basis points\n- `addLiquidity` is complex: specify distribution across bins using `deltaIds` (relative bin offsets from active bin), `distributionX` and `distributionY` (percentage allocations per bin)\n- `activeIdDesired`: The bin ID you expect to be active; `idSlippage`: max deviation from desired active ID\n- Each LB pair is uniquely identified by (tokenX, tokenY, binStep)\n- Trader Joe is the dominant DEX on Avalanche; use it for AVAX pairs and Avalanche ecosystem tokens\n- Input token must be ERC20-approved to the LB Router\n",
128
+ "uniswap-v2": "# Uniswap V2\n\nConstant product AMM (x*y=k) with permissionless pair creation. The most forked DEX protocol in DeFi, deployed across 9 chains with identical interfaces.\n\n## Category\n\ndex | Chains: Ethereum, Arbitrum, Optimism, Polygon, Base, BSC, Avalanche, Blast, Zora, Arc\n\n## Key Operations\n\n- **swap**: Swap an exact amount of input tokens for as many output tokens as possible, routed through a path of pairs\n- **addLiquidity**: Deposit two tokens into a pair to mint LP tokens proportional to pool share\n- **removeLiquidity**: Burn LP tokens to withdraw both underlying tokens from a pair\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/uniswap-v2\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { UniswapV2RouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n path: Address[],\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256[] {\n const router = IRouter.at(routerAddress);\n return router.swapExactTokensForTokens(amountIn, amountOutMin, path, recipient, 99999999999);\n}\n```\n\n- `routerAddress`: The Uniswap V2 Router contract address for the target chain\n- `path`: Ordered array of token addresses defining the swap route (e.g., `[tokenIn, WETH, tokenOut]` for multi-hop)\n- `amountIn`: Exact amount of input token to swap (in wei)\n- `amountOutMin`: Minimum acceptable output amount, used for slippage protection\n- `recipient`: Address to receive the output tokens\n- Deadline is hardcoded to `99999999999` (far future) since Sauce executes atomically\n\n### addLiquidity\n\n```typescript\nimport { UniswapV2RouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n amountADesired: Uint256,\n amountBDesired: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256; liquidity: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.addLiquidity(\n tokenA,\n tokenB,\n amountADesired,\n amountBDesired,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- `tokenA` / `tokenB`: The two token addresses forming the pair\n- `amountADesired` / `amountBDesired`: Ideal amounts to deposit (router adjusts to maintain ratio)\n- `amountAMin` / `amountBMin`: Minimum amounts to deposit (slippage protection)\n- `recipient`: Address to receive the LP tokens\n- Both tokens must be approved to the router before calling\n\n### removeLiquidity\n\n```typescript\nimport { UniswapV2RouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n liquidity: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.removeLiquidity(\n tokenA,\n tokenB,\n liquidity,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- `liquidity`: Amount of LP tokens to burn\n- `amountAMin` / `amountBMin`: Minimum amounts of each token to receive (slippage protection)\n- LP token must be approved to the router before calling\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| --------- | -------- | -------------------------------------------- |\n| Ethereum | Factory | `0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f` |\n| Ethereum | Router | `0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D` |\n| Arbitrum | Factory | `0xf1D7CC64Fb4452F05c498126312eBE29f30Fbcf9` |\n| Arbitrum | Router | `0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24` |\n| Optimism | Factory | `0x0c3c1c532F1e39EdF36BE9Fe0bE1410313E074Bf` |\n| Optimism | Router | `0x4A7b5Da61326A6379179b40d00F57E5bbDC962c2` |\n| Polygon | Factory | `0x9e5A52f57b3038F1B8EeE45F28b3C1967e22799C` |\n| Polygon | Router | `0xedf6066a2b290C185783862C7F4776A2C8077AD1` |\n| Base | Factory | `0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6` |\n| Base | Router | `0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24` |\n| BSC | Factory | `0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6` |\n| BSC | Router | `0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24` |\n| Avalanche | Factory | `0x9e5A52f57b3038F1B8EeE45F28b3C1967e22799C` |\n| Avalanche | Router | `0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24` |\n| Blast | Factory | `0x5C346464d33F90bABaf70dB6388507CC889C1070` |\n| Blast | Router | `0xBB66Eb1c5e875933D44DAe661dbD80e5D9B03035` |\n| Zora | Factory | `0x0F797dC7efaEA995bB916f268D919d0a1950eE3C` |\n| Zora | Router | `0xa00F34A632630EFd15223B1968358bA4845bEEC7` |\n\n## ABI Methods\n\n### UniswapV2RouterABI\n\n- `swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline) -> uint256[] amounts` - Swap exact input tokens along path, returns amounts at each hop\n- `swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path, address to, uint256 deadline) -> uint256[] amounts` - Swap tokens to get exact output amount, returns amounts at each hop\n- `addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB, uint256 liquidity)` - Add liquidity to a pair, returns actual amounts deposited and LP tokens minted\n- `removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB)` - Burn LP tokens and withdraw underlying tokens\n- `getAmountsOut(uint256 amountIn, address[] path) -> uint256[] amounts` - Quote: calculate output amounts for given input along path (view)\n\n### UniswapV2FactoryABI\n\n- `getPair(address tokenA, address tokenB) -> address pair` - Look up the pair contract address for two tokens (view)\n- `createPair(address tokenA, address tokenB) -> address pair` - Create a new pair (if it doesn't exist)\n\n## Notes\n\n- Path array defines the swap route: `[tokenIn, tokenOut]` for direct swaps, `[tokenIn, WETH, tokenOut]` for multi-hop through WETH\n- 0.3% fee per hop, taken from input amount before swap\n- Both tokens must be ERC20-approved to the Router before addLiquidity/swap\n- LP tokens must be ERC20-approved to the Router before removeLiquidity\n- For tokens with transfer taxes (fee-on-transfer), use `swapExactTokensForTokensSupportingFeeOnTransferTokens` instead (not in SDK but available on-chain)\n- Uniswap V2 is the simplest and most battle-tested DEX model; prefer V3 for better capital efficiency, but V2 for maximum compatibility and simplicity\n- On Arc (5042) the router's `WETH()` is a stub that always reverts with `UnsupportedProtocolError()`, so the ETH paths (`swapExactETHForTokens`, `addLiquidityETH`, …) revert. Trade USDC's ERC-20 `0x3600000000000000000000000000000000000000`; Arc's native coin is USDC and it has no canonical wrapped native\n",
129
+ "uniswap-v3": "# Uniswap V3\n\nConcentrated liquidity AMM allowing LPs to allocate capital within custom price ranges for higher capital efficiency. Supports multiple fee tiers per pair and NFT-based liquidity positions.\n\n## Category\n\ndex | Chains: Ethereum, Arbitrum, Optimism, Polygon, Base, BSC, Avalanche, Celo, Arc\n\n## Key Operations\n\n- **swap**: Swap tokens using exact input (single-hop or multi-hop via encoded path)\n- **addLiquidity**: Mint a new concentrated liquidity position as an NFT within a tick range\n- **removeLiquidity**: Decrease liquidity from an existing NFT position\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/uniswap-v3\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { UniswapV3SwapRouterABI as ISwapRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenIn: Address,\n tokenOut: Address,\n fee: Uint256,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256 {\n const router = ISwapRouter.at(routerAddress);\n return router.exactInputSingle({\n tokenIn: tokenIn,\n tokenOut: tokenOut,\n fee: fee,\n recipient: recipient,\n deadline: 99999999999,\n amountIn: amountIn,\n amountOutMinimum: amountOutMin,\n sqrtPriceLimitX96: 0,\n });\n}\n```\n\n- `routerAddress`: Uniswap V3 SwapRouter address for the target chain. This `swap` uses SwapRouter's params (with `deadline`); chains that only have SwapRouter02 (Base, BSC, Avalanche, Celo, Monad) need `UniswapV3SwapRouter02ABI`, whose params have no `deadline`\n- `tokenIn` / `tokenOut`: Input and output token addresses\n- `fee`: Pool fee tier in hundredths of a bip. Common values: `500` (0.05%), `3000` (0.3%), `10000` (1%)\n- `amountIn`: Exact amount of input token (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n- `sqrtPriceLimitX96`: Set to `0` to accept any price (no limit)\n\n### addLiquidity (mint position)\n\n```typescript\nimport { UniswapV3NonfungiblePositionManagerABI as INonfungiblePositionManager } from \"./abis\";\n\nfunction main(\n nfpmAddress: Address,\n token0: Address,\n token1: Address,\n fee: Uint256,\n tickLower: Uint256,\n tickUpper: Uint256,\n amount0Desired: Uint256,\n amount1Desired: Uint256,\n amount0Min: Uint256,\n amount1Min: Uint256,\n recipient: Address,\n): { tokenId: Uint256; liquidity: Uint256; amount0: Uint256; amount1: Uint256 } {\n const nfpm = INonfungiblePositionManager.at(nfpmAddress);\n return nfpm.mint({\n token0: token0,\n token1: token1,\n fee: fee,\n tickLower: tickLower,\n tickUpper: tickUpper,\n amount0Desired: amount0Desired,\n amount1Desired: amount1Desired,\n amount0Min: amount0Min,\n amount1Min: amount1Min,\n recipient: recipient,\n deadline: 99999999999,\n });\n}\n```\n\n- `nfpmAddress`: NonfungiblePositionManager contract address\n- `token0` / `token1`: Pair tokens sorted by address (token0 < token1)\n- `fee`: Pool fee tier (500, 3000, or 10000)\n- `tickLower` / `tickUpper`: Price range boundaries as tick values. Ticks must be multiples of the pool's tick spacing (10 for 0.05%, 60 for 0.3%, 200 for 1%)\n- `amount0Desired` / `amount1Desired`: Target deposit amounts\n- `amount0Min` / `amount1Min`: Minimum deposit amounts (slippage protection)\n- Both tokens must be approved to the NonfungiblePositionManager\n\n### removeLiquidity (decrease liquidity)\n\n```typescript\nimport { UniswapV3NonfungiblePositionManagerABI as INonfungiblePositionManager } from \"./abis\";\n\nfunction main(\n nfpmAddress: Address,\n tokenId: Uint256,\n liquidity: Uint256,\n amount0Min: Uint256,\n amount1Min: Uint256,\n): { amount0: Uint256; amount1: Uint256 } {\n const nfpm = INonfungiblePositionManager.at(nfpmAddress);\n return nfpm.decreaseLiquidity({\n tokenId: tokenId,\n liquidity: liquidity,\n amount0Min: amount0Min,\n amount1Min: amount1Min,\n deadline: 99999999999,\n });\n}\n```\n\n- `tokenId`: NFT ID of the liquidity position\n- `liquidity`: Amount of liquidity to remove (not token amounts)\n- `amount0Min` / `amount1Min`: Minimum tokens to receive (slippage protection)\n- After decreasing liquidity, call `collect` to actually withdraw the tokens\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| --------- | ------------ | -------------------------------------------- |\n| Ethereum | Factory | `0x1F98431c8aD98523631AE4a59f267346ea31F984` |\n| Ethereum | SwapRouter | `0xE592427A0AEce92De3Edee1F18E0157C05861564` |\n| Ethereum | SwapRouter02 | `0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45` |\n| Ethereum | QuoterV2 | `0x61fFE014bA17989E743c5F6cB21bF9697530B21e` |\n| Ethereum | NFPM | `0xC36442b4a4522E871399CD717aBDD847Ab11FE88` |\n| Arbitrum | Factory | `0x1F98431c8aD98523631AE4a59f267346ea31F984` |\n| Arbitrum | SwapRouter | `0xE592427A0AEce92De3Edee1F18E0157C05861564` |\n| Arbitrum | NFPM | `0xC36442b4a4522E871399CD717aBDD847Ab11FE88` |\n| Optimism | Factory | `0x1F98431c8aD98523631AE4a59f267346ea31F984` |\n| Optimism | SwapRouter | `0xE592427A0AEce92De3Edee1F18E0157C05861564` |\n| Optimism | NFPM | `0xC36442b4a4522E871399CD717aBDD847Ab11FE88` |\n| Polygon | Factory | `0x1F98431c8aD98523631AE4a59f267346ea31F984` |\n| Polygon | SwapRouter | `0xE592427A0AEce92De3Edee1F18E0157C05861564` |\n| Polygon | NFPM | `0xC36442b4a4522E871399CD717aBDD847Ab11FE88` |\n| Base | Factory | `0x33128a8fC17869897dcE68Ed026d694621f6FDfD` |\n| Base | SwapRouter02 | `0x2626664c2603336E57B271c5C0b26F421741e481` |\n| Base | NFPM | `0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1` |\n| BSC | Factory | `0xdB1d10011AD0Ff90774D0C6Bb92e5C5c8b4461F7` |\n| BSC | SwapRouter02 | `0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2` |\n| Avalanche | Factory | `0x740b1c1de25031C31FF4fC9A62f554A55cdC1baD` |\n| Avalanche | SwapRouter02 | `0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE` |\n| Celo | Factory | `0xAfE208a311B21f13EF87E33A90049fC17A7acDEc` |\n| Celo | SwapRouter02 | `0x5615CDAb10dc425a742d643d949a7F474C01abc4` |\n\n## ABI Methods\n\n### UniswapV3SwapRouterABI\n\n- `exactInputSingle(tuple(address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96)) -> uint256 amountOut` - Single-hop swap with exact input amount\n- `exactInput(tuple(bytes path, address recipient, uint256 deadline, uint256 amountIn, uint256 amountOutMinimum)) -> uint256 amountOut` - Multi-hop swap with exact input via encoded path (tokenA+fee+tokenB+fee+tokenC)\n- `exactOutputSingle(tuple(address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96)) -> uint256 amountIn` - Single-hop swap specifying exact output desired\n- `exactOutput(tuple(bytes path, address recipient, uint256 deadline, uint256 amountOut, uint256 amountInMaximum)) -> uint256 amountIn` - Multi-hop swap specifying exact output desired\n\n### UniswapV3SwapRouter02ABI\n\nSwapRouter02's params structs drop `deadline` (wrap the call in a deadline check if needed).\n\n- `exactInputSingle(tuple(address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96)) -> uint256 amountOut`\n- `exactInput(tuple(bytes path, address recipient, uint256 amountIn, uint256 amountOutMinimum)) -> uint256 amountOut`\n- `exactOutputSingle(tuple(address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96)) -> uint256 amountIn`\n- `exactOutput(tuple(bytes path, address recipient, uint256 amountOut, uint256 amountInMaximum)) -> uint256 amountIn`\n\n### UniswapV3NonfungiblePositionManagerABI\n\n- `mint(tuple(address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Desired, uint256 amount1Desired, uint256 amount0Min, uint256 amount1Min, address recipient, uint256 deadline)) -> (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)` - Create new liquidity position NFT\n- `increaseLiquidity(tuple(uint256 tokenId, uint256 amount0Desired, uint256 amount1Desired, uint256 amount0Min, uint256 amount1Min, uint256 deadline)) -> (uint128 liquidity, uint256 amount0, uint256 amount1)` - Add more liquidity to existing position\n- `decreaseLiquidity(tuple(uint256 tokenId, uint128 liquidity, uint256 amount0Min, uint256 amount1Min, uint256 deadline)) -> (uint256 amount0, uint256 amount1)` - Remove liquidity from position (tokens stay in contract until collected)\n- `collect(tuple(uint256 tokenId, address recipient, uint128 amount0Max, uint128 amount1Max)) -> (uint256 amount0, uint256 amount1)` - Withdraw accumulated fees and removed liquidity tokens\n\n### UniswapV3FactoryABI\n\n- `getPool(address tokenA, address tokenB, uint24 fee) -> address pool` - Look up pool address for token pair and fee tier (view)\n- `createPool(address tokenA, address tokenB, uint24 fee) -> address pool` - Deploy a new pool\n\n### UniswapV3QuoterV2ABI\n\n- `quoteExactInputSingle(tuple(address tokenIn, address tokenOut, uint256 amountIn, uint24 fee, uint160 sqrtPriceLimitX96)) -> (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate)` - Simulate a swap to get expected output. Not a view: it reverts internally to measure, so call it off-chain (eth_call)\n\n## Notes\n\n- Fee tiers: `100` (0.01%, stablecoins), `500` (0.05%, correlated pairs), `3000` (0.3%, standard), `10000` (1%, exotic)\n- Token order matters: `token0` must be the lower address. Sort before calling mint\n- Tick spacing varies by fee tier: 1 (0.01%), 10 (0.05%), 60 (0.3%), 200 (1%)\n- After `decreaseLiquidity`, tokens sit in the position until `collect` is called\n- For multi-hop swaps via `exactInput`, the `path` is ABI-encoded as `tokenIn + fee + tokenMiddle + fee + tokenOut`\n- Input token must be ERC20-approved to the SwapRouter for swaps\n- Both tokens must be ERC20-approved to the NFPM for minting positions\n- Prefer V3 over V2 for major pairs to benefit from concentrated liquidity and lower effective slippage\n- On Arc (5042) `WETH9()` on SwapRouter02 and the position manager is a stub that always reverts with `UnsupportedProtocolError()`, so `unwrapWETH9`, `refundETH` and native-value swaps revert. Trade USDC's ERC-20 `0x3600000000000000000000000000000000000000`; Arc's native coin is USDC and it has no canonical wrapped native\n",
130
+ "uniswap-v4": "# Uniswap V4\n\nSingleton AMM with hooks architecture enabling custom pool logic, flash accounting, and native ETH support. All pools share a single PoolManager contract for gas savings on multi-hop swaps.\n\n## Category\n\ndex | Chains: Ethereum, Arbitrum, Optimism, Base, Polygon, BSC, Avalanche, Blast, Arc\n\n## Key Operations\n\n- **swap**: Execute a swap through the UniversalRouter using command-based encoding\n- **addLiquidity**: Modify liquidity positions through the PositionManager\n- **removeLiquidity**: Decrease or remove liquidity positions through the PositionManager\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/uniswap-v4\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { UniswapV4UniversalRouterABI as IUniversalRouter } from \"./abis\";\n\nfunction main(routerAddress: Address, commands: bytes, inputs: bytes[]): Uint256 {\n const router = IUniversalRouter.at(routerAddress);\n router.execute(commands, inputs, 99999999999);\n return 1;\n}\n```\n\n- `routerAddress`: UniversalRouter address for the target chain\n- `commands`: Encoded bytes of command IDs defining the sequence of operations (each byte = one command)\n- `inputs`: Encoded bytes array of ABI-encoded parameters for each command\n- Commands and inputs must be pre-encoded off-chain; the router decodes and executes sequentially\n\n### addLiquidity\n\n```typescript\nimport { UniswapV4PositionManagerABI as IPositionManager } from \"./abis\";\n\nfunction main(positionManagerAddress: Address, unlockData: bytes): Uint256 {\n const pm = IPositionManager.at(positionManagerAddress);\n pm.modifyLiquidities(unlockData, 99999999999);\n return 1;\n}\n```\n\n- `positionManagerAddress`: PositionManager address for the target chain\n- `unlockData`: ABI-encoded liquidity modification data including pool key, tick range, and amounts\n- Data must be pre-encoded off-chain with the position parameters\n\n### removeLiquidity\n\n```typescript\nimport { UniswapV4PositionManagerABI as IPositionManager } from \"./abis\";\n\nfunction main(positionManagerAddress: Address, unlockData: bytes): Uint256 {\n const pm = IPositionManager.at(positionManagerAddress);\n pm.modifyLiquidities(unlockData, 99999999999);\n return 1;\n}\n```\n\n- Same interface as addLiquidity but with negative liquidityDelta in the encoded data\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| --------- | --------------- | -------------------------------------------- |\n| Ethereum | PoolManager | `0x000000000004444c5dc75cB358380D2e3dE08A90` |\n| Ethereum | UniversalRouter | `0x66a9893cc07d91d95644aedd05d03f95e1dba8af` |\n| Ethereum | PositionManager | `0xbd216513d74c8cf14cf4747e6aaa6420ff64ee9e` |\n| Arbitrum | PoolManager | `0x360e68faccca8ca495c1b759fd9eee466db9fb32` |\n| Arbitrum | UniversalRouter | `0xa51afafe0263b40edaef0df8781ea9aa03e381a3` |\n| Arbitrum | PositionManager | `0xd88f38f930b7952f2db2432cb002e7abbf3dd869` |\n| Optimism | PoolManager | `0x9a13f98cb987694c9f086b1f5eb990eea8264ec3` |\n| Optimism | UniversalRouter | `0x851116d9223fabed8e56c0e6b8ad0c31d98b3507` |\n| Optimism | PositionManager | `0x3c3ea4b57a46241e54610e5f022e5c45859a1017` |\n| Base | PoolManager | `0x498581ff718922c3f8e6a244956af099b2652b2b` |\n| Base | UniversalRouter | `0x6ff5693b99212da76ad316178a184ab56d299b43` |\n| Base | PositionManager | `0x7c5f5a4bbd8fd63184577525326123b519429bdc` |\n| Polygon | PoolManager | `0x67366782805870060151383f4bbff9dab53e5cd6` |\n| Polygon | UniversalRouter | `0x1095692a6237d83c6a72f3f5efedb9a670c49223` |\n| Polygon | PositionManager | `0x1ec2ebf4f37e7363fdfe3551602425af0b3ceef9` |\n| BSC | PoolManager | `0x28e2ea090877bf75740558f6bfb36a5ffee9e9df` |\n| BSC | UniversalRouter | `0x1906c1d672b88cd1b9ac7593301ca990f94eae07` |\n| BSC | PositionManager | `0x7a4a5c919ae2541aed11041a1aeee68f1287f95b` |\n| Avalanche | PoolManager | `0x06380c0e0912312b5150364b9dc4542ba0dbbc85` |\n| Avalanche | UniversalRouter | `0x94b75331ae8d42c1b61065089b7d48fe14aa73b7` |\n| Avalanche | PositionManager | `0xb74b1f14d2754acfcbbe1a221023a5cf50ab8acd` |\n| Blast | PoolManager | `0x1631559198a9e474033433b2958dabc135ab6446` |\n\n## ABI Methods\n\n### UniswapV4PoolManagerABI\n\n- `initialize(tuple(address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks), uint160 sqrtPriceX96) -> int24 tick` - Create and initialize a new pool with a starting price\n- `swap(tuple(address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks), tuple(bool zeroForOne, int256 amountSpecified, uint160 sqrtPriceLimitX96), bytes hookData) -> int256 delta` - Low-level swap (typically called through UniversalRouter, not directly)\n- `modifyLiquidity(tuple(address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks), tuple(int24 tickLower, int24 tickUpper, int256 liquidityDelta, bytes32 salt), bytes hookData) -> (int256 delta, int256 feeDelta)` - Low-level liquidity modification\n\n### UniswapV4UniversalRouterABI\n\n- `execute(bytes commands, bytes[] inputs, uint256 deadline)` - Execute a batch of commands (swap, settle, take, etc.) in sequence\n- `execute(bytes commands, bytes[] inputs)` - The same, with no deadline\n\n### UniswapV4PositionManagerABI\n\n- `modifyLiquidities(bytes unlockData, uint256 deadline)` - Modify one or more liquidity positions in a single transaction\n\n## Notes\n\n- V4 uses a singleton architecture: ALL pools live in a single PoolManager contract, saving gas on multi-hop swaps\n- Hooks: each pool can attach a custom hooks contract that intercepts before/after swap and liquidity events\n- Pool key: `(currency0, currency1, fee, tickSpacing, hooks)` uniquely identifies a pool\n- `currency0` = address(0) means native ETH; V4 supports native ETH directly (no WETH wrapping needed)\n- `zeroForOne`: true = swap currency0 for currency1; false = swap currency1 for currency0\n- `amountSpecified`: positive = exact input; negative = exact output\n- Flash accounting: V4 uses transient storage for balance tracking within a transaction, settling at the end\n- Commands/inputs for the UniversalRouter must be constructed off-chain; this is more complex than V3 but more powerful\n- V4 is the newest Uniswap version; use it for advanced pool logic (custom hooks) or when gas efficiency on multi-hop matters most\n- On Arc (5042) the PositionManager's `WETH9()` is a stub that always reverts with `UnsupportedProtocolError()`. Arc's native coin is USDC at 18 decimals, so a pool keyed on `address(0)` is native USDC, a different currency from the 6-decimal ERC-20 `0x3600000000000000000000000000000000000000` over the same balance\n",
131
+ "unitflow-v3": "# UnitFlow V3\n\nConcentrated-liquidity AMM on Arc, forked from Uniswap V3 with native USDC in place of WETH9.\n\n## Category\n\ndex | Chains: Arc (5042)\n\n## SauceScript Functions\n\n### swap\n\nExact-input single-hop swap through UnitFlowV3Router.\n\n```typescript\nimport { UnitFlowV3RouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenIn: Address,\n tokenOut: Address,\n fee: Uint256,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n deadline: Uint256,\n): Uint256 {\n const router = IRouter.at(routerAddress);\n return router.exactInputSingle({\n tokenIn: tokenIn,\n tokenOut: tokenOut,\n fee: fee,\n recipient: recipient,\n deadline: deadline,\n amountIn: amountIn,\n amountOutMinimum: amountOutMin,\n sqrtPriceLimitX96: 0,\n });\n}\n```\n\n- The router has Uniswap V3 SwapRouter's shape: its params include `deadline`\n- `tokenIn` must be `approve`d to the router\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| ----- | ----------------- | -------------------------------------------- |\n| Arc | UnitFlowV3Factory | `0x5bfBCeb73d39F722B1cB83fD2F11736b28c1Be6d` |\n| Arc | UnitFlowV3Router | `0x6fD8351b9596C1F0b2f2479BfA6A171cb3d0f410` |\n| Arc | Quoter | `0x5AF6E89F0960Ff375AF84d9911D8153ef6240E34` |\n\n## ABI Reference\n\n- `UnitFlowV3FactoryABI`: `getPool(address tokenA, address tokenB, uint24 fee) returns (address)`, `feeAmountTickSpacing(uint24 fee) returns (int24)`\n- `UnitFlowV3RouterABI`: `exactInputSingle(ExactInputSingleParams) returns (uint256 amountOut)`, `factory() returns (address)`\n- `UnitFlowV3QuoterABI`: `quoteExactInputSingle(address tokenIn, address tokenOut, uint24 fee, uint256 amountIn, uint160 sqrtPriceLimitX96) returns (uint256 amountOut)`; call it with `eth_call`\n\n## Notes\n\n- Pools call back `unitFlowV3SwapCallback`, not `uniswapV3SwapCallback`, so a contract that swaps against a pool directly must implement the renamed callback\n- The GitHub README lists testnet addresses; these mainnet addresses are the defaults in UnitFlow's own app build\n",
132
+ "velodrome": "# Velodrome\n\nThe central trading and liquidity marketplace on Optimism. Solidly-fork with ve(3,3) tokenomics, supporting both stable (correlated assets) and volatile (uncorrelated assets) pool types.\n\n## Category\n\ndex | Chains: Optimism\n\n## Key Operations\n\n- **swap**: Swap tokens with route-based routing specifying stable or volatile pool type\n- **addLiquidity**: Add liquidity to a stable or volatile pool\n- **removeLiquidity**: Remove liquidity from a stable or volatile pool\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/velodrome\";\n```\n\n## SauceScript Examples\n\n### swap\n\n```typescript\nimport { VelodromeRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenIn: Address,\n tokenOut: Address,\n stable: bool,\n factory: Address,\n amountIn: Uint256,\n amountOutMin: Uint256,\n recipient: Address,\n): Uint256[] {\n const router = IRouter.at(routerAddress);\n return router.swapExactTokensForTokens(\n amountIn,\n amountOutMin,\n [{ from: tokenIn, to: tokenOut, stable: stable, factory: factory }],\n recipient,\n 99999999999,\n );\n}\n```\n\n- `routerAddress`: Velodrome RouterV2 address on Optimism\n- `tokenIn` / `tokenOut`: Input and output token addresses\n- `stable`: `true` for stable pools (pegged assets like USDC/USDT), `false` for volatile pools (uncorrelated like ETH/USDC)\n- `factory`: Pool factory address (`0xF1046053aa5682b4F9a81b5481394DA16BE5FF5a` on Optimism)\n- `amountIn`: Exact input amount (in wei)\n- `amountOutMin`: Minimum output for slippage protection\n- `recipient`: Address to receive output tokens\n- Routes array supports multi-hop: `[{from: A, to: B, stable: false, factory: f}, {from: B, to: C, stable: true, factory: f}]`\n\n### addLiquidity\n\n```typescript\nimport { VelodromeRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n stable: bool,\n amountADesired: Uint256,\n amountBDesired: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256; liquidity: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.addLiquidity(\n tokenA,\n tokenB,\n stable,\n amountADesired,\n amountBDesired,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- `stable`: Must match the pool type you want to provide liquidity to\n- Both tokens must be approved to the router\n\n### removeLiquidity\n\n```typescript\nimport { VelodromeRouterABI as IRouter } from \"./abis\";\n\nfunction main(\n routerAddress: Address,\n tokenA: Address,\n tokenB: Address,\n stable: bool,\n liquidity: Uint256,\n amountAMin: Uint256,\n amountBMin: Uint256,\n recipient: Address,\n): { amountA: Uint256; amountB: Uint256 } {\n const router = IRouter.at(routerAddress);\n return router.removeLiquidity(\n tokenA,\n tokenB,\n stable,\n liquidity,\n amountAMin,\n amountBMin,\n recipient,\n 99999999999,\n );\n}\n```\n\n- `liquidity`: Amount of LP tokens to burn\n- LP token must be approved to the router\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ----------- | -------------------------------------------- |\n| Optimism | RouterV2 | `0xa062aE8A9c5e11aaA026fc2670B0D65cCc8B2858` |\n| Optimism | PoolFactory | `0xF1046053aa5682b4F9a81b5481394DA16BE5FF5a` |\n\n## ABI Methods\n\n### VelodromeRouterABI\n\n- `swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, tuple[](address from, address to, bool stable, address factory) routes, address to, uint256 deadline) -> uint256[] amounts` - Swap with route tuples specifying pool type per hop\n- `addLiquidity(address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB, uint256 liquidity)` - Add liquidity to a stable or volatile pool\n- `removeLiquidity(address tokenA, address tokenB, bool stable, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) -> (uint256 amountA, uint256 amountB)` - Remove liquidity from a pool\n\n### VelodromePoolFactoryABI\n\n- `getPool(address tokenA, address tokenB, bool stable) -> address pool` - Look up pool address (view)\n\n## Notes\n\n- Two pool types: `stable=true` for correlated assets (uses Curve-like invariant), `stable=false` for uncorrelated (uses x*y=k)\n- Fees: volatile pools typically 0.3%, stable pools typically 0.04% (set by governance)\n- ve(3,3) model: VELO holders vote-lock tokens to direct gauge emissions to pools weekly\n- Routes include both `stable` flag and `factory` address per hop\n- Optimism-only deployment; Aerodrome is the Base equivalent (same interface)\n- LP tokens can be staked in gauges for VELO emissions\n- The default DEX on Optimism; preferred for stablecoin swaps (stable pools) and major volatile pairs\n",
133
+ "venus": "# Venus\n\nLeading lending and borrowing protocol on BNB Chain. Fork of Compound V2 with additional features including VAI stablecoin minting.\n\n## Category\n\nlending | Chains: BSC (56)\n\n## SauceScript Functions\n\n### supply\n\nSupply assets by minting vTokens. Exchange rate grows as interest accrues.\n\n```typescript\nimport { VTokenABI as IVToken } from \"./abis\";\n\nfunction main(vTokenAddress: Address, amount: Uint256): Uint256 {\n const vToken = IVToken.at(vTokenAddress);\n return vToken.mint(amount);\n}\n```\n\n- `vTokenAddress`: A BEP-20 vToken market (each asset has its own vToken, e.g. vUSDC). vBNB takes native BNB instead: see `VBNBABI`\n- Returns 0 on success, error code on failure\n- Requires ERC-20 approval of underlying to the vToken\n\n### withdraw\n\nWithdraw underlying assets by specifying the exact amount.\n\n```typescript\nimport { VTokenABI as IVToken } from \"./abis\";\n\nfunction main(vTokenAddress: Address, amount: Uint256): Uint256 {\n const vToken = IVToken.at(vTokenAddress);\n return vToken.redeemUnderlying(amount);\n}\n```\n\n### borrow\n\nBorrow assets against vToken collateral. Must call enterMarkets first.\n\n```typescript\nimport { VTokenABI as IVToken } from \"./abis\";\n\nfunction main(vTokenAddress: Address, amount: Uint256): Uint256 {\n const vToken = IVToken.at(vTokenAddress);\n return vToken.borrow(amount);\n}\n```\n\n- Must enable collateral via `VenusComptroller.enterMarkets([vTokenAddress])` first\n\n### repay\n\nRepay borrowed assets.\n\n```typescript\nimport { VTokenABI as IVToken } from \"./abis\";\n\nfunction main(vTokenAddress: Address, amount: Uint256): Uint256 {\n const vToken = IVToken.at(vTokenAddress);\n return vToken.repayBorrow(amount);\n}\n```\n\n- Requires ERC-20 approval of underlying to the vToken\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| ----- | ----------- | -------------------------------------------- |\n| BSC | comptroller | `0xfD36E2c2a6789Db23113685031d7F16329158384` |\n| BSC | vBNB | `0xA07c5b74C9B40447a954e1466938b865b6BBea36` |\n\n## ABI Reference\n\n### VTokenABI\n\n- `mint(uint256 mintAmount) returns (uint256)` - Supply underlying, receive vTokens\n- `redeem(uint256 redeemTokens) returns (uint256)` - Redeem vTokens for underlying\n- `redeemUnderlying(uint256 redeemAmount) returns (uint256)` - Redeem exact underlying amount\n- `borrow(uint256 borrowAmount) returns (uint256)` - Borrow underlying\n- `repayBorrow(uint256 repayAmount) returns (uint256)` - Repay borrow debt\n- `balanceOfUnderlying(address owner) returns (uint256)` - Get underlying balance including accrued interest. Not a view: it accrues interest first, so it cannot be STATICCALLed\n\n### VBNBABI\n\nvBNB (`vBNB`) takes native BNB, so its `mint` and `repayBorrow` take no amount: the BNB sent with the call is the amount.\n\n- `mint()` - Supply BNB (payable), receive vBNB. Returns nothing; reverts on failure\n- `repayBorrow()` - Repay BNB borrow debt (payable). Returns nothing; reverts on failure\n- `redeem`, `redeemUnderlying`, `borrow`, `balanceOfUnderlying` - As on `VTokenABI`\n\n### VenusComptrollerABI\n\n- `enterMarkets(address[] vTokens) returns (uint256[])` - Enable vTokens as collateral\n- `exitMarket(address vToken) returns (uint256)` - Remove vToken from collateral\n\n## Notes\n\n- Same interface as Compound V2 (forked codebase)\n- Must call `enterMarkets` on Comptroller before borrowing against any market\n- Also supports VAI stablecoin minting (separate contract)\n- Return values: 0 = success, non-zero = error code\n- BSC-only deployment. TVL: $3B+. Audited\n",
134
+ "vertex": "# Vertex\n\nVertically integrated DEX combining spot, perpetuals, and money markets with an off-chain sequencer for sub-second order matching on Arbitrum.\n\n## Category\n\nperpetuals | Chains: Arbitrum\n\n## Key Operations\n\n- **depositCollateral**: Deposit collateral into Vertex endpoint\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/vertex\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit collateral\nimport { EndpointABI as IEndpoint } from \"./abis\";\nfunction main(endpointAddress: Address, productId: Uint256, amount: Uint256): Uint256 {\n const endpoint = IEndpoint.at(endpointAddress);\n endpoint.depositCollateral(0x000000000000000000000000, productId, amount);\n return 1;\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------- | -------------------------------------------- |\n| Arbitrum | endpoint | `0x73eab16c88b9f38d3f2661c9e5875ec0eeee2965` |\n| Arbitrum | clearinghouse | `0x773bb71b0108b060b76746422ee810bfec9a963d` |\n\n## ABI Methods\n\n### EndpointABI\n\n- `depositCollateral(bytes12,uint32,uint128)` - Deposit collateral. Params: subaccountName (bytes12), productId (uint32), amount (uint128)\n- `submitSlowModeTransaction(bytes)` - Submit slow-mode tx (fallback when sequencer is down)\n\n### ClearinghouseABI\n\n- `withdrawCollateral((bytes32 sender, uint32 productId, uint128 amount, uint64 nonce))` - Apply a sequenced WithdrawCollateral transaction; users submit withdrawals through the Endpoint's `submitSlowModeTransaction`\n\n## Notes\n\n- TVL: $100M+. Off-chain sequencer for sub-second order matching\n- Uses subaccount system (bytes12 identifier) for position isolation\n- productId identifies the market (spot or perp)\n- Most trading happens off-chain via sequencer - on-chain methods are for deposits/withdrawals\n- Approve collateral token to endpoint before depositing\n",
135
+ "wormhole": "# Wormhole\n\nGeneric cross-chain messaging protocol with guardian-based attestation. Supports token bridging and arbitrary message passing across 30+ chains.\n\n## Category\n\ncross-chain messaging + bridge | Direction: any-to-any | Chains: Ethereum (1), Arbitrum (42161), Optimism (10), Base (8453), Polygon (137), Avalanche (43114), Arc (5042)\n\n## SauceScript Functions\n\n### bridgeTokens\n\nTransfer tokens cross-chain via the Wormhole TokenBridge.\n\n```typescript\nimport { WormholeTokenBridgeABI as ITokenBridge } from \"./abis\";\n\nfunction main(\n tokenBridgeAddress: Address,\n token: Address,\n amount: Uint256,\n recipientChain: Uint256,\n recipient: Uint256,\n): Uint256 {\n const bridge = ITokenBridge.at(tokenBridgeAddress);\n return bridge.transferTokens(token, amount, recipientChain, recipient, 0, 0);\n}\n```\n\n- `token`: ERC-20 token to bridge\n- `recipientChain`: Wormhole chain ID (NOT EVM chain ID). E.g. Ethereum=2, Arbitrum=23, Base=30\n- `recipient`: Destination address as bytes32 (left-padded)\n- `arbiterFee`: Fee for relayer (set to 0 for self-redemption)\n- `nonce`: Unique identifier (set to 0)\n- Requires ERC-20 approval to the TokenBridge\n- Requires native token for Wormhole message fee (sent as msg.value, use `coreBridge.messageFee()` to query)\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| --------- | ----------- | -------------------------------------------- |\n| Ethereum | coreBridge | `0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B` |\n| Ethereum | tokenBridge | `0x3ee18B2214AFF97000D974cf647E7C347E8fa585` |\n| Arbitrum | coreBridge | `0xa5f208e072434bC67592E4C49C1B991BA79BCA46` |\n| Arbitrum | tokenBridge | `0x0b2402144Bb366A632D14B83F244D2e0e21bD39c` |\n| Optimism | coreBridge | `0xEe91C335eab126dF5fDB3797EA9d6aD93aeC9722` |\n| Optimism | tokenBridge | `0x1D68124e65faFC907325e3EDbF8c4d84499DAa8b` |\n| Base | coreBridge | `0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6` |\n| Base | tokenBridge | `0x8d2de8d2f73F1F4cAB472AC9A881C9b123C79627` |\n| Polygon | coreBridge | `0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7` |\n| Polygon | tokenBridge | `0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE` |\n| Avalanche | coreBridge | `0x54a8e5f9c4CbA08F9943965859F6c34eAF03E26c` |\n| Avalanche | tokenBridge | `0x0e082F06FF657D94310cB8cE8B0D9a04541d8052` |\n\n## ABI Reference\n\n### WormholeCoreBridgeABI\n\n- `publishMessage(uint32 nonce, bytes payload, uint8 consistencyLevel) returns (uint64 sequence)` [payable] - Publish arbitrary message for guardian attestation\n- `messageFee() returns (uint256)` - Get current message fee (view)\n\n### WormholeTokenBridgeABI\n\n- `transferTokens(address token, uint256 amount, uint16 recipientChain, bytes32 recipient, uint256 arbiterFee, uint32 nonce) returns (uint64 sequence)` [payable] - Bridge tokens to destination chain. Returns sequence number for tracking\n- `completeTransfer(bytes encodedVm)` - Complete transfer on destination by submitting signed VAA (Verified Action Approval)\n- `wrappedAsset(uint16 tokenChainId, bytes32 tokenAddress) returns (address)` - Look up wrapped asset address on current chain (view)\n\n## Notes\n\n- Uses Wormhole chain IDs (NOT EVM chain IDs). E.g. Ethereum=2, BSC=4, Polygon=5, Avalanche=6, Arbitrum=23, Optimism=24, Base=30\n- Two-step process: (1) `transferTokens` on source, (2) `completeTransfer` on destination with signed VAA\n- If `arbiterFee` > 0, any relayer can submit the VAA and earn the fee. Otherwise, recipient must self-redeem\n- Bridged tokens are wrapped versions (e.g. \"Wormhole-wrapped USDC\") unless using CCTP integration\n- 19 guardians must reach 2/3+1 consensus for message finality (typically 1-15 minutes)\n- Query `messageFee()` on CoreBridge to know how much native token to attach\n- TVL: $3B+. Audited\n",
136
+ "yearn-v3": "# Yearn V3\n\nYield aggregator protocol. V3 vaults follow the ERC-4626 standard for automated yield optimization with multi-strategy allocations.\n\n## Category\n\nyield | Chains: Ethereum\n\n## Key Operations\n\n- **deposit**: Deposit assets into vault, receive yield-bearing shares\n- **withdraw**: Withdraw assets by specifying asset amount\n- **redeem**: Withdraw by specifying share amount\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/yearn-v3\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Deposit into Yearn V3 vault\nimport { YearnV3VaultABI as IYearnV3Vault } from \"./abis\";\nfunction main(vaultAddress: Address, assets: Uint256, receiver: Address): Uint256 {\n const vault = IYearnV3Vault.at(vaultAddress);\n return vault.deposit(assets, receiver);\n}\n\n// Withdraw from vault\nimport { YearnV3VaultABI as IYearnV3Vault } from \"./abis\";\nfunction main(vaultAddress: Address, assets: Uint256, receiver: Address, owner: Address): Uint256 {\n const vault = IYearnV3Vault.at(vaultAddress);\n return vault.withdraw(assets, receiver, owner);\n}\n\n// Redeem shares\nimport { YearnV3VaultABI as IYearnV3Vault } from \"./abis\";\nfunction main(vaultAddress: Address, shares: Uint256, receiver: Address, owner: Address): Uint256 {\n const vault = IYearnV3Vault.at(vaultAddress);\n return vault.redeem(shares, receiver, owner);\n}\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------ | -------------------------------------------- |\n| Ethereum | vaultFactory | `0x770D0d1Fb036483Ed4AbB6d53c1C89fb277D812F` |\n\n## ABI Methods\n\n### YearnV3VaultABI (ERC-4626)\n\n- `deposit(uint256,address)` - Deposit assets, receive shares. Returns shares minted\n- `withdraw(uint256,address,address)` - Withdraw by asset amount. Params: assets, receiver, owner\n- `redeem(uint256,address,address)` - Redeem by share amount. Returns assets\n- `convertToShares(uint256)` - Preview shares for asset amount\n- `convertToAssets(uint256)` - Preview assets for share amount\n- `totalAssets()` - Total assets managed by vault\n- `pricePerShare()` - Current share price (Yearn-specific, equivalent to convertToAssets(1e18))\n- `balanceOf(address)` - Query vault share balance\n- `approve(address,uint256)` - Approve share spending\n\n## Notes\n\n- TVL: $500M+. ERC-4626 compliant (same interface as sfrxETH, pufETH, sDAI)\n- Each vault has a unique address per underlying asset + strategy combination\n- Approve underlying token to vault before depositing\n- Vaults are deployed via factory - no single canonical vault address\n",
137
+ "zerolend": "# ZeroLend\n\nLeading lending protocol on zkSync Era. Aave V3 fork optimized for zero-knowledge rollups with low transaction costs.\n\n## Category\n\nlending | Chains: zkSync (324)\n\n## SauceScript Functions\n\n### supply\n\nSupply assets to earn interest. Same interface as Aave V3.\n\n```typescript\nimport { ZeroLendPoolABI as IZeroLendPool } from \"./abis\";\n\nfunction main(poolAddress: Address, asset: Address, amount: Uint256, onBehalfOf: Address): Uint256 {\n const pool = IZeroLendPool.at(poolAddress);\n pool.supply(asset, amount, onBehalfOf, 0);\n return 1;\n}\n```\n\n- `onBehalfOf`: Address receiving the supply tokens (use msg.sender for self)\n- Requires ERC-20 approval to the Pool\n\n### withdraw\n\nWithdraw supplied assets.\n\n```typescript\nimport { ZeroLendPoolABI as IZeroLendPool } from \"./abis\";\n\nfunction main(poolAddress: Address, asset: Address, amount: Uint256, to: Address): Uint256 {\n const pool = IZeroLendPool.at(poolAddress);\n return pool.withdraw(asset, amount, to);\n}\n```\n\n- `amount`: Use `type(uint256).max` to withdraw all\n- Returns actual withdrawn amount\n\n### borrow\n\nBorrow assets against supplied collateral.\n\n```typescript\nimport { ZeroLendPoolABI as IZeroLendPool } from \"./abis\";\n\nfunction main(\n poolAddress: Address,\n asset: Address,\n amount: Uint256,\n interestRateMode: Uint256,\n onBehalfOf: Address,\n): Uint256 {\n const pool = IZeroLendPool.at(poolAddress);\n pool.borrow(asset, amount, interestRateMode, 0, onBehalfOf);\n return 1;\n}\n```\n\n- `interestRateMode`: 2 = variable rate\n\n### repay\n\nRepay borrowed debt.\n\n```typescript\nimport { ZeroLendPoolABI as IZeroLendPool } from \"./abis\";\n\nfunction main(\n poolAddress: Address,\n asset: Address,\n amount: Uint256,\n interestRateMode: Uint256,\n onBehalfOf: Address,\n): Uint256 {\n const pool = IZeroLendPool.at(poolAddress);\n return pool.repay(asset, amount, interestRateMode, onBehalfOf);\n}\n```\n\n- `amount`: Use `type(uint256).max` to repay full debt\n- Requires ERC-20 approval to the Pool\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| ------ | -------- | -------------------------------------------- |\n| zkSync | pool | `0x4d9429246EA989C9CeE203B43F6d1C7D83e3B8F8` |\n\n## ABI Reference\n\n### ZeroLendPoolABI\n\n- `supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)` - Supply asset to earn interest\n- `withdraw(address asset, uint256 amount, address to) returns (uint256)` - Withdraw supplied asset\n- `borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf)` - Borrow against collateral\n- `repay(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf) returns (uint256)` - Repay debt\n\n## Notes\n\n- Same interface as Aave V3 (forked codebase) -- referralCode always 0\n- interestRateMode: 2 = variable (stable rate not supported)\n- All supply/repay operations require ERC-20 approval to the Pool\n- zkSync Era-only deployment. TVL: $100M+. Audited\n",
138
+ "zerox": "# 0x Protocol\n\nDEX aggregation protocol powering swaps across the DeFi ecosystem. Exchange Proxy provides a single entry point for token swaps across multiple sources.\n\n## Category\n\naggregator | Chains: Ethereum, Arbitrum, Optimism, Polygon, BSC, Avalanche, Base\n\n## Key Operations\n\n- **transformERC20**: Execute a token swap via the Exchange Proxy transformer pipeline\n\n## SDK Usage\n\n```typescript\nimport { protocolInfo, deployments, sauceFunctions } from \"@eco-incorp/sauce/protocols/zerox\";\n```\n\n## SauceScript Examples\n\n```typescript\n// Note: 0x requires off-chain route computation via 0x API before on-chain execution.\n// The transformERC20 function uses transformations array populated from API response.\n```\n\n## Key Addresses\n\n| Chain | Contract | Address |\n| --------- | ------------- | -------------------------------------------- |\n| Ethereum | exchangeProxy | `0xDef1C0ded9bec7F1a1670819833240f027b25EfF` |\n| Arbitrum | exchangeProxy | `0xDef1C0ded9bec7F1a1670819833240f027b25EfF` |\n| Optimism | exchangeProxy | `0xDEF1ABE32c034e558Cdd535791643C58a13aCC10` |\n| Polygon | exchangeProxy | `0xDef1C0ded9bec7F1a1670819833240f027b25EfF` |\n| BSC | exchangeProxy | `0xDef1C0ded9bec7F1a1670819833240f027b25EfF` |\n| Avalanche | exchangeProxy | `0xDef1C0ded9bec7F1a1670819833240f027b25EfF` |\n| Base | exchangeProxy | `0xDef1C0ded9bec7F1a1670819833240f027b25EfF` |\n\n## ABI Methods\n\n### ExchangeProxyABI\n\n- `transformERC20(address,address,uint256,uint256,tuple[])` - Execute token swap via transformer pipeline. Payable. Params: inputToken, outputToken, inputTokenAmount, minOutputTokenAmount, transformations (array of Transformation tuples). Returns outputTokenAmount\n - Transformation tuple: `{ deploymentNonce (uint32), data (bytes) }` - Each transformation specifies a deployed transformer and its calldata\n\n## Notes\n\n- Same Exchange Proxy address across all 7 chains\n- Uses transformer pipeline architecture - each swap is a sequence of transformations\n- Route computation happens via 0x API - transformations array comes from API response\n- Approve inputToken to exchangeProxy before swapping\n- 0x API provides the optimal route, slippage protection, and transformer calldata\n",
139
+ "zksync-bridge": "# zkSync Native Bridge\n\nOfficial zkSync Era bridge via DiamondProxy. Deposits ETH and executes L2 transactions from Ethereum with ZK proof-based finality.\n\n## Category\n\nnative L2 bridge | Direction: L1 to L2 (Ethereum to zkSync Era) | Chains: Ethereum (1), zkSync Era (324)\n\n## SauceScript Functions\n\n### depositETH\n\nDeposit ETH from Ethereum L1 to zkSync Era L2.\n\n```typescript\nimport { ZkSyncDiamondProxyABI as IDiamondProxy } from \"./abis\";\n\nfunction main(diamondProxyAddress: Address, recipient: Address, l2GasLimit: Uint256): Uint256 {\n const proxy = IDiamondProxy.at(diamondProxyAddress);\n return proxy.requestL2Transaction(\n recipient,\n ctx.msgValue(),\n 0x00,\n l2GasLimit,\n 800,\n [],\n ctx.msgSender(),\n );\n}\n```\n\n- `recipient`: Address to receive ETH on zkSync L2 (also the contract to call if `_calldata` is provided)\n- `_l2Value`: Amount of ETH to send to the recipient on L2 (use `msg.value`)\n- `_calldata`: Optional calldata to execute on L2. `0x00` for simple ETH deposits\n- `_l2GasLimit`: Gas limit for L2 execution (e.g. 300000)\n- `_l2GasPerPubdataByteLimit`: Gas per pubdata byte limit (800 is the standard value)\n- `_factoryDeps`: Array of contract bytecodes to deploy on L2. Empty `[]` for standard operations\n- `_refundRecipient`: Address to receive excess gas refund on L2 (use `msg.sender`)\n- `msg.value` must cover: L2 value + L2 gas costs. Use `l2TransactionBaseCost()` to estimate\n\n## Deployed Addresses\n\n| Chain | Contract | Address |\n| -------- | ------------ | -------------------------------------------- |\n| Ethereum | diamondProxy | `0x32400084C286CF3E17e7B677ea9583e60a000324` |\n| zkSync | l2Bridge | `0x11f943b2c77b743AB90f4A0Ae7d5A4e7FCA3E102` |\n\n## ABI Reference\n\n### ZkSyncDiamondProxyABI\n\n- `requestL2Transaction(address _contractL2, uint256 _l2Value, bytes _calldata, uint256 _l2GasLimit, uint256 _l2GasPerPubdataByteLimit, bytes[] _factoryDeps, address _refundRecipient) returns (bytes32 canonicalTxHash)` [payable] - Request an L2 transaction from L1. Used for ETH deposits, contract calls, and contract deployments\n- `l2TransactionBaseCost(uint256 _gasPrice, uint256 _l2GasLimit, uint256 _l2GasPerPubdataByteLimit) returns (uint256)` - Estimate the base cost of an L2 transaction (view). Use to calculate required msg.value\n\n## Notes\n\n- **L1 to L2** via DiamondProxy. For L2 to L1 withdrawals, use the L2 withdraw mechanism on zkSync Era\n- `requestL2Transaction` is a general-purpose L1-to-L2 transaction request -- handles ETH deposits, contract calls, and even contract deployments (via `_factoryDeps`)\n- `msg.value` must cover: `_l2Value + l2TransactionBaseCost(gasPrice, _l2GasLimit, _l2GasPerPubdataByteLimit)`\n- Use `l2TransactionBaseCost()` to estimate the gas cost component before submitting\n- `_l2GasPerPubdataByteLimit`: 800 is the standard value (required for pubdata pricing)\n- `_factoryDeps`: used when deploying contracts via L1. Empty array for standard ETH transfers\n- zkEVM architecture -- L2 to L1 withdrawals finalize with ZK proofs (typically 1-24 hours)\n- L1 to L2 deposits finalize after the batch containing the transaction is committed (~minutes)\n- For ERC-20 bridging, use the zkSync ERC20 Bridge contracts (separate from the DiamondProxy)\n- Canonical bridge -- no third-party risk, secured by zkSync's ZK proving system (Matter Labs)\n- Audited\n",
140
+ };
141
+ //# sourceMappingURL=skills.generated.js.map