@gauntlet-xyz/sdk 2.3.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) hide show
  1. package/README.md +135 -0
  2. package/dist/api/activity.d.ts +1 -1
  3. package/dist/api/activity.d.ts.map +1 -1
  4. package/dist/api/caip.d.ts +1 -1
  5. package/dist/api/caip.d.ts.map +1 -1
  6. package/dist/api/client.d.ts +65 -6
  7. package/dist/api/client.d.ts.map +1 -1
  8. package/dist/api/errors.d.ts +1 -1
  9. package/dist/api/errors.d.ts.map +1 -1
  10. package/dist/api/generated.d.ts +621 -14
  11. package/dist/api/generated.d.ts.map +1 -1
  12. package/dist/api/index.d.ts +13 -13
  13. package/dist/api/index.d.ts.map +1 -1
  14. package/dist/api/index.js +48 -8
  15. package/dist/api/index.js.map +7 -1
  16. package/dist/api/positionHistory.d.ts +1 -1
  17. package/dist/api/positionHistory.d.ts.map +1 -1
  18. package/dist/attribution/index.d.ts +3 -3
  19. package/dist/attribution/index.d.ts.map +1 -1
  20. package/dist/chunk-7TA2OJUK.js +4364 -0
  21. package/dist/chunk-7TA2OJUK.js.map +7 -0
  22. package/dist/chunk-HC2BS7MK.js +439 -0
  23. package/dist/chunk-HC2BS7MK.js.map +7 -0
  24. package/dist/chunk-S2TTA45N.js +2009 -0
  25. package/dist/chunk-S2TTA45N.js.map +7 -0
  26. package/dist/chunk-STIV2CC4.js +57 -0
  27. package/dist/chunk-STIV2CC4.js.map +7 -0
  28. package/dist/chunk-SU6JAKIA.js +283 -0
  29. package/dist/chunk-SU6JAKIA.js.map +7 -0
  30. package/dist/cjs/api/activity.d.ts +70 -0
  31. package/dist/cjs/api/activity.d.ts.map +1 -0
  32. package/dist/cjs/api/activity.js +136 -0
  33. package/dist/cjs/api/activity.js.map +7 -0
  34. package/dist/cjs/api/caip.d.ts +29 -0
  35. package/dist/cjs/api/caip.d.ts.map +1 -0
  36. package/dist/cjs/api/caip.js +59 -0
  37. package/dist/cjs/api/caip.js.map +7 -0
  38. package/dist/cjs/api/client.d.ts +173 -0
  39. package/dist/cjs/api/client.d.ts.map +1 -0
  40. package/dist/cjs/api/client.js +171 -0
  41. package/dist/cjs/api/client.js.map +7 -0
  42. package/dist/cjs/api/decimal.d.ts +21 -0
  43. package/dist/cjs/api/decimal.d.ts.map +1 -0
  44. package/dist/cjs/api/decimal.js +60 -0
  45. package/dist/cjs/api/decimal.js.map +7 -0
  46. package/dist/cjs/api/errors.d.ts +32 -0
  47. package/dist/cjs/api/errors.d.ts.map +1 -0
  48. package/dist/cjs/api/errors.js +80 -0
  49. package/dist/cjs/api/errors.js.map +7 -0
  50. package/dist/cjs/api/generated.d.ts +2068 -0
  51. package/dist/cjs/api/generated.d.ts.map +1 -0
  52. package/dist/cjs/api/generated.js +17 -0
  53. package/dist/cjs/api/generated.js.map +7 -0
  54. package/dist/cjs/api/http.d.ts +16 -0
  55. package/dist/cjs/api/http.d.ts.map +1 -0
  56. package/dist/cjs/api/http.js +64 -0
  57. package/dist/cjs/api/http.js.map +7 -0
  58. package/dist/cjs/api/index.d.ts +14 -0
  59. package/dist/cjs/api/index.d.ts.map +1 -0
  60. package/dist/cjs/api/index.js +73 -0
  61. package/dist/cjs/api/index.js.map +7 -0
  62. package/dist/cjs/api/positionHistory.d.ts +44 -0
  63. package/dist/cjs/api/positionHistory.d.ts.map +1 -0
  64. package/dist/cjs/api/positionHistory.js +131 -0
  65. package/dist/cjs/api/positionHistory.js.map +7 -0
  66. package/dist/cjs/attribution/erc8021.d.ts +9 -0
  67. package/dist/cjs/attribution/erc8021.d.ts.map +1 -0
  68. package/dist/cjs/attribution/erc8021.js +37 -0
  69. package/dist/cjs/attribution/erc8021.js.map +7 -0
  70. package/dist/cjs/attribution/index.d.ts +25 -0
  71. package/dist/cjs/attribution/index.d.ts.map +1 -0
  72. package/dist/cjs/attribution/index.js +68 -0
  73. package/dist/cjs/attribution/index.js.map +7 -0
  74. package/dist/cjs/client.d.ts +72 -0
  75. package/dist/cjs/client.d.ts.map +1 -0
  76. package/dist/cjs/client.js +80 -0
  77. package/dist/cjs/client.js.map +7 -0
  78. package/dist/cjs/constants.d.ts +16 -0
  79. package/dist/cjs/constants.d.ts.map +1 -0
  80. package/dist/cjs/constants.js +83 -0
  81. package/dist/cjs/constants.js.map +7 -0
  82. package/dist/cjs/errors.d.ts +85 -0
  83. package/dist/cjs/errors.d.ts.map +1 -0
  84. package/dist/cjs/errors.js +210 -0
  85. package/dist/cjs/errors.js.map +7 -0
  86. package/dist/cjs/evm/abis/erc20.d.ts +41 -0
  87. package/dist/cjs/evm/abis/erc20.d.ts.map +1 -0
  88. package/dist/cjs/evm/abis/erc20.js +57 -0
  89. package/dist/cjs/evm/abis/erc20.js.map +7 -0
  90. package/dist/cjs/evm/abis/erc4626.d.ts +105 -0
  91. package/dist/cjs/evm/abis/erc4626.d.ts.map +1 -0
  92. package/dist/cjs/evm/abis/erc4626.js +97 -0
  93. package/dist/cjs/evm/abis/erc4626.js.map +7 -0
  94. package/dist/cjs/evm/abis/multiDepositorVault.d.ts +1048 -0
  95. package/dist/cjs/evm/abis/multiDepositorVault.d.ts.map +1 -0
  96. package/dist/cjs/evm/abis/multiDepositorVault.js +614 -0
  97. package/dist/cjs/evm/abis/multiDepositorVault.js.map +7 -0
  98. package/dist/cjs/evm/abis/priceAndFeeCalculator.d.ts +910 -0
  99. package/dist/cjs/evm/abis/priceAndFeeCalculator.d.ts.map +1 -0
  100. package/dist/cjs/evm/abis/priceAndFeeCalculator.js +517 -0
  101. package/dist/cjs/evm/abis/priceAndFeeCalculator.js.map +7 -0
  102. package/dist/cjs/evm/abis/priceAndFeeCalculatorV2.d.ts +277 -0
  103. package/dist/cjs/evm/abis/priceAndFeeCalculatorV2.d.ts.map +1 -0
  104. package/dist/cjs/evm/abis/priceAndFeeCalculatorV2.js +166 -0
  105. package/dist/cjs/evm/abis/priceAndFeeCalculatorV2.js.map +7 -0
  106. package/dist/cjs/evm/abis/provisioner.d.ts +4984 -0
  107. package/dist/cjs/evm/abis/provisioner.d.ts.map +1 -0
  108. package/dist/cjs/evm/abis/provisioner.js +2785 -0
  109. package/dist/cjs/evm/abis/provisioner.js.map +7 -0
  110. package/dist/cjs/evm/abis/provisionerV2.d.ts +740 -0
  111. package/dist/cjs/evm/abis/provisionerV2.d.ts.map +1 -0
  112. package/dist/cjs/evm/abis/provisionerV2.js +320 -0
  113. package/dist/cjs/evm/abis/provisionerV2.js.map +7 -0
  114. package/dist/cjs/evm/adapters/aera.d.ts +6 -0
  115. package/dist/cjs/evm/adapters/aera.d.ts.map +1 -0
  116. package/dist/cjs/evm/adapters/aera.js +491 -0
  117. package/dist/cjs/evm/adapters/aera.js.map +7 -0
  118. package/dist/cjs/evm/adapters/index.d.ts +3 -0
  119. package/dist/cjs/evm/adapters/index.d.ts.map +1 -0
  120. package/dist/cjs/evm/adapters/index.js +41 -0
  121. package/dist/cjs/evm/adapters/index.js.map +7 -0
  122. package/dist/cjs/evm/adapters/morpho.d.ts +3 -0
  123. package/dist/cjs/evm/adapters/morpho.d.ts.map +1 -0
  124. package/dist/cjs/evm/adapters/morpho.js +103 -0
  125. package/dist/cjs/evm/adapters/morpho.js.map +7 -0
  126. package/dist/cjs/evm/adapters/types.d.ts +84 -0
  127. package/dist/cjs/evm/adapters/types.d.ts.map +1 -0
  128. package/dist/cjs/evm/adapters/types.js +17 -0
  129. package/dist/cjs/evm/adapters/types.js.map +7 -0
  130. package/dist/cjs/evm/aeraContracts/priceAndFeeCalculator.d.ts +46 -0
  131. package/dist/cjs/evm/aeraContracts/priceAndFeeCalculator.d.ts.map +1 -0
  132. package/dist/cjs/evm/aeraContracts/priceAndFeeCalculator.js +223 -0
  133. package/dist/cjs/evm/aeraContracts/priceAndFeeCalculator.js.map +7 -0
  134. package/dist/cjs/evm/aeraContracts/readOptions.d.ts +8 -0
  135. package/dist/cjs/evm/aeraContracts/readOptions.d.ts.map +1 -0
  136. package/dist/cjs/evm/aeraContracts/readOptions.js +31 -0
  137. package/dist/cjs/evm/aeraContracts/readOptions.js.map +7 -0
  138. package/dist/cjs/evm/aeraContracts/v1.d.ts +2317 -0
  139. package/dist/cjs/evm/aeraContracts/v1.d.ts.map +1 -0
  140. package/dist/cjs/evm/aeraContracts/v1.js +120 -0
  141. package/dist/cjs/evm/aeraContracts/v1.js.map +7 -0
  142. package/dist/cjs/evm/aeraContracts/v2.d.ts +4538 -0
  143. package/dist/cjs/evm/aeraContracts/v2.d.ts.map +1 -0
  144. package/dist/cjs/evm/aeraContracts/v2.js +449 -0
  145. package/dist/cjs/evm/aeraContracts/v2.js.map +7 -0
  146. package/dist/cjs/evm/aeraContracts.d.ts +33 -0
  147. package/dist/cjs/evm/aeraContracts.d.ts.map +1 -0
  148. package/dist/cjs/evm/aeraContracts.js +224 -0
  149. package/dist/cjs/evm/aeraContracts.js.map +7 -0
  150. package/dist/cjs/evm/deposit.d.ts +50 -0
  151. package/dist/cjs/evm/deposit.d.ts.map +1 -0
  152. package/dist/cjs/evm/deposit.js +112 -0
  153. package/dist/cjs/evm/deposit.js.map +7 -0
  154. package/dist/cjs/evm/depositQuote.d.ts +32 -0
  155. package/dist/cjs/evm/depositQuote.d.ts.map +1 -0
  156. package/dist/cjs/evm/depositQuote.js +96 -0
  157. package/dist/cjs/evm/depositQuote.js.map +7 -0
  158. package/dist/cjs/evm/depositReceiverApproval.d.ts +17 -0
  159. package/dist/cjs/evm/depositReceiverApproval.d.ts.map +1 -0
  160. package/dist/cjs/evm/depositReceiverApproval.js +66 -0
  161. package/dist/cjs/evm/depositReceiverApproval.js.map +7 -0
  162. package/dist/cjs/evm/index.d.ts +28 -0
  163. package/dist/cjs/evm/index.d.ts.map +1 -0
  164. package/dist/cjs/evm/index.js +116 -0
  165. package/dist/cjs/evm/index.js.map +7 -0
  166. package/dist/cjs/evm/operationMode.d.ts +9 -0
  167. package/dist/cjs/evm/operationMode.d.ts.map +1 -0
  168. package/dist/cjs/evm/operationMode.js +65 -0
  169. package/dist/cjs/evm/operationMode.js.map +7 -0
  170. package/dist/cjs/evm/tokenModes.d.ts +22 -0
  171. package/dist/cjs/evm/tokenModes.d.ts.map +1 -0
  172. package/dist/cjs/evm/tokenModes.js +47 -0
  173. package/dist/cjs/evm/tokenModes.js.map +7 -0
  174. package/dist/cjs/evm/types.d.ts +34 -0
  175. package/dist/cjs/evm/types.d.ts.map +1 -0
  176. package/dist/cjs/evm/types.js +32 -0
  177. package/dist/cjs/evm/types.js.map +7 -0
  178. package/dist/cjs/evm/userCurrentBalance.d.ts +55 -0
  179. package/dist/cjs/evm/userCurrentBalance.d.ts.map +1 -0
  180. package/dist/cjs/evm/userCurrentBalance.js +225 -0
  181. package/dist/cjs/evm/userCurrentBalance.js.map +7 -0
  182. package/dist/cjs/evm/vaults.d.ts +44 -0
  183. package/dist/cjs/evm/vaults.d.ts.map +1 -0
  184. package/dist/cjs/evm/vaults.js +78 -0
  185. package/dist/cjs/evm/vaults.js.map +7 -0
  186. package/dist/cjs/evm/withdraw.d.ts +73 -0
  187. package/dist/cjs/evm/withdraw.d.ts.map +1 -0
  188. package/dist/cjs/evm/withdraw.js +161 -0
  189. package/dist/cjs/evm/withdraw.js.map +7 -0
  190. package/dist/cjs/evm/withdrawQuote.d.ts +135 -0
  191. package/dist/cjs/evm/withdrawQuote.d.ts.map +1 -0
  192. package/dist/cjs/evm/withdrawQuote.js +256 -0
  193. package/dist/cjs/evm/withdrawQuote.js.map +7 -0
  194. package/dist/cjs/index.d.ts +31 -0
  195. package/dist/cjs/index.d.ts.map +1 -0
  196. package/dist/cjs/index.js +128 -0
  197. package/dist/cjs/index.js.map +7 -0
  198. package/dist/cjs/package.json +1 -0
  199. package/dist/cjs/privy/index.d.ts +52 -0
  200. package/dist/cjs/privy/index.d.ts.map +1 -0
  201. package/dist/cjs/privy/index.js +57 -0
  202. package/dist/cjs/privy/index.js.map +7 -0
  203. package/dist/client.d.ts +4 -2
  204. package/dist/client.d.ts.map +1 -1
  205. package/dist/constants.d.ts.map +1 -1
  206. package/dist/errors.d.ts +15 -1
  207. package/dist/errors.d.ts.map +1 -1
  208. package/dist/evm/abis/priceAndFeeCalculatorV2.d.ts +44 -0
  209. package/dist/evm/abis/priceAndFeeCalculatorV2.d.ts.map +1 -1
  210. package/dist/evm/abis/provisionerV2.d.ts +56 -0
  211. package/dist/evm/abis/provisionerV2.d.ts.map +1 -1
  212. package/dist/evm/adapters/aera.d.ts +1 -1
  213. package/dist/evm/adapters/aera.d.ts.map +1 -1
  214. package/dist/evm/adapters/index.d.ts +1 -1
  215. package/dist/evm/adapters/index.d.ts.map +1 -1
  216. package/dist/evm/adapters/morpho.d.ts +1 -1
  217. package/dist/evm/adapters/morpho.d.ts.map +1 -1
  218. package/dist/evm/adapters/types.d.ts +6 -2
  219. package/dist/evm/adapters/types.d.ts.map +1 -1
  220. package/dist/evm/aeraContracts/priceAndFeeCalculator.d.ts +11 -6
  221. package/dist/evm/aeraContracts/priceAndFeeCalculator.d.ts.map +1 -1
  222. package/dist/evm/aeraContracts/readOptions.d.ts +8 -0
  223. package/dist/evm/aeraContracts/readOptions.d.ts.map +1 -0
  224. package/dist/evm/aeraContracts/v1.d.ts +2 -2
  225. package/dist/evm/aeraContracts/v1.d.ts.map +1 -1
  226. package/dist/evm/aeraContracts/v2.d.ts +396 -4
  227. package/dist/evm/aeraContracts/v2.d.ts.map +1 -1
  228. package/dist/evm/aeraContracts.d.ts +11 -5
  229. package/dist/evm/aeraContracts.d.ts.map +1 -1
  230. package/dist/evm/deposit.d.ts +4 -2
  231. package/dist/evm/deposit.d.ts.map +1 -1
  232. package/dist/evm/depositQuote.d.ts +32 -0
  233. package/dist/evm/depositQuote.d.ts.map +1 -0
  234. package/dist/evm/depositReceiverApproval.d.ts +2 -2
  235. package/dist/evm/depositReceiverApproval.d.ts.map +1 -1
  236. package/dist/evm/index.d.ts +27 -17
  237. package/dist/evm/index.d.ts.map +1 -1
  238. package/dist/evm/index.js +88 -9
  239. package/dist/evm/index.js.map +7 -1
  240. package/dist/evm/tokenModes.d.ts +22 -0
  241. package/dist/evm/tokenModes.d.ts.map +1 -0
  242. package/dist/evm/userCurrentBalance.d.ts +6 -2
  243. package/dist/evm/userCurrentBalance.d.ts.map +1 -1
  244. package/dist/evm/vaults.d.ts +2 -9
  245. package/dist/evm/vaults.d.ts.map +1 -1
  246. package/dist/evm/withdraw.d.ts +10 -2
  247. package/dist/evm/withdraw.d.ts.map +1 -1
  248. package/dist/evm/withdrawQuote.d.ts +135 -0
  249. package/dist/evm/withdrawQuote.d.ts.map +1 -0
  250. package/dist/index.d.ts +30 -22
  251. package/dist/index.d.ts.map +1 -1
  252. package/dist/index.js +139 -12
  253. package/dist/index.js.map +7 -1
  254. package/dist/manifest/vaults.json +1958 -0
  255. package/dist/privy/index.d.ts +1 -1
  256. package/dist/privy/index.d.ts.map +1 -1
  257. package/dist/privy/index.js +39 -48
  258. package/dist/privy/index.js.map +7 -1
  259. package/manifest/vaults.json +45 -460
  260. package/package.json +43 -9
  261. package/src/api/client.ts +104 -7
  262. package/src/api/generated.ts +621 -14
  263. package/src/api/index.ts +13 -0
  264. package/src/client.ts +4 -1
  265. package/src/constants.ts +2 -0
  266. package/src/errors.ts +39 -2
  267. package/src/evm/abis/priceAndFeeCalculatorV2.ts +22 -0
  268. package/src/evm/abis/provisionerV2.ts +33 -0
  269. package/src/evm/adapters/aera.ts +64 -34
  270. package/src/evm/adapters/types.ts +4 -0
  271. package/src/evm/aeraContracts/priceAndFeeCalculator.ts +72 -5
  272. package/src/evm/aeraContracts/readOptions.ts +3 -0
  273. package/src/evm/aeraContracts/v2.ts +273 -41
  274. package/src/evm/aeraContracts.ts +81 -8
  275. package/src/evm/deposit.ts +21 -8
  276. package/src/evm/depositQuote.ts +137 -0
  277. package/src/evm/index.ts +41 -0
  278. package/src/evm/tokenModes.ts +54 -0
  279. package/src/evm/userCurrentBalance.ts +12 -1
  280. package/src/evm/vaults.ts +0 -7
  281. package/src/evm/withdraw.ts +131 -7
  282. package/src/evm/withdrawQuote.ts +434 -0
  283. package/src/index.ts +26 -1
  284. package/dist/api/activity.js +0 -154
  285. package/dist/api/activity.js.map +0 -1
  286. package/dist/api/caip.js +0 -38
  287. package/dist/api/caip.js.map +0 -1
  288. package/dist/api/client.js +0 -109
  289. package/dist/api/client.js.map +0 -1
  290. package/dist/api/decimal.js +0 -44
  291. package/dist/api/decimal.js.map +0 -1
  292. package/dist/api/errors.js +0 -41
  293. package/dist/api/errors.js.map +0 -1
  294. package/dist/api/generated.js +0 -6
  295. package/dist/api/generated.js.map +0 -1
  296. package/dist/api/http.js +0 -39
  297. package/dist/api/http.js.map +0 -1
  298. package/dist/api/positionHistory.js +0 -126
  299. package/dist/api/positionHistory.js.map +0 -1
  300. package/dist/attribution/erc8021.js +0 -17
  301. package/dist/attribution/erc8021.js.map +0 -1
  302. package/dist/attribution/index.js +0 -45
  303. package/dist/attribution/index.js.map +0 -1
  304. package/dist/client.js +0 -72
  305. package/dist/client.js.map +0 -1
  306. package/dist/constants.js +0 -28
  307. package/dist/constants.js.map +0 -1
  308. package/dist/errors.js +0 -115
  309. package/dist/errors.js.map +0 -1
  310. package/dist/evm/abis/erc20.js +0 -30
  311. package/dist/evm/abis/erc20.js.map +0 -1
  312. package/dist/evm/abis/erc4626.js +0 -70
  313. package/dist/evm/abis/erc4626.js.map +0 -1
  314. package/dist/evm/abis/multiDepositorVault.js +0 -587
  315. package/dist/evm/abis/multiDepositorVault.js.map +0 -1
  316. package/dist/evm/abis/priceAndFeeCalculator.js +0 -490
  317. package/dist/evm/abis/priceAndFeeCalculator.js.map +0 -1
  318. package/dist/evm/abis/priceAndFeeCalculatorV2.js +0 -119
  319. package/dist/evm/abis/priceAndFeeCalculatorV2.js.map +0 -1
  320. package/dist/evm/abis/provisioner.js +0 -2768
  321. package/dist/evm/abis/provisioner.js.map +0 -1
  322. package/dist/evm/abis/provisionerV2.js +0 -262
  323. package/dist/evm/abis/provisionerV2.js.map +0 -1
  324. package/dist/evm/adapters/aera.js +0 -249
  325. package/dist/evm/adapters/aera.js.map +0 -1
  326. package/dist/evm/adapters/index.js +0 -14
  327. package/dist/evm/adapters/index.js.map +0 -1
  328. package/dist/evm/adapters/morpho.js +0 -79
  329. package/dist/evm/adapters/morpho.js.map +0 -1
  330. package/dist/evm/adapters/types.js +0 -2
  331. package/dist/evm/adapters/types.js.map +0 -1
  332. package/dist/evm/aeraContracts/priceAndFeeCalculator.js +0 -140
  333. package/dist/evm/aeraContracts/priceAndFeeCalculator.js.map +0 -1
  334. package/dist/evm/aeraContracts/v1.js +0 -59
  335. package/dist/evm/aeraContracts/v1.js.map +0 -1
  336. package/dist/evm/aeraContracts/v2.js +0 -217
  337. package/dist/evm/aeraContracts/v2.js.map +0 -1
  338. package/dist/evm/aeraContracts.js +0 -134
  339. package/dist/evm/aeraContracts.js.map +0 -1
  340. package/dist/evm/deposit.js +0 -109
  341. package/dist/evm/deposit.js.map +0 -1
  342. package/dist/evm/depositReceiverApproval.js +0 -32
  343. package/dist/evm/depositReceiverApproval.js.map +0 -1
  344. package/dist/evm/operationMode.js +0 -41
  345. package/dist/evm/operationMode.js.map +0 -1
  346. package/dist/evm/types.js +0 -5
  347. package/dist/evm/types.js.map +0 -1
  348. package/dist/evm/userCurrentBalance.js +0 -211
  349. package/dist/evm/userCurrentBalance.js.map +0 -1
  350. package/dist/evm/vaults.js +0 -75
  351. package/dist/evm/vaults.js.map +0 -1
  352. package/dist/evm/withdraw.js +0 -97
  353. package/dist/evm/withdraw.js.map +0 -1
