@gauntlet-xyz/sdk 2.5.0 → 3.1.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 (362) hide show
  1. package/README.md +121 -7
  2. package/dist/api/activity.d.ts +4 -2
  3. package/dist/api/activity.d.ts.map +1 -1
  4. package/dist/api/activityRows.d.ts +11 -0
  5. package/dist/api/activityRows.d.ts.map +1 -0
  6. package/dist/api/caip.d.ts +1 -1
  7. package/dist/api/caip.d.ts.map +1 -1
  8. package/dist/api/client.d.ts +43 -5
  9. package/dist/api/client.d.ts.map +1 -1
  10. package/dist/api/decimal.d.ts.map +1 -1
  11. package/dist/api/errors.d.ts +1 -1
  12. package/dist/api/errors.d.ts.map +1 -1
  13. package/dist/api/generated.d.ts +570 -7
  14. package/dist/api/generated.d.ts.map +1 -1
  15. package/dist/api/http.d.ts.map +1 -1
  16. package/dist/api/index.d.ts +13 -13
  17. package/dist/api/index.d.ts.map +1 -1
  18. package/dist/api/index.js +47 -8
  19. package/dist/api/index.js.map +7 -1
  20. package/dist/api/positionHistory.d.ts +1 -1
  21. package/dist/api/positionHistory.d.ts.map +1 -1
  22. package/dist/attribution/index.d.ts +8 -5
  23. package/dist/attribution/index.d.ts.map +1 -1
  24. package/dist/chunk-JJOLVL5V.js +546 -0
  25. package/dist/chunk-JJOLVL5V.js.map +7 -0
  26. package/dist/chunk-JRSNLXFY.js +2009 -0
  27. package/dist/chunk-JRSNLXFY.js.map +7 -0
  28. package/dist/chunk-MEKISE2T.js +367 -0
  29. package/dist/chunk-MEKISE2T.js.map +7 -0
  30. package/dist/chunk-YQXTLIJA.js +4477 -0
  31. package/dist/chunk-YQXTLIJA.js.map +7 -0
  32. package/dist/cjs/api/activity.d.ts +72 -0
  33. package/dist/cjs/api/activity.d.ts.map +1 -0
  34. package/dist/cjs/api/activity.js +138 -0
  35. package/dist/cjs/api/activity.js.map +7 -0
  36. package/dist/cjs/api/activityRows.d.ts +11 -0
  37. package/dist/cjs/api/activityRows.d.ts.map +1 -0
  38. package/dist/cjs/api/activityRows.js +139 -0
  39. package/dist/cjs/api/activityRows.js.map +7 -0
  40. package/dist/cjs/api/caip.d.ts +29 -0
  41. package/dist/cjs/api/caip.d.ts.map +1 -0
  42. package/dist/cjs/api/caip.js +61 -0
  43. package/dist/cjs/api/caip.js.map +7 -0
  44. package/dist/cjs/api/client.d.ts +173 -0
  45. package/dist/cjs/api/client.d.ts.map +1 -0
  46. package/dist/cjs/api/client.js +199 -0
  47. package/dist/cjs/api/client.js.map +7 -0
  48. package/dist/cjs/api/decimal.d.ts +21 -0
  49. package/dist/cjs/api/decimal.d.ts.map +1 -0
  50. package/dist/cjs/api/decimal.js +61 -0
  51. package/dist/cjs/api/decimal.js.map +7 -0
  52. package/dist/cjs/api/errors.d.ts +32 -0
  53. package/dist/cjs/api/errors.d.ts.map +1 -0
  54. package/dist/cjs/api/errors.js +80 -0
  55. package/dist/cjs/api/errors.js.map +7 -0
  56. package/dist/cjs/api/generated.d.ts +2068 -0
  57. package/dist/cjs/api/generated.d.ts.map +1 -0
  58. package/dist/cjs/api/generated.js +17 -0
  59. package/dist/cjs/api/generated.js.map +7 -0
  60. package/dist/cjs/api/http.d.ts +16 -0
  61. package/dist/cjs/api/http.d.ts.map +1 -0
  62. package/dist/cjs/api/http.js +65 -0
  63. package/dist/cjs/api/http.js.map +7 -0
  64. package/dist/cjs/api/index.d.ts +14 -0
  65. package/dist/cjs/api/index.d.ts.map +1 -0
  66. package/dist/cjs/api/index.js +73 -0
  67. package/dist/cjs/api/index.js.map +7 -0
  68. package/dist/cjs/api/positionHistory.d.ts +44 -0
  69. package/dist/cjs/api/positionHistory.d.ts.map +1 -0
  70. package/dist/cjs/api/positionHistory.js +144 -0
  71. package/dist/cjs/api/positionHistory.js.map +7 -0
  72. package/dist/cjs/attribution/erc8021.d.ts +9 -0
  73. package/dist/cjs/attribution/erc8021.d.ts.map +1 -0
  74. package/dist/cjs/attribution/erc8021.js +37 -0
  75. package/dist/cjs/attribution/erc8021.js.map +7 -0
  76. package/dist/cjs/attribution/index.d.ts +28 -0
  77. package/dist/cjs/attribution/index.d.ts.map +1 -0
  78. package/dist/cjs/attribution/index.js +70 -0
  79. package/dist/cjs/attribution/index.js.map +7 -0
  80. package/dist/cjs/client.d.ts +72 -0
  81. package/dist/cjs/client.d.ts.map +1 -0
  82. package/dist/cjs/client.js +80 -0
  83. package/dist/cjs/client.js.map +7 -0
  84. package/dist/cjs/constants.d.ts +16 -0
  85. package/dist/cjs/constants.d.ts.map +1 -0
  86. package/dist/cjs/constants.js +83 -0
  87. package/dist/cjs/constants.js.map +7 -0
  88. package/dist/cjs/errors.d.ts +85 -0
  89. package/dist/cjs/errors.d.ts.map +1 -0
  90. package/dist/cjs/errors.js +210 -0
  91. package/dist/cjs/errors.js.map +7 -0
  92. package/dist/cjs/evm/abis/erc20.d.ts +41 -0
  93. package/dist/cjs/evm/abis/erc20.d.ts.map +1 -0
  94. package/dist/cjs/evm/abis/erc20.js +57 -0
  95. package/dist/cjs/evm/abis/erc20.js.map +7 -0
  96. package/dist/cjs/evm/abis/erc4626.d.ts +105 -0
  97. package/dist/cjs/evm/abis/erc4626.d.ts.map +1 -0
  98. package/dist/cjs/evm/abis/erc4626.js +97 -0
  99. package/dist/cjs/evm/abis/erc4626.js.map +7 -0
  100. package/dist/cjs/evm/abis/multiDepositorVault.d.ts +1048 -0
  101. package/dist/cjs/evm/abis/multiDepositorVault.d.ts.map +1 -0
  102. package/dist/cjs/evm/abis/multiDepositorVault.js +614 -0
  103. package/dist/cjs/evm/abis/multiDepositorVault.js.map +7 -0
  104. package/dist/cjs/evm/abis/priceAndFeeCalculator.d.ts +910 -0
  105. package/dist/cjs/evm/abis/priceAndFeeCalculator.d.ts.map +1 -0
  106. package/dist/cjs/evm/abis/priceAndFeeCalculator.js +517 -0
  107. package/dist/cjs/evm/abis/priceAndFeeCalculator.js.map +7 -0
  108. package/dist/cjs/evm/abis/priceAndFeeCalculatorV2.d.ts +277 -0
  109. package/dist/cjs/evm/abis/priceAndFeeCalculatorV2.d.ts.map +1 -0
  110. package/dist/cjs/evm/abis/priceAndFeeCalculatorV2.js +166 -0
  111. package/dist/cjs/evm/abis/priceAndFeeCalculatorV2.js.map +7 -0
  112. package/dist/cjs/evm/abis/provisioner.d.ts +4984 -0
  113. package/dist/cjs/evm/abis/provisioner.d.ts.map +1 -0
  114. package/dist/cjs/evm/abis/provisioner.js +2785 -0
  115. package/dist/cjs/evm/abis/provisioner.js.map +7 -0
  116. package/dist/cjs/evm/abis/provisionerV2.d.ts +740 -0
  117. package/dist/cjs/evm/abis/provisionerV2.d.ts.map +1 -0
  118. package/dist/cjs/evm/abis/provisionerV2.js +320 -0
  119. package/dist/cjs/evm/abis/provisionerV2.js.map +7 -0
  120. package/dist/cjs/evm/adapters/aera.d.ts +6 -0
  121. package/dist/cjs/evm/adapters/aera.d.ts.map +1 -0
  122. package/dist/cjs/evm/adapters/aera.js +500 -0
  123. package/dist/cjs/evm/adapters/aera.js.map +7 -0
  124. package/dist/cjs/evm/adapters/index.d.ts +3 -0
  125. package/dist/cjs/evm/adapters/index.d.ts.map +1 -0
  126. package/dist/cjs/evm/adapters/index.js +41 -0
  127. package/dist/cjs/evm/adapters/index.js.map +7 -0
  128. package/dist/cjs/evm/adapters/morpho.d.ts +3 -0
  129. package/dist/cjs/evm/adapters/morpho.d.ts.map +1 -0
  130. package/dist/cjs/evm/adapters/morpho.js +103 -0
  131. package/dist/cjs/evm/adapters/morpho.js.map +7 -0
  132. package/dist/cjs/evm/adapters/types.d.ts +85 -0
  133. package/dist/cjs/evm/adapters/types.d.ts.map +1 -0
  134. package/dist/cjs/evm/adapters/types.js +17 -0
  135. package/dist/cjs/evm/adapters/types.js.map +7 -0
  136. package/dist/cjs/evm/aeraContracts/priceAndFeeCalculator.d.ts +46 -0
  137. package/dist/cjs/evm/aeraContracts/priceAndFeeCalculator.d.ts.map +1 -0
  138. package/dist/cjs/evm/aeraContracts/priceAndFeeCalculator.js +223 -0
  139. package/dist/cjs/evm/aeraContracts/priceAndFeeCalculator.js.map +7 -0
  140. package/dist/cjs/evm/aeraContracts/readOptions.d.ts +8 -0
  141. package/dist/cjs/evm/aeraContracts/readOptions.d.ts.map +1 -0
  142. package/dist/cjs/evm/aeraContracts/readOptions.js +31 -0
  143. package/dist/cjs/evm/aeraContracts/readOptions.js.map +7 -0
  144. package/dist/cjs/evm/aeraContracts/v1.d.ts +2317 -0
  145. package/dist/cjs/evm/aeraContracts/v1.d.ts.map +1 -0
  146. package/dist/cjs/evm/aeraContracts/v1.js +120 -0
  147. package/dist/cjs/evm/aeraContracts/v1.js.map +7 -0
  148. package/dist/cjs/evm/aeraContracts/v2.d.ts +4538 -0
  149. package/dist/cjs/evm/aeraContracts/v2.d.ts.map +1 -0
  150. package/dist/cjs/evm/aeraContracts/v2.js +449 -0
  151. package/dist/cjs/evm/aeraContracts/v2.js.map +7 -0
  152. package/dist/cjs/evm/aeraContracts.d.ts +33 -0
  153. package/dist/cjs/evm/aeraContracts.d.ts.map +1 -0
  154. package/dist/cjs/evm/aeraContracts.js +234 -0
  155. package/dist/cjs/evm/aeraContracts.js.map +7 -0
  156. package/dist/cjs/evm/deposit.d.ts +51 -0
  157. package/dist/cjs/evm/deposit.d.ts.map +1 -0
  158. package/dist/cjs/evm/deposit.js +142 -0
  159. package/dist/cjs/evm/deposit.js.map +7 -0
  160. package/dist/cjs/evm/depositQuote.d.ts +32 -0
  161. package/dist/cjs/evm/depositQuote.d.ts.map +1 -0
  162. package/dist/cjs/evm/depositQuote.js +97 -0
  163. package/dist/cjs/evm/depositQuote.js.map +7 -0
  164. package/dist/cjs/evm/depositReceiverApproval.d.ts +17 -0
  165. package/dist/cjs/evm/depositReceiverApproval.d.ts.map +1 -0
  166. package/dist/cjs/evm/depositReceiverApproval.js +71 -0
  167. package/dist/cjs/evm/depositReceiverApproval.js.map +7 -0
  168. package/dist/cjs/evm/index.d.ts +28 -0
  169. package/dist/cjs/evm/index.d.ts.map +1 -0
  170. package/dist/cjs/evm/index.js +116 -0
  171. package/dist/cjs/evm/index.js.map +7 -0
  172. package/dist/cjs/evm/operationMode.d.ts +9 -0
  173. package/dist/cjs/evm/operationMode.d.ts.map +1 -0
  174. package/dist/cjs/evm/operationMode.js +65 -0
  175. package/dist/cjs/evm/operationMode.js.map +7 -0
  176. package/dist/cjs/evm/tokenModes.d.ts +22 -0
  177. package/dist/cjs/evm/tokenModes.d.ts.map +1 -0
  178. package/dist/cjs/evm/tokenModes.js +47 -0
  179. package/dist/cjs/evm/tokenModes.js.map +7 -0
  180. package/dist/cjs/evm/types.d.ts +34 -0
  181. package/dist/cjs/evm/types.d.ts.map +1 -0
  182. package/dist/cjs/evm/types.js +32 -0
  183. package/dist/cjs/evm/types.js.map +7 -0
  184. package/dist/cjs/evm/userCurrentBalance.d.ts +69 -0
  185. package/dist/cjs/evm/userCurrentBalance.d.ts.map +1 -0
  186. package/dist/cjs/evm/userCurrentBalance.js +268 -0
  187. package/dist/cjs/evm/userCurrentBalance.js.map +7 -0
  188. package/dist/cjs/evm/vaults.d.ts +44 -0
  189. package/dist/cjs/evm/vaults.d.ts.map +1 -0
  190. package/dist/cjs/evm/vaults.js +78 -0
  191. package/dist/cjs/evm/vaults.js.map +7 -0
  192. package/dist/cjs/evm/withdraw.d.ts +75 -0
  193. package/dist/cjs/evm/withdraw.d.ts.map +1 -0
  194. package/dist/cjs/evm/withdraw.js +174 -0
  195. package/dist/cjs/evm/withdraw.js.map +7 -0
  196. package/dist/cjs/evm/withdrawQuote.d.ts +135 -0
  197. package/dist/cjs/evm/withdrawQuote.d.ts.map +1 -0
  198. package/dist/cjs/evm/withdrawQuote.js +257 -0
  199. package/dist/cjs/evm/withdrawQuote.js.map +7 -0
  200. package/dist/cjs/index.d.ts +31 -0
  201. package/dist/cjs/index.d.ts.map +1 -0
  202. package/dist/cjs/index.js +128 -0
  203. package/dist/cjs/index.js.map +7 -0
  204. package/dist/cjs/package.json +1 -0
  205. package/dist/cjs/privy/index.d.ts +52 -0
  206. package/dist/cjs/privy/index.d.ts.map +1 -0
  207. package/dist/cjs/privy/index.js +57 -0
  208. package/dist/cjs/privy/index.js.map +7 -0
  209. package/dist/client.d.ts +4 -2
  210. package/dist/client.d.ts.map +1 -1
  211. package/dist/constants.d.ts.map +1 -1
  212. package/dist/errors.d.ts +4 -1
  213. package/dist/errors.d.ts.map +1 -1
  214. package/dist/evm/adapters/aera.d.ts +1 -1
  215. package/dist/evm/adapters/aera.d.ts.map +1 -1
  216. package/dist/evm/adapters/index.d.ts +1 -1
  217. package/dist/evm/adapters/index.d.ts.map +1 -1
  218. package/dist/evm/adapters/morpho.d.ts +1 -1
  219. package/dist/evm/adapters/morpho.d.ts.map +1 -1
  220. package/dist/evm/adapters/types.d.ts +6 -3
  221. package/dist/evm/adapters/types.d.ts.map +1 -1
  222. package/dist/evm/aeraContracts/priceAndFeeCalculator.d.ts +1 -1
  223. package/dist/evm/aeraContracts/priceAndFeeCalculator.d.ts.map +1 -1
  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 +25 -4
  227. package/dist/evm/aeraContracts/v2.d.ts.map +1 -1
  228. package/dist/evm/aeraContracts.d.ts +2 -2
  229. package/dist/evm/aeraContracts.d.ts.map +1 -1
  230. package/dist/evm/deposit.d.ts +7 -4
  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 -25
  237. package/dist/evm/index.d.ts.map +1 -1
  238. package/dist/evm/index.js +86 -12
  239. package/dist/evm/index.js.map +7 -1
  240. package/dist/evm/tokenModes.d.ts +2 -2
  241. package/dist/evm/tokenModes.d.ts.map +1 -1
  242. package/dist/evm/userCurrentBalance.d.ts +21 -3
  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 +5 -3
  247. package/dist/evm/withdraw.d.ts.map +1 -1
  248. package/dist/evm/withdrawQuote.d.ts +14 -6
  249. package/dist/evm/withdrawQuote.d.ts.map +1 -1
  250. package/dist/index.d.ts +30 -28
  251. package/dist/index.d.ts.map +1 -1
  252. package/dist/index.js +137 -14
  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 +22 -395
  260. package/package.json +43 -9
  261. package/src/api/activity.ts +18 -15
  262. package/src/api/activityRows.ts +143 -0
  263. package/src/api/caip.ts +3 -1
  264. package/src/api/client.ts +105 -6
  265. package/src/api/decimal.ts +1 -0
  266. package/src/api/generated.ts +570 -7
  267. package/src/api/http.ts +1 -0
  268. package/src/api/index.ts +8 -0
  269. package/src/api/positionHistory.ts +20 -5
  270. package/src/attribution/index.ts +6 -2
  271. package/src/client.ts +4 -1
  272. package/src/constants.ts +2 -0
  273. package/src/errors.ts +7 -0
  274. package/src/evm/adapters/aera.ts +40 -19
  275. package/src/evm/adapters/types.ts +3 -0
  276. package/src/evm/aeraContracts/v2.ts +124 -16
  277. package/src/evm/aeraContracts.ts +29 -14
  278. package/src/evm/deposit.ts +61 -18
  279. package/src/evm/depositQuote.ts +138 -0
  280. package/src/evm/depositReceiverApproval.ts +14 -9
  281. package/src/evm/index.ts +10 -1
  282. package/src/evm/userCurrentBalance.ts +155 -60
  283. package/src/evm/vaults.ts +0 -7
  284. package/src/evm/withdraw.ts +20 -1
  285. package/src/evm/withdrawQuote.ts +126 -51
  286. package/src/index.ts +11 -2
  287. package/dist/api/activity.js +0 -154
  288. package/dist/api/activity.js.map +0 -1
  289. package/dist/api/caip.js +0 -38
  290. package/dist/api/caip.js.map +0 -1
  291. package/dist/api/client.js +0 -119
  292. package/dist/api/client.js.map +0 -1
  293. package/dist/api/decimal.js +0 -44
  294. package/dist/api/decimal.js.map +0 -1
  295. package/dist/api/errors.js +0 -41
  296. package/dist/api/errors.js.map +0 -1
  297. package/dist/api/generated.js +0 -6
  298. package/dist/api/generated.js.map +0 -1
  299. package/dist/api/http.js +0 -39
  300. package/dist/api/http.js.map +0 -1
  301. package/dist/api/positionHistory.js +0 -126
  302. package/dist/api/positionHistory.js.map +0 -1
  303. package/dist/attribution/erc8021.js +0 -17
  304. package/dist/attribution/erc8021.js.map +0 -1
  305. package/dist/attribution/index.js +0 -45
  306. package/dist/attribution/index.js.map +0 -1
  307. package/dist/client.js +0 -72
  308. package/dist/client.js.map +0 -1
  309. package/dist/constants.js +0 -28
  310. package/dist/constants.js.map +0 -1
  311. package/dist/errors.js +0 -134
  312. package/dist/errors.js.map +0 -1
  313. package/dist/evm/abis/erc20.js +0 -30
  314. package/dist/evm/abis/erc20.js.map +0 -1
  315. package/dist/evm/abis/erc4626.js +0 -70
  316. package/dist/evm/abis/erc4626.js.map +0 -1
  317. package/dist/evm/abis/multiDepositorVault.js +0 -587
  318. package/dist/evm/abis/multiDepositorVault.js.map +0 -1
  319. package/dist/evm/abis/priceAndFeeCalculator.js +0 -490
  320. package/dist/evm/abis/priceAndFeeCalculator.js.map +0 -1
  321. package/dist/evm/abis/priceAndFeeCalculatorV2.js +0 -141
  322. package/dist/evm/abis/priceAndFeeCalculatorV2.js.map +0 -1
  323. package/dist/evm/abis/provisioner.js +0 -2768
  324. package/dist/evm/abis/provisioner.js.map +0 -1
  325. package/dist/evm/abis/provisionerV2.js +0 -295
  326. package/dist/evm/abis/provisionerV2.js.map +0 -1
  327. package/dist/evm/adapters/aera.js +0 -280
  328. package/dist/evm/adapters/aera.js.map +0 -1
  329. package/dist/evm/adapters/index.js +0 -14
  330. package/dist/evm/adapters/index.js.map +0 -1
  331. package/dist/evm/adapters/morpho.js +0 -79
  332. package/dist/evm/adapters/morpho.js.map +0 -1
  333. package/dist/evm/adapters/types.js +0 -2
  334. package/dist/evm/adapters/types.js.map +0 -1
  335. package/dist/evm/aeraContracts/priceAndFeeCalculator.js +0 -174
  336. package/dist/evm/aeraContracts/priceAndFeeCalculator.js.map +0 -1
  337. package/dist/evm/aeraContracts/readOptions.js +0 -4
  338. package/dist/evm/aeraContracts/readOptions.js.map +0 -1
  339. package/dist/evm/aeraContracts/v1.js +0 -59
  340. package/dist/evm/aeraContracts/v1.js.map +0 -1
  341. package/dist/evm/aeraContracts/v2.js +0 -273
  342. package/dist/evm/aeraContracts/v2.js.map +0 -1
  343. package/dist/evm/aeraContracts.js +0 -195
  344. package/dist/evm/aeraContracts.js.map +0 -1
  345. package/dist/evm/deposit.js +0 -109
  346. package/dist/evm/deposit.js.map +0 -1
  347. package/dist/evm/depositReceiverApproval.js +0 -32
  348. package/dist/evm/depositReceiverApproval.js.map +0 -1
  349. package/dist/evm/operationMode.js +0 -41
  350. package/dist/evm/operationMode.js.map +0 -1
  351. package/dist/evm/tokenModes.js +0 -34
  352. package/dist/evm/tokenModes.js.map +0 -1
  353. package/dist/evm/types.js +0 -5
  354. package/dist/evm/types.js.map +0 -1
  355. package/dist/evm/userCurrentBalance.js +0 -211
  356. package/dist/evm/userCurrentBalance.js.map +0 -1
  357. package/dist/evm/vaults.js +0 -75
  358. package/dist/evm/vaults.js.map +0 -1
  359. package/dist/evm/withdraw.js +0 -177
  360. package/dist/evm/withdraw.js.map +0 -1
  361. package/dist/evm/withdrawQuote.js +0 -164
  362. package/dist/evm/withdrawQuote.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,13 +41,16 @@ 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
  /**
46
49
  * Builds the ordered list of EVM transactions required to deposit into a Gauntlet vault.
47
50
  *
48
- * Returns one or two transactions: an ERC-20 approval (only if the current allowance is
49
- * insufficient) followed by the deposit or async deposit request. Each transaction is
51
+ * Returns ordered transactions: ERC-20 approvals (if the allowance is insufficient),
52
+ * followed by the deposit or async deposit request. Some tokens require an approval
53
+ * of zero before a new nonzero approval. Each transaction is
50
54
  * returned as a `PreparedTx` object ready to be signed and sent.
51
55
  *
52
56
  * @param client - A configured `GauntletClient` instance with an EVM public client and wallet.
@@ -74,13 +78,16 @@ export async function getDepositTx(
74
78
  client: GauntletClient,
75
79
  params: EvmDepositParams
76
80
  ): Promise<PreparedTx[]> {
81
+ params = structuredClone(params);
82
+ const slippageBps = params.slippageBps ?? DEFAULT_BPS;
83
+ if (!Number.isInteger(slippageBps) || slippageBps < 0 || slippageBps > Number(MAX_BPS)) {
84
+ throw new InvalidSlippageBPSError(slippageBps);
85
+ }
77
86
  if (
78
- params.slippageBps !== undefined &&
79
- (!Number.isInteger(params.slippageBps) ||
80
- params.slippageBps < 0 ||
81
- params.slippageBps > Number(MAX_BPS))
87
+ params.minUnitsOut !== undefined &&
88
+ (typeof params.minUnitsOut !== 'bigint' || params.minUnitsOut <= 0n)
82
89
  ) {
83
- throw new InvalidSlippageBPSError(params.slippageBps);
90
+ throw new InvalidSyncDepositBoundError();
84
91
  }
85
92
 
86
93
  const resolved = await resolveVault(client, params.vaultId, params.chainId);
@@ -105,6 +112,12 @@ export async function getDepositTx(
105
112
  }
106
113
 
107
114
  const requestedDepositMode = parseOperationMode(params.vaultId, params.depositMode);
115
+ if (
116
+ params.minUnitsOut !== undefined &&
117
+ (protocol !== 'aera' || requestedDepositMode !== 'sync')
118
+ ) {
119
+ throw new InvalidSyncDepositBoundError();
120
+ }
108
121
  let modifiedDepositMode: OperationMode;
109
122
  let aeraRuntime: AeraRuntimeContracts | undefined;
110
123
 
@@ -130,7 +143,7 @@ export async function getDepositTx(
130
143
  : vault.vaultAddress;
131
144
 
132
145
  // NOTE: this could be moved to the buildDeposit level
133
- const { sufficient } = await adapter.checkAllowance({
146
+ const { sufficient, current } = await adapter.checkAllowance({
134
147
  publicClient,
135
148
  token: token.address,
136
149
  owner: account,
@@ -141,14 +154,43 @@ export async function getDepositTx(
141
154
  const steps: EvmTxStep[] = [];
142
155
 
143
156
  if (!sufficient) {
144
- steps.push(
145
- adapter.buildApproval({
146
- token: token.address,
147
- spender,
148
- amount: params.amount,
149
- account,
150
- })
151
- );
157
+ const approval = adapter.buildApproval({
158
+ token: token.address,
159
+ spender,
160
+ amount: params.amount,
161
+ account,
162
+ });
163
+ if (current > 0n && params.amount > 0n) {
164
+ try {
165
+ await publicClient.estimateContractGas({
166
+ address: approval.address,
167
+ abi: approval.abi,
168
+ functionName: 'approve',
169
+ args: approval.args,
170
+ account,
171
+ });
172
+ } catch (approvalError) {
173
+ const reset = adapter.buildApproval({
174
+ token: token.address,
175
+ spender,
176
+ amount: 0n,
177
+ account,
178
+ });
179
+ try {
180
+ await publicClient.estimateContractGas({
181
+ address: reset.address,
182
+ abi: reset.abi,
183
+ functionName: 'approve',
184
+ args: reset.args,
185
+ account,
186
+ });
187
+ } catch {
188
+ throw approvalError;
189
+ }
190
+ steps.push(reset);
191
+ }
192
+ }
193
+ steps.push(approval);
152
194
  }
153
195
 
154
196
  const depositSteps = await adapter.buildDeposit({
@@ -159,12 +201,13 @@ export async function getDepositTx(
159
201
  async: modifiedDepositMode === 'async',
160
202
  asset: token,
161
203
  publicClient,
162
- slippageBps: params.slippageBps ?? DEFAULT_BPS,
204
+ slippageBps,
163
205
  solverTip: params.solverTip,
164
206
  maxPriceAge: params.maxPriceAge,
165
207
  aeraRuntime,
208
+ minUnitsOut: params.minUnitsOut,
166
209
  });
167
210
  steps.push(...depositSteps);
168
211
 
169
- return await Promise.all(steps.map((step) => encodeTransactionWithAttribution(client, step)));
212
+ return Promise.all(steps.map((step) => encodeTransactionWithAttribution(client, step, chainId)));
170
213
  }
@@ -0,0 +1,138 @@
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
+ params = structuredClone(params);
99
+ const slippageBps = params.slippageBps ?? DEFAULT_BPS;
100
+ if (!Number.isInteger(slippageBps) || slippageBps < 0 || slippageBps > Number(MAX_BPS)) {
101
+ throw new InvalidSlippageBPSError(slippageBps);
102
+ }
103
+
104
+ const { publicClient, vault, token, runtime } = await resolveSyncDepositContext(
105
+ client,
106
+ params,
107
+ 'quote'
108
+ );
109
+
110
+ const { unitsOut, feeBps, numeraireOut } = await getSyncDepositQuoteValues(
111
+ publicClient,
112
+ runtime.provisioner.address,
113
+ runtime.feeCalculator.address,
114
+ runtime.feeCalculator.version,
115
+ vault.vaultAddress,
116
+ token.address,
117
+ params.amount
118
+ );
119
+ const minUnitsOut = applySlippageDown(unitsOut, slippageBps);
120
+ if (minUnitsOut <= 0n) throw new InvalidSyncDepositBoundError();
121
+
122
+ return { unitsOut, minUnitsOut, numeraireOut, feeBps, slippageBps };
123
+ }
124
+
125
+ /** Reads the live Instant Supply fee for a vault token, without requiring a deposit amount. */
126
+ export async function getSyncDepositRate(
127
+ client: GauntletClient,
128
+ params: SyncDepositRateParams
129
+ ): Promise<SyncDepositRate> {
130
+ const { publicClient, runtime, token } = await resolveSyncDepositContext(client, params, 'rate');
131
+
132
+ const feeBps = await getSyncDepositFeeBps(
133
+ publicClient,
134
+ runtime.provisioner.address,
135
+ token.address
136
+ );
137
+ return { feeBps };
138
+ }
@@ -25,6 +25,7 @@ export async function getDepositReceiverApprovalTx(
25
25
  client: GauntletClient,
26
26
  params: EvmDepositReceiverApprovalParams
27
27
  ): Promise<PreparedTx> {
28
+ params = { ...params };
28
29
  const resolved = await resolveVault(client, params.vaultId, params.chainId);
29
30
  if (!resolved) throw new VaultNotFoundError(params.vaultId);
30
31
 
@@ -39,13 +40,17 @@ export async function getDepositReceiverApprovalTx(
39
40
  throw new UnsupportedFeatureError('Aera: deposit receiver approval on V1');
40
41
  }
41
42
 
42
- return encodeTransactionWithAttribution(client, {
43
- type: 'setDepositReceiverApproval',
44
- ...provisionerV2.setDepositReceiverApprovalTxRequest(
45
- runtime.provisioner.address,
46
- params.depositor,
47
- params.approved ?? true,
48
- receiver
49
- ),
50
- });
43
+ return encodeTransactionWithAttribution(
44
+ client,
45
+ {
46
+ type: 'setDepositReceiverApproval',
47
+ ...provisionerV2.setDepositReceiverApprovalTxRequest(
48
+ runtime.provisioner.address,
49
+ params.depositor,
50
+ params.approved ?? true,
51
+ receiver
52
+ ),
53
+ },
54
+ chainId
55
+ );
51
56
  }
