@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
@@ -4,17 +4,21 @@ import {
4
4
  type GetContractReturnType,
5
5
  type PublicClient,
6
6
  getContract,
7
+ zeroAddress,
7
8
  } from 'viem';
9
+ import { erc20Abi } from '../abis/erc20';
8
10
  import { priceAndFeeCalculatorV2Abi } from '../abis/priceAndFeeCalculatorV2';
9
11
  import { provisionerV2Abi } from '../abis/provisionerV2';
10
12
  import {
11
13
  Rounding,
14
+ convertTokenToNumeraire,
12
15
  convertTokenToUnitsIfActive,
13
16
  convertUnitsToTokenIfActive,
14
17
  } from './priceAndFeeCalculator';
15
18
  import { MAX_BPS } from '../../constants';
16
- import { StalePriceError } from '../../errors';
19
+ import { StalePriceError, UnsupportedFeatureError } from '../../errors';
17
20
  import type { ContractVersion } from '../types';
21
+ import { readAtBlock } from './readOptions';
18
22
 
19
23
  export type PriceAndFeeCalculatorContract<T extends Client> = GetContractReturnType<
20
24
  typeof priceAndFeeCalculatorV2Abi,
@@ -33,19 +37,71 @@ export function getPriceAndFeeCalculator<T extends Client>(
33
37
  });
34
38
  }
35
39
 