@@ -8,6 +8,7 @@ import {
8
8
  VaultNotFoundError,
9
9
  UnsupportedAssetError,
10
10
  InvalidSlippageBPSError,
11
+ InvalidSyncDepositBoundError,
11
12
  } from '../errors';
12
13
  import {
13
14
  resolveAeraRuntimeContracts,
@@ -40,6 +41,8 @@ export interface EvmDepositParams {
40
41
  solverTip?: bigint;
41
42
  /** Maximum price age passed to async Aera provisioner requests. Defaults to 10 days. */
42
43
  maxPriceAge?: bigint;
44
+ /** Caller-reviewed minimum output for an explicit Aera synchronous deposit. */
45
+ minUnitsOut?: bigint;
43
46
  }
44
47
 
45
48
  /**
@@ -74,13 +77,15 @@ export async function getDepositTx(
74
77
  client: GauntletClient,
75
78
  params: EvmDepositParams
76
79
  ): Promise<PreparedTx[]> {
80
+ const slippageBps = params.slippageBps ?? DEFAULT_BPS;
81
+ if (!Number.isInteger(slippageBps) || slippageBps < 0 || slippageBps > Number(MAX_BPS)) {
82
+ throw new InvalidSlippageBPSError(slippageBps);
83
+ }
77
84
  if (
78
- params.slippageBps !== undefined &&
79
- (!Number.isInteger(params.slippageBps) ||
80
- params.slippageBps < 0 ||
81
- params.slippageBps > Number(MAX_BPS))
85
+ params.minUnitsOut !== undefined &&
86
+ (typeof params.minUnitsOut !== 'bigint' || params.minUnitsOut <= 0n)
82
87
  ) {
83
- throw new InvalidSlippageBPSError(params.slippageBps);
88
+ throw new InvalidSyncDepositBoundError();
84
89
  }
85
90
 
86
91
  const resolved = await resolveVault(client, params.vaultId, params.chainId);
@@ -105,6 +110,12 @@ export async function getDepositTx(
105
110
  }
106
111
 
107
112
  const requestedDepositMode = parseOperationMode(params.vaultId, params.depositMode);
113
+ if (
114
+ params.minUnitsOut !== undefined &&
115
+ (protocol !== 'aera' || requestedDepositMode !== 'sync')
116
+ ) {
117
+ throw new InvalidSyncDepositBoundError();
118
+ }
108
119
  let modifiedDepositMode: OperationMode;
109
120
  let aeraRuntime: AeraRuntimeContracts | undefined;
110
121
 
@@ -113,7 +124,8 @@ export async function getDepositTx(
113
124
  const tokenModeSupport = await resolveAeraTokenModeSupport(
114
125
  publicClient,
115
126
  aeraRuntime,
116
- token.address
127
+ token.address,
128
+ { includeSyncModes: requestedDepositMode !== 'async' }
117
129
  );
118
130
  modifiedDepositMode = resolveOperationMode(params.vaultId, requestedDepositMode, {
119
131
  async: tokenModeSupport.asyncDeposit,
@@ -158,12 +170,13 @@ export async function getDepositTx(
158
170
  async: modifiedDepositMode === 'async',
159
171
  asset: token,
160
172
  publicClient,
161
- slippageBps: params.slippageBps ?? DEFAULT_BPS,
173
+ slippageBps,
162
174
  solverTip: params.solverTip,
163
175
  maxPriceAge: params.maxPriceAge,
164
176
  aeraRuntime,
177
+ minUnitsOut: params.minUnitsOut,
165
178
  });
166
179
  steps.push(...depositSteps);
167
180
 
168
- return await Promise.all(steps.map((step) => encodeTransactionWithAttribution(client, step)));
181
+ return Promise.all(steps.map((step) => encodeTransactionWithAttribution(client, step)));
169
182
  }
@@ -0,0 +1,137 @@
1
+ import type { GauntletClient } from '../client';
2
+ import { DEFAULT_BPS, MAX_BPS } from '../constants';
3
+ import {
4
+ InvalidSlippageBPSError,
5
+ InvalidSyncDepositBoundError,
6
+ UnsupportedAssetError,
7
+ UnsupportedFeatureError,
8
+ VaultNotFoundError,
9
+ } from '../errors';
10
+ import {
11
+ applySlippageDown,
12
+ resolveAeraRuntimeContracts,
13
+ resolveAeraTokenModeSupport,
14
+ } from './aeraContracts';
15
+ import { getSyncDepositFeeBps, getSyncDepositQuoteValues } from './aeraContracts/v2';
16
+ import { resolveOperationMode } from './operationMode';
17
+ import { ContractVersion } from './types';
18
+ import { resolveVault } from './vaults';
19
+
20
+ export type SyncDepositQuote = Readonly<{
21
+ unitsOut: bigint;
22
+ minUnitsOut: bigint;
23
+ /** Deposit amount converted to the vault's numeraire, after the Instant Supply fee. */
24
+ numeraireOut: bigint;
25
+ /** Instant Supply fee applied to the deposited token amount, in basis points. */
26
+ feeBps: bigint;
27
+ /** Slippage tolerance used to derive `minUnitsOut`, in basis points. */
28
+ slippageBps: number;
29
+ }>;
30
+
31
+ export type SyncDepositQuoteParams = {
32
+ vaultId: string;
33
+ chainId?: number;
34
+ assetSymbol?: string;
35
+ amount: bigint;
36
+ slippageBps?: number;
37
+ };
38
+
39
+ export type SyncDepositRateParams = {
40
+ vaultId: string;
41
+ chainId?: number;
42
+ assetSymbol?: string;
43
+ };
44
+
45
+ export type SyncDepositRate = Readonly<{
46
+ /** Instant Supply fee, in basis points. Independent of the deposit amount. */
47
+ feeBps: bigint;
48
+ }>;
49
+
50
+ async function resolveSyncDepositContext(
51
+ client: GauntletClient,
52
+ params: SyncDepositRateParams,
53
+ readKind: 'quote' | 'rate'
54
+ ) {
55
+ const resolved = await resolveVault(client, params.vaultId, params.chainId);
56
+ if (!resolved) throw new VaultNotFoundError(params.vaultId, params.chainId);
57
+ if (resolved.protocol !== 'aera') {
58
+ throw new UnsupportedFeatureError(
59
+ readKind === 'quote'
60
+ ? 'Sync deposit quote is only available for Aera vaults'
61
+ : 'Sync deposit rate is only available for Aera vaults'
62
+ );
63
+ }
64
+
65
+ const { vault } = resolved;
66
+ const token =
67
+ vault.supplyToken.length > 1
68
+ ? vault.supplyToken.find(({ symbol }) => symbol === params.assetSymbol)
69
+ : vault.supplyToken[0];
70
+ if (!token) throw new UnsupportedAssetError(params.assetSymbol ?? 'unknown', params.vaultId);
71
+
72
+ const publicClient = client.getPublicClient(params.chainId ?? vault.chainId);
73
+ const runtime = await resolveAeraRuntimeContracts(publicClient, vault);
74
+ if (runtime.provisioner.version !== ContractVersion.V2) {
75
+ throw new UnsupportedFeatureError(
76
+ readKind === 'quote'
77
+ ? 'Sync deposit quote requires an Aera V2 provisioner'
78
+ : 'Sync deposit rate requires an Aera V2 provisioner'
79
+ );
80
+ }
81
+
82
+ const tokenModeSupport = await resolveAeraTokenModeSupport(publicClient, runtime, token.address, {
83
+ includeSyncModes: true,
84
+ });
85
+ resolveOperationMode(params.vaultId, 'sync', {
86
+ async: tokenModeSupport.asyncDeposit,
87
+ sync: tokenModeSupport.syncDeposit,
88
+ });
89
+
90
+ return { publicClient, vault, token, runtime };
91
+ }
92
+
93
+ /** Quotes an Aera synchronous deposit and its execution bounds. */
94
+ export async function getSyncDepositQuote(
95
+ client: GauntletClient,
96
+ params: SyncDepositQuoteParams
97
+ ): Promise<SyncDepositQuote> {
98
+ const slippageBps = params.slippageBps ?? DEFAULT_BPS;
99
+ if (!Number.isInteger(slippageBps) || slippageBps < 0 || slippageBps > Number(MAX_BPS)) {
100
+ throw new InvalidSlippageBPSError(slippageBps);
101
+ }
102
+
103
+ const { publicClient, vault, token, runtime } = await resolveSyncDepositContext(
104
+ client,
105
+ params,
106
+ 'quote'
107
+ );
108
+
109
+ const { unitsOut, feeBps, numeraireOut } = await getSyncDepositQuoteValues(
110
+ publicClient,
111
+ runtime.provisioner.address,
112
+ runtime.feeCalculator.address,
113
+ runtime.feeCalculator.version,
114
+ vault.vaultAddress,
115
+ token.address,
116
+ params.amount
117
+ );
118
+ const minUnitsOut = applySlippageDown(unitsOut, slippageBps);
119
+ if (minUnitsOut <= 0n) throw new InvalidSyncDepositBoundError();
120
+
121
+ return { unitsOut, minUnitsOut, numeraireOut, feeBps, slippageBps };
122
+ }
123
+
124
+ /** Reads the live Instant Supply fee for a vault token, without requiring a deposit amount. */
125
+ export async function getSyncDepositRate(
126
+ client: GauntletClient,
127
+ params: SyncDepositRateParams
128
+ ): Promise<SyncDepositRate> {
129
+ const { publicClient, runtime, token } = await resolveSyncDepositContext(client, params, 'rate');
130
+
131
+ const feeBps = await getSyncDepositFeeBps(
132
+ publicClient,
133
+ runtime.provisioner.address,
134
+ token.address
135
+ );
136
+ return { feeBps };
137
+ }
package/src/evm/index.ts CHANGED
@@ -1,10 +1,32 @@
1
1
  export { getDepositTx } from './deposit';