package/src/evm/index.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  export { getDepositTx } from './deposit';
2
2
  export { getDepositReceiverApprovalTx } from './depositReceiverApproval';
3
+ export { getSyncDepositQuote, getSyncDepositRate } from './depositQuote';
3
4
  export { getWithdrawTx } from './withdraw';
4
- export { getSyncWithdrawQuote } from './withdrawQuote';
5
+ export { getSyncWithdrawQuote, getSyncWithdrawRate } from './withdrawQuote';
5
6
  export { getAeraTokenModeSupport } from './tokenModes';
6
7
  export { getUserCurrentBalance } from './userCurrentBalance';
7
8
  export { getVaults, VaultId } from './vaults';
@@ -14,6 +15,7 @@ export {
14
15
  ChainMismatchError,
15
16
  InvalidSlippageBPSError,
16
17
  InvalidSolverTipError,
18
+ InvalidSyncDepositBoundError,
17
19
  InvalidSyncWithdrawBoundError,
18
20
  InvalidWithdrawParamsError,
19
21
  RpcNotConfiguredError,
@@ -38,6 +40,12 @@ export {
38
40
 
39
41
  export type { EvmDepositParams } from './deposit';
40
42
  export type { EvmDepositReceiverApprovalParams } from './depositReceiverApproval';
43
+ export type {
44
+ SyncDepositQuote,
45
+ SyncDepositQuoteParams,
46
+ SyncDepositRate,
47
+ SyncDepositRateParams,
48
+ } from './depositQuote';
41
49
  export type { EvmWithdrawParams } from './withdraw';
42
50
  export type {
43
51
  SyncWithdrawQuote,
@@ -46,6 +54,7 @@ export type {
46
54
  SyncWithdrawQuoteContext,
47
55
  SyncWithdrawQuoteRequest,
48
56
  SyncWithdrawQuoteBounds,
57
+ SyncWithdrawRateParams,
49
58
  } from './withdrawQuote';
50
59
  export type { AeraTokenModeSupportParams } from './tokenModes';
51
60
  export type { SyncRedeemRate } from './aeraContracts/v2';
@@ -1,12 +1,28 @@
1
1
  import { parseAbi, type Address } from 'viem';
2
2
  import type { GauntletClient } from '../client';
3
3
  import type { EvmVaultDeployment } from './types';
4
- import { ChainMismatchError, UnsupportedProtocolError, VaultNotFoundError } from '../errors';
4
+ import {
5
+ ChainMismatchError,
6
+ GauntletSDKError,
7
+ UnsupportedAssetError,
8
+ UnsupportedProtocolError,
9
+ VaultNotFoundError,
10
+ } from '../errors';
5
11
  import { getMultiDepositorVault, resolveAeraRuntimeContracts } from './aeraContracts';
6
12
  import { convertUnitsToToken } from './aeraContracts/priceAndFeeCalculator';
13
+ import { getUserUnitsRefundableUntil } from './aeraContracts/v2';
7
14
  import { provisionerV2Abi } from './abis/provisionerV2';
8
15
  import { ContractVersion } from './types';
9
- import { BLOCKS_3_DAYS, CHAIN_NAMES, DEFAULT_BLOCKS_3_DAYS, LOG_PAGE_SIZE } from '../constants';
16
+ import {
17
+ BLOCKS_3_DAYS,
18
+ CHAIN_NAMES,
19
+ DAY,
20
+ DEFAULT_BLOCKS_3_DAYS,
21
+ LOG_PAGE_SIZE,
22
+ } from '../constants';
23
+
24
+ // Log chunks fetched at once per event type.
25
+ const LOG_CHUNK_CONCURRENCY = 16;
10
26
 
11
27
  // Inline as-const ABI items give viem full type inference for args and return types.
12
28
  const DEPOSIT_REQUESTED_V1_ABI = [
@@ -54,11 +70,24 @@ export interface UserCurrentBalanceParams {
54
70
  vaultId: string;
55
71
  address: Address;
56
72
  chainId?: number;
73
+ /** Required for deployments that support multiple assets, ignored otherwise. */
74
+ assetSymbol?: string;
75
+ /**
76
+ * Scan from this block, including expired requests that still hold escrow.
77
+ * Requires `chainId` for a vault with more than one deployment.
78
+ */
79
+ fromBlock?: bigint;
57
80
  }
58
81
 
59
82
  export interface UserCurrentBalance {
83
+ /** Block used for balances, conversions, and request state. */
84
+ blockNumber: bigint;
85
+ /** First block included in the request scan. Older escrow is outside this result. */
86
+ fromBlock: bigint;
60
87
  /** Chain identifier, e.g. "base" */
61
88
  chain: string;
89
+ /** EVM chain id of the deployment, e.g. 8453 */
90
+ chainId: number;
62
91
  token: Address;
63
92
  decimals: number;
64
93
  /** Assets queued via async deposit, not yet earning */
@@ -67,6 +96,8 @@ export interface UserCurrentBalance {
67
96
  balance: bigint;
68
97
  /** Assets queued via async withdraw, not yet claimable */
69
98
  pendingWithdraw: bigint;
99
+ /** Timestamp until which this account cannot redeem vault units. */
100
+ unitsLockedUntil?: bigint;
70
101
  }
71
102
 
72
103
  // V2 legacy wrapper calls can emit both receiver-aware and legacy events for one request.
@@ -86,21 +117,78 @@ function dedupeByRequestHash<TLog extends { args: { [key: string]: unknown } }>(
86
117
  });
87
118
  }
88
119
 
120
+ /** Step back by the expected block count, and widen until the block predates the cutoff. */
121
+ async function requestScanStart(
122
+ publicClient: ReturnType<GauntletClient['getPublicClient']>,
123
+ chainId: number,
124
+ blockNumber: bigint,
125
+ days: number,
126
+ cutoff: bigint
127
+ ): Promise<bigint> {
128
+ let span = ((BLOCKS_3_DAYS[chainId] ?? DEFAULT_BLOCKS_3_DAYS) * BigInt(days)) / 3n;
129
+ for (;;) {
130
+ if (span >= blockNumber) return 0n;
131
+ const start = blockNumber - span;
132
+ const block = await publicClient.getBlock({ blockNumber: start });
133
+ if (block.timestamp <= cutoff) return start;
134
+ span *= 2n;
135
+ }
136
+ }
137
+
138
+ async function mapInBatches<T, P extends Promise<unknown>>(
139
+ items: T[],
140
+ size: number,
141
+ fn: (item: T) => P
142
+ ): Promise<Awaited<P>[]> {
143
+ const results: Awaited<P>[] = [];
144
+ for (let i = 0; i < items.length; i += size) {
145
+ results.push(...(await Promise.all(items.slice(i, i + size).map(fn))));
146
+ }
147
+ return results;
148
+ }
149
+
89
150
  async function queryDeploymentBalance(
90
151
  client: GauntletClient,
91
152
  deployment: EvmVaultDeployment,
92
- address: Address
153
+ params: UserCurrentBalanceParams
93
154
  ): Promise<UserCurrentBalance> {
94
155
  const publicClient = client.getPublicClient(deployment.chainId);
95
- const token = deployment.supplyToken[0];
156
+ const { address } = params;
157
+ const token =
158
+ deployment.supplyToken.length > 1
159
+ ? deployment.supplyToken.find((candidate) => candidate.symbol === params.assetSymbol)
160
+ : deployment.supplyToken[0];
161
+ if (token === undefined)
162
+ throw new UnsupportedAssetError(params.assetSymbol ?? 'unknown', params.vaultId);
163
+ const snapshot = await publicClient.getBlock({ blockTag: 'latest' });
164
+ if (snapshot.number === null) {
165
+ throw new GauntletSDKError('The balance snapshot has no block number');
166
+ }
167
+ const blockNumber = snapshot.number;
168
+ const readOptions = { blockNumber };
169
+ const expirationDays = deployment.expirationDays ?? 3;
170
+ if (!Number.isSafeInteger(expirationDays) || expirationDays <= 0) {
171
+ throw new GauntletSDKError('The request expiration must be a positive integer number of days');
172
+ }
173
+ const scanDays = Math.max(3, expirationDays);
174
+ const cutoff = snapshot.timestamp - BigInt(DAY) * BigInt(scanDays);
175
+ const fromBlock =
176
+ params.fromBlock ??
177
+ (await requestScanStart(publicClient, deployment.chainId, blockNumber, scanDays, cutoff));
178
+ if (fromBlock < 0n || fromBlock > blockNumber) {
179
+ throw new GauntletSDKError('The request scan range is invalid');
180
+ }
96
181
 
97
182
  const vaultContract = getMultiDepositorVault(publicClient, deployment.vaultAddress);
98
183
  const [runtime, units] = await Promise.all([
99
- resolveAeraRuntimeContracts(publicClient, deployment),
100
- vaultContract.read.balanceOf([address]),
184
+ resolveAeraRuntimeContracts(publicClient, deployment, readOptions),
185
+ vaultContract.read.balanceOf([address], readOptions),
101
186
  ]);
102
187
  const provisionerAddress = runtime.provisioner.address;
103
188
  const isV2 = runtime.provisioner.version === ContractVersion.V2;
189
+ const unitsLockedUntilPromise = isV2
190
+ ? getUserUnitsRefundableUntil(publicClient, provisionerAddress, address, readOptions)
191
+ : Promise.resolve(undefined);
104
192
 
105
193
  const balance = await convertUnitsToToken(
106
194
  publicClient,
@@ -108,63 +196,56 @@ async function queryDeploymentBalance(
108
196
  runtime.feeCalculator.version,
109
197
  deployment.vaultAddress,
110
198
  token.address,
111
- units
199
+ units,
200
+ readOptions
112
201
  );
113
202
 
114
- // Look back ~3 days for pending async requests
115
- const currentBlock = await publicClient.getBlockNumber();
116
- const lookback = BLOCKS_3_DAYS[deployment.chainId] ?? DEFAULT_BLOCKS_3_DAYS;
117
- const fromBlock = currentBlock > lookback ? currentBlock - lookback : 0n;
118
-
119
- // Compute block-range chunks to stay within the 10,000-block RPC limit, then fetch in parallel
203
+ // Compute block-range chunks to stay within the 10,000-block RPC limit, then fetch in bounded batches
120
204
  const chunks: [bigint, bigint][] = [];
121
- for (let cursor = fromBlock; cursor <= currentBlock; cursor += LOG_PAGE_SIZE + 1n) {
122
- const end = cursor + LOG_PAGE_SIZE <= currentBlock ? cursor + LOG_PAGE_SIZE : currentBlock;
205
+ for (let cursor = fromBlock; cursor <= blockNumber; cursor += LOG_PAGE_SIZE + 1n) {
206
+ const end = cursor + LOG_PAGE_SIZE <= blockNumber ? cursor + LOG_PAGE_SIZE : blockNumber;
123
207
  chunks.push([cursor, end]);
124
208
  }
125
209
 
210
+ // Each map keeps LOG_CHUNK_CONCURRENCY queries in flight.
126
211
  const [depositPages, redeemPages] = await Promise.all([
127
- Promise.all(
128
- chunks.map(([from, to]) =>
129
- isV2
130
- ? publicClient.getContractEvents({
131
- address: provisionerAddress,
132
- abi: provisionerV2Abi,
133
- eventName: 'DepositRequested',
134
- args: { receiver: address },
135
- fromBlock: from,
136
- toBlock: to,
137
- })
138
- : publicClient.getContractEvents({
139
- address: provisionerAddress,
140
- abi: DEPOSIT_REQUESTED_V1_ABI,
141
- eventName: 'DepositRequested',
142
- args: { user: address },
143
- fromBlock: from,
144
- toBlock: to,
145
- })
146
- )
212
+ mapInBatches(chunks, LOG_CHUNK_CONCURRENCY, ([from, to]) =>
213
+ isV2
214
+ ? publicClient.getContractEvents({
215
+ address: provisionerAddress,
216
+ abi: provisionerV2Abi,
217
+ eventName: 'DepositRequested',
218
+ args: { receiver: address, token: token.address },
219
+ fromBlock: from,
220
+ toBlock: to,
221
+ })
222
+ : publicClient.getContractEvents({
223
+ address: provisionerAddress,
224
+ abi: DEPOSIT_REQUESTED_V1_ABI,
225
+ eventName: 'DepositRequested',
226
+ args: { user: address, token: token.address },
227
+ fromBlock: from,
228
+ toBlock: to,
229
+ })
147
230
  ),
148
- Promise.all(
149
- chunks.map(([from, to]) =>
150
- isV2
151
- ? publicClient.getContractEvents({
152
- address: provisionerAddress,
153
- abi: provisionerV2Abi,
154
- eventName: 'RedeemRequested',
155
- args: { user: address },
156
- fromBlock: from,
157
- toBlock: to,
158
- })
159
- : publicClient.getContractEvents({
160
- address: provisionerAddress,
161
- abi: REDEEM_REQUESTED_V1_ABI,
162
- eventName: 'RedeemRequested',
163
- args: { user: address },
164
- fromBlock: from,
165
- toBlock: to,
166
- })
167
- )
231
+ mapInBatches(chunks, LOG_CHUNK_CONCURRENCY, ([from, to]) =>
232
+ isV2
233
+ ? publicClient.getContractEvents({
234
+ address: provisionerAddress,
235
+ abi: provisionerV2Abi,
236
+ eventName: 'RedeemRequested',
237
+ args: { user: address, token: token.address },
238
+ fromBlock: from,
239
+ toBlock: to,
240
+ })
241
+ : publicClient.getContractEvents({
242
+ address: provisionerAddress,
243
+ abi: REDEEM_REQUESTED_V1_ABI,
244
+ eventName: 'RedeemRequested',
245
+ args: { user: address, token: token.address },
246
+ fromBlock: from,
247
+ toBlock: to,
248
+ })
168
249
  ),
169
250
  ]);
170
251
 
@@ -188,6 +269,7 @@ async function queryDeploymentBalance(
188
269
  })),
189
270
  ],
190
271
  allowFailure: false,
272
+ blockNumber,
191
273
  });
192
274
 
193
275
  const depositChecks = pendingChecks.slice(0, depositLogs.length);
@@ -215,17 +297,23 @@ async function queryDeploymentBalance(
215
297
  runtime.feeCalculator.version,
216
298
  deployment.vaultAddress,
217
299
  token.address,
218
- pendingWithdrawUnits
300
+ pendingWithdrawUnits,
301
+ readOptions
219
302
  )
220
303
  : 0n;
304
+ const unitsLockedUntil = await unitsLockedUntilPromise;
221
305
 
222
306
  return {
307
+ blockNumber,
308
+ fromBlock,
223
309
  chain: CHAIN_NAMES[deployment.chainId] ?? `chain-${deployment.chainId}`,
310
+ chainId: deployment.chainId,
224
311
  token: token.address,
225
312
  decimals: token.decimals,
226
313
  pendingDeposit,
227
314
  balance,
228
315
  pendingWithdraw,
316
+ ...(unitsLockedUntil !== undefined ? { unitsLockedUntil } : {}),
229
317
  };
230
318
  }
231
319
 
@@ -238,7 +326,9 @@ async function queryDeploymentBalance(
238
326
  * - `pendingWithdraw` — vault units locked in a pending async redeem request (converted to tokens).
239
327
  *
240
328
  * Only supported for Aera multi-depositor vaults. Pending amounts are detected by scanning
241
- * the last ~3 days of provisioner events and cross-checking hash existence on-chain.
329
+ * the configured request lifetime, with a minimum of three days. Set `fromBlock` (with `chainId`
330
+ * on a multi-chain vault) for older escrow.
331
+ * All state reads use one block. The returned range identifies the scanned history.
242
332
  *
243
333
  * @param client - A configured `GauntletClient` instance with an EVM public client for each
244
334
  * chain the vault is deployed on.
@@ -249,6 +339,7 @@ async function queryDeploymentBalance(
249
339
  * @throws {VaultNotFoundError} If the vault ID is not found in the manifest.
250
340
  * @throws {UnsupportedProtocolError} If the vault is not an Aera multi-depositor vault.
251
341
  * @throws {ChainMismatchError} If `chainId` is specified but no deployment exists for that chain.
342
+ * @throws {UnsupportedAssetError} If a multi-asset deployment gets no matching `assetSymbol`.
252
343
  *
253
344
  * @example
254
345
  * ```ts
@@ -256,13 +347,14 @@ async function queryDeploymentBalance(
256
347
  * vaultId: 'baseUsdcPrime',
257
348
  * address: '0xYourWalletAddress',
258
349
  * });
259
- * // [{ chain: 'base', token: '0x...', decimals: 6, balance: 100_000_000n, pendingDeposit: 0n, pendingWithdraw: 0n }]
350
+ * // [{ chain: 'base', chainId: 8453, token: '0x...', decimals: 6, balance: 100_000_000n, pendingDeposit: 0n, pendingWithdraw: 0n }]
260
351
  * ```
261
352
  */
262
353
  export async function getUserCurrentBalance(
263
354
  client: GauntletClient,
264
355
  params: UserCurrentBalanceParams
265
356
  ): Promise<UserCurrentBalance[]> {
357
+ params = { ...params };
266
358
  const manifest = await client.manifest;
267
359
  const vaultInfo = manifest.vaults.find((v) => v.vaultId === params.vaultId);
268
360
  if (!vaultInfo) throw new VaultNotFoundError(params.vaultId);
@@ -283,8 +375,11 @@ export async function getUserCurrentBalance(
283
375
  evmDeployments.map((d) => `${d.chainId}`).join(', ')
284
376
  );
285
377
  }
286
- return [await queryDeploymentBalance(client, deployment, params.address)];
378
+ return [await queryDeploymentBalance(client, deployment, params)];
379
+ }
380
+ if (params.fromBlock !== undefined && evmDeployments.length > 1) {
381
+ throw new GauntletSDKError('fromBlock requires chainId for a vault with several deployments');
287
382
  }
288
383
 
289
- return Promise.all(evmDeployments.map((d) => queryDeploymentBalance(client, d, params.address)));
384
+ return Promise.all(evmDeployments.map((d) => queryDeploymentBalance(client, d, params)));
290
385
  }