36
- function getProvisioner<T extends Client>(client: T, address: Address) {
37
- return getContract({
38
- address,
40
+ type SyncRedeemReadOptions = {
41
+ blockNumber?: bigint;
42
+ blockTimestamp?: bigint;
43
+ };
44
+
45
+ async function resolveReadContext(
46
+ client: PublicClient,
47
+ options: SyncRedeemReadOptions = {}
48
+ ): Promise<Required<SyncRedeemReadOptions>> {
49
+ if (options.blockNumber !== undefined && options.blockTimestamp !== undefined) {
50
+ return { blockNumber: options.blockNumber, blockTimestamp: options.blockTimestamp };
51
+ }
52
+
53
+ const block =
54
+ options.blockNumber === undefined ? await client.getBlock() : await client.getBlock(options);
55
+ if (block.number === null) {
56
+ throw new UnsupportedFeatureError('Aera: sync redeem reads require a numbered block');
57
+ }
58
+
59
+ return {
60
+ blockNumber: options.blockNumber ?? block.number,
61
+ blockTimestamp: options.blockTimestamp ?? BigInt(block.timestamp),
62
+ };
63
+ }
64
+
65
+ async function getTokenDetails(
66
+ client: PublicClient,
67
+ provisioner: Address,
68
+ token: Address,
69
+ options: SyncRedeemReadOptions = {}
70
+ ) {
71
+ return client.readContract({
72
+ address: provisioner,
39
73
  abi: provisionerV2Abi,
40
- client,
74
+ functionName: 'tokensDetails',
75
+ args: [token],
76
+ ...readAtBlock(options),
41
77
  });
42
78
  }
43
79
 
44
- async function getTokenDetails(client: PublicClient, provisioner: Address, token: Address) {
45
- return getProvisioner(client, provisioner).read.tokensDetails([token]);
80
+ /**
81
+ * Returns the vault's currently known sync-redeem liquidity in tokens.
82
+ *
83
+ * When a pull-funds pointer is configured, the provisioner may source more tokens during the
84
+ * redemption, so the vault's current token balance is not a reliable liquidity limit.
85
+ */
86
+ export async function getKnownSyncRedeemLiquidityTokens(
87
+ client: PublicClient,
88
+ vault: Address,
89
+ token: Address,
90
+ hasPullFundsSubmitData: boolean,
91
+ options: SyncRedeemReadOptions = {}
92
+ ): Promise<bigint | undefined> {
93
+ if (hasPullFundsSubmitData) return undefined;
94
+
95
+ return client.readContract({
96
+ address: token,
97
+ abi: erc20Abi,
98
+ functionName: 'balanceOf',
99
+ args: [vault],
100
+ ...readAtBlock(options),
101
+ });
46
102
  }
47
103
 
48
- async function getDepositUnitsOut({
104
+ async function getDepositQuote({
49
105
  client,
50
106
  provisioner,
51
107
  feeCalculator,
@@ -54,6 +110,7 @@ async function getDepositUnitsOut({
54
110
  token,
55
111
  tokensIn,
56
112
  multiplierIndex,
113
+ options,
57
114
  }: {
58
115
  client: PublicClient;
59
116
  provisioner: Address;
@@ -63,20 +120,24 @@ async function getDepositUnitsOut({
63
120
  token: Address;
64
121
  tokensIn: bigint;
65
122
  multiplierIndex: 4 | 6;
66
- }): Promise<bigint> {
67
- const tokenDetails = await getTokenDetails(client, provisioner, token);
68
- const multiplier = BigInt(tokenDetails[multiplierIndex]);
69
- const adjustedTokensIn = (tokensIn * multiplier) / MAX_BPS;
123
+ options?: SyncRedeemReadOptions;
124
+ }): Promise<{ unitsOut: bigint; multiplierBps: bigint }> {
125
+ const tokenDetails = await getTokenDetails(client, provisioner, token, options);
126
+ const multiplierBps = BigInt(tokenDetails[multiplierIndex]);
127
+ const adjustedTokensIn = (tokensIn * multiplierBps) / MAX_BPS;
70
128
 
71
- return convertTokenToUnitsIfActive(
129
+ const unitsOut = await convertTokenToUnitsIfActive(
72
130
  client,
73
131
  feeCalculator,
74
132
  feeCalculatorVersion,
75
133
  vault,
76
134
  token,
77
135
  adjustedTokensIn,
78
- Rounding.Floor
136
+ Rounding.Floor,
137
+ options
79
138
  );
139
+
140
+ return { unitsOut, multiplierBps };
80
141
  }
81
142
 
82
143
  async function getRedeemTokenOut({
@@ -88,6 +149,7 @@ async function getRedeemTokenOut({
88
149
  token,
89
150
  unitsIn,
90
151
  multiplierIndex,
152
+ options,
91
153
  }: {
92
154
  client: PublicClient;
93
155
  provisioner: Address;
@@ -97,9 +159,10 @@ async function getRedeemTokenOut({
97
159
  token: Address;
98
160
  unitsIn: bigint;
99
161
  multiplierIndex: 5 | 7;
162
+ options?: SyncRedeemReadOptions;
100
163
  }): Promise<bigint> {
101
164
  const [tokenDetails, tokensOut] = await Promise.all([
102
- getTokenDetails(client, provisioner, token),
165
+ getTokenDetails(client, provisioner, token, options),
103
166
  convertUnitsToTokenIfActive(
104
167
  client,
105
168
  feeCalculator,
@@ -107,7 +170,8 @@ async function getRedeemTokenOut({
107
170
  vault,
108
171
  token,
109
172
  unitsIn,
110
- Rounding.Floor
173
+ Rounding.Floor,
174
+ options
111
175
  ),
112
176
  ]);
113
177
  const multiplier = BigInt(tokenDetails[multiplierIndex]);
@@ -124,6 +188,7 @@ async function getWithdrawUnitsIn({
124
188
  token,
125
189
  tokensOut,
126
190
  multiplierIndex,
191
+ options,
127
192
  }: {
128
193
  client: PublicClient;
129
194
  provisioner: Address;
@@ -133,8 +198,9 @@ async function getWithdrawUnitsIn({
133
198
  token: Address;
134
199
  tokensOut: bigint;
135
200
  multiplierIndex: 5 | 7;
201
+ options?: SyncRedeemReadOptions;
136
202
  }): Promise<bigint> {
137
- const tokenDetails = await getTokenDetails(client, provisioner, token);
203
+ const tokenDetails = await getTokenDetails(client, provisioner, token, options);
138
204
  const multiplier = BigInt(tokenDetails[multiplierIndex]);
139
205
  const preMultiplierTokens = (tokensOut * MAX_BPS + multiplier - 1n) / multiplier;
140
206
 
@@ -145,17 +211,39 @@ async function getWithdrawUnitsIn({
145
211
  vault,
146
212
  token,
147
213
  preMultiplierTokens,
148
- Rounding.Ceil
214
+ Rounding.Ceil,
215
+ options
149
216
  );
150
217
  }
151
218
 
152
- async function getSyncRedeemMultiplier(
219
+ /** Breakdown of the effective sync redeem multiplier, in basis points. */
220
+ export interface SyncRedeemRate {
221
+ /** Base sync redeem multiplier (tokensDetails.syncRedeemMultiplier). */
222
+ baseMultiplierBps: bigint;
223
+ /** Dynamic premium charged for the current oracle price age. */
224
+ dynamicPremiumBps: bigint;
225
+ /** Multiplier actually applied to size the redemption (base - dynamic premium). */
226
+ effectiveMultiplierBps: bigint;
227
+ }
228
+
229
+ /**
230
+ * Reads the live sync redeem rate and whether pull-funds calldata is configured.
231
+ *
232
+ * Both values come from the same token-details read, avoiding another RPC request when a quote
233
+ * needs to determine whether the vault balance is a reliable liquidity limit.
234
+ *
235
+ * @throws {StalePriceError} If the oracle price is older than the configured max age,
236
+ * in which case the on-chain sync redeem would revert.
237
+ */
238
+ export async function getSyncRedeemRateContext(
153
239
  client: PublicClient,
154
240
  provisioner: Address,
155
241
  vault: Address,
156
242
  token: Address,
157
- feeCalculator: Address
158
- ): Promise<bigint> {
243
+ feeCalculator: Address,
244
+ options: SyncRedeemReadOptions = {}
245
+ ): Promise<{ rate: SyncRedeemRate; hasPullFundsSubmitData: boolean }> {
246
+ const readContext = await resolveReadContext(client, options);
159
247
  const [tokenDetails, syncRedeemDetails, anchorTimestamp] = await client.multicall({
160
248
  contracts: [
161
249
  {
@@ -177,12 +265,12 @@ async function getSyncRedeemMultiplier(
177
265
  },
178
266
  ],
179
267
  allowFailure: false,
268
+ blockNumber: readContext.blockNumber,
180
269
  });
181
- const block = await client.getBlock();
182
- const syncRedeemMultiplier = BigInt(tokenDetails[7]);
270
+ const baseMultiplierBps = BigInt(tokenDetails[7]);
183
271
  const maxPriceAge = BigInt(syncRedeemDetails[0]);
184
272
  const maxDynamicPremiumBps = BigInt(syncRedeemDetails[2]);
185
- const blockTimestamp = BigInt(block.timestamp);
273
+ const blockTimestamp = readContext.blockTimestamp;
186
274
  const priceTimestamp = BigInt(anchorTimestamp);
187
275
 
188
276
  if (priceTimestamp + maxPriceAge < blockTimestamp) {
@@ -198,7 +286,39 @@ async function getSyncRedeemMultiplier(
198
286
  ? 0n
199
287
  : ((blockTimestamp - priceTimestamp) * maxDynamicPremiumBps + maxPriceAge - 1n) / maxPriceAge;
200
288
 
201
- return syncRedeemMultiplier - dynamicPremiumBps;
289
+ return {
290
+ rate: {
291
+ baseMultiplierBps,
292
+ dynamicPremiumBps,
293
+ effectiveMultiplierBps: baseMultiplierBps - dynamicPremiumBps,
294
+ },
295
+ hasPullFundsSubmitData: tokenDetails[9] !== zeroAddress,
296
+ };
297
+ }
298
+
299
+ /** Preserves the existing rate-only API for callers that do not need pull-funds state. */
300
+ export async function getSyncRedeemRate(
301
+ client: PublicClient,
302
+ provisioner: Address,
303
+ vault: Address,
304
+ token: Address,
305
+ feeCalculator: Address,
306
+ options: SyncRedeemReadOptions = {}
307
+ ): Promise<SyncRedeemRate> {
308
+ return (await getSyncRedeemRateContext(client, provisioner, vault, token, feeCalculator, options))
309
+ .rate;
310
+ }
311
+
312
+ async function getSyncRedeemMultiplier(
313
+ client: PublicClient,
314
+ provisioner: Address,
315
+ vault: Address,
316
+ token: Address,
317
+ feeCalculator: Address,
318
+ options: SyncRedeemReadOptions = {}
319
+ ): Promise<bigint> {
320
+ return (await getSyncRedeemRate(client, provisioner, vault, token, feeCalculator, options))
321
+ .effectiveMultiplierBps;
202
322
  }
203
323
 
204
324
  export async function getSyncRedeemTokenOut(
@@ -208,8 +328,12 @@ export async function getSyncRedeemTokenOut(
208
328
  feeCalculatorVersion: ContractVersion,
209
329
  vault: Address,
210
330
  token: Address,
211
- unitsIn: bigint
331
+ unitsIn: bigint,
332
+ effectiveMultiplierBps?: bigint,
333
+ options: SyncRedeemReadOptions = {}
212
334
  ): Promise<bigint> {
335
+ const readContext =
336
+ effectiveMultiplierBps === undefined ? await resolveReadContext(client, options) : options;
213
337
  const [tokenAmount, multiplier] = await Promise.all([
214
338
  convertUnitsToTokenIfActive(
215
339
  client,
@@ -218,9 +342,12 @@ export async function getSyncRedeemTokenOut(
218
342
  vault,
219
343
  token,
220
344
  unitsIn,
221
- Rounding.Floor
345
+ Rounding.Floor,
346
+ readContext
222
347
  ),
223
- getSyncRedeemMultiplier(client, provisioner, vault, token, feeCalculator),
348
+ effectiveMultiplierBps !== undefined
349
+ ? Promise.resolve(effectiveMultiplierBps)
350
+ : getSyncRedeemMultiplier(client, provisioner, vault, token, feeCalculator, readContext),
224
351
  ]);
225
352
 
226
353
  return (tokenAmount * multiplier) / MAX_BPS;
@@ -235,7 +362,7 @@ export async function getAsyncDepositUnitsOut(
235
362
  token: Address,
236
363
  tokensIn: bigint
237
364
  ): Promise<bigint> {
238
- return getDepositUnitsOut({
365
+ const quote = await getDepositQuote({
239
366
  client,
240
367
  provisioner,
241
368
  feeCalculator,
@@ -245,9 +372,10 @@ export async function getAsyncDepositUnitsOut(
245
372
  tokensIn,
246
373
  multiplierIndex: 4,
247
374
  });
375
+ return quote.unitsOut;
248
376
  }
249
377
 
250
- export async function getSyncDepositUnitsOut(
378
+ const getSyncDepositQuote = (
251
379
  client: PublicClient,
252
380
  provisioner: Address,
253
381
  feeCalculator: Address,
@@ -255,8 +383,8 @@ export async function getSyncDepositUnitsOut(
255
383
  vault: Address,
256
384
  token: Address,
257
385
  tokensIn: bigint
258
- ): Promise<bigint> {
259
- return getDepositUnitsOut({
386
+ ) =>
387
+ getDepositQuote({
260
388
  client,
261
389
  provisioner,
262
390
  feeCalculator,
@@ -266,6 +394,66 @@ export async function getSyncDepositUnitsOut(
266
394
  tokensIn,
267
395
  multiplierIndex: 6,
268
396
  });
397
+
398
+ export async function getSyncDepositUnitsOut(
399
+ client: PublicClient,
400
+ provisioner: Address,
401
+ feeCalculator: Address,
402
+ feeCalculatorVersion: ContractVersion,
403
+ vault: Address,
404
+ token: Address,
405
+ tokensIn: bigint
406
+ ): Promise<bigint> {
407
+ const quote = await getSyncDepositQuote(
408
+ client,
409
+ provisioner,
410
+ feeCalculator,
411
+ feeCalculatorVersion,
412
+ vault,
413
+ token,
414
+ tokensIn
415
+ );
416
+ return quote.unitsOut;
417
+ }
418
+
419
+ export async function getSyncDepositQuoteValues(
420
+ client: PublicClient,
421
+ provisioner: Address,
422
+ feeCalculator: Address,
423
+ feeCalculatorVersion: ContractVersion,
424
+ vault: Address,
425
+ token: Address,
426
+ tokensIn: bigint
427
+ ): Promise<{ unitsOut: bigint; feeBps: bigint; numeraireOut: bigint }> {
428
+ const { unitsOut, multiplierBps } = await getSyncDepositQuote(
429
+ client,
430
+ provisioner,
431
+ feeCalculator,
432
+ feeCalculatorVersion,
433
+ vault,
434
+ token,
435
+ tokensIn
436
+ );
437
+ const numeraireOut = await convertTokenToNumeraire(
438
+ client,
439
+ feeCalculator,
440
+ feeCalculatorVersion,
441
+ vault,
442
+ token,
443
+ (tokensIn * multiplierBps) / MAX_BPS
444
+ );
445
+ return { unitsOut, feeBps: MAX_BPS - multiplierBps, numeraireOut };
446
+ }
447
+
448
+ /** Reads the live Instant Supply fee for a vault token, independent of the deposit amount. */
449
+ export async function getSyncDepositFeeBps(
450
+ client: PublicClient,
451
+ provisioner: Address,
452
+ token: Address,
453
+ options: SyncRedeemReadOptions = {}
454
+ ): Promise<bigint> {
455
+ const tokenDetails = await getTokenDetails(client, provisioner, token, options);
456
+ return MAX_BPS - BigInt(tokenDetails[6]);
269
457
  }
270
458
 
271
459
  export async function getAsyncRedeemTokenOut(
@@ -317,15 +505,15 @@ export async function getSyncWithdrawUnitsIn(
317
505
  feeCalculatorVersion: ContractVersion,
318
506
  vault: Address,
319
507
  token: Address,
320
- tokensOut: bigint
508
+ tokensOut: bigint,
509
+ effectiveMultiplierBps?: bigint,
510
+ options: SyncRedeemReadOptions = {}
321
511
  ): Promise<bigint> {
322
- const multiplier = await getSyncRedeemMultiplier(
323
- client,
324
- provisioner,
325
- vault,
326
- token,
327
- feeCalculator
328
- );
512
+ const readContext =
513
+ effectiveMultiplierBps === undefined ? await resolveReadContext(client, options) : options;
514
+ const multiplier =
515
+ effectiveMultiplierBps ??
516
+ (await getSyncRedeemMultiplier(client, provisioner, vault, token, feeCalculator, readContext));
329
517
  const prePremiumTokens = (tokensOut * MAX_BPS + multiplier - 1n) / multiplier;
330
518
 
331
519
  return convertTokenToUnitsIfActive(
@@ -335,10 +523,54 @@ export async function getSyncWithdrawUnitsIn(
335
523
  vault,
336
524
  token,
337
525
  prePremiumTokens,
338
- Rounding.Ceil
526
+ Rounding.Ceil,
527
+ readContext
339
528
  );
340
529
  }
341
530
 
531
+ /** Current sync redeem epoch accounting, in numeraire (all values uint256). */
532
+ export interface SyncRedeemEpochState {
533
+ epochTimestamp: bigint;
534
+ epochStartTvlNumeraire: bigint;
535
+ epochRedeemedNumeraire: bigint;
536
+ epochCapNumeraire: bigint;
537
+ }
538
+
539
+ export async function getSyncRedeemEpochState(
540
+ client: PublicClient,
541
+ provisioner: Address,
542
+ options: SyncRedeemReadOptions = {}
543
+ ): Promise<SyncRedeemEpochState> {
544
+ const [epochTimestamp, epochStartTvlNumeraire, epochRedeemedNumeraire, epochCapNumeraire] =
545
+ await client.readContract({
546
+ address: provisioner,
547
+ abi: provisionerV2Abi,
548
+ functionName: 'getSyncRedeemEpochState',
549
+ ...readAtBlock(options),
550
+ });
551
+
552
+ return { epochTimestamp, epochStartTvlNumeraire, epochRedeemedNumeraire, epochCapNumeraire };
553
+ }
554
+
555
+ /**
556
+ * Raw expiry timestamp for the user's latest sync-deposit lock (0 if none was recorded).
557
+ * The user is locked while this value is greater than or equal to the relevant block timestamp.
558
+ */
559
+ export async function getUserUnitsRefundableUntil(
560
+ client: PublicClient,
561
+ provisioner: Address,
562
+ user: Address,
563
+ options: SyncRedeemReadOptions = {}
564
+ ): Promise<bigint> {
565
+ return client.readContract({
566
+ address: provisioner,
567
+ abi: provisionerV2Abi,
568
+ functionName: 'userUnitsRefundableUntil',
569
+ args: [user],
570
+ ...readAtBlock(options),
571
+ });
572
+ }
573
+
342
574
  export function depositTxRequest(
343
575
  provisioner: Address,
344
576
  token: Address,
@@ -15,6 +15,7 @@ import { provisionerAbi } from './abis/provisioner';
15
15
  import { provisionerV2Abi } from './abis/provisionerV2';
16
16
  import { MAX_BPS } from '../constants';
17
17
  import { ContractVersion, type EvmVaultDeployment } from './types';
18
+ import { readAtBlock } from './aeraContracts/readOptions';
18
19
 
19
20
  const contractVersionCache = new Map<string, ContractVersion>();
20
21
 
@@ -28,6 +29,19 @@ const contractVersionAbi = [
28
29
  },
29
30
  ] as const;
30
31
 
32
+ const solvingGateAbi = [
33
+ {
34
+ type: 'function',
35
+ inputs: [
36
+ { name: 'provisioner', internalType: 'address', type: 'address' },
37
+ { name: 'token', internalType: 'address', type: 'address' },
38
+ ],
39
+ name: 'paused',
40
+ outputs: [{ name: '', internalType: 'bool', type: 'bool' }],
41
+ stateMutability: 'view',
42
+ },
43
+ ] as const;
44
+
31
45
  export interface AeraRuntimeContracts {
32
46
  provisioner: {
33
47
  address: Address;
@@ -46,6 +60,19 @@ export interface AeraTokenModeSupport {
46
60
  syncRedeem: boolean;
47
61
  }
48
62
 
63
+ export function requireAeraSyncRedeemRuntime(runtime: AeraRuntimeContracts): void {
64
+ if (runtime.provisioner.version !== ContractVersion.V2) {
65
+ throw new UnsupportedFeatureError('Aera: sync redeem requires a V2 provisioner');
66
+ }
67
+ if (runtime.feeCalculator.version !== ContractVersion.V2) {
68
+ throw new UnsupportedFeatureError('Aera: sync redeem requires a V2 price and fee calculator');
69
+ }
70
+ }
71
+
72
+ export type AeraReadOptions = {
73
+ blockNumber?: bigint;
74
+ };
75
+
49
76
  export function applySlippageDown(amount: bigint, slippageBps: number): bigint {
50
77
  return (amount * (MAX_BPS - BigInt(slippageBps))) / MAX_BPS;
51
78
  }
@@ -97,7 +124,8 @@ export function getMultiDepositorVault<T extends Client>(
97
124
 
98
125
  export async function resolveContractVersion(
99
126
  client: PublicClient,
100
- address: Address
127
+ address: Address,
128
+ options: AeraReadOptions = {}
101
129
  ): Promise<ContractVersion> {
102
130
  const cacheKey = contractVersionCacheKey(client, address);
103
131
  const cached = contractVersionCache.get(cacheKey);
@@ -108,6 +136,7 @@ export async function resolveContractVersion(
108
136
  address,
109
137
  abi: contractVersionAbi,
110
138
  functionName: 'version',
139
+ ...readAtBlock(options),
111
140
  });
112
141
  const version = versionString.startsWith('2.') ? ContractVersion.V2 : ContractVersion.V1;
113
142
  contractVersionCache.set(cacheKey, version);
@@ -123,7 +152,8 @@ export async function resolveContractVersion(
123
152
 
124
153
  export async function resolveAeraRuntimeContracts(
125
154
  client: PublicClient,
126
- vault: EvmVaultDeployment
155
+ vault: EvmVaultDeployment,
156
+ options: AeraReadOptions = {}
127
157
  ): Promise<AeraRuntimeContracts> {
128
158
  if (vault.vaultType !== 'multi-depositor') {
129
159
  throw new UnimplementedFeatureError('Aera: single depositor vaults');
@@ -134,11 +164,13 @@ export async function resolveAeraRuntimeContracts(
134
164
  address: vault.vaultAddress,
135
165
  abi: multiDepositorVaultAbi,
136
166
  functionName: 'provisioner',
167
+ ...readAtBlock(options),
137
168
  }),
138
169
  client.readContract({
139
170
  address: vault.vaultAddress,
140
171
  abi: multiDepositorVaultAbi,
141
172
  functionName: 'feeCalculator',
173
+ ...readAtBlock(options),
142
174
  }),
143
175
  ]);
144
176
 
@@ -150,8 +182,8 @@ export async function resolveAeraRuntimeContracts(
150
182
  }
151
183
 
152
184
  const [provisionerVersion, feeCalculatorVersion] = await Promise.all([
153
- resolveContractVersion(client, provisionerAddress),
154
- resolveContractVersion(client, feeCalculatorAddress),
185
+ resolveContractVersion(client, provisionerAddress, options),
186
+ resolveContractVersion(client, feeCalculatorAddress, options),
155
187
  ]);
156
188
 
157
189
  return {
@@ -169,21 +201,61 @@ export async function resolveAeraRuntimeContracts(
169
201
  export async function resolveAeraTokenModeSupport(
170
202
  client: PublicClient,
171
203
  runtime: AeraRuntimeContracts,
172
- token: Address
204
+ token: Address,
205
+ options: AeraReadOptions & { includeSyncModes?: boolean } = {}
173
206
  ): Promise<AeraTokenModeSupport> {
174
207
  if (runtime.provisioner.version === ContractVersion.V2) {
175
- const tokenDetails = await client.readContract({
208
+ const tokenDetailsPromise = client.readContract({
176
209
  address: runtime.provisioner.address,
177
210
  abi: provisionerV2Abi,
178
211
  functionName: 'tokensDetails',
179
212
  args: [token],
213
+ ...readAtBlock(options),
180
214
  });
215
+ if (options.includeSyncModes === false) {
216
+ const tokenDetails = await tokenDetailsPromise;
217
+ return {
218
+ asyncDeposit: Boolean(tokenDetails[0]),
219
+ asyncRedeem: Boolean(tokenDetails[1]),
220
+ syncDeposit: false,
221
+ syncRedeem: false,
222
+ };
223
+ }
224
+
225
+ const [tokenDetails, solvingGateEnabled, solvingGate] = await Promise.all([
226
+ tokenDetailsPromise,
227
+ client.readContract({
228
+ address: runtime.provisioner.address,
229
+ abi: provisionerV2Abi,
230
+ functionName: 'SOLVING_GATE_ENABLED',
231
+ ...readAtBlock(options),
232
+ }),
233
+ client.readContract({
234
+ address: runtime.provisioner.address,
235
+ abi: provisionerV2Abi,
236
+ functionName: 'solvingGate',
237
+ ...readAtBlock(options),
238
+ }),
239
+ ]);
240
+ const solvingPaused =
241
+ solvingGateEnabled && solvingGate !== zeroAddress
242
+ ? await client.readContract({
243
+ address: solvingGate,
244
+ abi: solvingGateAbi,
245
+ functionName: 'paused',
246
+ args: [runtime.provisioner.address, token],
247
+ ...readAtBlock(options),
248
+ })
249
+ : false;
181
250
 
182
251
  return {
183
252
  asyncDeposit: Boolean(tokenDetails[0]),
184
253
  asyncRedeem: Boolean(tokenDetails[1]),
185
- syncDeposit: Boolean(tokenDetails[2]),
186
- syncRedeem: Boolean(tokenDetails[3]),
254
+ syncDeposit: Boolean(tokenDetails[2]) && !solvingPaused,
255
+ syncRedeem:
256
+ Boolean(tokenDetails[3]) &&
257
+ !solvingPaused &&
258
+ runtime.feeCalculator.version === ContractVersion.V2,
187
259
  };
188
260
  }
189
261
 
@@ -192,6 +264,7 @@ export async function resolveAeraTokenModeSupport(
192
264
  abi: provisionerAbi,
193
265
  functionName: 'tokensDetails',
194
266
  args: [token],
267
+ ...readAtBlock(options),
195
268
  });
196
269
 
197
270
  return {