2
2
  export { getDepositReceiverApprovalTx } from './depositReceiverApproval';
3
+ export { getSyncDepositQuote, getSyncDepositRate } from './depositQuote';
3
4
  export { getWithdrawTx } from './withdraw';
5
+ export { getSyncWithdrawQuote, getSyncWithdrawRate } from './withdrawQuote';
6
+ export { getAeraTokenModeSupport } from './tokenModes';
4
7
  export { getUserCurrentBalance } from './userCurrentBalance';
5
8
  export { getVaults, VaultId } from './vaults';
6
9
  export { ContractVersion } from './types';
7
10
  export { resolveAeraRuntimeContracts, resolveContractVersion } from './aeraContracts';
11
+ export {
12
+ GauntletSDKError,
13
+ AccountRequiredError,
14
+ AccountMismatchError,
15
+ ChainMismatchError,
16
+ InvalidSlippageBPSError,
17
+ InvalidSolverTipError,
18
+ InvalidSyncDepositBoundError,
19
+ InvalidSyncWithdrawBoundError,
20
+ InvalidWithdrawParamsError,
21
+ RpcNotConfiguredError,
22
+ StalePriceError,
23
+ UnsupportedAssetError,
24
+ UnsupportedDepositModeError,
25
+ UnsupportedFeatureError,
26
+ UnsupportedProtocolError,
27
+ UnimplementedFeatureError,
28
+ VaultNotFoundError,
29
+ } from '../errors';
8
30
  export {
9
31
  Rounding,
10
32
  convertTokenToUnits,
@@ -18,8 +40,26 @@ export {
18
40
 
19
41
  export type { EvmDepositParams } from './deposit';
20
42
  export type { EvmDepositReceiverApprovalParams } from './depositReceiverApproval';
43
+ export type {
44
+ SyncDepositQuote,
45
+ SyncDepositQuoteParams,
46
+ SyncDepositRate,
47
+ SyncDepositRateParams,
48
+ } from './depositQuote';
21
49
  export type { EvmWithdrawParams } from './withdraw';
50
+ export type {
51
+ SyncWithdrawQuote,
52
+ SyncWithdrawQuoteParams,
53
+ SyncWithdrawCapacity,
54
+ SyncWithdrawQuoteContext,
55
+ SyncWithdrawQuoteRequest,
56
+ SyncWithdrawQuoteBounds,
57
+ SyncWithdrawRateParams,
58
+ } from './withdrawQuote';
59
+ export type { AeraTokenModeSupportParams } from './tokenModes';
60
+ export type { SyncRedeemRate } from './aeraContracts/v2';
22
61
  export type { EvmTxStep } from './adapters/types';
62
+ export type { PreparedTx } from '../attribution';
23
63
  export type {
24
64
  VaultInfo,
25
65
  VaultDeployment,
@@ -31,3 +71,4 @@ export type { VaultFilter } from './vaults';
31
71
  export type { UserCurrentBalanceParams, UserCurrentBalance } from './userCurrentBalance';
32
72
  export type { AeraRuntimeContracts, AeraTokenModeSupport } from './aeraContracts';
33
73
  export type { NormalizedVaultPriceState } from './aeraContracts/priceAndFeeCalculator';
74
+ export type { SyncWithdrawBound } from '../errors';
@@ -0,0 +1,54 @@
1
+ import type { GauntletClient } from '../client';
2
+ import { UnsupportedAssetError, UnsupportedFeatureError, VaultNotFoundError } from '../errors';
3
+ import { resolveVault } from './vaults';
4
+ import {
5
+ resolveAeraRuntimeContracts,
6
+ resolveAeraTokenModeSupport,
7
+ type AeraTokenModeSupport,
8
+ } from './aeraContracts';
9
+
10
+ export interface AeraTokenModeSupportParams {
11
+ vaultId: string;
12
+ /** EVM chain ID. Defaults to the vault's primary chain (Base for current multichain vaults). */
13
+ chainId?: number;
14
+ /** Required for multiasset vaults. */
15
+ assetSymbol?: string;
16
+ }
17
+
18
+ /**
19
+ * Reads which deposit/redeem modes (sync vs async) are currently enabled on-chain for a vault token.
20
+ *
21
+ * Use this to decide which entry points to offer a user (e.g. whether an instant withdraw is
22
+ * available) before any amount is entered. Mode availability includes the provisioner's token
23
+ * settings and live runtime gates. A paused V2 solving gate disables both sync modes.
24
+ *
25
+ * @throws {VaultNotFoundError} If the vault ID is not found.
26
+ * @throws {UnsupportedFeatureError} If the vault is not an Aera deployment.
27
+ * @throws {UnsupportedAssetError} If the asset symbol is not accepted by the vault.
28
+ */
29
+ export async function getAeraTokenModeSupport(
30
+ client: GauntletClient,
31
+ params: AeraTokenModeSupportParams
32
+ ): Promise<AeraTokenModeSupport> {
33
+ const resolved = await resolveVault(client, params.vaultId, params.chainId);
34
+ if (!resolved) throw new VaultNotFoundError(params.vaultId);
35
+
36
+ const { vault, protocol } = resolved;
37
+ if (protocol !== 'aera') {
38
+ throw new UnsupportedFeatureError('Token mode support is only available for Aera vaults');
39
+ }
40
+
41
+ const chainId = params.chainId ?? vault.chainId;
42
+ const publicClient = client.getPublicClient(chainId);
43
+
44
+ const token =
45
+ vault.supplyToken.length > 1
46
+ ? vault.supplyToken.find((tInfo) => tInfo.symbol === params.assetSymbol)
47
+ : vault.supplyToken[0];
48
+ if (token === undefined) {
49
+ throw new UnsupportedAssetError(params.assetSymbol ?? 'unknown', params.vaultId);
50
+ }
51
+
52
+ const runtime = await resolveAeraRuntimeContracts(publicClient, vault);
53
+ return resolveAeraTokenModeSupport(publicClient, runtime, token.address);
54
+ }
@@ -4,6 +4,7 @@ import type { EvmVaultDeployment } from './types';
4
4
  import { ChainMismatchError, UnsupportedProtocolError, VaultNotFoundError } from '../errors';
5
5
  import { getMultiDepositorVault, resolveAeraRuntimeContracts } from './aeraContracts';
6
6
  import { convertUnitsToToken } from './aeraContracts/priceAndFeeCalculator';
7
+ import { getUserUnitsRefundableUntil } from './aeraContracts/v2';
7
8
  import { provisionerV2Abi } from './abis/provisionerV2';
8
9
  import { ContractVersion } from './types';
9
10
  import { BLOCKS_3_DAYS, CHAIN_NAMES, DEFAULT_BLOCKS_3_DAYS, LOG_PAGE_SIZE } from '../constants';
@@ -59,6 +60,8 @@ export interface UserCurrentBalanceParams {
59
60
  export interface UserCurrentBalance {
60
61
  /** Chain identifier, e.g. "base" */
61
62
  chain: string;
63
+ /** EVM chain id of the deployment, e.g. 8453 */
64
+ chainId: number;
62
65
  token: Address;
63
66
  decimals: number;
64
67
  /** Assets queued via async deposit, not yet earning */
@@ -67,6 +70,8 @@ export interface UserCurrentBalance {
67
70
  balance: bigint;
68
71
  /** Assets queued via async withdraw, not yet claimable */
69
72
  pendingWithdraw: bigint;
73
+ /** Timestamp until which this account cannot redeem vault units. */
74
+ unitsLockedUntil?: bigint;
70
75
  }
71
76
 
72
77
  // V2 legacy wrapper calls can emit both receiver-aware and legacy events for one request.
@@ -101,6 +106,9 @@ async function queryDeploymentBalance(
101
106
  ]);
102
107
  const provisionerAddress = runtime.provisioner.address;
103
108
  const isV2 = runtime.provisioner.version === ContractVersion.V2;
109
+ const unitsLockedUntilPromise = isV2
110
+ ? getUserUnitsRefundableUntil(publicClient, provisionerAddress, address)
111
+ : Promise.resolve(undefined);
104
112
 
105
113
  const balance = await convertUnitsToToken(
106
114
  publicClient,
@@ -218,14 +226,17 @@ async function queryDeploymentBalance(
218
226
  pendingWithdrawUnits
219
227
  )
220
228
  : 0n;
229
+ const unitsLockedUntil = await unitsLockedUntilPromise;
221
230
 
222
231
  return {
223
232
  chain: CHAIN_NAMES[deployment.chainId] ?? `chain-${deployment.chainId}`,
233
+ chainId: deployment.chainId,
224
234
  token: token.address,
225
235
  decimals: token.decimals,
226
236
  pendingDeposit,
227
237
  balance,
228
238
  pendingWithdraw,
239
+ ...(unitsLockedUntil !== undefined ? { unitsLockedUntil } : {}),
229
240
  };
230
241
  }
231
242
 
@@ -256,7 +267,7 @@ async function queryDeploymentBalance(
256
267
  * vaultId: 'baseUsdcPrime',
257
268
  * address: '0xYourWalletAddress',
258
269
  * });
259
- * // [{ chain: 'base', token: '0x...', decimals: 6, balance: 100_000_000n, pendingDeposit: 0n, pendingWithdraw: 0n }]
270
+ * // [{ chain: 'base', chainId: 8453, token: '0x...', decimals: 6, balance: 100_000_000n, pendingDeposit: 0n, pendingWithdraw: 0n }]
260
271
  * ```
261
272
  */
262
273
  export async function getUserCurrentBalance(
package/src/evm/vaults.ts CHANGED
@@ -8,16 +8,9 @@ export enum VaultId {
8
8
  EthUsdcPrime = 'ethUsdcPrime',
9
9
  AeraUsdAlpha = 'gtusda',
10
10
  EthUsdcPrimeV2 = 'ethUsdcPrimeV2',
11
- AeraUsdAlphaStaging = 'stgusda',
12
- AeraUsdAlphaDev = 'devusda',
13
- AeraUsdAlphaDevDeux = 'devusda2',
14
11
  AeraLeveredFalconX = 'gpaafalconx',
15
- AeraLeveredFalconXStaging = 'pytstg',
16
12
  AeraSyrupUsdc = 'gpsyrupusdc',
17
- AeraSyrupUsdcStaging = 'syruppytstg',
18
13
  AeraBtcYield = 'gtbtc',
19
- AeraBtcYieldStaging = 'gtbtcstaging',
20
- AeraLeveredUsccStaging = 'gtusccstg',
21
14
  AeraLeveredUscc = 'gtuscc',
22
15
  AeraLend = 'gtlend',
23
16
  AeraKastEth = 'kasteth',
@@ -1,15 +1,19 @@
1
1
  import type { Address } from 'viem';
2
2
  import type { GauntletClient } from '../client';
3
3
  import type { AdapterWithdrawParams } from './adapters/types';
4
+ import type { SyncWithdrawQuoteBounds } from './withdrawQuote';
4
5
  import { getAdapter } from './adapters';
5
6
  import { encodeTransactionWithAttribution, PreparedTx } from '../attribution';
6
7
  import {
8
+ AccountMismatchError,
7
9
  AccountRequiredError,
8
10
  VaultNotFoundError,
9
11
  UnsupportedAssetError,
10
12
  InvalidSlippageBPSError,
13
+ InvalidWithdrawParamsError,
11
14
  } from '../errors';
12
15
  import {
16
+ requireAeraSyncRedeemRuntime,
13
17
  resolveAeraRuntimeContracts,
14
18
  resolveAeraTokenModeSupport,
15
19
  type AeraRuntimeContracts,
@@ -22,6 +26,7 @@ import {
22
26
  resolveSyncOnlyOperationMode,
23
27
  type OperationMode,
24
28
  } from './operationMode';
29
+ import { ContractVersion } from './types';
25
30
 
26
31
  export type EvmWithdrawParams = {
27
32
  vaultId: string;
@@ -39,12 +44,94 @@ export type EvmWithdrawParams = {
39
44
  solverTip?: bigint;
40
45
  /** Maximum price age passed to async Aera provisioner requests. Defaults to 10 days. */
41
46
  maxPriceAge?: bigint;
47
+ /**
48
+ * Current sync quote bounds to pin instant withdraw transaction construction.
49
+ * Supplying bounds implies `depositMode: 'sync'`; explicit async requests are rejected.
50
+ */
51
+ syncWithdrawQuote?: SyncWithdrawQuoteBounds;
42
52
  } & (
43
53
  | { shares: bigint; amount?: never; entireAmount?: never }
44
54
  | { amount: bigint; shares?: never; entireAmount?: never }
45
- | { entireAmount: true; shares?: never; amount?: never }
55
+ | { account?: Address; entireAmount: true; shares?: never; amount?: never }
46
56
  );
47
57
 
58
+ function validateWithdrawParams(params: EvmWithdrawParams) {
59
+ const modes = [
60
+ 'amount' in params && params.amount != null,
61
+ 'shares' in params && params.shares != null,
62
+ 'entireAmount' in params && params.entireAmount === true,
63
+ ].filter(Boolean).length;
64
+
65
+ if (modes !== 1) throw new InvalidWithdrawParamsError();
66
+ }
67
+
68
+ function sameAddress(left: Address, right: Address): boolean {
69
+ return left.toLowerCase() === right.toLowerCase();
70
+ }
71
+
72
+ function validateSyncWithdrawQuote({
73
+ params,
74
+ account,
75
+ chainId,
76
+ slippageBps,
77
+ tokenAddress,
78
+ }: {
79
+ params: EvmWithdrawParams;
80
+ account: Address;
81
+ chainId: number;
82
+ slippageBps: number;
83
+ tokenAddress: Address;
84
+ }) {
85
+ const quote = params.syncWithdrawQuote;
86
+ if (quote === undefined) return;
87
+
88
+ const { context } = quote;
89
+ if (
90
+ context.vaultId !== params.vaultId ||
91
+ context.chainId !== chainId ||
92
+ !sameAddress(context.tokenAddress, tokenAddress) ||
93
+ context.slippageBps !== slippageBps
94
+ ) {
95
+ throw new InvalidWithdrawParamsError();
96
+ }
97
+
98
+ if (context.account !== undefined && !sameAddress(context.account, account)) {
99
+ throw new InvalidWithdrawParamsError();
100
+ }
101
+
102
+ switch (context.request.mode) {
103
+ case 'amount':
104
+ if (
105
+ quote.kind !== 'withdraw' ||
106
+ !('amount' in params && params.amount != null) ||
107
+ context.request.amount !== params.amount ||
108
+ quote.tokensOut !== params.amount
109
+ ) {
110
+ throw new InvalidWithdrawParamsError();
111
+ }
112
+ return;
113
+ case 'shares':
114
+ if (
115
+ quote.kind !== 'redeem' ||
116
+ !('shares' in params && params.shares != null) ||
117
+ context.request.shares !== params.shares ||
118
+ quote.shares !== params.shares
119
+ ) {
120
+ throw new InvalidWithdrawParamsError();
121
+ }
122
+ return;
123
+ case 'entireAmount':
124
+ if (
125
+ quote.kind !== 'redeem' ||
126
+ !('entireAmount' in params && params.entireAmount) ||
127
+ !sameAddress(context.request.account, account)
128
+ ) {
129
+ throw new InvalidWithdrawParamsError();
130
+ }
131
+ return;
132
+ }
133
+ }
134
+
48
135
  /**
49
136
  * Builds the ordered list of EVM transactions required to withdraw from a Gauntlet vault.
50
137
  *
@@ -76,6 +163,7 @@ export type EvmWithdrawParams = {
76
163
  * const txs = await getWithdrawTx(client, {
77
164
  * vaultId: 'baseUsdcPrime',
78
165
  * entireAmount: true,
166
+ * account: walletAddress,
79
167
  * });
80
168
  * ```
81
169
  */
@@ -83,6 +171,8 @@ export async function getWithdrawTx(
83
171
  client: GauntletClient,
84
172
  params: EvmWithdrawParams
85
173
  ): Promise<PreparedTx[]> {
174
+ validateWithdrawParams(params);
175
+
86
176
  if (
87
177
  params.slippageBps !== undefined &&
88
178
  (!Number.isInteger(params.slippageBps) ||
@@ -99,6 +189,11 @@ export async function getWithdrawTx(
99
189
 
100
190
  const account = client.wallet?.account?.address;
101
191
  if (!account) throw new AccountRequiredError();
192
+ if ('entireAmount' in params && params.entireAmount && params.account !== undefined) {
193
+ if (!sameAddress(params.account, account)) {
194
+ throw new AccountMismatchError(account, params.account);
195
+ }
196
+ }
102
197
 
103
198
  const { vault, protocol } = resolved;
104
199
 
@@ -114,20 +209,48 @@ export async function getWithdrawTx(
114
209
  const adapter = getAdapter(protocol);
115
210
  const publicClient = client.getPublicClient(chainId);
116
211
  const requestedWithdrawMode = parseOperationMode(params.vaultId, params.depositMode);
212
+ const slippageBps =
213
+ params.slippageBps ?? params.syncWithdrawQuote?.context.slippageBps ?? DEFAULT_BPS;
117
214
  let modifiedDepositMode: OperationMode;
118
215
  let aeraRuntime: AeraRuntimeContracts | undefined;
119
216
 
217
+ if (params.syncWithdrawQuote !== undefined) {
218
+ if (protocol !== 'aera' || requestedWithdrawMode === 'async') {
219
+ throw new InvalidWithdrawParamsError();
220
+ }
221
+
222
+ validateSyncWithdrawQuote({
223
+ params,
224
+ account,
225
+ chainId,
226
+ slippageBps,
227
+ tokenAddress: token.address,
228
+ });
229
+ }
230
+
120
231
  if (protocol === 'aera') {
121
232
  aeraRuntime = await resolveAeraRuntimeContracts(publicClient, vault);
233
+ if (
234
+ aeraRuntime.provisioner.version === ContractVersion.V2 &&
235
+ (requestedWithdrawMode === 'sync' || params.syncWithdrawQuote !== undefined)
236
+ ) {
237
+ requireAeraSyncRedeemRuntime(aeraRuntime);
238
+ }
122
239
  const tokenModeSupport = await resolveAeraTokenModeSupport(
123
240
  publicClient,
124
241
  aeraRuntime,
125
- token.address
242
+ token.address,
243
+ { includeSyncModes: requestedWithdrawMode !== 'async' }
126
244
  );
127
- modifiedDepositMode = resolveOperationMode(params.vaultId, requestedWithdrawMode, {
128
- async: tokenModeSupport.asyncRedeem,
129
- sync: tokenModeSupport.syncRedeem,
130
- });
245
+ modifiedDepositMode = resolveOperationMode(
246
+ params.vaultId,
247
+ params.syncWithdrawQuote !== undefined ? 'sync' : requestedWithdrawMode,
248
+ {
249
+ async: tokenModeSupport.asyncRedeem,
250
+ sync: tokenModeSupport.syncRedeem,
251
+ }
252
+ );
253
+ if (modifiedDepositMode === 'sync') requireAeraSyncRedeemRuntime(aeraRuntime);
131
254
  } else {
132
255
  modifiedDepositMode = resolveSyncOnlyOperationMode(params.vaultId, requestedWithdrawMode);
133
256
  }
@@ -139,10 +262,11 @@ export async function getWithdrawTx(
139
262
  async: modifiedDepositMode === 'async',
140
263
  asset: token,
141
264
  publicClient,
142
- slippageBps: params.slippageBps ?? DEFAULT_BPS,
265
+ slippageBps,
143
266
  solverTip: params.solverTip,
144
267
  maxPriceAge: params.maxPriceAge,
145
268
  aeraRuntime,
269
+ syncWithdrawQuote: params.syncWithdrawQuote,
146
270
  ...('shares' in params && params.shares != null ? { shares: params.shares } : {}),
147
271
  ...('amount' in params && params.amount != null ? { amount: params.amount } : {}),
148
272
  ...('entireAmount' in params && params.entireAmount ? { entireAmount: true as const } : {}),