@agg-build/ui 4.26.1 → 4.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/dist/event-trading-state.utils-B3my25Re.mjs +789 -0
  2. package/dist/event-trading-state.utils-s4DEc4iA.js +921 -0
  3. package/dist/events.js +23 -17658
  4. package/dist/events.mjs +3 -50
  5. package/dist/index.js +811 -47152
  6. package/dist/index.mjs +584 -1204
  7. package/dist/list-D8v2SmY1.js +6989 -0
  8. package/dist/list-DD7roCVl.mjs +6838 -0
  9. package/dist/manage-betdex-account-modal-21ZVLsz0.js +2390 -0
  10. package/dist/manage-betdex-account-modal-D2vKHird.mjs +2294 -0
  11. package/dist/modals-BReGwJzz.mjs +2993 -0
  12. package/dist/modals-CSexQO1C.js +3077 -0
  13. package/dist/modals.js +24 -11810
  14. package/dist/modals.mjs +3 -49
  15. package/dist/pages-CMlCYngA.mjs +7846 -0
  16. package/dist/pages-xvAzj6c2.js +7955 -0
  17. package/dist/pages.js +25 -42391
  18. package/dist/pages.mjs +3 -57
  19. package/dist/primitives-CqxNeV7H.js +9930 -0
  20. package/dist/primitives-Dz5aF8ma.mjs +8928 -0
  21. package/dist/primitives.js +102 -11079
  22. package/dist/primitives.mjs +1 -204
  23. package/dist/trading-CDkNdjGx.mjs +7086 -0
  24. package/dist/trading-CXsZFd3l.js +7217 -0
  25. package/dist/trading.js +39 -18215
  26. package/dist/trading.mjs +3 -68
  27. package/dist/types/agg-provider.d.mts +1 -1
  28. package/dist/types/agg-provider.d.ts +1 -1
  29. package/dist/types/auth/connect-button-view/index.d.mts +4 -5
  30. package/dist/types/auth/connect-button-view/index.d.ts +4 -5
  31. package/dist/types/deposit/components/DepositQRCode.d.mts +2 -2
  32. package/dist/types/deposit/components/DepositQRCode.d.ts +2 -2
  33. package/dist/types/deposit/index.d.mts +4 -4
  34. package/dist/types/deposit/index.d.ts +4 -4
  35. package/dist/types/deposit/steps/card-deposit.d.mts +1 -1
  36. package/dist/types/deposit/steps/card-deposit.d.ts +1 -1
  37. package/dist/types/deposit/steps/card-payment-pending.d.mts +1 -1
  38. package/dist/types/deposit/steps/card-payment-pending.d.ts +1 -1
  39. package/dist/types/deposit/steps/card-provider.d.mts +1 -1
  40. package/dist/types/deposit/steps/card-provider.d.ts +1 -1
  41. package/dist/types/deposit/steps/card-purchase-success.d.mts +1 -1
  42. package/dist/types/deposit/steps/card-purchase-success.d.ts +1 -1
  43. package/dist/types/deposit/steps/card-widget.d.mts +1 -1
  44. package/dist/types/deposit/steps/card-widget.d.ts +1 -1
  45. package/dist/types/deposit/steps/crypto-transfer.d.mts +1 -1
  46. package/dist/types/deposit/steps/crypto-transfer.d.ts +1 -1
  47. package/dist/types/deposit/steps/deposit-method.d.mts +2 -1
  48. package/dist/types/deposit/steps/deposit-method.d.ts +2 -1
  49. package/dist/types/deposit/steps/venue-selection.d.mts +1 -1
  50. package/dist/types/deposit/steps/venue-selection.d.ts +1 -1
  51. package/dist/types/deposit/steps/wallet-form.d.mts +1 -1
  52. package/dist/types/deposit/steps/wallet-form.d.ts +1 -1
  53. package/dist/types/deposit/steps/wallet-processing.d.mts +1 -1
  54. package/dist/types/deposit/steps/wallet-processing.d.ts +1 -1
  55. package/dist/types/deposit/steps/wallet-success.d.mts +1 -1
  56. package/dist/types/deposit/steps/wallet-success.d.ts +1 -1
  57. package/dist/types/events/item/event-list-item.utils.d.mts +1 -1
  58. package/dist/types/events/item/event-list-item.utils.d.ts +1 -1
  59. package/dist/types/events/item/index.d.mts +8 -8
  60. package/dist/types/events/item/index.d.ts +8 -8
  61. package/dist/types/events/item-details/event-list-item-details-market-selector.d.mts +1 -1
  62. package/dist/types/events/item-details/event-list-item-details-market-selector.d.ts +1 -1
  63. package/dist/types/events/item-details/event-markets-chart.d.mts +1 -1
  64. package/dist/types/events/item-details/event-markets-chart.d.ts +1 -1
  65. package/dist/types/events/item-details/event-markets-chart.utils.d.mts +1 -1
  66. package/dist/types/events/item-details/event-markets-chart.utils.d.ts +1 -1
  67. package/dist/types/events/item-details/index.d.mts +4 -4
  68. package/dist/types/events/item-details/index.d.ts +4 -4
  69. package/dist/types/events/item-details/settlement-summary.d.mts +4 -4
  70. package/dist/types/events/item-details/settlement-summary.d.ts +4 -4
  71. package/dist/types/events/list/category-sidebar.d.mts +4 -4
  72. package/dist/types/events/list/category-sidebar.d.ts +4 -4
  73. package/dist/types/events/list/event-list-tabs.d.mts +4 -8
  74. package/dist/types/events/list/event-list-tabs.d.ts +4 -8
  75. package/dist/types/events/list/event-list-venue-strip.d.mts +4 -11
  76. package/dist/types/events/list/event-list-venue-strip.d.ts +4 -11
  77. package/dist/types/events/list/index.d.mts +4 -4
  78. package/dist/types/events/list/index.d.ts +4 -4
  79. package/dist/types/events/market-details/index.d.mts +8 -8
  80. package/dist/types/events/market-details/index.d.ts +8 -8
  81. package/dist/types/events/market-details/market-details-graph-panel.d.mts +4 -14
  82. package/dist/types/events/market-details/market-details-graph-panel.d.ts +4 -14
  83. package/dist/types/events/market-details/market-details-outcome-button.d.mts +4 -4
  84. package/dist/types/events/market-details/market-details-outcome-button.d.ts +4 -4
  85. package/dist/types/events/market-details/orderbook-aggregation.d.mts +3 -1
  86. package/dist/types/events/market-details/orderbook-aggregation.d.ts +3 -1
  87. package/dist/types/events/market-details/use-visible-market-streams.d.mts +1 -1
  88. package/dist/types/events/market-details/use-visible-market-streams.d.ts +1 -1
  89. package/dist/types/events/orderbook/index.d.mts +4 -4
  90. package/dist/types/events/orderbook/index.d.ts +4 -4
  91. package/dist/types/events/orderbook/orderbook-with-states.d.mts +4 -4
  92. package/dist/types/events/orderbook/orderbook-with-states.d.ts +4 -4
  93. package/dist/types/events/shared/chart-source-caption.d.mts +1 -1
  94. package/dist/types/events/shared/chart-source-caption.d.ts +1 -1
  95. package/dist/types/events/shared/sports-live-score.d.mts +4 -4
  96. package/dist/types/events/shared/sports-live-score.d.ts +4 -4
  97. package/dist/types/events/shared/use-chart-orderbook.d.mts +3 -3
  98. package/dist/types/events/shared/use-chart-orderbook.d.ts +3 -3
  99. package/dist/types/geo-block-banner/index.d.mts +4 -4
  100. package/dist/types/geo-block-banner/index.d.ts +4 -4
  101. package/dist/types/geo-block-modal/index.d.mts +4 -4
  102. package/dist/types/geo-block-modal/index.d.ts +4 -4
  103. package/dist/types/kyc/shared-kyc-modal.d.mts +4 -4
  104. package/dist/types/kyc/shared-kyc-modal.d.ts +4 -4
  105. package/dist/types/notifications/agg-notification-events-provider.d.mts +1 -1
  106. package/dist/types/notifications/agg-notification-events-provider.d.ts +1 -1
  107. package/dist/types/notifications/agg-toast-provider.d.mts +1 -1
  108. package/dist/types/notifications/agg-toast-provider.d.ts +1 -1
  109. package/dist/types/onboarding/index.d.mts +4 -4
  110. package/dist/types/onboarding/index.d.ts +4 -4
  111. package/dist/types/onboarding/steps/connect-accounts.d.mts +4 -4
  112. package/dist/types/onboarding/steps/connect-accounts.d.ts +4 -4
  113. package/dist/types/onboarding/steps/connect-kalshi-modal.d.mts +4 -4
  114. package/dist/types/onboarding/steps/connect-kalshi-modal.d.ts +4 -4
  115. package/dist/types/onboarding/steps/connect-novig-modal.d.mts +1 -1
  116. package/dist/types/onboarding/steps/connect-novig-modal.d.ts +1 -1
  117. package/dist/types/onboarding/steps/connect-onchain-modal.d.mts +4 -4
  118. package/dist/types/onboarding/steps/connect-onchain-modal.d.ts +4 -4
  119. package/dist/types/onboarding/steps/connect-prophetx-modal.d.mts +1 -1
  120. package/dist/types/onboarding/steps/connect-prophetx-modal.d.ts +1 -1
  121. package/dist/types/onboarding/steps/how-it-works.d.mts +4 -4
  122. package/dist/types/onboarding/steps/how-it-works.d.ts +4 -4
  123. package/dist/types/onboarding/steps/profile-setup.d.mts +4 -4
  124. package/dist/types/onboarding/steps/profile-setup.d.ts +4 -4
  125. package/dist/types/pages/event-market/event-market.shared.d.mts +4 -4
  126. package/dist/types/pages/event-market/event-market.shared.d.ts +4 -4
  127. package/dist/types/pages/event-market/event-market.types.d.mts +2 -0
  128. package/dist/types/pages/event-market/event-market.types.d.ts +2 -0
  129. package/dist/types/pages/event-market/event-open-orders.d.mts +8 -27
  130. package/dist/types/pages/event-market/event-open-orders.d.ts +8 -27
  131. package/dist/types/pages/event-market/index.d.mts +6 -6
  132. package/dist/types/pages/event-market/index.d.ts +6 -6
  133. package/dist/types/pages/event-market/sports-event-market-page.d.mts +6 -6
  134. package/dist/types/pages/event-market/sports-event-market-page.d.ts +6 -6
  135. package/dist/types/pages/event-market/sports-line-rail.d.mts +2 -1
  136. package/dist/types/pages/event-market/sports-line-rail.d.ts +2 -1
  137. package/dist/types/pages/event-market/sports-market-card.d.mts +4 -4
  138. package/dist/types/pages/event-market/sports-market-card.d.ts +4 -4
  139. package/dist/types/pages/event-market/sports-markets.d.mts +4 -4
  140. package/dist/types/pages/event-market/sports-markets.d.ts +4 -4
  141. package/dist/types/pages/home/index.d.mts +6 -6
  142. package/dist/types/pages/home/index.d.ts +6 -6
  143. package/dist/types/pages/leaderboard/components/leaderboard-header-row.d.mts +1 -1
  144. package/dist/types/pages/leaderboard/components/leaderboard-header-row.d.ts +1 -1
  145. package/dist/types/pages/leaderboard/components/leaderboard-row.d.mts +1 -1
  146. package/dist/types/pages/leaderboard/components/leaderboard-row.d.ts +1 -1
  147. package/dist/types/pages/leaderboard/components/leaderboard-skeleton.d.mts +1 -1
  148. package/dist/types/pages/leaderboard/components/leaderboard-skeleton.d.ts +1 -1
  149. package/dist/types/pages/leaderboard/components/segmented-control.d.mts +1 -1
  150. package/dist/types/pages/leaderboard/components/segmented-control.d.ts +1 -1
  151. package/dist/types/pages/leaderboard/index.d.mts +1 -1
  152. package/dist/types/pages/leaderboard/index.d.ts +1 -1
  153. package/dist/types/pages/user-profile/components/activity-row.d.mts +4 -4
  154. package/dist/types/pages/user-profile/components/activity-row.d.ts +4 -4
  155. package/dist/types/pages/user-profile/components/available-balance-card.d.mts +4 -4
  156. package/dist/types/pages/user-profile/components/available-balance-card.d.ts +4 -4
  157. package/dist/types/pages/user-profile/components/balance-display.d.mts +4 -4
  158. package/dist/types/pages/user-profile/components/balance-display.d.ts +4 -4
  159. package/dist/types/pages/user-profile/components/balances-card.d.mts +4 -4
  160. package/dist/types/pages/user-profile/components/balances-card.d.ts +4 -4
  161. package/dist/types/pages/user-profile/components/betdex-account-activity.d.mts +1 -1
  162. package/dist/types/pages/user-profile/components/betdex-account-activity.d.ts +1 -1
  163. package/dist/types/pages/user-profile/components/betdex-account-card.d.mts +1 -1
  164. package/dist/types/pages/user-profile/components/betdex-account-card.d.ts +1 -1
  165. package/dist/types/pages/user-profile/components/betdex-account-transfers.d.mts +1 -1
  166. package/dist/types/pages/user-profile/components/betdex-account-transfers.d.ts +1 -1
  167. package/dist/types/pages/user-profile/components/betdex-wallet-deposit.d.mts +1 -1
  168. package/dist/types/pages/user-profile/components/betdex-wallet-deposit.d.ts +1 -1
  169. package/dist/types/pages/user-profile/components/claim-activity-breakdown-modal.d.mts +1 -1
  170. package/dist/types/pages/user-profile/components/claim-activity-breakdown-modal.d.ts +1 -1
  171. package/dist/types/pages/user-profile/components/empty-state.d.mts +4 -4
  172. package/dist/types/pages/user-profile/components/empty-state.d.ts +4 -4
  173. package/dist/types/pages/user-profile/components/manage-balances-modal.d.mts +4 -4
  174. package/dist/types/pages/user-profile/components/manage-balances-modal.d.ts +4 -4
  175. package/dist/types/pages/user-profile/components/open-order-row.d.mts +4 -4
  176. package/dist/types/pages/user-profile/components/open-order-row.d.ts +4 -4
  177. package/dist/types/pages/user-profile/components/position-row.d.mts +4 -4
  178. package/dist/types/pages/user-profile/components/position-row.d.ts +4 -4
  179. package/dist/types/pages/user-profile/components/positions-activity.d.mts +4 -4
  180. package/dist/types/pages/user-profile/components/positions-activity.d.ts +4 -4
  181. package/dist/types/pages/user-profile/components/positions-value-card.d.mts +4 -4
  182. package/dist/types/pages/user-profile/components/positions-value-card.d.ts +4 -4
  183. package/dist/types/pages/user-profile/components/user-info-card.d.mts +4 -4
  184. package/dist/types/pages/user-profile/components/user-info-card.d.ts +4 -4
  185. package/dist/types/pages/user-profile/index.d.mts +6 -6
  186. package/dist/types/pages/user-profile/index.d.ts +6 -6
  187. package/dist/types/paper-trading/paper-onboarding-modal.d.mts +4 -14
  188. package/dist/types/paper-trading/paper-onboarding-modal.d.ts +4 -14
  189. package/dist/types/paper-trading/paper-trading-badge.d.mts +4 -16
  190. package/dist/types/paper-trading/paper-trading-badge.d.ts +4 -16
  191. package/dist/types/paper-trading/paper-trading-onboarding.d.mts +4 -12
  192. package/dist/types/paper-trading/paper-trading-onboarding.d.ts +4 -12
  193. package/dist/types/primitives/agg-logo/agg-logo.utils.d.mts +1 -1
  194. package/dist/types/primitives/agg-logo/agg-logo.utils.d.ts +1 -1
  195. package/dist/types/primitives/agg-logo/index.d.mts +4 -5
  196. package/dist/types/primitives/agg-logo/index.d.ts +4 -5
  197. package/dist/types/primitives/autocomplete-select/index.d.mts +4 -5
  198. package/dist/types/primitives/autocomplete-select/index.d.ts +4 -5
  199. package/dist/types/primitives/badge/index.d.mts +1 -1
  200. package/dist/types/primitives/badge/index.d.ts +1 -1
  201. package/dist/types/primitives/button/button.types.d.mts +2 -2
  202. package/dist/types/primitives/button/button.types.d.ts +2 -2
  203. package/dist/types/primitives/button/index.d.mts +4 -5
  204. package/dist/types/primitives/button/index.d.ts +4 -5
  205. package/dist/types/primitives/calendar/index.d.mts +4 -4
  206. package/dist/types/primitives/calendar/index.d.ts +4 -4
  207. package/dist/types/primitives/card/index.d.mts +4 -5
  208. package/dist/types/primitives/card/index.d.ts +4 -5
  209. package/dist/types/primitives/chart/chart-type-switch.d.mts +4 -5
  210. package/dist/types/primitives/chart/chart-type-switch.d.ts +4 -5
  211. package/dist/types/primitives/chart/index.d.mts +4 -5
  212. package/dist/types/primitives/chart/index.d.ts +4 -5
  213. package/dist/types/primitives/chart/probability-chart.d.mts +2 -2
  214. package/dist/types/primitives/chart/probability-chart.d.ts +2 -2
  215. package/dist/types/primitives/chart/probability-live-tail.d.mts +1 -1
  216. package/dist/types/primitives/chart/probability-live-tail.d.ts +1 -1
  217. package/dist/types/primitives/conditional-wrapper.d.mts +6 -7
  218. package/dist/types/primitives/conditional-wrapper.d.ts +6 -7
  219. package/dist/types/primitives/copy-button/index.d.mts +4 -5
  220. package/dist/types/primitives/copy-button/index.d.ts +4 -5
  221. package/dist/types/primitives/currency-input/index.d.mts +4 -5
  222. package/dist/types/primitives/currency-input/index.d.ts +4 -5
  223. package/dist/types/primitives/footer/agg-build-logo.d.mts +12 -15
  224. package/dist/types/primitives/footer/agg-build-logo.d.ts +12 -15
  225. package/dist/types/primitives/footer/index.d.mts +4 -6
  226. package/dist/types/primitives/footer/index.d.ts +4 -6
  227. package/dist/types/primitives/header/index.d.mts +4 -6
  228. package/dist/types/primitives/header/index.d.ts +4 -6
  229. package/dist/types/primitives/icon/index.d.mts +4 -5
  230. package/dist/types/primitives/icon/index.d.ts +4 -5
  231. package/dist/types/primitives/icon/registry.d.mts +180 -351
  232. package/dist/types/primitives/icon/registry.d.ts +180 -351
  233. package/dist/types/primitives/icon/svg/activity-chart.d.mts +4 -4
  234. package/dist/types/primitives/icon/svg/activity-chart.d.ts +4 -4
  235. package/dist/types/primitives/icon/svg/activity.d.mts +4 -4
  236. package/dist/types/primitives/icon/svg/activity.d.ts +4 -4
  237. package/dist/types/primitives/icon/svg/apple.d.mts +4 -4
  238. package/dist/types/primitives/icon/svg/apple.d.ts +4 -4
  239. package/dist/types/primitives/icon/svg/apps.d.mts +4 -4
  240. package/dist/types/primitives/icon/svg/apps.d.ts +4 -4
  241. package/dist/types/primitives/icon/svg/arbitrum.d.mts +4 -4
  242. package/dist/types/primitives/icon/svg/arbitrum.d.ts +4 -4
  243. package/dist/types/primitives/icon/svg/arrow-right.d.mts +4 -4
  244. package/dist/types/primitives/icon/svg/arrow-right.d.ts +4 -4
  245. package/dist/types/primitives/icon/svg/arrow-trend-up.d.mts +4 -4
  246. package/dist/types/primitives/icon/svg/arrow-trend-up.d.ts +4 -4
  247. package/dist/types/primitives/icon/svg/arrows-to-dot.d.mts +4 -4
  248. package/dist/types/primitives/icon/svg/arrows-to-dot.d.ts +4 -4
  249. package/dist/types/primitives/icon/svg/badge-check-thin.d.mts +4 -4
  250. package/dist/types/primitives/icon/svg/badge-check-thin.d.ts +4 -4
  251. package/dist/types/primitives/icon/svg/bank.d.mts +4 -4
  252. package/dist/types/primitives/icon/svg/bank.d.ts +4 -4
  253. package/dist/types/primitives/icon/svg/base.d.mts +4 -4
  254. package/dist/types/primitives/icon/svg/base.d.ts +4 -4
  255. package/dist/types/primitives/icon/svg/best-prices.d.mts +4 -4
  256. package/dist/types/primitives/icon/svg/best-prices.d.ts +4 -4
  257. package/dist/types/primitives/icon/svg/bnb.d.mts +4 -4
  258. package/dist/types/primitives/icon/svg/bnb.d.ts +4 -4
  259. package/dist/types/primitives/icon/svg/bolt.d.mts +4 -4
  260. package/dist/types/primitives/icon/svg/bolt.d.ts +4 -4
  261. package/dist/types/primitives/icon/svg/calendar.d.mts +1 -1
  262. package/dist/types/primitives/icon/svg/calendar.d.ts +1 -1
  263. package/dist/types/primitives/icon/svg/chart-candlestick.d.mts +4 -4
  264. package/dist/types/primitives/icon/svg/chart-candlestick.d.ts +4 -4
  265. package/dist/types/primitives/icon/svg/chart-line.d.mts +4 -4
  266. package/dist/types/primitives/icon/svg/chart-line.d.ts +4 -4
  267. package/dist/types/primitives/icon/svg/check-badge.d.mts +4 -4
  268. package/dist/types/primitives/icon/svg/check-badge.d.ts +4 -4
  269. package/dist/types/primitives/icon/svg/check-circle.d.mts +4 -4
  270. package/dist/types/primitives/icon/svg/check-circle.d.ts +4 -4
  271. package/dist/types/primitives/icon/svg/chevron-down-thin.d.mts +4 -5
  272. package/dist/types/primitives/icon/svg/chevron-down-thin.d.ts +4 -5
  273. package/dist/types/primitives/icon/svg/chevron-down.d.mts +4 -4
  274. package/dist/types/primitives/icon/svg/chevron-down.d.ts +4 -4
  275. package/dist/types/primitives/icon/svg/chevron-left.d.mts +4 -4
  276. package/dist/types/primitives/icon/svg/chevron-left.d.ts +4 -4
  277. package/dist/types/primitives/icon/svg/chevron-right.d.mts +4 -4
  278. package/dist/types/primitives/icon/svg/chevron-right.d.ts +4 -4
  279. package/dist/types/primitives/icon/svg/chevron-up.d.mts +4 -4
  280. package/dist/types/primitives/icon/svg/chevron-up.d.ts +4 -4
  281. package/dist/types/primitives/icon/svg/circle-overlap.d.mts +4 -4
  282. package/dist/types/primitives/icon/svg/circle-overlap.d.ts +4 -4
  283. package/dist/types/primitives/icon/svg/circle-xmark.d.mts +4 -4
  284. package/dist/types/primitives/icon/svg/circle-xmark.d.ts +4 -4
  285. package/dist/types/primitives/icon/svg/close.d.mts +4 -4
  286. package/dist/types/primitives/icon/svg/close.d.ts +4 -4
  287. package/dist/types/primitives/icon/svg/copy.d.mts +4 -4
  288. package/dist/types/primitives/icon/svg/copy.d.ts +4 -4
  289. package/dist/types/primitives/icon/svg/create-account.d.mts +4 -4
  290. package/dist/types/primitives/icon/svg/create-account.d.ts +4 -4
  291. package/dist/types/primitives/icon/svg/credit-card.d.mts +4 -4
  292. package/dist/types/primitives/icon/svg/credit-card.d.ts +4 -4
  293. package/dist/types/primitives/icon/svg/cross-circle.d.mts +4 -4
  294. package/dist/types/primitives/icon/svg/cross-circle.d.ts +4 -4
  295. package/dist/types/primitives/icon/svg/disconnect.d.mts +4 -4
  296. package/dist/types/primitives/icon/svg/disconnect.d.ts +4 -4
  297. package/dist/types/primitives/icon/svg/discord.d.mts +4 -4
  298. package/dist/types/primitives/icon/svg/discord.d.ts +4 -4
  299. package/dist/types/primitives/icon/svg/document.d.mts +4 -4
  300. package/dist/types/primitives/icon/svg/document.d.ts +4 -4
  301. package/dist/types/primitives/icon/svg/dots-horizontal.d.mts +4 -4
  302. package/dist/types/primitives/icon/svg/dots-horizontal.d.ts +4 -4
  303. package/dist/types/primitives/icon/svg/download.d.mts +4 -4
  304. package/dist/types/primitives/icon/svg/download.d.ts +4 -4
  305. package/dist/types/primitives/icon/svg/email.d.mts +4 -4
  306. package/dist/types/primitives/icon/svg/email.d.ts +4 -4
  307. package/dist/types/primitives/icon/svg/error-filled.d.mts +4 -4
  308. package/dist/types/primitives/icon/svg/error-filled.d.ts +4 -4
  309. package/dist/types/primitives/icon/svg/ethereum.d.mts +4 -4
  310. package/dist/types/primitives/icon/svg/ethereum.d.ts +4 -4
  311. package/dist/types/primitives/icon/svg/external-link.d.mts +4 -4
  312. package/dist/types/primitives/icon/svg/external-link.d.ts +4 -4
  313. package/dist/types/primitives/icon/svg/gift-bonus.d.mts +4 -4
  314. package/dist/types/primitives/icon/svg/gift-bonus.d.ts +4 -4
  315. package/dist/types/primitives/icon/svg/google.d.mts +4 -4
  316. package/dist/types/primitives/icon/svg/google.d.ts +4 -4
  317. package/dist/types/primitives/icon/svg/hourglass-start.d.mts +4 -4
  318. package/dist/types/primitives/icon/svg/hourglass-start.d.ts +4 -4
  319. package/dist/types/primitives/icon/svg/image.d.mts +4 -4
  320. package/dist/types/primitives/icon/svg/image.d.ts +4 -4
  321. package/dist/types/primitives/icon/svg/info.d.mts +4 -4
  322. package/dist/types/primitives/icon/svg/info.d.ts +4 -4
  323. package/dist/types/primitives/icon/svg/internet-security.d.mts +4 -4
  324. package/dist/types/primitives/icon/svg/internet-security.d.ts +4 -4
  325. package/dist/types/primitives/icon/svg/link-accounts.d.mts +4 -4
  326. package/dist/types/primitives/icon/svg/link-accounts.d.ts +4 -4
  327. package/dist/types/primitives/icon/svg/lock.d.mts +4 -4
  328. package/dist/types/primitives/icon/svg/lock.d.ts +4 -4
  329. package/dist/types/primitives/icon/svg/minus.d.mts +1 -1
  330. package/dist/types/primitives/icon/svg/minus.d.ts +1 -1
  331. package/dist/types/primitives/icon/svg/paper-buying-power.d.mts +4 -10
  332. package/dist/types/primitives/icon/svg/paper-buying-power.d.ts +4 -10
  333. package/dist/types/primitives/icon/svg/paper-earnings.d.mts +4 -10
  334. package/dist/types/primitives/icon/svg/paper-earnings.d.ts +4 -10
  335. package/dist/types/primitives/icon/svg/paper-mode.d.mts +4 -4
  336. package/dist/types/primitives/icon/svg/paper-mode.d.ts +4 -4
  337. package/dist/types/primitives/icon/svg/paper-onboarding-funds.d.mts +4 -11
  338. package/dist/types/primitives/icon/svg/paper-onboarding-funds.d.ts +4 -11
  339. package/dist/types/primitives/icon/svg/paper-onboarding-markets.d.mts +4 -11
  340. package/dist/types/primitives/icon/svg/paper-onboarding-markets.d.ts +4 -11
  341. package/dist/types/primitives/icon/svg/paper-onboarding-performance.d.mts +4 -11
  342. package/dist/types/primitives/icon/svg/paper-onboarding-performance.d.ts +4 -11
  343. package/dist/types/primitives/icon/svg/paper-plane.d.mts +4 -4
  344. package/dist/types/primitives/icon/svg/paper-plane.d.ts +4 -4
  345. package/dist/types/primitives/icon/svg/pencil.d.mts +4 -4
  346. package/dist/types/primitives/icon/svg/pencil.d.ts +4 -4
  347. package/dist/types/primitives/icon/svg/play-square.d.mts +4 -4
  348. package/dist/types/primitives/icon/svg/play-square.d.ts +4 -4
  349. package/dist/types/primitives/icon/svg/plus.d.mts +1 -1
  350. package/dist/types/primitives/icon/svg/plus.d.ts +1 -1
  351. package/dist/types/primitives/icon/svg/polygon.d.mts +4 -4
  352. package/dist/types/primitives/icon/svg/polygon.d.ts +4 -4
  353. package/dist/types/primitives/icon/svg/profile-about-tab.d.mts +4 -5
  354. package/dist/types/primitives/icon/svg/profile-about-tab.d.ts +4 -5
  355. package/dist/types/primitives/icon/svg/profile-accounts-wallets-tab.d.mts +4 -5
  356. package/dist/types/primitives/icon/svg/profile-accounts-wallets-tab.d.ts +4 -5
  357. package/dist/types/primitives/icon/svg/profile.d.mts +4 -4
  358. package/dist/types/primitives/icon/svg/profile.d.ts +4 -4
  359. package/dist/types/primitives/icon/svg/quotes-warning.d.mts +4 -5
  360. package/dist/types/primitives/icon/svg/quotes-warning.d.ts +4 -5
  361. package/dist/types/primitives/icon/svg/recenter.d.mts +4 -4
  362. package/dist/types/primitives/icon/svg/recenter.d.ts +4 -4
  363. package/dist/types/primitives/icon/svg/revenue-alt.d.mts +4 -4
  364. package/dist/types/primitives/icon/svg/revenue-alt.d.ts +4 -4
  365. package/dist/types/primitives/icon/svg/search.d.mts +4 -4
  366. package/dist/types/primitives/icon/svg/search.d.ts +4 -4
  367. package/dist/types/primitives/icon/svg/shield-trust.d.mts +4 -4
  368. package/dist/types/primitives/icon/svg/shield-trust.d.ts +4 -4
  369. package/dist/types/primitives/icon/svg/solana.d.mts +4 -4
  370. package/dist/types/primitives/icon/svg/solana.d.ts +4 -4
  371. package/dist/types/primitives/icon/svg/sort-end-date.d.mts +4 -4
  372. package/dist/types/primitives/icon/svg/sort-end-date.d.ts +4 -4
  373. package/dist/types/primitives/icon/svg/sort-top-arbitrage.d.mts +4 -4
  374. package/dist/types/primitives/icon/svg/sort-top-arbitrage.d.ts +4 -4
  375. package/dist/types/primitives/icon/svg/sort-volume-24hr.d.mts +4 -4
  376. package/dist/types/primitives/icon/svg/sort-volume-24hr.d.ts +4 -4
  377. package/dist/types/primitives/icon/svg/sort-volume.d.mts +4 -4
  378. package/dist/types/primitives/icon/svg/sort-volume.d.ts +4 -4
  379. package/dist/types/primitives/icon/svg/sparkles-filled.d.mts +4 -4
  380. package/dist/types/primitives/icon/svg/sparkles-filled.d.ts +4 -4
  381. package/dist/types/primitives/icon/svg/spinner.d.mts +4 -4
  382. package/dist/types/primitives/icon/svg/spinner.d.ts +4 -4
  383. package/dist/types/primitives/icon/svg/stay-in-control.d.mts +4 -4
  384. package/dist/types/primitives/icon/svg/stay-in-control.d.ts +4 -4
  385. package/dist/types/primitives/icon/svg/success-check.d.mts +4 -4
  386. package/dist/types/primitives/icon/svg/success-check.d.ts +4 -4
  387. package/dist/types/primitives/icon/svg/telegram.d.mts +4 -4
  388. package/dist/types/primitives/icon/svg/telegram.d.ts +4 -4
  389. package/dist/types/primitives/icon/svg/triangle-down.d.mts +4 -4
  390. package/dist/types/primitives/icon/svg/triangle-down.d.ts +4 -4
  391. package/dist/types/primitives/icon/svg/triangle-up-filled.d.mts +4 -4
  392. package/dist/types/primitives/icon/svg/triangle-up-filled.d.ts +4 -4
  393. package/dist/types/primitives/icon/svg/triangle-up.d.mts +4 -4
  394. package/dist/types/primitives/icon/svg/triangle-up.d.ts +4 -4
  395. package/dist/types/primitives/icon/svg/twitter.d.mts +4 -4
  396. package/dist/types/primitives/icon/svg/twitter.d.ts +4 -4
  397. package/dist/types/primitives/icon/svg/upload.d.mts +4 -4
  398. package/dist/types/primitives/icon/svg/upload.d.ts +4 -4
  399. package/dist/types/primitives/icon/svg/usdc.d.mts +4 -4
  400. package/dist/types/primitives/icon/svg/usdc.d.ts +4 -4
  401. package/dist/types/primitives/icon/svg/user-trust.d.mts +4 -4
  402. package/dist/types/primitives/icon/svg/user-trust.d.ts +4 -4
  403. package/dist/types/primitives/icon/svg/wallet-avatar.d.mts +1 -1
  404. package/dist/types/primitives/icon/svg/wallet-avatar.d.ts +1 -1
  405. package/dist/types/primitives/icon/svg/wallet-filled.d.mts +4 -4
  406. package/dist/types/primitives/icon/svg/wallet-filled.d.ts +4 -4
  407. package/dist/types/primitives/icon/svg/wallet.d.mts +4 -4
  408. package/dist/types/primitives/icon/svg/wallet.d.ts +4 -4
  409. package/dist/types/primitives/icon/svg/warning-filled.d.mts +4 -4
  410. package/dist/types/primitives/icon/svg/warning-filled.d.ts +4 -4
  411. package/dist/types/primitives/icon/svg/warning.d.mts +4 -4
  412. package/dist/types/primitives/icon/svg/warning.d.ts +4 -4
  413. package/dist/types/primitives/inline-alert/index.d.mts +4 -5
  414. package/dist/types/primitives/inline-alert/index.d.ts +4 -5
  415. package/dist/types/primitives/loading-icon/index.d.mts +4 -5
  416. package/dist/types/primitives/loading-icon/index.d.ts +4 -5
  417. package/dist/types/primitives/modal/index.d.mts +12 -9
  418. package/dist/types/primitives/modal/index.d.ts +12 -9
  419. package/dist/types/primitives/number-value.d.mts +4 -4
  420. package/dist/types/primitives/number-value.d.ts +4 -4
  421. package/dist/types/primitives/remote-image/index.d.mts +4 -5
  422. package/dist/types/primitives/remote-image/index.d.ts +4 -5
  423. package/dist/types/primitives/search/index.d.mts +4 -5
  424. package/dist/types/primitives/search/index.d.ts +4 -5
  425. package/dist/types/primitives/search/search-empty-icon.d.mts +4 -4
  426. package/dist/types/primitives/search/search-empty-icon.d.ts +4 -4
  427. package/dist/types/primitives/select/index.d.mts +4 -5
  428. package/dist/types/primitives/select/index.d.ts +4 -5
  429. package/dist/types/primitives/skeleton/index.d.mts +4 -5
  430. package/dist/types/primitives/skeleton/index.d.ts +4 -5
  431. package/dist/types/primitives/skeleton/skeleton-block.d.mts +4 -4
  432. package/dist/types/primitives/skeleton/skeleton-block.d.ts +4 -4
  433. package/dist/types/primitives/skeleton/views/event-list-item-details-skeleton-view.d.mts +4 -4
  434. package/dist/types/primitives/skeleton/views/event-list-item-details-skeleton-view.d.ts +4 -4
  435. package/dist/types/primitives/skeleton/views/event-list-item-skeleton-view.d.mts +4 -10
  436. package/dist/types/primitives/skeleton/views/event-list-item-skeleton-view.d.ts +4 -10
  437. package/dist/types/primitives/skeleton/views/event-list-skeleton-view.d.mts +4 -4
  438. package/dist/types/primitives/skeleton/views/event-list-skeleton-view.d.ts +4 -4
  439. package/dist/types/primitives/skeleton/views/market-details-skeleton-view.d.mts +5 -5
  440. package/dist/types/primitives/skeleton/views/market-details-skeleton-view.d.ts +5 -5
  441. package/dist/types/primitives/skeleton/views/place-order-skeleton-view.d.mts +8 -8
  442. package/dist/types/primitives/skeleton/views/place-order-skeleton-view.d.ts +8 -8
  443. package/dist/types/primitives/skeleton/views/search-skeleton-view.d.mts +4 -4
  444. package/dist/types/primitives/skeleton/views/search-skeleton-view.d.ts +4 -4
  445. package/dist/types/primitives/skeleton/views/settlement-skeleton-view.d.mts +4 -4
  446. package/dist/types/primitives/skeleton/views/settlement-skeleton-view.d.ts +4 -4
  447. package/dist/types/primitives/skeleton/views/user-profile-overview-skeleton-view.d.mts +4 -4
  448. package/dist/types/primitives/skeleton/views/user-profile-overview-skeleton-view.d.ts +4 -4
  449. package/dist/types/primitives/skeleton/views/user-profile-positions-activity-skeleton-view.d.mts +4 -4
  450. package/dist/types/primitives/skeleton/views/user-profile-positions-activity-skeleton-view.d.ts +4 -4
  451. package/dist/types/primitives/state-message/index.d.mts +4 -5
  452. package/dist/types/primitives/state-message/index.d.ts +4 -5
  453. package/dist/types/primitives/switch-button/index.d.mts +4 -5
  454. package/dist/types/primitives/switch-button/index.d.ts +4 -5
  455. package/dist/types/primitives/tabs/index.d.mts +4 -5
  456. package/dist/types/primitives/tabs/index.d.ts +4 -5
  457. package/dist/types/primitives/toast/index.d.mts +1 -1
  458. package/dist/types/primitives/toast/index.d.ts +1 -1
  459. package/dist/types/primitives/tooltip/index.d.mts +4 -5
  460. package/dist/types/primitives/tooltip/index.d.ts +4 -5
  461. package/dist/types/primitives/typography/index.d.mts +4 -5
  462. package/dist/types/primitives/typography/index.d.ts +4 -5
  463. package/dist/types/primitives/typography/typography.types.d.mts +1 -1
  464. package/dist/types/primitives/typography/typography.types.d.ts +1 -1
  465. package/dist/types/primitives/venue-logo/index.d.mts +4 -5
  466. package/dist/types/primitives/venue-logo/index.d.ts +4 -5
  467. package/dist/types/primitives/venue-logo/svg/default-venue.d.mts +1 -1
  468. package/dist/types/primitives/venue-logo/svg/default-venue.d.ts +1 -1
  469. package/dist/types/primitives/venue-logo/svg/logo-betdex.d.mts +1 -1
  470. package/dist/types/primitives/venue-logo/svg/logo-betdex.d.ts +1 -1
  471. package/dist/types/primitives/venue-logo/svg/logo-hyperliquid.d.mts +4 -4
  472. package/dist/types/primitives/venue-logo/svg/logo-hyperliquid.d.ts +4 -4
  473. package/dist/types/primitives/venue-logo/svg/logo-kalshi.d.mts +4 -4
  474. package/dist/types/primitives/venue-logo/svg/logo-kalshi.d.ts +4 -4
  475. package/dist/types/primitives/venue-logo/svg/logo-limitless.d.mts +4 -4
  476. package/dist/types/primitives/venue-logo/svg/logo-limitless.d.ts +4 -4
  477. package/dist/types/primitives/venue-logo/svg/logo-myriad.d.mts +4 -4
  478. package/dist/types/primitives/venue-logo/svg/logo-myriad.d.ts +4 -4
  479. package/dist/types/primitives/venue-logo/svg/logo-novig.d.mts +4 -23
  480. package/dist/types/primitives/venue-logo/svg/logo-novig.d.ts +4 -23
  481. package/dist/types/primitives/venue-logo/svg/logo-opinion.d.mts +4 -4
  482. package/dist/types/primitives/venue-logo/svg/logo-opinion.d.ts +4 -4
  483. package/dist/types/primitives/venue-logo/svg/logo-polymarket.d.mts +4 -4
  484. package/dist/types/primitives/venue-logo/svg/logo-polymarket.d.ts +4 -4
  485. package/dist/types/primitives/venue-logo/svg/logo-pred.d.mts +4 -5
  486. package/dist/types/primitives/venue-logo/svg/logo-pred.d.ts +4 -5
  487. package/dist/types/primitives/venue-logo/svg/logo-predict.d.mts +4 -4
  488. package/dist/types/primitives/venue-logo/svg/logo-predict.d.ts +4 -4
  489. package/dist/types/primitives/venue-logo/svg/logo-probable.d.mts +4 -4
  490. package/dist/types/primitives/venue-logo/svg/logo-probable.d.ts +4 -4
  491. package/dist/types/primitives/venue-logo/svg/logo-prophetx.d.mts +4 -26
  492. package/dist/types/primitives/venue-logo/svg/logo-prophetx.d.ts +4 -26
  493. package/dist/types/primitives/venue-logo/svg/logo-tiprun.d.mts +4 -5
  494. package/dist/types/primitives/venue-logo/svg/logo-tiprun.d.ts +4 -5
  495. package/dist/types/primitives/venue-logo/venue-logo.constants.d.mts +1 -1
  496. package/dist/types/primitives/venue-logo/venue-logo.constants.d.ts +1 -1
  497. package/dist/types/profile/index.d.mts +4 -4
  498. package/dist/types/profile/index.d.ts +4 -4
  499. package/dist/types/profile/tabs/about-tab.d.mts +4 -4
  500. package/dist/types/profile/tabs/about-tab.d.ts +4 -4
  501. package/dist/types/profile/tabs/accounts-wallets-tab.d.mts +4 -4
  502. package/dist/types/profile/tabs/accounts-wallets-tab.d.ts +4 -4
  503. package/dist/types/profile/tabs/trading-access-tab.d.mts +4 -4
  504. package/dist/types/profile/tabs/trading-access-tab.d.ts +4 -4
  505. package/dist/types/shared/default-avatar.d.mts +4 -4
  506. package/dist/types/shared/default-avatar.d.ts +4 -4
  507. package/dist/types/shared/open-orders.d.mts +1 -1
  508. package/dist/types/shared/open-orders.d.ts +1 -1
  509. package/dist/types/shared/react-inert.d.mts +1 -0
  510. package/dist/types/shared/react-inert.d.ts +1 -0
  511. package/dist/types/shared/transfer-fee-summary.d.mts +1 -1
  512. package/dist/types/shared/transfer-fee-summary.d.ts +1 -1
  513. package/dist/types/trading/fund-kalshi-modal.d.mts +4 -4
  514. package/dist/types/trading/fund-kalshi-modal.d.ts +4 -4
  515. package/dist/types/trading/manage-betdex-account-modal.d.mts +1 -1
  516. package/dist/types/trading/manage-betdex-account-modal.d.ts +1 -1
  517. package/dist/types/trading/place-order/index.d.mts +4 -4
  518. package/dist/types/trading/place-order/index.d.ts +4 -4
  519. package/dist/types/trading/place-order/index.place-order.execution-view.d.mts +6 -6
  520. package/dist/types/trading/place-order/index.place-order.execution-view.d.ts +6 -6
  521. package/dist/types/trading/place-order/index.place-order.failure.d.mts +4 -4
  522. package/dist/types/trading/place-order/index.place-order.failure.d.ts +4 -4
  523. package/dist/types/trading/place-order/index.place-order.success.d.mts +4 -4
  524. package/dist/types/trading/place-order/index.place-order.success.d.ts +4 -4
  525. package/dist/types/trading/settlement/index.d.mts +4 -4
  526. package/dist/types/trading/settlement/index.d.ts +4 -4
  527. package/dist/types/trading/settlement/settlement-details.d.mts +4 -4
  528. package/dist/types/trading/settlement/settlement-details.d.ts +4 -4
  529. package/dist/types/trading/settlement/settlement-text-renderer.d.mts +4 -4
  530. package/dist/types/trading/settlement/settlement-text-renderer.d.ts +4 -4
  531. package/dist/types/withdraw/index.d.mts +4 -4
  532. package/dist/types/withdraw/index.d.ts +4 -4
  533. package/dist/types/withdraw/steps/withdraw-amount.d.mts +1 -1
  534. package/dist/types/withdraw/steps/withdraw-amount.d.ts +1 -1
  535. package/dist/types/withdraw/steps/withdraw-method.d.mts +1 -1
  536. package/dist/types/withdraw/steps/withdraw-method.d.ts +1 -1
  537. package/dist/types/withdraw/steps/withdraw-provider.d.mts +1 -1
  538. package/dist/types/withdraw/steps/withdraw-provider.d.ts +1 -1
  539. package/dist/types/withdraw/steps/withdraw-success.d.mts +2 -2
  540. package/dist/types/withdraw/steps/withdraw-success.d.ts +2 -2
  541. package/package.json +9 -8
  542. package/dist/chunk-6CZNJSRL.mjs +0 -3551
  543. package/dist/chunk-7G2GTWAS.mjs +0 -5189
  544. package/dist/chunk-7ORC3TUJ.mjs +0 -2883
  545. package/dist/chunk-EJXA32MG.mjs +0 -2377
  546. package/dist/chunk-JH4B3ZHQ.mjs +0 -1
  547. package/dist/chunk-KN7JN7F5.mjs +0 -8303
  548. package/dist/chunk-PN5HEBFC.mjs +0 -5789
  549. package/dist/chunk-W2LCFCW3.mjs +0 -2879
  550. package/dist/chunk-WOCZ4TVT.mjs +0 -1645
  551. package/dist/chunk-XZVGHKMW.mjs +0 -11426
  552. package/dist/event-market-A276CAYG.mjs +0 -21
@@ -0,0 +1,2294 @@
1
+ "use client";
2
+ import { $ as SkeletonBlock, Bn as getMotionClassName, Dt as WalletIcon, Fn as cn, Ln as formatCompactUsd, P as VenueLogo, Pt as SuccessCheckIcon, Zn as AGG_TERMS_OF_SERVICE_URL, bt as Icon, c as Typography, dn as CloseIcon, f as Modal, gt as Button, m as InlineAlert, mn as ChevronLeftIcon, p as LoadingIcon, pn as ChevronRightIcon, t as Tooltip, u as Select, zn as formatUsd } from "./primitives-Dz5aF8ma.mjs";
3
+ import { useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
4
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
5
+ import { getVenueAvailabilityState, useAppConfig, useDepositAddresses, useHostedVenueAccount, useHostedVenueActivity, useHostedVenueTransfers, useLabels, useSdkUiConfig, useWithdrawPreview } from "@agg-build/hooks";
6
+ import { Venue as Venue$1 } from "@agg-build/sdk";
7
+ import * as Dialog from "@radix-ui/react-dialog";
8
+ import { z } from "zod";
9
+ import { useWithdrawFlow, useWithdrawalLifecycle } from "@agg-build/hooks/withdraw";
10
+ //#region src/notifications/deposit-notification-events.ts
11
+ const AGG_DEPOSIT_NOTIFICATION_EVENT = "agg:deposit-notification";
12
+ const dispatchAggDepositNotification = (detail) => {
13
+ if (typeof window === "undefined") return;
14
+ window.dispatchEvent(new CustomEvent(AGG_DEPOSIT_NOTIFICATION_EVENT, { detail }));
15
+ };
16
+ const subscribeAggDepositNotification = (handler) => {
17
+ if (typeof window === "undefined") return () => {};
18
+ const handleDepositNotification = (event) => {
19
+ if (!(event instanceof CustomEvent)) return;
20
+ handler(event.detail);
21
+ };
22
+ window.addEventListener(AGG_DEPOSIT_NOTIFICATION_EVENT, handleDepositNotification);
23
+ return () => {
24
+ window.removeEventListener(AGG_DEPOSIT_NOTIFICATION_EVENT, handleDepositNotification);
25
+ };
26
+ };
27
+ //#endregion
28
+ //#region src/geo-block-banner/index.tsx
29
+ const GeoBlockBanner = ({ venue, termsUrl = AGG_TERMS_OF_SERVICE_URL, className }) => {
30
+ const labels = useLabels();
31
+ const message = venue ? labels.trading.geoBlockVenueMessage(venue) : labels.trading.geoBlockGenericMessage;
32
+ return /* @__PURE__ */ jsxs("div", {
33
+ className: cn("flex items-center gap-5 rounded-agg-lg bg-agg-secondary-hover p-3", className),
34
+ role: "status",
35
+ children: [/* @__PURE__ */ jsxs("p", {
36
+ className: "min-w-0 flex-1 text-agg-xs leading-agg-4 text-agg-foreground",
37
+ children: [
38
+ message,
39
+ /* @__PURE__ */ jsx("a", {
40
+ href: termsUrl,
41
+ className: "underline",
42
+ target: "_blank",
43
+ rel: "noreferrer noopener",
44
+ children: labels.trading.geoBlockTermsLink
45
+ }),
46
+ labels.trading.geoBlockMessageSuffix
47
+ ]
48
+ }), /* @__PURE__ */ jsx(Icon, {
49
+ name: "internet-security",
50
+ className: "h-6 w-6 shrink-0 text-agg-muted-foreground"
51
+ })]
52
+ });
53
+ };
54
+ GeoBlockBanner.displayName = "GeoBlockBanner";
55
+ //#endregion
56
+ //#region src/kyc/shared-kyc-modal.tsx
57
+ const SharedKycModal = ({ open, state = "initial", errorMessage, onOpenChange, onStartVerification }) => {
58
+ const labels = useLabels();
59
+ const modalLabels = labels.trading.sharedKyc.modal;
60
+ const isInitiating = state === "initiating";
61
+ const handleOpenChange = (nextOpen) => {
62
+ if (isInitiating && !nextOpen) return;
63
+ onOpenChange(nextOpen);
64
+ };
65
+ return /* @__PURE__ */ jsx(Modal, {
66
+ open,
67
+ onOpenChange: handleOpenChange,
68
+ children: /* @__PURE__ */ jsxs(Modal.Container, {
69
+ maxWidth: "420px",
70
+ "aria-label": modalLabels.ariaLabel,
71
+ classNames: { container: "!rounded-agg-2xl" },
72
+ children: [/* @__PURE__ */ jsx("div", {
73
+ className: "flex h-14 shrink-0 items-center justify-end px-5",
74
+ children: /* @__PURE__ */ jsx(Dialog.Close, {
75
+ "aria-label": labels.common.close,
76
+ disabled: isInitiating,
77
+ className: "flex size-11 cursor-pointer items-center justify-center rounded-agg-full text-agg-foreground hover:bg-agg-secondary-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary disabled:cursor-not-allowed disabled:opacity-50",
78
+ children: /* @__PURE__ */ jsx(Icon, {
79
+ name: "close",
80
+ size: "small",
81
+ "aria-hidden": "true"
82
+ })
83
+ })
84
+ }), /* @__PURE__ */ jsx(Modal.Body, {
85
+ classNames: { root: "!px-8 !pb-9 !pt-0" },
86
+ children: state === "success" ? /* @__PURE__ */ jsxs("div", {
87
+ className: "flex flex-col items-center gap-6 text-center",
88
+ role: "status",
89
+ "aria-live": "polite",
90
+ children: [
91
+ /* @__PURE__ */ jsx("div", {
92
+ className: "flex size-12 items-center justify-center rounded-agg-full border border-agg-success bg-agg-success/10 text-agg-success",
93
+ children: /* @__PURE__ */ jsx(Icon, {
94
+ name: "success-check",
95
+ className: "size-5",
96
+ "aria-hidden": "true"
97
+ })
98
+ }),
99
+ /* @__PURE__ */ jsxs("div", {
100
+ className: "flex flex-col items-center gap-2",
101
+ children: [/* @__PURE__ */ jsx(Dialog.Title, { children: /* @__PURE__ */ jsx(Typography, {
102
+ as: "span",
103
+ variant: "body-large-strong",
104
+ children: modalLabels.successTitle
105
+ }) }), /* @__PURE__ */ jsx(Dialog.Description, { children: /* @__PURE__ */ jsx(Typography, {
106
+ as: "span",
107
+ variant: "label",
108
+ className: "text-pretty text-agg-foreground",
109
+ children: modalLabels.successDescription
110
+ }) })]
111
+ }),
112
+ /* @__PURE__ */ jsx(Button, {
113
+ variant: "secondary",
114
+ size: "large",
115
+ onClick: () => handleOpenChange(false),
116
+ children: modalLabels.done
117
+ })
118
+ ]
119
+ }) : /* @__PURE__ */ jsxs("div", {
120
+ className: "flex flex-col items-center gap-6 text-center",
121
+ children: [
122
+ /* @__PURE__ */ jsx(Icon, {
123
+ name: "user-trust",
124
+ className: "h-12! w-12! text-agg-muted-foreground",
125
+ "aria-hidden": "true"
126
+ }),
127
+ /* @__PURE__ */ jsxs("div", {
128
+ className: "flex flex-col items-center gap-2",
129
+ children: [/* @__PURE__ */ jsx(Dialog.Title, { children: /* @__PURE__ */ jsx(Typography, {
130
+ as: "span",
131
+ variant: "body-large-strong",
132
+ children: state === "pending" ? modalLabels.pendingTitle : modalLabels.title
133
+ }) }), /* @__PURE__ */ jsx(Dialog.Description, { children: /* @__PURE__ */ jsx(Typography, {
134
+ as: "span",
135
+ variant: "label",
136
+ className: "text-pretty text-agg-foreground",
137
+ children: state === "pending" ? modalLabels.pendingDescription : modalLabels.freeDescription
138
+ }) })]
139
+ }),
140
+ state === "error" || state === "pending" && errorMessage ? /* @__PURE__ */ jsx(InlineAlert, {
141
+ tone: "error",
142
+ variant: "surface",
143
+ message: errorMessage || modalLabels.error
144
+ }) : null,
145
+ /* @__PURE__ */ jsxs("div", {
146
+ className: "flex flex-col items-center gap-4",
147
+ children: [/* @__PURE__ */ jsx(Button, {
148
+ variant: "primary",
149
+ size: "large",
150
+ isLoading: isInitiating,
151
+ disabled: isInitiating,
152
+ "aria-label": state === "pending" ? modalLabels.checkStatus : modalLabels.startVerification,
153
+ onClick: onStartVerification,
154
+ children: state === "pending" ? modalLabels.checkStatus : modalLabels.startVerification
155
+ }), /* @__PURE__ */ jsx(Button, {
156
+ variant: "tertiary",
157
+ size: "large",
158
+ disabled: isInitiating,
159
+ onClick: () => handleOpenChange(false),
160
+ children: modalLabels.doItLater
161
+ })]
162
+ })
163
+ ]
164
+ })
165
+ })]
166
+ })
167
+ });
168
+ };
169
+ SharedKycModal.displayName = "SharedKycModal";
170
+ //#endregion
171
+ //#region src/onboarding/steps/connect-kalshi-modal.tsx
172
+ const kalshiCredentialsSchema = z.object({
173
+ apiKeyId: z.string().trim().min(1),
174
+ privateKey: z.string().trim().min(1)
175
+ });
176
+ const getSafeConnectionError = ({ apiKeyId, error, fallback, privateKey }) => {
177
+ if (!(error instanceof Error) || !error.message.trim()) return fallback;
178
+ return [apiKeyId, privateKey].filter(Boolean).reduce((message, sensitiveValue) => message.split(sensitiveValue).join("[redacted]"), error.message).trim();
179
+ };
180
+ const CloseButton = ({ className, disabled }) => {
181
+ const labels = useLabels();
182
+ return /* @__PURE__ */ jsx(Dialog.Close, {
183
+ "aria-label": labels.common.close,
184
+ disabled,
185
+ className: cn("z-30 flex size-6 cursor-pointer items-center justify-center rounded-agg-full", "text-agg-foreground transition-colors hover:text-agg-foreground/80", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-accent", "disabled:cursor-not-allowed disabled:opacity-50", className),
186
+ children: /* @__PURE__ */ jsx(Icon, {
187
+ name: "close",
188
+ size: "medium",
189
+ className: "!text-agg-foreground"
190
+ })
191
+ });
192
+ };
193
+ const ConnectKalshiModal = ({ open, onOpenChange, onVerify }) => {
194
+ const labels = useLabels();
195
+ const { disabledVenues, isLoading: isAppConfigLoading } = useAppConfig();
196
+ const apiKeyInputRef = useRef(null);
197
+ const errorId = useId();
198
+ const [apiKeyId, setApiKeyId] = useState("");
199
+ const [privateKey, setPrivateKey] = useState("");
200
+ const [isVerifying, setIsVerifying] = useState(false);
201
+ const [isConnected, setIsConnected] = useState(false);
202
+ const [error, setError] = useState();
203
+ const availabilityState = getVenueAvailabilityState({
204
+ venueId: Venue$1.kalshi,
205
+ disabledVenues,
206
+ isConfigLoading: isAppConfigLoading
207
+ });
208
+ const parsedCredentials = useMemo(() => kalshiCredentialsSchema.safeParse({
209
+ apiKeyId,
210
+ privateKey
211
+ }), [apiKeyId, privateKey]);
212
+ useEffect(() => {
213
+ if (!open) return;
214
+ setApiKeyId("");
215
+ setPrivateKey("");
216
+ setError(void 0);
217
+ setIsVerifying(false);
218
+ setIsConnected(false);
219
+ }, [open]);
220
+ const handleOpenAutoFocus = useCallback((event) => {
221
+ event.preventDefault();
222
+ apiKeyInputRef.current?.focus({ preventScroll: true });
223
+ }, []);
224
+ const handleOpenChange = useCallback((nextOpen) => {
225
+ if (isVerifying && !nextOpen) return;
226
+ onOpenChange(nextOpen);
227
+ }, [isVerifying, onOpenChange]);
228
+ const handleVerify = useCallback(async () => {
229
+ if (!parsedCredentials.success || isVerifying || isConnected) return;
230
+ const credentials = parsedCredentials.data;
231
+ setIsVerifying(true);
232
+ setError(void 0);
233
+ try {
234
+ await onVerify(credentials);
235
+ setApiKeyId("");
236
+ setPrivateKey("");
237
+ setIsConnected(true);
238
+ } catch (verificationError) {
239
+ setError(getSafeConnectionError({
240
+ ...credentials,
241
+ error: verificationError,
242
+ fallback: labels.onboarding.connectKalshiModal.fallbackError
243
+ }));
244
+ } finally {
245
+ setIsVerifying(false);
246
+ }
247
+ }, [
248
+ isConnected,
249
+ isVerifying,
250
+ labels.onboarding.connectKalshiModal.fallbackError,
251
+ onVerify,
252
+ parsedCredentials
253
+ ]);
254
+ const handleSubmit = useCallback((event) => {
255
+ event.preventDefault();
256
+ handleVerify();
257
+ }, [handleVerify]);
258
+ if (availabilityState === "hidden") return null;
259
+ return /* @__PURE__ */ jsx(Modal, {
260
+ open,
261
+ onOpenChange: handleOpenChange,
262
+ children: /* @__PURE__ */ jsx(Modal.Container, {
263
+ maxWidth: isConnected ? "480px" : "600px",
264
+ "aria-label": labels.onboarding.connectKalshiModal.ariaLabel,
265
+ classNames: { container: "!rounded-t-agg-xl !rounded-b-none md:!rounded-agg-2xl" },
266
+ onOpenAutoFocus: isConnected ? void 0 : handleOpenAutoFocus,
267
+ children: isConnected ? /* @__PURE__ */ jsxs(Modal.Body, {
268
+ classNames: { root: "relative !px-5 !py-8 md:!px-10 md:!py-12" },
269
+ children: [/* @__PURE__ */ jsx(CloseButton, { className: "absolute right-5 top-5 md:right-8 md:top-8" }), /* @__PURE__ */ jsxs("div", {
270
+ className: "flex flex-col items-center gap-8 text-center",
271
+ role: "status",
272
+ "aria-live": "polite",
273
+ children: [
274
+ /* @__PURE__ */ jsx("div", {
275
+ className: "flex size-[60px] items-center justify-center rounded-agg-full bg-agg-success/15",
276
+ children: /* @__PURE__ */ jsx(Icon, {
277
+ name: "success-check",
278
+ className: "size-6 text-agg-success",
279
+ "aria-hidden": "true"
280
+ })
281
+ }),
282
+ /* @__PURE__ */ jsxs("div", {
283
+ className: "flex flex-col items-center gap-3",
284
+ children: [/* @__PURE__ */ jsx(Dialog.Title, {
285
+ className: "text-agg-2xl font-agg-bold leading-agg-8 text-agg-foreground",
286
+ children: labels.onboarding.connectKalshiModal.success.title
287
+ }), /* @__PURE__ */ jsx(Dialog.Description, {
288
+ className: "text-agg-base leading-agg-6 text-agg-foreground",
289
+ children: labels.onboarding.connectKalshiModal.success.description
290
+ })]
291
+ }),
292
+ /* @__PURE__ */ jsx(Button, {
293
+ variant: "secondary",
294
+ size: "large",
295
+ onClick: () => handleOpenChange(false),
296
+ children: labels.onboarding.connectKalshiModal.success.done
297
+ })
298
+ ]
299
+ })]
300
+ }) : /* @__PURE__ */ jsxs("form", {
301
+ className: "flex min-h-0 flex-1 flex-col",
302
+ onSubmit: handleSubmit,
303
+ children: [/* @__PURE__ */ jsx(Modal.Body, {
304
+ classNames: { root: "relative !px-5 !pb-6 !pt-5 md:!px-10 md:!pb-0 md:!pt-12" },
305
+ children: /* @__PURE__ */ jsxs("div", {
306
+ className: "flex flex-col gap-6 md:items-center md:gap-0",
307
+ children: [
308
+ /* @__PURE__ */ jsxs("div", {
309
+ className: "flex w-full flex-col md:contents",
310
+ children: [/* @__PURE__ */ jsxs("div", {
311
+ className: "flex items-center gap-3 md:contents",
312
+ children: [
313
+ /* @__PURE__ */ jsx(VenueLogo, {
314
+ venue: Venue$1.kalshi,
315
+ variant: "logo",
316
+ size: "large",
317
+ className: "!size-10 md:!mb-8 md:!size-[60px]"
318
+ }),
319
+ /* @__PURE__ */ jsx(Dialog.Title, {
320
+ className: "text-agg-lg font-agg-bold leading-agg-7 text-agg-foreground md:mb-4 md:text-center md:text-agg-2xl md:leading-agg-8",
321
+ children: labels.onboarding.connectKalshiModal.title
322
+ }),
323
+ /* @__PURE__ */ jsx(CloseButton, {
324
+ disabled: isVerifying,
325
+ className: "ml-auto shrink-0 md:absolute md:right-8 md:top-8 md:ml-0"
326
+ })
327
+ ]
328
+ }), /* @__PURE__ */ jsx(Dialog.Description, {
329
+ className: "mt-3 text-agg-sm leading-agg-5 text-agg-foreground md:mb-8 md:mt-0 md:text-center md:text-agg-base md:leading-agg-6",
330
+ children: labels.onboarding.connectKalshiModal.description
331
+ })]
332
+ }),
333
+ /* @__PURE__ */ jsxs("div", {
334
+ className: "flex w-full flex-col gap-4",
335
+ children: [/* @__PURE__ */ jsxs("div", {
336
+ className: "flex flex-col gap-3 rounded-agg-xl bg-agg-secondary-hover p-4",
337
+ children: [
338
+ /* @__PURE__ */ jsxs("div", {
339
+ className: "flex flex-col gap-1",
340
+ children: [/* @__PURE__ */ jsx("p", {
341
+ className: "text-agg-xs font-agg-bold uppercase leading-agg-4 text-agg-muted-foreground",
342
+ children: labels.onboarding.connectKalshiModal.stepOne.label
343
+ }), /* @__PURE__ */ jsx("p", {
344
+ className: "text-agg-sm font-agg-bold leading-agg-5 text-agg-foreground",
345
+ children: labels.onboarding.connectKalshiModal.stepOne.title
346
+ })]
347
+ }),
348
+ /* @__PURE__ */ jsxs("div", {
349
+ className: "text-agg-sm leading-agg-5 text-agg-foreground",
350
+ children: [
351
+ /* @__PURE__ */ jsx("p", { children: labels.onboarding.connectKalshiModal.stepOne.instructions.signIn }),
352
+ /* @__PURE__ */ jsxs("p", { children: [
353
+ labels.onboarding.connectKalshiModal.stepOne.instructions.goToProfilePrefix,
354
+ " ",
355
+ /* @__PURE__ */ jsx("span", {
356
+ className: "font-agg-bold",
357
+ children: labels.onboarding.connectKalshiModal.stepOne.instructions.profileText
358
+ }),
359
+ labels.onboarding.connectKalshiModal.stepOne.instructions.goToProfileSeparator,
360
+ " ",
361
+ /* @__PURE__ */ jsx("a", {
362
+ href: labels.onboarding.connectKalshiModal.stepOne.instructions.profileUrl,
363
+ target: "_blank",
364
+ rel: "noreferrer",
365
+ className: "cursor-pointer underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary",
366
+ children: labels.onboarding.connectKalshiModal.stepOne.instructions.profileUrl
367
+ })
368
+ ] }),
369
+ /* @__PURE__ */ jsxs("p", { children: [
370
+ labels.onboarding.connectKalshiModal.stepOne.instructions.clickCreateKeyPrefix,
371
+ " ",
372
+ /* @__PURE__ */ jsx("span", {
373
+ className: "font-agg-bold",
374
+ children: labels.onboarding.connectKalshiModal.stepOne.instructions.createKeyText
375
+ }),
376
+ labels.onboarding.connectKalshiModal.stepOne.instructions.clickCreateKeySuffix
377
+ ] }),
378
+ /* @__PURE__ */ jsxs("p", { children: [
379
+ labels.onboarding.connectKalshiModal.stepOne.instructions.selectPermissionsPrefix,
380
+ " ",
381
+ /* @__PURE__ */ jsx("span", {
382
+ className: "font-agg-bold",
383
+ children: labels.onboarding.connectKalshiModal.stepOne.instructions.readWriteText
384
+ }),
385
+ labels.onboarding.connectKalshiModal.stepOne.instructions.selectPermissionsSuffix
386
+ ] }),
387
+ /* @__PURE__ */ jsx("p", { children: labels.onboarding.connectKalshiModal.stepOne.instructions.createKey })
388
+ ]
389
+ }),
390
+ /* @__PURE__ */ jsxs("p", {
391
+ className: "text-agg-sm leading-agg-5 text-agg-foreground",
392
+ children: [
393
+ labels.onboarding.connectKalshiModal.stepOne.footerLineOne,
394
+ /* @__PURE__ */ jsx("br", {}),
395
+ labels.onboarding.connectKalshiModal.stepOne.footerLineTwo
396
+ ]
397
+ })
398
+ ]
399
+ }), /* @__PURE__ */ jsxs("div", {
400
+ className: "flex flex-col gap-3 rounded-agg-xl bg-agg-secondary-hover p-4",
401
+ children: [
402
+ /* @__PURE__ */ jsxs("div", {
403
+ className: "flex flex-col gap-1",
404
+ children: [/* @__PURE__ */ jsx("p", {
405
+ className: "text-agg-xs font-agg-bold uppercase leading-agg-4 text-agg-muted-foreground",
406
+ children: labels.onboarding.connectKalshiModal.stepTwo.label
407
+ }), /* @__PURE__ */ jsx("p", {
408
+ className: "text-agg-sm font-agg-bold leading-agg-5 text-agg-foreground",
409
+ children: labels.onboarding.connectKalshiModal.stepTwo.title
410
+ })]
411
+ }),
412
+ /* @__PURE__ */ jsx("p", {
413
+ className: "text-agg-sm leading-agg-5 text-agg-foreground",
414
+ children: labels.onboarding.connectKalshiModal.stepTwo.description
415
+ }),
416
+ /* @__PURE__ */ jsxs("div", {
417
+ className: "flex flex-col gap-2",
418
+ children: [/* @__PURE__ */ jsx("label", {
419
+ htmlFor: "kalshi-api-key-id",
420
+ className: "text-agg-sm font-agg-bold text-agg-foreground",
421
+ children: labels.onboarding.connectKalshiModal.stepTwo.apiKeyIdLabel
422
+ }), /* @__PURE__ */ jsx("input", {
423
+ ref: apiKeyInputRef,
424
+ id: "kalshi-api-key-id",
425
+ type: "text",
426
+ autoComplete: "off",
427
+ value: apiKeyId,
428
+ onChange: (event) => setApiKeyId(event.target.value),
429
+ placeholder: labels.onboarding.connectKalshiModal.stepTwo.apiKeyIdPlaceholder,
430
+ disabled: isVerifying,
431
+ "aria-invalid": !!error,
432
+ "aria-describedby": error ? errorId : void 0,
433
+ className: cn("h-10 w-full rounded-agg-sm border border-agg-separator bg-agg-secondary px-3 py-2.5", "text-agg-base text-agg-foreground placeholder:text-agg-muted-foreground", "outline-none transition-colors focus:border-agg-primary focus:ring-1 focus:ring-agg-primary", "disabled:cursor-not-allowed disabled:opacity-60")
434
+ })]
435
+ }),
436
+ /* @__PURE__ */ jsxs("div", {
437
+ className: "flex flex-col gap-2",
438
+ children: [/* @__PURE__ */ jsx("label", {
439
+ htmlFor: "kalshi-private-key",
440
+ className: "text-agg-sm font-agg-bold text-agg-foreground",
441
+ children: labels.onboarding.connectKalshiModal.stepTwo.privateKeyLabel
442
+ }), /* @__PURE__ */ jsx("textarea", {
443
+ id: "kalshi-private-key",
444
+ autoComplete: "off",
445
+ value: privateKey,
446
+ onChange: (event) => setPrivateKey(event.target.value),
447
+ placeholder: labels.onboarding.connectKalshiModal.stepTwo.privateKeyPlaceholder,
448
+ rows: 3,
449
+ disabled: isVerifying,
450
+ "aria-invalid": !!error,
451
+ "aria-describedby": error ? errorId : void 0,
452
+ className: cn("w-full resize-none rounded-agg-sm border border-agg-separator bg-agg-secondary px-3 py-2.5", "text-agg-base text-agg-foreground placeholder:text-agg-muted-foreground", "outline-none transition-colors focus:border-agg-primary focus:ring-1 focus:ring-agg-primary", "disabled:cursor-not-allowed disabled:opacity-60")
453
+ })]
454
+ })
455
+ ]
456
+ })]
457
+ }),
458
+ error ? /* @__PURE__ */ jsxs("div", {
459
+ id: errorId,
460
+ className: "flex items-center gap-2 md:justify-center",
461
+ role: "alert",
462
+ "aria-live": "assertive",
463
+ children: [/* @__PURE__ */ jsx(Icon, {
464
+ name: "warning",
465
+ size: "small",
466
+ className: "size-3.5 text-agg-error"
467
+ }), /* @__PURE__ */ jsx("p", {
468
+ className: "text-agg-sm leading-agg-5 text-agg-error",
469
+ children: error
470
+ })]
471
+ }) : null
472
+ ]
473
+ })
474
+ }), /* @__PURE__ */ jsxs(Modal.Footer, {
475
+ classNames: { root: "relative !h-auto !gap-3 !p-4 md:!justify-center md:!border-0 md:!px-10 md:!pb-12 md:!pt-8" },
476
+ children: [
477
+ /* @__PURE__ */ jsx("div", {
478
+ "aria-hidden": "true",
479
+ className: "pointer-events-none absolute inset-x-0 -top-[60px] h-[60px] bg-gradient-to-b from-transparent to-agg-secondary md:hidden"
480
+ }),
481
+ /* @__PURE__ */ jsx(Button, {
482
+ variant: "secondary",
483
+ size: "large",
484
+ className: "shrink-0",
485
+ onClick: () => handleOpenChange(false),
486
+ disabled: isVerifying,
487
+ children: labels.onboarding.connectKalshiModal.actions.cancel
488
+ }),
489
+ /* @__PURE__ */ jsx(Button, {
490
+ type: "submit",
491
+ variant: "primary",
492
+ size: "large",
493
+ className: "flex-1 md:flex-none",
494
+ disabled: !parsedCredentials.success || isVerifying,
495
+ isLoading: isVerifying,
496
+ children: labels.onboarding.connectKalshiModal.actions.verifyConnection
497
+ })
498
+ ]
499
+ })]
500
+ })
501
+ })
502
+ });
503
+ };
504
+ ConnectKalshiModal.displayName = "ConnectKalshiModal";
505
+ //#endregion
506
+ //#region src/onboarding/steps/connect-prophetx-modal.tsx
507
+ function ConnectProphetxModal({ open, onOpenChange, onVerify, onDisconnect, allowExistingConnection = false }) {
508
+ const copy = useLabels().onboarding.connectProphetxModal;
509
+ const common = useLabels().common;
510
+ const { prophetxExecutionMode, disabledVenues, isLoading } = useAppConfig();
511
+ const id = useId();
512
+ const [accessKey, setAccessKey] = useState("");
513
+ const [secretKey, setSecretKey] = useState("");
514
+ const [pending, setPending] = useState(false);
515
+ const [disconnecting, setDisconnecting] = useState(false);
516
+ const [disconnectError, setDisconnectError] = useState(false);
517
+ const busy = pending || disconnecting;
518
+ const [connected, setConnected] = useState(false);
519
+ const [error, setError] = useState(false);
520
+ useEffect(() => {
521
+ if (!open) {
522
+ setAccessKey("");
523
+ setSecretKey("");
524
+ setError(false);
525
+ setDisconnectError(false);
526
+ setConnected(false);
527
+ }
528
+ }, [open]);
529
+ if (isLoading || !allowExistingConnection && (prophetxExecutionMode !== "direct" || disabledVenues.includes(Venue$1.prophetx))) return null;
530
+ return /* @__PURE__ */ jsx(Modal, {
531
+ open,
532
+ onOpenChange: (value) => {
533
+ if (!busy) onOpenChange(value);
534
+ },
535
+ children: /* @__PURE__ */ jsx(Modal.Container, {
536
+ maxWidth: "480px",
537
+ "aria-label": copy.title,
538
+ children: /* @__PURE__ */ jsxs(Modal.Body, {
539
+ classNames: { root: "relative !p-6" },
540
+ children: [/* @__PURE__ */ jsx(Dialog.Close, {
541
+ "aria-label": common.close,
542
+ disabled: busy,
543
+ className: "absolute right-4 top-4 cursor-pointer disabled:cursor-not-allowed",
544
+ children: /* @__PURE__ */ jsx(Icon, {
545
+ name: "close",
546
+ size: "medium"
547
+ })
548
+ }), /* @__PURE__ */ jsxs("form", {
549
+ className: "flex flex-col gap-4",
550
+ onSubmit: async (event) => {
551
+ event.preventDefault();
552
+ if (busy || !accessKey.trim() || !secretKey.trim()) return;
553
+ setPending(true);
554
+ setError(false);
555
+ try {
556
+ await onVerify({
557
+ accessKey: accessKey.trim(),
558
+ secretKey: secretKey.trim()
559
+ });
560
+ setAccessKey("");
561
+ setSecretKey("");
562
+ setConnected(true);
563
+ } catch {
564
+ setError(true);
565
+ } finally {
566
+ setPending(false);
567
+ }
568
+ },
569
+ children: [
570
+ /* @__PURE__ */ jsx(VenueLogo, {
571
+ venue: Venue$1.prophetx,
572
+ size: "large"
573
+ }),
574
+ /* @__PURE__ */ jsx(Dialog.Title, {
575
+ className: "text-agg-xl font-agg-bold text-agg-foreground",
576
+ children: copy.title
577
+ }),
578
+ /* @__PURE__ */ jsx(Dialog.Description, {
579
+ className: "text-agg-sm text-agg-muted-foreground",
580
+ children: copy.description
581
+ }),
582
+ /* @__PURE__ */ jsx("p", {
583
+ className: "text-agg-sm text-agg-muted-foreground",
584
+ children: copy.fundingNotice
585
+ }),
586
+ connected ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("p", {
587
+ role: "status",
588
+ children: copy.connected
589
+ }), /* @__PURE__ */ jsx(Button, {
590
+ type: "button",
591
+ onClick: () => onOpenChange(false),
592
+ children: copy.done
593
+ })] }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
594
+ /* @__PURE__ */ jsx("a", {
595
+ className: "text-agg-sm text-agg-primary underline",
596
+ href: "https://www.prophetx.co",
597
+ target: "_blank",
598
+ rel: "noopener noreferrer",
599
+ children: copy.instructions
600
+ }),
601
+ /* @__PURE__ */ jsx("label", {
602
+ htmlFor: `${id}-access`,
603
+ className: "text-agg-sm text-agg-foreground",
604
+ children: copy.accessKey
605
+ }),
606
+ /* @__PURE__ */ jsx("input", {
607
+ id: `${id}-access`,
608
+ type: "password",
609
+ autoComplete: "off",
610
+ spellCheck: false,
611
+ className: "rounded-agg-md border border-agg-border bg-agg-secondary p-3 text-agg-foreground",
612
+ value: accessKey,
613
+ onChange: (e) => setAccessKey(e.target.value),
614
+ disabled: busy,
615
+ required: true
616
+ }),
617
+ /* @__PURE__ */ jsx("label", {
618
+ htmlFor: `${id}-secret`,
619
+ className: "text-agg-sm text-agg-foreground",
620
+ children: copy.secretKey
621
+ }),
622
+ /* @__PURE__ */ jsx("input", {
623
+ id: `${id}-secret`,
624
+ type: "password",
625
+ autoComplete: "new-password",
626
+ spellCheck: false,
627
+ className: "rounded-agg-md border border-agg-border bg-agg-secondary p-3 text-agg-foreground",
628
+ value: secretKey,
629
+ onChange: (e) => setSecretKey(e.target.value),
630
+ disabled: busy,
631
+ required: true
632
+ }),
633
+ error ? /* @__PURE__ */ jsx("p", {
634
+ role: "alert",
635
+ className: "text-agg-sm text-agg-error",
636
+ children: copy.error
637
+ }) : null,
638
+ /* @__PURE__ */ jsx(Button, {
639
+ type: "submit",
640
+ disabled: busy || !accessKey.trim() || !secretKey.trim(),
641
+ children: pending ? copy.verifying : copy.verify
642
+ })
643
+ ] }),
644
+ allowExistingConnection && onDisconnect ? /* @__PURE__ */ jsx(Button, {
645
+ type: "button",
646
+ variant: "secondary",
647
+ disabled: busy,
648
+ onClick: async () => {
649
+ setDisconnecting(true);
650
+ setDisconnectError(false);
651
+ setError(false);
652
+ try {
653
+ await onDisconnect();
654
+ setAccessKey("");
655
+ setSecretKey("");
656
+ onOpenChange(false);
657
+ } catch {
658
+ setDisconnectError(true);
659
+ } finally {
660
+ setDisconnecting(false);
661
+ }
662
+ },
663
+ children: disconnecting ? copy.disconnecting : copy.disconnect
664
+ }) : null,
665
+ disconnectError ? /* @__PURE__ */ jsx("p", {
666
+ role: "alert",
667
+ className: "text-agg-sm text-agg-error",
668
+ children: copy.disconnectError
669
+ }) : null
670
+ ]
671
+ })]
672
+ })
673
+ })
674
+ });
675
+ }
676
+ //#endregion
677
+ //#region src/onboarding/steps/connect-novig-modal.tsx
678
+ function ConnectNovigModal({ open, onOpenChange, onVerify, onDisconnect, allowExistingConnection = false }) {
679
+ const copy = useLabels().onboarding.connectNovigModal;
680
+ const common = useLabels().common;
681
+ const { novigExecutionMode, disabledVenues, isLoading } = useAppConfig();
682
+ const id = useId();
683
+ const [keyId, setKeyId] = useState("");
684
+ const [privateKey, setPrivateKey] = useState("");
685
+ const [pending, setPending] = useState(false);
686
+ const [disconnecting, setDisconnecting] = useState(false);
687
+ const [disconnectError, setDisconnectError] = useState(false);
688
+ const busy = pending || disconnecting;
689
+ const [connected, setConnected] = useState(false);
690
+ const [error, setError] = useState(false);
691
+ useEffect(() => {
692
+ if (!open) {
693
+ setKeyId("");
694
+ setPrivateKey("");
695
+ setError(false);
696
+ setDisconnectError(false);
697
+ setConnected(false);
698
+ }
699
+ }, [open]);
700
+ if (isLoading || !allowExistingConnection && (novigExecutionMode !== "direct" || disabledVenues.includes(Venue$1.novig))) return null;
701
+ return /* @__PURE__ */ jsx(Modal, {
702
+ open,
703
+ onOpenChange: (value) => {
704
+ if (!busy) onOpenChange(value);
705
+ },
706
+ children: /* @__PURE__ */ jsx(Modal.Container, {
707
+ maxWidth: "480px",
708
+ "aria-label": copy.title,
709
+ children: /* @__PURE__ */ jsxs(Modal.Body, {
710
+ classNames: { root: "relative !p-6" },
711
+ children: [/* @__PURE__ */ jsx(Dialog.Close, {
712
+ "aria-label": common.close,
713
+ disabled: busy,
714
+ className: "absolute right-4 top-4 cursor-pointer disabled:cursor-not-allowed",
715
+ children: /* @__PURE__ */ jsx(Icon, {
716
+ name: "close",
717
+ size: "medium"
718
+ })
719
+ }), /* @__PURE__ */ jsxs("form", {
720
+ className: "flex flex-col gap-4",
721
+ onSubmit: async (event) => {
722
+ event.preventDefault();
723
+ if (busy || !keyId.trim() || !privateKey.trim()) return;
724
+ setPending(true);
725
+ setError(false);
726
+ try {
727
+ await onVerify({
728
+ keyId: keyId.trim(),
729
+ privateKey: privateKey.trim()
730
+ });
731
+ setKeyId("");
732
+ setPrivateKey("");
733
+ setConnected(true);
734
+ } catch {
735
+ setError(true);
736
+ } finally {
737
+ setPending(false);
738
+ }
739
+ },
740
+ children: [
741
+ /* @__PURE__ */ jsx(VenueLogo, {
742
+ venue: Venue$1.novig,
743
+ size: "large"
744
+ }),
745
+ /* @__PURE__ */ jsx(Dialog.Title, {
746
+ className: "text-agg-xl font-agg-bold text-agg-foreground",
747
+ children: copy.title
748
+ }),
749
+ /* @__PURE__ */ jsx(Dialog.Description, {
750
+ className: "text-agg-sm text-agg-muted-foreground",
751
+ children: copy.description
752
+ }),
753
+ /* @__PURE__ */ jsx("p", {
754
+ className: "text-agg-sm text-agg-muted-foreground",
755
+ children: copy.fundingNotice
756
+ }),
757
+ connected ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("p", {
758
+ role: "status",
759
+ children: copy.connected
760
+ }), /* @__PURE__ */ jsx(Button, {
761
+ type: "button",
762
+ onClick: () => onOpenChange(false),
763
+ children: copy.done
764
+ })] }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
765
+ /* @__PURE__ */ jsx("a", {
766
+ className: "text-agg-sm text-agg-primary underline",
767
+ href: "https://docs.novig.com/api/quickstart",
768
+ target: "_blank",
769
+ rel: "noopener noreferrer",
770
+ children: copy.instructions
771
+ }),
772
+ /* @__PURE__ */ jsx("label", {
773
+ htmlFor: `${id}-access`,
774
+ className: "text-agg-sm text-agg-foreground",
775
+ children: copy.keyId
776
+ }),
777
+ /* @__PURE__ */ jsx("input", {
778
+ id: `${id}-access`,
779
+ type: "password",
780
+ autoComplete: "off",
781
+ spellCheck: false,
782
+ className: "rounded-agg-md border border-agg-border bg-agg-secondary p-3 text-agg-foreground",
783
+ value: keyId,
784
+ onChange: (e) => setKeyId(e.target.value),
785
+ disabled: busy,
786
+ required: true
787
+ }),
788
+ /* @__PURE__ */ jsx("label", {
789
+ htmlFor: `${id}-secret`,
790
+ className: "text-agg-sm text-agg-foreground",
791
+ children: copy.privateKey
792
+ }),
793
+ /* @__PURE__ */ jsx("textarea", {
794
+ id: `${id}-secret`,
795
+ rows: 5,
796
+ autoComplete: "new-password",
797
+ spellCheck: false,
798
+ className: "rounded-agg-md border border-agg-border bg-agg-secondary p-3 text-agg-foreground",
799
+ value: privateKey,
800
+ onChange: (e) => setPrivateKey(e.target.value),
801
+ disabled: busy,
802
+ required: true
803
+ }),
804
+ error ? /* @__PURE__ */ jsx("p", {
805
+ role: "alert",
806
+ className: "text-agg-sm text-agg-error",
807
+ children: copy.error
808
+ }) : null,
809
+ /* @__PURE__ */ jsx(Button, {
810
+ type: "submit",
811
+ disabled: busy || !keyId.trim() || !privateKey.trim(),
812
+ children: pending ? copy.verifying : copy.verify
813
+ })
814
+ ] }),
815
+ allowExistingConnection && onDisconnect ? /* @__PURE__ */ jsx(Button, {
816
+ type: "button",
817
+ variant: "secondary",
818
+ disabled: busy,
819
+ onClick: async () => {
820
+ setDisconnecting(true);
821
+ setDisconnectError(false);
822
+ setError(false);
823
+ try {
824
+ await onDisconnect();
825
+ setKeyId("");
826
+ setPrivateKey("");
827
+ onOpenChange(false);
828
+ } catch {
829
+ setDisconnectError(true);
830
+ } finally {
831
+ setDisconnecting(false);
832
+ }
833
+ },
834
+ children: disconnecting ? copy.disconnecting : copy.disconnect
835
+ }) : null,
836
+ disconnectError ? /* @__PURE__ */ jsx("p", {
837
+ role: "alert",
838
+ className: "text-agg-sm text-agg-error",
839
+ children: copy.disconnectError
840
+ }) : null
841
+ ]
842
+ })]
843
+ })
844
+ })
845
+ });
846
+ }
847
+ //#endregion
848
+ //#region src/pages/user-profile/components/betdex-account-transfers.tsx
849
+ function hostedWithdrawalRaw(value) {
850
+ const match = /^([0-9]{1,26})(?:\.([0-9]{1,6}))?$/.exec(value.trim());
851
+ if (!match) return null;
852
+ const raw = BigInt(match[1]) * BigInt(1e6) + BigInt((match[2] ?? "").padEnd(6, "0"));
853
+ return raw > BigInt(0) ? raw.toString() : null;
854
+ }
855
+ const amountText = (raw) => {
856
+ const value = BigInt(raw);
857
+ const fraction = (value % BigInt(1e6)).toString().padStart(6, "0").replace(/0+$/, "");
858
+ return (value / BigInt(1e6)).toString() + (fraction ? "." + fraction : "");
859
+ };
860
+ function BetdexAccountTransfers({ accountId, environment, availableRaw, canDeposit, onWalletDeposit }) {
861
+ const labels = useLabels().userProfile.hostedBetdex;
862
+ const transfer = useHostedVenueTransfers(accountId, environment);
863
+ const [showWithdraw, setShowWithdraw] = useState(false);
864
+ const wallet = useDepositAddresses({ enabled: transfer.isAvailable && environment === "production" && showWithdraw });
865
+ const [amount, setAmount] = useState("");
866
+ const [destination, setDestination] = useState("");
867
+ const [actionError, setActionError] = useState(false);
868
+ const raw = hostedWithdrawalRaw(amount);
869
+ const withinBalance = raw !== null && (availableRaw === void 0 || BigInt(raw) <= BigInt(availableRaw));
870
+ const validDestination = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(destination.trim());
871
+ const result = transfer.withdrawal.data;
872
+ const terminal = result?.status === "confirmed" || result?.status === "failed";
873
+ const run = (work) => {
874
+ setActionError(false);
875
+ work().catch(() => setActionError(true));
876
+ };
877
+ if (!transfer.isAvailable) return null;
878
+ return /* @__PURE__ */ jsxs("div", {
879
+ className: "flex flex-col gap-3 border-t border-agg-separator pt-3",
880
+ children: [
881
+ /* @__PURE__ */ jsxs("div", {
882
+ className: "flex flex-wrap gap-2",
883
+ children: [
884
+ canDeposit && environment === "production" && onWalletDeposit ? /* @__PURE__ */ jsx(Button, {
885
+ type: "button",
886
+ variant: "secondary",
887
+ size: "small",
888
+ disabled: transfer.deposit.isPending,
889
+ isLoading: transfer.deposit.isPending,
890
+ onClick: () => run(async () => {
891
+ onWalletDeposit((await transfer.deposit.mutateAsync()).result.address);
892
+ }),
893
+ children: labels.fromWallet
894
+ }) : null,
895
+ canDeposit ? /* @__PURE__ */ jsx(Button, {
896
+ type: "button",
897
+ variant: "secondary",
898
+ size: "small",
899
+ "aria-label": labels.deposit,
900
+ isLoading: transfer.deposit.isPending,
901
+ disabled: transfer.deposit.isPending,
902
+ onClick: () => run(() => transfer.deposit.mutateAsync()),
903
+ children: labels.deposit
904
+ }) : null,
905
+ /* @__PURE__ */ jsx(Button, {
906
+ type: "button",
907
+ variant: "secondary",
908
+ size: "small",
909
+ "aria-expanded": showWithdraw || !!transfer.request,
910
+ onClick: () => setShowWithdraw((value) => !value),
911
+ children: labels.withdraw
912
+ })
913
+ ]
914
+ }),
915
+ transfer.deposit.data ? /* @__PURE__ */ jsxs("div", {
916
+ className: "flex flex-col gap-2 agg-type-caption",
917
+ children: [/* @__PURE__ */ jsx("p", {
918
+ className: "text-agg-muted-foreground",
919
+ children: labels.depositInstructions[environment]
920
+ }), /* @__PURE__ */ jsxs("label", {
921
+ className: "flex flex-col gap-1 text-agg-muted-foreground",
922
+ children: [labels.depositAddress, /* @__PURE__ */ jsx("input", {
923
+ readOnly: true,
924
+ value: transfer.deposit.data.address,
925
+ onFocus: (event) => event.currentTarget.select(),
926
+ className: "w-full rounded-agg-md border border-agg-separator bg-agg-primary p-2 text-agg-foreground"
927
+ })]
928
+ })]
929
+ }) : null,
930
+ transfer.deposit.isError || transfer.withdrawal.isError || transfer.storageError || actionError ? /* @__PURE__ */ jsx("p", {
931
+ role: "alert",
932
+ className: "agg-type-caption text-agg-error",
933
+ children: labels.transferUnavailable
934
+ }) : null,
935
+ transfer.request ? /* @__PURE__ */ jsxs("div", {
936
+ className: "flex flex-col gap-2 agg-type-caption",
937
+ children: [
938
+ /* @__PURE__ */ jsxs("p", { children: [
939
+ labels.withdrawalAmount,
940
+ ": ",
941
+ amountText(transfer.request.amountRaw)
942
+ ] }),
943
+ /* @__PURE__ */ jsxs("p", {
944
+ className: "break-all",
945
+ children: [
946
+ labels.withdrawalDestination,
947
+ ": ",
948
+ transfer.request.destinationAddress
949
+ ]
950
+ }),
951
+ /* @__PURE__ */ jsx("p", {
952
+ role: "status",
953
+ children: result ? labels.withdrawalStatuses[result.status] : labels.withdrawalUnknown
954
+ }),
955
+ terminal ? /* @__PURE__ */ jsx(Button, {
956
+ type: "button",
957
+ variant: "tertiary",
958
+ size: "small",
959
+ onClick: () => {
960
+ transfer.clear();
961
+ setAmount("");
962
+ setDestination("");
963
+ setActionError(false);
964
+ setShowWithdraw(false);
965
+ },
966
+ children: labels.withdrawalNew
967
+ }) : /* @__PURE__ */ jsx(Button, {
968
+ type: "button",
969
+ variant: "tertiary",
970
+ size: "small",
971
+ "aria-label": result ? labels.withdrawalCheck : labels.withdrawalRetry,
972
+ isLoading: transfer.withdrawal.isPending,
973
+ disabled: transfer.withdrawal.isPending,
974
+ onClick: () => run(transfer.check),
975
+ children: result ? labels.withdrawalCheck : labels.withdrawalRetry
976
+ })
977
+ ]
978
+ }) : showWithdraw ? /* @__PURE__ */ jsxs("form", {
979
+ className: "flex flex-col gap-3",
980
+ onSubmit: (event) => {
981
+ event.preventDefault();
982
+ if (!raw || !withinBalance || !validDestination || !transfer.ready) return;
983
+ run(() => transfer.submit(raw, destination.trim()));
984
+ },
985
+ children: [
986
+ /* @__PURE__ */ jsxs("label", {
987
+ className: "flex flex-col gap-1 agg-type-caption text-agg-muted-foreground",
988
+ children: [labels.withdrawalAmount, /* @__PURE__ */ jsx("input", {
989
+ inputMode: "decimal",
990
+ autoComplete: "off",
991
+ value: amount,
992
+ onChange: (event) => setAmount(event.target.value),
993
+ className: "rounded-agg-md border border-agg-separator bg-agg-primary p-2 text-agg-foreground"
994
+ })]
995
+ }),
996
+ environment === "production" ? /* @__PURE__ */ jsx(Button, {
997
+ type: "button",
998
+ variant: "secondary",
999
+ size: "small",
1000
+ disabled: !wallet.isReady || !wallet.svmAddress || wallet.isError,
1001
+ isLoading: wallet.isLoading,
1002
+ onClick: () => {
1003
+ if (wallet.isReady && wallet.svmAddress && !wallet.isError) setDestination(wallet.svmAddress);
1004
+ },
1005
+ children: labels.toWallet
1006
+ }) : null,
1007
+ /* @__PURE__ */ jsxs("label", {
1008
+ className: "flex flex-col gap-1 agg-type-caption text-agg-muted-foreground",
1009
+ children: [labels.withdrawalDestination, /* @__PURE__ */ jsx("input", {
1010
+ autoComplete: "off",
1011
+ spellCheck: false,
1012
+ value: destination,
1013
+ onChange: (event) => setDestination(event.target.value),
1014
+ className: "rounded-agg-md border border-agg-separator bg-agg-primary p-2 text-agg-foreground"
1015
+ })]
1016
+ }),
1017
+ /* @__PURE__ */ jsx(Button, {
1018
+ type: "submit",
1019
+ variant: "primary",
1020
+ size: "small",
1021
+ "aria-label": labels.withdrawalSubmit,
1022
+ disabled: !withinBalance || !validDestination || !transfer.ready || transfer.withdrawal.isPending,
1023
+ isLoading: transfer.withdrawal.isPending,
1024
+ children: labels.withdrawalSubmit
1025
+ })
1026
+ ]
1027
+ }) : null
1028
+ ]
1029
+ });
1030
+ }
1031
+ //#endregion
1032
+ //#region src/pages/user-profile/components/betdex-account-activity.tsx
1033
+ /** Preserve sub-micro ledger dust; no floating-point arithmetic or rounded zero. */
1034
+ function amount(raw) {
1035
+ const negative = raw.startsWith("-");
1036
+ const digits = (negative ? raw.slice(1) : raw).padStart(19, "0");
1037
+ const fraction = digits.slice(-18).replace(/0+$/, "");
1038
+ return `${negative ? "-" : "+"}${digits.slice(0, -18)}${fraction ? `.${fraction}` : ""}`;
1039
+ }
1040
+ function BetdexAccountActivity({ accountId, environment }) {
1041
+ const labels = useLabels().userProfile.hostedBetdex;
1042
+ const [page, setPage] = useState(0);
1043
+ const { activity, isAvailable } = useHostedVenueActivity("betdex", page);
1044
+ if (!isAvailable) return null;
1045
+ const data = activity.data;
1046
+ const valid = data?.accountId === accountId && data.environment === environment && data.page === page;
1047
+ const unavailable = activity.isError || !!data && !valid;
1048
+ return /* @__PURE__ */ jsxs("section", {
1049
+ "aria-label": labels.activityTitle,
1050
+ className: "flex flex-col gap-3 border-t border-agg-separator pt-3",
1051
+ children: [
1052
+ /* @__PURE__ */ jsx("h4", {
1053
+ className: "agg-type-label text-agg-foreground",
1054
+ children: labels.activityTitle
1055
+ }),
1056
+ /* @__PURE__ */ jsx("p", {
1057
+ className: "agg-type-caption text-agg-muted-foreground",
1058
+ children: labels.activityDescription
1059
+ }),
1060
+ activity.isPending ? /* @__PURE__ */ jsx(SkeletonBlock, { className: "h-16 w-full" }) : null,
1061
+ unavailable ? /* @__PURE__ */ jsx("p", {
1062
+ role: "status",
1063
+ className: "agg-type-caption text-agg-muted-foreground",
1064
+ children: labels.activityUnavailable
1065
+ }) : null,
1066
+ valid && !unavailable ? data.items.length ? /* @__PURE__ */ jsx("ul", {
1067
+ className: "flex flex-col gap-3 agg-type-caption",
1068
+ children: data.items.map((item) => /* @__PURE__ */ jsxs("li", {
1069
+ className: "flex flex-col gap-1",
1070
+ children: [/* @__PURE__ */ jsxs("div", {
1071
+ className: "flex justify-between gap-3 text-agg-foreground",
1072
+ children: [/* @__PURE__ */ jsx("span", { children: labels.activityCodes[item.code] }), /* @__PURE__ */ jsxs("span", {
1073
+ className: "break-all tabular-nums",
1074
+ children: [
1075
+ amount(item.amountRaw),
1076
+ " ",
1077
+ data.asset
1078
+ ]
1079
+ })]
1080
+ }), /* @__PURE__ */ jsx("time", {
1081
+ dateTime: item.createdAt,
1082
+ className: "text-agg-muted-foreground",
1083
+ children: new Date(item.createdAt).toLocaleString()
1084
+ })]
1085
+ }, item.id))
1086
+ }) : /* @__PURE__ */ jsx("p", {
1087
+ className: "agg-type-caption text-agg-muted-foreground",
1088
+ children: labels.activityEmpty
1089
+ }) : null,
1090
+ /* @__PURE__ */ jsxs("div", {
1091
+ className: "flex flex-wrap gap-2",
1092
+ children: [
1093
+ /* @__PURE__ */ jsx(Button, {
1094
+ type: "button",
1095
+ variant: "tertiary",
1096
+ size: "small",
1097
+ disabled: activity.isFetching || page === 0,
1098
+ onClick: () => setPage((value) => Math.max(0, value - 1)),
1099
+ children: labels.activityPrevious
1100
+ }),
1101
+ /* @__PURE__ */ jsx(Button, {
1102
+ type: "button",
1103
+ variant: "tertiary",
1104
+ size: "small",
1105
+ disabled: activity.isFetching || unavailable || !valid || data.nextPage === null,
1106
+ onClick: () => {
1107
+ if (valid && data.nextPage !== null) setPage(data.nextPage);
1108
+ },
1109
+ children: labels.activityNext
1110
+ }),
1111
+ /* @__PURE__ */ jsx(Button, {
1112
+ type: "button",
1113
+ variant: "tertiary",
1114
+ size: "small",
1115
+ disabled: activity.isFetching,
1116
+ onClick: () => {
1117
+ activity.refetch();
1118
+ },
1119
+ children: labels.activityRefresh
1120
+ })
1121
+ ]
1122
+ })
1123
+ ]
1124
+ });
1125
+ }
1126
+ //#endregion
1127
+ //#region src/pages/user-profile/components/betdex-account-card.tsx
1128
+ /** Hosted venue cash must never be presented as a signing-wallet chain balance. */
1129
+ function BetdexAccountCard({ onWalletDeposit } = {}) {
1130
+ const [showActivity, setShowActivity] = useState(false);
1131
+ const labels = useLabels().userProfile.hostedBetdex;
1132
+ const { account, provision, isAvailable } = useHostedVenueAccount("betdex");
1133
+ const data = account.data;
1134
+ if (!isAvailable || data?.status === "disabled") return null;
1135
+ const pending = provision.isPending || data?.status === "provisioning";
1136
+ const canCreate = data?.status === "not_created" && data.provisioningEnabled;
1137
+ const rawLabel = (raw) => formatUsd(Number(raw) / 1e6);
1138
+ return /* @__PURE__ */ jsxs("section", {
1139
+ "aria-label": labels.title,
1140
+ className: "flex flex-col gap-3 rounded-agg-xl border border-agg-separator bg-agg-secondary p-5",
1141
+ children: [
1142
+ /* @__PURE__ */ jsxs("div", {
1143
+ className: "flex items-center gap-2",
1144
+ children: [/* @__PURE__ */ jsx(VenueLogo, {
1145
+ venue: Venue$1.betdex,
1146
+ size: "small",
1147
+ className: "size-4"
1148
+ }), /* @__PURE__ */ jsx("h3", {
1149
+ className: "agg-type-label text-agg-foreground",
1150
+ children: labels.title
1151
+ })]
1152
+ }),
1153
+ /* @__PURE__ */ jsx("p", {
1154
+ className: "agg-type-caption text-agg-muted-foreground",
1155
+ children: labels.description
1156
+ }),
1157
+ data?.environment === "sandbox" ? /* @__PURE__ */ jsx("p", {
1158
+ className: "agg-type-caption text-agg-warning",
1159
+ children: labels.sandbox
1160
+ }) : null,
1161
+ account.isPending ? /* @__PURE__ */ jsx(SkeletonBlock, { className: "h-10 w-full" }) : null,
1162
+ data?.status === "active" && data.balanceStatus === "available" && data.balance && !account.isError ? /* @__PURE__ */ jsx("dl", {
1163
+ className: "flex flex-col gap-2 agg-type-caption",
1164
+ children: [
1165
+ [labels.total, data.balance.totalRaw],
1166
+ [labels.available, data.balance.availableRaw],
1167
+ [labels.reserved, data.balance.unmatchedExposureRaw]
1168
+ ].map(([label, raw]) => /* @__PURE__ */ jsxs("div", {
1169
+ className: "flex justify-between gap-3",
1170
+ children: [/* @__PURE__ */ jsx("dt", {
1171
+ className: "text-agg-muted-foreground",
1172
+ children: label
1173
+ }), /* @__PURE__ */ jsx("dd", {
1174
+ className: "text-agg-foreground",
1175
+ children: rawLabel(raw)
1176
+ })]
1177
+ }, label))
1178
+ }) : null,
1179
+ pending ? /* @__PURE__ */ jsx("p", {
1180
+ role: "status",
1181
+ className: "agg-type-caption text-agg-muted-foreground",
1182
+ children: labels.provisioning
1183
+ }) : null,
1184
+ data?.status === "suspended" ? /* @__PURE__ */ jsx("p", {
1185
+ role: "status",
1186
+ className: "agg-type-caption text-agg-muted-foreground",
1187
+ children: labels.suspended
1188
+ }) : null,
1189
+ account.isError || data?.status === "unavailable" || data?.balanceStatus === "unavailable" ? /* @__PURE__ */ jsx("p", {
1190
+ role: "status",
1191
+ className: "agg-type-caption text-agg-muted-foreground",
1192
+ children: labels.unavailable
1193
+ }) : null,
1194
+ data?.status === "not_created" && !data.provisioningEnabled ? /* @__PURE__ */ jsx("p", {
1195
+ className: "agg-type-caption text-agg-muted-foreground",
1196
+ children: labels.provisioningUnavailable
1197
+ }) : null,
1198
+ provision.isError ? /* @__PURE__ */ jsx("p", {
1199
+ role: "alert",
1200
+ className: "agg-type-caption text-agg-error",
1201
+ children: labels.creationFailed
1202
+ }) : null,
1203
+ canCreate || data?.status === "provisioning" ? /* @__PURE__ */ jsx(Button, {
1204
+ type: "button",
1205
+ "aria-label": data?.status === "provisioning" ? labels.checkSetup : labels.createAccount,
1206
+ variant: "secondary",
1207
+ size: "small",
1208
+ isLoading: provision.isPending,
1209
+ disabled: provision.isPending || account.isError,
1210
+ onClick: () => provision.mutate(),
1211
+ children: data?.status === "provisioning" ? labels.checkSetup : labels.createAccount
1212
+ }) : null,
1213
+ /* @__PURE__ */ jsx(Button, {
1214
+ type: "button",
1215
+ variant: "tertiary",
1216
+ size: "small",
1217
+ disabled: account.isFetching || provision.isPending,
1218
+ onClick: () => {
1219
+ account.refetch();
1220
+ },
1221
+ children: labels.refresh
1222
+ }),
1223
+ data?.accountId && data.environment && ["active", "suspended"].includes(data.status) ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
1224
+ /* @__PURE__ */ jsxs("details", {
1225
+ className: "group/agg-betdex-funds border-t border-agg-separator pt-3",
1226
+ children: [/* @__PURE__ */ jsxs("summary", {
1227
+ className: "flex min-h-11 cursor-pointer list-none items-center justify-between gap-3 text-agg-sm font-agg-bold text-agg-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary [&::-webkit-details-marker]:hidden",
1228
+ children: [labels.manageFunds, /* @__PURE__ */ jsx(Icon, {
1229
+ name: "chevron-down",
1230
+ size: "small",
1231
+ className: "transition-transform group-open/agg-betdex-funds:rotate-180"
1232
+ })]
1233
+ }), /* @__PURE__ */ jsx(BetdexAccountTransfers, {
1234
+ accountId: data.accountId,
1235
+ environment: data.environment,
1236
+ availableRaw: data.balanceStatus === "available" ? data.balance?.availableRaw : void 0,
1237
+ canDeposit: data.status === "active",
1238
+ onWalletDeposit
1239
+ }, `transfers:${data.accountId}:${data.environment}`)]
1240
+ }),
1241
+ /* @__PURE__ */ jsx(Button, {
1242
+ type: "button",
1243
+ variant: "tertiary",
1244
+ size: "small",
1245
+ "aria-expanded": showActivity,
1246
+ onClick: () => setShowActivity((shown) => !shown),
1247
+ children: showActivity ? labels.hideActivity : labels.showActivity
1248
+ }),
1249
+ showActivity ? /* @__PURE__ */ jsx(BetdexAccountActivity, {
1250
+ accountId: data.accountId,
1251
+ environment: data.environment
1252
+ }, `${data.accountId}:${data.environment}`) : null
1253
+ ] }) : null
1254
+ ]
1255
+ });
1256
+ }
1257
+ //#endregion
1258
+ //#region src/shared/constants.ts
1259
+ const USDC = {
1260
+ value: "USDC",
1261
+ label: "USDC",
1262
+ iconUrl: "https://assets.snagsolutions.io/public/web/icons/usdc.svg"
1263
+ };
1264
+ const SUPPORTED_NETWORKS = [
1265
+ {
1266
+ value: "abstract",
1267
+ label: "Abstract",
1268
+ iconUrl: "https://assets.snagsolutions.io/public/prediction-markets/logos/Abstract.svg",
1269
+ tokens: [USDC]
1270
+ },
1271
+ {
1272
+ value: "arbitrum",
1273
+ label: "Arbitrum One",
1274
+ iconUrl: "https://assets.snagsolutions.io/public/prediction-markets/logos/Arbitrum.svg",
1275
+ tokens: [USDC]
1276
+ },
1277
+ {
1278
+ value: "base",
1279
+ label: "Base",
1280
+ iconUrl: "https://assets.snagsolutions.io/public/prediction-markets/logos/Base.svg",
1281
+ tokens: [USDC]
1282
+ },
1283
+ {
1284
+ value: "bnb",
1285
+ label: "BNB Chain",
1286
+ iconUrl: "https://assets.snagsolutions.io/public/prediction-markets/logos/BNB.svg",
1287
+ tokens: [USDC]
1288
+ },
1289
+ {
1290
+ value: "flow",
1291
+ label: "Flow",
1292
+ iconUrl: "https://assets.snagsolutions.io/public/prediction-markets/logos/Flow.svg",
1293
+ tokens: [USDC]
1294
+ },
1295
+ {
1296
+ value: "hyperliquid",
1297
+ label: "Hyperliquid",
1298
+ iconUrl: "https://assets.snagsolutions.io/public/prediction-markets/logos/hyperliquid.png",
1299
+ tokens: [USDC]
1300
+ },
1301
+ {
1302
+ value: "mainnet",
1303
+ label: "Ethereum",
1304
+ iconUrl: "https://assets.snagsolutions.io/public/prediction-markets/logos/ETH.svg",
1305
+ tokens: [USDC]
1306
+ },
1307
+ {
1308
+ value: "optimism",
1309
+ label: "Optimism",
1310
+ iconUrl: "https://assets.snagsolutions.io/public/web/icons/chains/optimism/colored.svg",
1311
+ tokens: [USDC]
1312
+ },
1313
+ {
1314
+ value: "polygon",
1315
+ label: "Polygon Mainnet",
1316
+ iconUrl: "https://assets.snagsolutions.io/public/prediction-markets/logos/Polygon.svg",
1317
+ tokens: [USDC]
1318
+ },
1319
+ {
1320
+ value: "solana",
1321
+ label: "Solana",
1322
+ iconUrl: "https://assets.snagsolutions.io/public/prediction-markets/logos/Solana.svg",
1323
+ tokens: [USDC]
1324
+ },
1325
+ {
1326
+ value: "zksync",
1327
+ label: "zkSync Era",
1328
+ iconUrl: "https://assets.snagsolutions.io/public/web/icons/chains/zksync/colored.svg",
1329
+ tokens: [USDC]
1330
+ }
1331
+ ];
1332
+ /** Map local SUPPORTED_NETWORKS to Select items with iconUrl. */
1333
+ const mapNetworksToOptions = () => {
1334
+ return SUPPORTED_NETWORKS.map((n) => ({
1335
+ value: n.value,
1336
+ label: n.label,
1337
+ iconUrl: n.iconUrl
1338
+ }));
1339
+ };
1340
+ const USDC_ICON_URL = "https://assets.snagsolutions.io/public/web/icons/usdc.svg";
1341
+ /** Default currency options shown when the caller does not provide any. */
1342
+ const DEFAULT_CURRENCY_OPTIONS = [
1343
+ {
1344
+ value: "USDC",
1345
+ label: "USDC",
1346
+ iconUrl: USDC_ICON_URL
1347
+ },
1348
+ {
1349
+ value: "USDC.e",
1350
+ label: "USDC.e",
1351
+ iconUrl: USDC_ICON_URL
1352
+ },
1353
+ {
1354
+ value: "USDH",
1355
+ label: "USDH",
1356
+ iconUrl: USDC_ICON_URL
1357
+ },
1358
+ {
1359
+ value: "pUSD",
1360
+ label: "pUSD",
1361
+ iconUrl: USDC_ICON_URL
1362
+ },
1363
+ {
1364
+ value: "USDT",
1365
+ label: "USDT",
1366
+ iconUrl: "https://assets.snagsolutions.io/public/web/icons/usdt.svg"
1367
+ },
1368
+ {
1369
+ value: "USDT",
1370
+ label: "USDT",
1371
+ iconUrl: "https://assets.snagsolutions.io/public/web/icons/usdt.svg"
1372
+ },
1373
+ {
1374
+ value: "ARB",
1375
+ label: "ARB",
1376
+ iconUrl: "https://assets.snagsolutions.io/public/web/icons/tokens/arb.svg"
1377
+ },
1378
+ {
1379
+ value: "BNB",
1380
+ label: "BNB",
1381
+ iconUrl: "https://assets.snagsolutions.io/public/web/icons/tokens/bnb.svg"
1382
+ },
1383
+ {
1384
+ value: "BTC",
1385
+ label: "BTC",
1386
+ iconUrl: "https://assets.snagsolutions.io/public/web/icons/tokens/btc.svg"
1387
+ },
1388
+ {
1389
+ value: "MATIC",
1390
+ label: "MATIC",
1391
+ iconUrl: "https://assets.snagsolutions.io/public/web/icons/tokens/matic.svg"
1392
+ },
1393
+ {
1394
+ value: "ETH",
1395
+ label: "ETH",
1396
+ iconUrl: "https://assets.snagsolutions.io/public/web/icons/tokens/eth.svg"
1397
+ },
1398
+ {
1399
+ value: "SOL",
1400
+ label: "SOL",
1401
+ iconUrl: "https://assets.snagsolutions.io/public/web/icons/tokens/sol.svg"
1402
+ },
1403
+ {
1404
+ value: "OP",
1405
+ label: "OP",
1406
+ iconUrl: "https://assets.snagsolutions.io/public/web/icons/tokens/op.svg"
1407
+ }
1408
+ ];
1409
+ /** Add iconUrl to token options when missing, based on DEFAULT_CURRENCY_OPTIONS. */
1410
+ const withTokenIcons = (options) => {
1411
+ const byValue = new Map(DEFAULT_CURRENCY_OPTIONS.map((o) => [o.value, o.iconUrl]));
1412
+ return options.map((o) => o.iconUrl ? o : {
1413
+ ...o,
1414
+ iconUrl: byValue.get(o.value)
1415
+ });
1416
+ };
1417
+ /** Maps numeric EIP-155 chain IDs to the slug values used in SUPPORTED_NETWORKS. */
1418
+ const CHAIN_ID_TO_SLUG = {
1419
+ "1": "mainnet",
1420
+ "10": "optimism",
1421
+ "56": "bnb",
1422
+ "137": "polygon",
1423
+ "324": "zksync",
1424
+ "747": "flow",
1425
+ "1337": "hyperliquid",
1426
+ "8453": "base",
1427
+ "42161": "arbitrum",
1428
+ "2741": "abstract",
1429
+ "792703809": "solana"
1430
+ };
1431
+ /** Add iconUrl to network options when missing, resolved via chain ID or slug. */
1432
+ const withNetworkIcons = (options) => {
1433
+ const bySlug = new Map(SUPPORTED_NETWORKS.map((n) => [n.value, n.iconUrl]));
1434
+ return options.map((o) => {
1435
+ const slug = CHAIN_ID_TO_SLUG[o.value] ?? o.value;
1436
+ return {
1437
+ ...o,
1438
+ iconUrl: o.iconUrl ?? bySlug.get(slug)
1439
+ };
1440
+ });
1441
+ };
1442
+ /** Merge two option arrays by value (preserving caller order, then filling from defaults). */
1443
+ const mergeSelectOptionsUnique = (base, fill) => {
1444
+ const seen = /* @__PURE__ */ new Set();
1445
+ const out = [];
1446
+ for (const opt of base ?? []) if (!seen.has(opt.value)) {
1447
+ out.push(opt);
1448
+ seen.add(opt.value);
1449
+ }
1450
+ for (const opt of fill) if (!seen.has(opt.value)) {
1451
+ out.push(opt);
1452
+ seen.add(opt.value);
1453
+ }
1454
+ return out;
1455
+ };
1456
+ //#endregion
1457
+ //#region src/withdraw/steps/withdraw-method.tsx
1458
+ const WithdrawMethodStep = ({ balance, onSelectMethod }) => {
1459
+ const labels = useLabels();
1460
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Modal.Header, {
1461
+ title: labels.withdraw.title,
1462
+ hideBorder: true
1463
+ }), /* @__PURE__ */ jsx(Modal.Body, {
1464
+ classNames: { root: "px-5 pt-0 pb-6 sm:px-8 sm:pt-0 sm:pb-8" },
1465
+ children: /* @__PURE__ */ jsxs("div", {
1466
+ className: "flex flex-col gap-5",
1467
+ children: [/* @__PURE__ */ jsxs("p", {
1468
+ className: "agg-type-body text-agg-foreground",
1469
+ children: [
1470
+ labels.withdraw.balancePrefix,
1471
+ " ",
1472
+ formatCompactUsd(balance)
1473
+ ]
1474
+ }), /* @__PURE__ */ jsxs("div", {
1475
+ className: cn("flex items-center gap-3 sm:gap-4 rounded-xl border border-agg-separator bg-agg-secondary p-3 sm:p-4", "hover:bg-agg-secondary-hover transition-colors cursor-pointer"),
1476
+ role: "button",
1477
+ tabIndex: 0,
1478
+ onClick: () => onSelectMethod("wallet"),
1479
+ onKeyDown: (e) => {
1480
+ if (e.key === "Enter" || e.key === " ") {
1481
+ e.preventDefault();
1482
+ onSelectMethod("wallet");
1483
+ }
1484
+ },
1485
+ children: [
1486
+ /* @__PURE__ */ jsx("div", {
1487
+ className: "shrink-0 flex items-center justify-center h-10 w-10 rounded-lg bg-agg-secondary-hover",
1488
+ children: /* @__PURE__ */ jsx(WalletIcon, { className: "h-6 w-6 text-agg-muted-foreground" })
1489
+ }),
1490
+ /* @__PURE__ */ jsxs("div", {
1491
+ className: "flex-1 min-w-0",
1492
+ children: [/* @__PURE__ */ jsx("p", {
1493
+ className: "agg-type-body-strong text-agg-foreground",
1494
+ children: labels.withdraw.methods.walletTitle
1495
+ }), /* @__PURE__ */ jsx("p", {
1496
+ className: "agg-type-label text-agg-muted-foreground",
1497
+ children: labels.withdraw.methods.walletDescription
1498
+ })]
1499
+ }),
1500
+ /* @__PURE__ */ jsx("div", {
1501
+ className: "shrink-0 text-agg-muted-foreground",
1502
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-5 w-5" })
1503
+ })
1504
+ ]
1505
+ })]
1506
+ })
1507
+ })] });
1508
+ };
1509
+ //#endregion
1510
+ //#region src/shared/transfer-fee-summary.tsx
1511
+ const separator = /* @__PURE__ */ jsx("span", {
1512
+ className: "text-agg-muted-foreground",
1513
+ "aria-hidden": "true",
1514
+ children: "·"
1515
+ });
1516
+ const normalizeFeeLabel = (label) => label.replace(/\s*~\s*$/, "");
1517
+ const TransferFeeSummary = ({ estimate, view, minDeposit, eta }) => {
1518
+ const labels = useLabels();
1519
+ if (!estimate) return null;
1520
+ if (view === "deposit") return /* @__PURE__ */ jsxs("p", {
1521
+ className: "agg-type-label flex flex-wrap items-center gap-x-2 gap-y-1 text-agg-foreground",
1522
+ children: [
1523
+ minDeposit ? /* @__PURE__ */ jsxs("span", { children: [
1524
+ labels.deposit.sendCrypto.minDepositPrefix,
1525
+ " ",
1526
+ minDeposit
1527
+ ] }) : null,
1528
+ minDeposit ? separator : null,
1529
+ /* @__PURE__ */ jsxs("span", { children: [
1530
+ normalizeFeeLabel(labels.deposit.walletFlow.feePrefix),
1531
+ ": ",
1532
+ estimate.estimatedFees
1533
+ ] }),
1534
+ eta ? separator : null,
1535
+ eta ? /* @__PURE__ */ jsx("span", { children: eta }) : null
1536
+ ]
1537
+ });
1538
+ return /* @__PURE__ */ jsxs("div", {
1539
+ className: "agg-type-label flex flex-wrap items-center gap-x-2 gap-y-1 text-agg-foreground",
1540
+ children: [
1541
+ /* @__PURE__ */ jsxs("span", { children: [
1542
+ labels.withdraw.walletFlow.estimatedFees,
1543
+ ": ",
1544
+ estimate.estimatedFees
1545
+ ] }),
1546
+ separator,
1547
+ /* @__PURE__ */ jsxs("span", {
1548
+ className: "inline-flex items-center gap-1",
1549
+ children: [/* @__PURE__ */ jsxs("span", { children: [
1550
+ labels.withdraw.walletFlow.networkReserve,
1551
+ ": ",
1552
+ estimate.networkReserve
1553
+ ] }), /* @__PURE__ */ jsx(Tooltip, {
1554
+ "aria-label": labels.withdraw.walletFlow.networkReserveTooltipAria,
1555
+ size: "medium",
1556
+ content: /* @__PURE__ */ jsxs("div", {
1557
+ className: "text-center",
1558
+ children: [/* @__PURE__ */ jsx("p", { children: labels.withdraw.walletFlow.networkReserveTooltipLineOne }), /* @__PURE__ */ jsx("p", { children: labels.withdraw.walletFlow.networkReserveTooltipLineTwo })]
1559
+ }),
1560
+ classNames: {
1561
+ content: "min-w-96 max-w-none!",
1562
+ arrow: "[&_polygon]:fill-agg-background",
1563
+ icon: "text-agg-foreground! h-3! w-3!"
1564
+ }
1565
+ })]
1566
+ }),
1567
+ separator,
1568
+ /* @__PURE__ */ jsxs("span", { children: [
1569
+ labels.withdraw.walletFlow.youReceive,
1570
+ ": ",
1571
+ estimate.youReceive
1572
+ ] })
1573
+ ]
1574
+ });
1575
+ };
1576
+ //#endregion
1577
+ //#region src/withdraw/steps/withdraw-amount.tsx
1578
+ /** Converts a raw integer string (e.g. "1000000") to a decimal string ("1.000000"). */
1579
+ const formatRawTokenAmount$1 = (rawAmount, decimals) => {
1580
+ if (!rawAmount) return "0";
1581
+ const raw = BigInt(rawAmount);
1582
+ const divisor = BigInt(`1${"0".repeat(decimals)}`);
1583
+ const whole = raw / divisor;
1584
+ const remainder = raw % divisor;
1585
+ if (remainder === BigInt(0)) return whole.toString();
1586
+ return `${whole.toString()}.${remainder.toString().padStart(decimals, "0").replace(/0+$/, "")}`;
1587
+ };
1588
+ /** Converts a human-readable decimal string to a raw integer string, or null if invalid. */
1589
+ const parseTokenAmountToRaw = (amount, decimals) => {
1590
+ const normalizedAmount = amount.trim();
1591
+ if (!normalizedAmount || !/^\d*(?:\.\d*)?$/.test(normalizedAmount)) return null;
1592
+ const [wholePart = "0", fractionalPart = ""] = normalizedAmount.split(".");
1593
+ if (fractionalPart.length > decimals) return null;
1594
+ const normalizedWhole = wholePart === "" ? "0" : wholePart;
1595
+ const normalizedFraction = fractionalPart.padEnd(decimals, "0");
1596
+ try {
1597
+ return `${BigInt(normalizedWhole)}${normalizedFraction}`.replace(/^0+(?=\d)/, "");
1598
+ } catch {
1599
+ return null;
1600
+ }
1601
+ };
1602
+ const WithdrawAmountStep = ({ title, fixedDestination = false, amount, destinationWallet, balanceDisplay, tokenOptions, networkOptions, selectedToken, selectedNetwork, destDecimals, isConfirming = false, error, max = false, onBack, onAmountChange, onDestinationChange, onTokenChange, onNetworkChange, onMaxClick, onContinue }) => {
1603
+ const labels = useLabels();
1604
+ const isSolanaDest = selectedNetwork === "792703809";
1605
+ const trimmedDestination = destinationWallet.trim();
1606
+ const isValidAddress = isSolanaDest ? /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(trimmedDestination) : /^0x[a-fA-F0-9]{40}$/.test(trimmedDestination);
1607
+ const isValid = Number(amount) > 0 && isValidAddress;
1608
+ const amountRaw = amount && Number(amount) > 0 ? parseTokenAmountToRaw(amount, destDecimals) : null;
1609
+ const destinationChainId = Number(selectedNetwork) || null;
1610
+ const preview = useWithdrawPreview({
1611
+ amountRaw,
1612
+ tokenSymbol: selectedToken || null,
1613
+ destinationChainId,
1614
+ destinationAddress: trimmedDestination || null,
1615
+ max
1616
+ });
1617
+ const previewUnviable = preview.data?.pricingStatus === "unviable";
1618
+ const previewUnviableMessage = previewUnviable ? preview.data?.maxDeliverableRaw != null && BigInt(preview.data.maxDeliverableRaw) > BigInt(0) ? `Amount exceeds your withdrawable balance. Max: ~${formatRawTokenAmount$1(preview.data.maxDeliverableRaw, destDecimals)} ${selectedToken}` : preview.data?.unviableReason ?? "This amount can't be withdrawn right now." : null;
1619
+ const previewLoading = preview.isFetching;
1620
+ const isDisabled = !isValid || isConfirming || previewUnviable || previewLoading;
1621
+ const withdrawEstimate = preview.data && preview.data.pricingStatus === "quoted" ? {
1622
+ estimatedFees: preview.data.feeRaw != null ? `~${formatRawTokenAmount$1(preview.data.feeRaw, destDecimals)} ${selectedToken}` : "—",
1623
+ networkReserve: preview.data.networkFeeRaw != null ? `~${formatRawTokenAmount$1(preview.data.networkFeeRaw, destDecimals)} ${selectedToken}` : "—",
1624
+ youReceive: preview.data.receiveAmountRaw != null ? `~${formatRawTokenAmount$1(preview.data.receiveAmountRaw, destDecimals)} ${selectedToken}` : "—"
1625
+ } : null;
1626
+ /**
1627
+ * Only show withdraw estimate if the backend returned a valid quoted preview.
1628
+ */
1629
+ const shouldShowWithdrawEstimate = Boolean(withdrawEstimate);
1630
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Modal.Header, {
1631
+ title: title ?? labels.withdraw.walletFlow.title,
1632
+ hideBorder: true,
1633
+ leftElement: /* @__PURE__ */ jsx("button", {
1634
+ type: "button",
1635
+ className: "mr-2 flex items-center justify-center text-agg-foreground transition-colors hover:cursor-pointer hover:text-agg-foreground/80",
1636
+ onClick: onBack,
1637
+ "aria-label": labels.withdraw.back,
1638
+ children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "h-6 w-6" })
1639
+ })
1640
+ }), /* @__PURE__ */ jsx(Modal.Body, {
1641
+ classNames: { root: "px-5 pt-0 pb-6 sm:px-8 sm:pt-0 sm:pb-8" },
1642
+ children: /* @__PURE__ */ jsxs("div", {
1643
+ className: "flex flex-col gap-5",
1644
+ children: [
1645
+ /* @__PURE__ */ jsxs("div", {
1646
+ className: "flex flex-col gap-5",
1647
+ children: [
1648
+ /* @__PURE__ */ jsxs("div", {
1649
+ className: "flex flex-col gap-2",
1650
+ children: [/* @__PURE__ */ jsx("p", {
1651
+ className: "agg-type-label-strong text-agg-foreground",
1652
+ children: labels.withdraw.walletFlow.recipientAddressLabel
1653
+ }), /* @__PURE__ */ jsx("input", {
1654
+ type: "text",
1655
+ "aria-label": labels.withdraw.walletFlow.recipientAddressLabel,
1656
+ className: cn("agg-type-body w-full h-10 rounded border border-agg-separator bg-agg-secondary px-3 outline-none", "text-agg-foreground placeholder:text-agg-muted-foreground", "focus:border-agg-primary transition-colors"),
1657
+ placeholder: isSolanaDest ? "FwR3..." : "0x971d...",
1658
+ value: destinationWallet,
1659
+ readOnly: fixedDestination,
1660
+ onChange: (e) => onDestinationChange(e.target.value)
1661
+ })]
1662
+ }),
1663
+ /* @__PURE__ */ jsxs("div", {
1664
+ className: "flex flex-col gap-2",
1665
+ children: [/* @__PURE__ */ jsxs("div", {
1666
+ className: "flex items-center justify-between",
1667
+ children: [/* @__PURE__ */ jsx("p", {
1668
+ className: "agg-type-label-strong text-agg-foreground",
1669
+ children: labels.withdraw.walletFlow.amountLabel
1670
+ }), /* @__PURE__ */ jsxs("p", {
1671
+ className: "agg-type-label text-agg-muted-foreground",
1672
+ children: [
1673
+ labels.withdraw.balancePrefix,
1674
+ " ",
1675
+ balanceDisplay
1676
+ ]
1677
+ })]
1678
+ }), /* @__PURE__ */ jsxs("div", {
1679
+ className: "flex h-10 items-center gap-2 rounded border border-agg-separator bg-agg-secondary px-3 focus-within:border-agg-primary transition-colors",
1680
+ children: [
1681
+ /* @__PURE__ */ jsx("input", {
1682
+ type: "text",
1683
+ inputMode: "decimal",
1684
+ "aria-label": labels.withdraw.walletFlow.amountLabel,
1685
+ className: cn("agg-type-body flex-1 min-w-0 bg-transparent outline-none", Number(amount) > 0 ? "text-agg-foreground" : "text-agg-muted-foreground"),
1686
+ placeholder: "0.00",
1687
+ value: amount,
1688
+ onChange: (e) => onAmountChange(e.target.value)
1689
+ }),
1690
+ /* @__PURE__ */ jsx("span", {
1691
+ className: "agg-type-body text-agg-muted-foreground shrink-0",
1692
+ children: selectedToken
1693
+ }),
1694
+ onMaxClick ? /* @__PURE__ */ jsx("button", {
1695
+ type: "button",
1696
+ className: "agg-type-label-strong text-agg-primary hover:opacity-80 transition-opacity cursor-pointer shrink-0",
1697
+ onClick: onMaxClick,
1698
+ children: labels.withdraw.walletFlow.max
1699
+ }) : null
1700
+ ]
1701
+ })]
1702
+ }),
1703
+ /* @__PURE__ */ jsxs("div", {
1704
+ className: "flex flex-col gap-3 sm:flex-row sm:gap-5",
1705
+ children: [/* @__PURE__ */ jsxs("div", {
1706
+ className: "flex-1 flex flex-col gap-2 min-w-0",
1707
+ children: [/* @__PURE__ */ jsx("p", {
1708
+ className: "agg-type-label-strong text-agg-foreground",
1709
+ children: labels.withdraw.walletFlow.tokenLabel
1710
+ }), /* @__PURE__ */ jsx(Select, {
1711
+ items: tokenOptions,
1712
+ disabled: fixedDestination,
1713
+ value: selectedToken,
1714
+ onChange: onTokenChange,
1715
+ ariaLabel: labels.withdraw.walletFlow.tokenLabel
1716
+ })]
1717
+ }), /* @__PURE__ */ jsxs("div", {
1718
+ className: "flex-1 flex flex-col gap-2 min-w-0",
1719
+ children: [/* @__PURE__ */ jsx("p", {
1720
+ className: "agg-type-label-strong text-agg-foreground",
1721
+ children: labels.withdraw.walletFlow.networkLabel
1722
+ }), /* @__PURE__ */ jsx(Select, {
1723
+ items: networkOptions,
1724
+ disabled: fixedDestination,
1725
+ value: selectedNetwork,
1726
+ onChange: onNetworkChange,
1727
+ ariaLabel: labels.withdraw.walletFlow.networkLabel
1728
+ })]
1729
+ })]
1730
+ }),
1731
+ shouldShowWithdrawEstimate && withdrawEstimate ? /* @__PURE__ */ jsx(TransferFeeSummary, {
1732
+ estimate: withdrawEstimate,
1733
+ view: "withdraw"
1734
+ }) : null,
1735
+ previewUnviableMessage ? /* @__PURE__ */ jsx("p", {
1736
+ className: "agg-type-label text-agg-error",
1737
+ role: "alert",
1738
+ children: previewUnviableMessage
1739
+ }) : null
1740
+ ]
1741
+ }),
1742
+ /* @__PURE__ */ jsx(Button, {
1743
+ variant: isValid && !isConfirming && !previewUnviable && !previewLoading ? "primary" : "secondary",
1744
+ size: "large",
1745
+ className: "w-full",
1746
+ disabled: isDisabled,
1747
+ prefix: previewLoading && !isConfirming ? /* @__PURE__ */ jsx(LoadingIcon, {
1748
+ size: "small",
1749
+ className: "mr-2 text-current"
1750
+ }) : void 0,
1751
+ onClick: onContinue,
1752
+ children: isConfirming ? labels.common.loading : previewLoading ? labels.withdraw.walletFlow.calculatingFees : labels.withdraw.walletFlow.confirm
1753
+ }),
1754
+ error ? /* @__PURE__ */ jsx("p", {
1755
+ className: "agg-type-label text-agg-error text-center",
1756
+ role: "alert",
1757
+ children: error
1758
+ }) : null
1759
+ ]
1760
+ })
1761
+ })] });
1762
+ };
1763
+ //#endregion
1764
+ //#region src/withdraw/steps/withdraw-success.tsx
1765
+ const SummaryRow = ({ label, value }) => /* @__PURE__ */ jsxs("div", {
1766
+ className: "flex items-center justify-between gap-4 border-b border-agg-separator py-2 last:border-b-0",
1767
+ children: [/* @__PURE__ */ jsx("p", {
1768
+ className: "min-w-0 text-[12px] leading-4 font-agg-bold uppercase text-agg-muted-foreground",
1769
+ children: label
1770
+ }), /* @__PURE__ */ jsx("p", {
1771
+ className: "min-w-0 text-right text-[14px] leading-5 text-agg-foreground",
1772
+ children: value
1773
+ })]
1774
+ });
1775
+ const WithdrawCloseButton = ({ onClose, label }) => /* @__PURE__ */ jsx("button", {
1776
+ type: "button",
1777
+ className: "absolute right-8 top-7 flex cursor-pointer items-center justify-center text-agg-foreground transition-colors hover:text-agg-foreground/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary",
1778
+ onClick: onClose,
1779
+ "aria-label": label,
1780
+ children: /* @__PURE__ */ jsx(CloseIcon, { className: "h-6 w-6" })
1781
+ });
1782
+ const LoadingGlyph = ({ className, enableAnimations }) => /* @__PURE__ */ jsx("span", {
1783
+ "aria-hidden": "true",
1784
+ className: cn("inline-block rounded-full border-2 border-current border-r-transparent", getMotionClassName(enableAnimations, "animate-spin"), className)
1785
+ });
1786
+ const loadingActiveIndexFor = (state) => {
1787
+ if (state.status === "transferring") return 2;
1788
+ if (state.status === "bridging") return 1;
1789
+ return 0;
1790
+ };
1791
+ const getLoadingSteps = (labels) => [
1792
+ {
1793
+ id: "preparing",
1794
+ label: labels.lifecycle.loadingSteps.preparing
1795
+ },
1796
+ {
1797
+ id: "bridging",
1798
+ label: labels.lifecycle.loadingSteps.bridging
1799
+ },
1800
+ {
1801
+ id: "sending",
1802
+ label: labels.lifecycle.loadingSteps.sending
1803
+ },
1804
+ {
1805
+ id: "confirming",
1806
+ label: labels.lifecycle.loadingSteps.confirming
1807
+ }
1808
+ ];
1809
+ const WithdrawLoadingStep = ({ lifecycleState, onClose }) => {
1810
+ const labels = useLabels();
1811
+ const { features: { enableAnimations } } = useSdkUiConfig();
1812
+ const walletFlowLabels = labels.withdraw.walletFlow;
1813
+ const activeIndex = loadingActiveIndexFor(lifecycleState);
1814
+ const loadingSteps = getLoadingSteps(walletFlowLabels);
1815
+ return /* @__PURE__ */ jsx("div", {
1816
+ className: "relative",
1817
+ children: /* @__PURE__ */ jsx(Modal.Body, {
1818
+ classNames: { root: "px-8 py-7" },
1819
+ children: /* @__PURE__ */ jsxs("div", {
1820
+ className: "flex flex-col gap-7",
1821
+ children: [
1822
+ /* @__PURE__ */ jsxs("div", {
1823
+ className: "flex items-center justify-between gap-4",
1824
+ children: [/* @__PURE__ */ jsx("h3", {
1825
+ className: "text-agg-2xl leading-agg-8 font-agg-bold text-agg-foreground",
1826
+ children: walletFlowLabels.successTitle
1827
+ }), /* @__PURE__ */ jsx("button", {
1828
+ type: "button",
1829
+ className: "flex cursor-pointer items-center justify-center text-agg-foreground transition-colors hover:text-agg-foreground/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary",
1830
+ onClick: onClose,
1831
+ "aria-label": labels.common.close,
1832
+ children: /* @__PURE__ */ jsx(CloseIcon, { className: "h-6 w-6" })
1833
+ })]
1834
+ }),
1835
+ /* @__PURE__ */ jsx("div", {
1836
+ className: "flex flex-col gap-5",
1837
+ role: "status",
1838
+ "aria-live": "polite",
1839
+ children: loadingSteps.map((step, index) => {
1840
+ const isComplete = index < activeIndex;
1841
+ const isActive = index === activeIndex;
1842
+ return /* @__PURE__ */ jsxs("div", {
1843
+ className: "flex items-center gap-3",
1844
+ children: [
1845
+ isComplete ? /* @__PURE__ */ jsx(Icon, {
1846
+ name: "check-circle",
1847
+ size: "small",
1848
+ className: "h-4 w-4 shrink-0 text-agg-primary",
1849
+ "aria-hidden": "true"
1850
+ }) : null,
1851
+ isActive ? /* @__PURE__ */ jsx(LoadingGlyph, {
1852
+ enableAnimations,
1853
+ className: "h-4 w-4 shrink-0 text-agg-primary"
1854
+ }) : null,
1855
+ !isComplete && !isActive ? /* @__PURE__ */ jsx("span", {
1856
+ "aria-hidden": "true",
1857
+ className: "h-4 w-4 shrink-0 rounded-full border border-agg-separator"
1858
+ }) : null,
1859
+ /* @__PURE__ */ jsx("p", {
1860
+ className: cn("min-w-0 flex-1 text-agg-base leading-agg-6", isActive || isComplete ? "text-agg-foreground" : "text-agg-muted-foreground"),
1861
+ children: step.label
1862
+ })
1863
+ ]
1864
+ }, step.id);
1865
+ })
1866
+ }),
1867
+ /* @__PURE__ */ jsx("p", {
1868
+ className: "text-agg-sm leading-agg-5 text-agg-foreground",
1869
+ children: walletFlowLabels.loadingDescription
1870
+ })
1871
+ ]
1872
+ })
1873
+ })
1874
+ });
1875
+ };
1876
+ const resultCopyFor = ({ status, tokenSymbol, labels }) => {
1877
+ if (status === "failed") return {
1878
+ title: labels.successTitleFailed,
1879
+ description: labels.successDescriptionFailed(tokenSymbol)
1880
+ };
1881
+ if (status === "partial_success") return {
1882
+ title: labels.successTitlePartial,
1883
+ description: labels.successDescriptionPartial(tokenSymbol)
1884
+ };
1885
+ return {
1886
+ title: labels.successTitleCompleted,
1887
+ description: labels.successDescriptionCompleted(tokenSymbol)
1888
+ };
1889
+ };
1890
+ const WithdrawSuccessStep = ({ summary, tokenSymbol, requestedWithdrawal, resultStatus, errorMessage, onDone, onRetry, onClose }) => {
1891
+ const labels = useLabels();
1892
+ const walletFlowLabels = labels.withdraw.walletFlow;
1893
+ const { title, description } = resultCopyFor({
1894
+ status: resultStatus,
1895
+ tokenSymbol,
1896
+ labels: walletFlowLabels
1897
+ });
1898
+ const isFailed = resultStatus === "failed";
1899
+ return /* @__PURE__ */ jsx("div", {
1900
+ className: "relative",
1901
+ children: /* @__PURE__ */ jsxs(Modal.Body, {
1902
+ classNames: { root: "px-10 py-12" },
1903
+ children: [/* @__PURE__ */ jsx(WithdrawCloseButton, {
1904
+ onClose,
1905
+ label: labels.common.close
1906
+ }), /* @__PURE__ */ jsxs("div", {
1907
+ className: "flex flex-col items-center justify-center gap-8 text-center",
1908
+ children: [
1909
+ /* @__PURE__ */ jsx("div", {
1910
+ className: cn("flex h-[60px] w-[60px] items-center justify-center rounded-full", isFailed ? "bg-agg-error/15" : "bg-agg-success/15"),
1911
+ "aria-hidden": "true",
1912
+ children: isFailed ? /* @__PURE__ */ jsx(CloseIcon, { className: "h-6 w-6 text-agg-error" }) : /* @__PURE__ */ jsx(SuccessCheckIcon, { className: "h-6 w-6 text-agg-success" })
1913
+ }),
1914
+ /* @__PURE__ */ jsxs("div", {
1915
+ className: "flex w-full flex-col items-center gap-3 text-center text-agg-foreground",
1916
+ children: [/* @__PURE__ */ jsx("h3", {
1917
+ className: "text-agg-2xl leading-agg-8 font-agg-bold",
1918
+ children: title
1919
+ }), /* @__PURE__ */ jsx("p", {
1920
+ className: "max-w-[400px] text-agg-base leading-agg-6",
1921
+ "data-withdraw-result-status": resultStatus,
1922
+ children: errorMessage && isFailed ? errorMessage : description
1923
+ })]
1924
+ }),
1925
+ !isFailed ? /* @__PURE__ */ jsxs("div", {
1926
+ className: "flex w-full max-w-[400px] flex-col rounded-agg-lg border border-agg-separator bg-agg-secondary px-3 py-1 text-left",
1927
+ children: [
1928
+ /* @__PURE__ */ jsx(SummaryRow, {
1929
+ label: walletFlowLabels.summary.requestedWithdrawal,
1930
+ value: requestedWithdrawal
1931
+ }),
1932
+ /* @__PURE__ */ jsx(SummaryRow, {
1933
+ label: walletFlowLabels.summary.amountReceived,
1934
+ value: summary.amountReceived
1935
+ }),
1936
+ /* @__PURE__ */ jsx(SummaryRow, {
1937
+ label: walletFlowLabels.summary.fees,
1938
+ value: summary.fees
1939
+ }),
1940
+ /* @__PURE__ */ jsx(SummaryRow, {
1941
+ label: walletFlowLabels.summary.network,
1942
+ value: summary.network
1943
+ }),
1944
+ /* @__PURE__ */ jsx(SummaryRow, {
1945
+ label: walletFlowLabels.summary.toWallet,
1946
+ value: summary.toWallet
1947
+ })
1948
+ ]
1949
+ }) : null,
1950
+ isFailed ? /* @__PURE__ */ jsxs("div", {
1951
+ className: "flex items-center justify-center gap-3",
1952
+ children: [/* @__PURE__ */ jsx(Button, {
1953
+ variant: "secondary",
1954
+ size: "large",
1955
+ className: "w-[120px]",
1956
+ onClick: onClose,
1957
+ children: walletFlowLabels.close
1958
+ }), /* @__PURE__ */ jsx(Button, {
1959
+ variant: "primary",
1960
+ size: "large",
1961
+ className: "w-[123px]",
1962
+ onClick: onRetry,
1963
+ children: walletFlowLabels.retry
1964
+ })]
1965
+ }) : /* @__PURE__ */ jsx(Button, {
1966
+ variant: "secondary",
1967
+ size: "large",
1968
+ className: "w-[120px]",
1969
+ onClick: onDone,
1970
+ children: labels.withdraw.done
1971
+ })
1972
+ ]
1973
+ })]
1974
+ })
1975
+ });
1976
+ };
1977
+ //#endregion
1978
+ //#region src/withdraw/index.tsx
1979
+ const DEFAULT_TOKEN_DECIMALS = 6;
1980
+ const TOKEN_DECIMALS_BY_SYMBOL = {
1981
+ BNB: 18,
1982
+ ETH: 18,
1983
+ MATIC: 18,
1984
+ POL: 18,
1985
+ WETH: 18,
1986
+ USDC: 6,
1987
+ USDT: 6
1988
+ };
1989
+ const TOKEN_DECIMALS_BY_CHAIN_AND_SYMBOL = { "56": {
1990
+ USDC: 18,
1991
+ USDT: 18
1992
+ } };
1993
+ const getTokenDecimals = (tokenSymbol, chainId) => {
1994
+ const normalizedSymbol = tokenSymbol.trim().toUpperCase();
1995
+ const normalizedChainId = chainId?.trim();
1996
+ if (normalizedChainId) {
1997
+ const chainTokenDecimals = TOKEN_DECIMALS_BY_CHAIN_AND_SYMBOL[normalizedChainId]?.[normalizedSymbol];
1998
+ if (chainTokenDecimals != null) return chainTokenDecimals;
1999
+ }
2000
+ return TOKEN_DECIMALS_BY_SYMBOL[normalizedSymbol] ?? DEFAULT_TOKEN_DECIMALS;
2001
+ };
2002
+ const formatRawTokenAmount = (rawAmount, decimals) => {
2003
+ const raw = BigInt(rawAmount);
2004
+ const divisor = BigInt(`1${"0".repeat(decimals)}`);
2005
+ const whole = raw / divisor;
2006
+ const remainder = raw % divisor;
2007
+ if (remainder === BigInt(0)) return whole.toString();
2008
+ return `${whole.toString()}.${remainder.toString().padStart(decimals, "0").replace(/0+$/, "")}`;
2009
+ };
2010
+ const formatLifecycleTokenAmount = ({ rawAmount, tokenSymbol, chainId }) => `${formatRawTokenAmount(rawAmount, getTokenDecimals(tokenSymbol, chainId))} ${tokenSymbol}`;
2011
+ const buildTerminalSummary = ({ fallbackSummary, lifecycleCompletedAmountRaw, lifecycleRequestedAmountRaw, lifecycleFeeRaw, tokenSymbol, chainId }) => {
2012
+ if (!lifecycleCompletedAmountRaw) return fallbackSummary;
2013
+ const amountReceived = formatLifecycleTokenAmount({
2014
+ rawAmount: lifecycleCompletedAmountRaw,
2015
+ tokenSymbol,
2016
+ chainId
2017
+ });
2018
+ let feeRaw = lifecycleFeeRaw;
2019
+ if (feeRaw == null && lifecycleRequestedAmountRaw) try {
2020
+ const r = BigInt(lifecycleRequestedAmountRaw);
2021
+ const c = BigInt(lifecycleCompletedAmountRaw);
2022
+ feeRaw = (r > c ? r - c : BigInt(0)).toString();
2023
+ } catch {
2024
+ feeRaw = null;
2025
+ }
2026
+ return {
2027
+ ...fallbackSummary,
2028
+ amountReceived,
2029
+ ...feeRaw != null ? { fees: formatLifecycleTokenAmount({
2030
+ rawAmount: feeRaw,
2031
+ tokenSymbol,
2032
+ chainId
2033
+ }) } : {}
2034
+ };
2035
+ };
2036
+ function isControlledWithdrawModalProps(props) {
2037
+ return "withdrawFlow" in props;
2038
+ }
2039
+ function WithdrawModalSelfDriven({ open, onOpenChange }) {
2040
+ const withdrawProps = useWithdrawFlow({
2041
+ open,
2042
+ onOpenChange
2043
+ });
2044
+ return /* @__PURE__ */ jsx(WithdrawModalControlled, { ...withdrawProps });
2045
+ }
2046
+ function WithdrawModalControlled({ open, onOpenChange, withdrawFlow, transferTarget, onWithdrawDestinationChange, onWithdrawAmountChange, onWithdrawTokenChange, onWithdrawNetworkChange, onMaxClick, onSelectWithdrawProvider, onDoneWithdraw }) {
2047
+ const initialFormStep = transferTarget ? "withdraw-amount" : "method";
2048
+ const [flowState, setFlowState] = useState({
2049
+ status: "form",
2050
+ formStep: initialFormStep
2051
+ });
2052
+ const [isConfirming, setIsConfirming] = useState(false);
2053
+ const [confirmError, setConfirmError] = useState(null);
2054
+ const { state: withdrawalLifecycleState, reset: resetWithdrawalLifecycle } = useWithdrawalLifecycle(withdrawFlow.withdrawalId);
2055
+ useEffect(() => {
2056
+ if (!open) {
2057
+ setFlowState({
2058
+ status: "form",
2059
+ formStep: initialFormStep
2060
+ });
2061
+ setIsConfirming(false);
2062
+ setConfirmError(null);
2063
+ resetWithdrawalLifecycle();
2064
+ }
2065
+ }, [
2066
+ open,
2067
+ resetWithdrawalLifecycle,
2068
+ initialFormStep
2069
+ ]);
2070
+ useEffect(() => {
2071
+ if (flowState.status !== "loading") return;
2072
+ if (!withdrawalLifecycleState.terminal) return;
2073
+ if (withdrawalLifecycleState.status === "completed") {
2074
+ setFlowState({ status: "success" });
2075
+ return;
2076
+ }
2077
+ if (withdrawalLifecycleState.status === "partial") {
2078
+ setFlowState({ status: "partial_success" });
2079
+ return;
2080
+ }
2081
+ if (withdrawalLifecycleState.status === "failed") setFlowState({
2082
+ status: "failed",
2083
+ errorMessage: withdrawalLifecycleState.errorMessage
2084
+ });
2085
+ }, [
2086
+ flowState.status,
2087
+ withdrawalLifecycleState.errorMessage,
2088
+ withdrawalLifecycleState.status,
2089
+ withdrawalLifecycleState.terminal
2090
+ ]);
2091
+ const handleOpenChange = (isOpen) => {
2092
+ if (!isOpen) {
2093
+ setFlowState({
2094
+ status: "form",
2095
+ formStep: initialFormStep
2096
+ });
2097
+ setIsConfirming(false);
2098
+ setConfirmError(null);
2099
+ resetWithdrawalLifecycle();
2100
+ }
2101
+ onOpenChange(isOpen);
2102
+ };
2103
+ const handleBack = () => {
2104
+ if (transferTarget) {
2105
+ handleOpenChange(false);
2106
+ return;
2107
+ }
2108
+ setConfirmError(null);
2109
+ setFlowState({
2110
+ status: "form",
2111
+ formStep: initialFormStep
2112
+ });
2113
+ };
2114
+ const handleRetry = () => {
2115
+ setConfirmError(null);
2116
+ setIsConfirming(false);
2117
+ resetWithdrawalLifecycle();
2118
+ setFlowState({
2119
+ status: "form",
2120
+ formStep: "withdraw-amount"
2121
+ });
2122
+ };
2123
+ const handleConfirm = async () => {
2124
+ if (isConfirming || transferTarget && (withdrawFlow.destinationWallet !== transferTarget.address || withdrawFlow.selectedNetwork !== transferTarget.chainId || withdrawFlow.selectedToken !== transferTarget.tokenSymbol)) return;
2125
+ setFlowState({ status: "loading" });
2126
+ setIsConfirming(true);
2127
+ setConfirmError(null);
2128
+ try {
2129
+ await onSelectWithdrawProvider("wallet");
2130
+ } catch (err) {
2131
+ const errorMessage = err instanceof Error ? err.message : "Withdrawal failed. Please try again.";
2132
+ setConfirmError(errorMessage);
2133
+ setFlowState({
2134
+ status: "failed",
2135
+ errorMessage
2136
+ });
2137
+ } finally {
2138
+ setIsConfirming(false);
2139
+ }
2140
+ };
2141
+ const withdrawTokenOptions = withTokenIcons(withdrawFlow.tokenOptions);
2142
+ const withdrawNetworkOptions = withNetworkIcons(withdrawFlow.networkOptions);
2143
+ const requestedWithdrawal = `${withdrawFlow.amount} ${withdrawFlow.selectedToken}`.trim();
2144
+ const modalMaxWidth = flowState.status === "form" && flowState.formStep === "method" ? "600px" : "480px";
2145
+ const resultStatus = flowState.status;
2146
+ const terminalSummary = buildTerminalSummary({
2147
+ fallbackSummary: withdrawFlow.purchaseSummary,
2148
+ lifecycleCompletedAmountRaw: withdrawalLifecycleState.completedAmountRaw,
2149
+ lifecycleRequestedAmountRaw: withdrawalLifecycleState.requestedAmountRaw,
2150
+ lifecycleFeeRaw: withdrawalLifecycleState.feeRaw,
2151
+ tokenSymbol: withdrawFlow.selectedToken,
2152
+ chainId: withdrawFlow.selectedNetwork
2153
+ });
2154
+ return /* @__PURE__ */ jsx(Modal, {
2155
+ open,
2156
+ onOpenChange: handleOpenChange,
2157
+ children: /* @__PURE__ */ jsxs(Modal.Container, {
2158
+ maxWidth: modalMaxWidth,
2159
+ "aria-label": transferTarget?.title ?? "Withdraw",
2160
+ children: [
2161
+ flowState.status === "form" && flowState.formStep === "method" ? /* @__PURE__ */ jsx(WithdrawMethodStep, {
2162
+ balance: withdrawFlow.balance,
2163
+ onSelectMethod: () => setFlowState({
2164
+ status: "form",
2165
+ formStep: "withdraw-amount"
2166
+ })
2167
+ }) : null,
2168
+ flowState.status === "form" && flowState.formStep === "withdraw-amount" ? /* @__PURE__ */ jsx(WithdrawAmountStep, {
2169
+ title: transferTarget?.title,
2170
+ fixedDestination: !!transferTarget,
2171
+ amount: withdrawFlow.amount,
2172
+ destinationWallet: withdrawFlow.destinationWallet,
2173
+ balanceDisplay: withdrawFlow.balanceDisplay,
2174
+ tokenOptions: withdrawTokenOptions,
2175
+ networkOptions: withdrawNetworkOptions,
2176
+ selectedToken: withdrawFlow.selectedToken,
2177
+ selectedNetwork: withdrawFlow.selectedNetwork,
2178
+ destDecimals: getTokenDecimals(withdrawFlow.selectedToken, withdrawFlow.selectedNetwork),
2179
+ isConfirming,
2180
+ error: confirmError,
2181
+ max: withdrawFlow.isMax,
2182
+ onBack: handleBack,
2183
+ onAmountChange: onWithdrawAmountChange,
2184
+ onDestinationChange: onWithdrawDestinationChange,
2185
+ onTokenChange: onWithdrawTokenChange,
2186
+ onNetworkChange: onWithdrawNetworkChange,
2187
+ onMaxClick,
2188
+ onContinue: handleConfirm
2189
+ }) : null,
2190
+ flowState.status === "loading" ? /* @__PURE__ */ jsx(WithdrawLoadingStep, {
2191
+ lifecycleState: withdrawalLifecycleState,
2192
+ onClose: () => handleOpenChange(false)
2193
+ }) : null,
2194
+ flowState.status === "success" || flowState.status === "partial_success" || flowState.status === "failed" ? /* @__PURE__ */ jsx(WithdrawSuccessStep, {
2195
+ summary: terminalSummary,
2196
+ tokenSymbol: withdrawFlow.selectedToken,
2197
+ requestedWithdrawal,
2198
+ resultStatus,
2199
+ errorMessage: flowState.status === "failed" ? flowState.errorMessage : null,
2200
+ onDone: onDoneWithdraw,
2201
+ onRetry: handleRetry,
2202
+ onClose: () => handleOpenChange(false)
2203
+ }) : null
2204
+ ]
2205
+ })
2206
+ });
2207
+ }
2208
+ const WithdrawModal = (props) => {
2209
+ if (isControlledWithdrawModalProps(props)) return /* @__PURE__ */ jsx(WithdrawModalControlled, { ...props });
2210
+ return /* @__PURE__ */ jsx(WithdrawModalSelfDriven, { ...props });
2211
+ };
2212
+ WithdrawModal.displayName = "WithdrawModal";
2213
+ //#endregion
2214
+ //#region src/pages/user-profile/components/betdex-wallet-deposit.tsx
2215
+ /** Move the user's managed cash through the normal bridge/withdrawal pipeline
2216
+ * to their verified BETDEX deposit address. Only confirmation submits money. */
2217
+ function BetdexWalletDeposit({ address, onClose }) {
2218
+ const labels = useLabels().userProfile.hostedBetdex;
2219
+ const flow = useWithdrawFlow({
2220
+ open: true,
2221
+ onOpenChange: (open) => {
2222
+ if (!open) onClose();
2223
+ }
2224
+ });
2225
+ const { onWithdrawDestinationChange, onWithdrawNetworkChange, onWithdrawTokenChange } = flow;
2226
+ useEffect(() => {
2227
+ onWithdrawDestinationChange(address);
2228
+ onWithdrawNetworkChange("792703809");
2229
+ onWithdrawTokenChange("USDC");
2230
+ }, [
2231
+ address,
2232
+ onWithdrawDestinationChange,
2233
+ onWithdrawNetworkChange,
2234
+ onWithdrawTokenChange
2235
+ ]);
2236
+ return /* @__PURE__ */ jsx(WithdrawModal, {
2237
+ ...flow,
2238
+ transferTarget: {
2239
+ title: labels.transferToBetdex,
2240
+ address,
2241
+ chainId: "792703809",
2242
+ tokenSymbol: "USDC"
2243
+ }
2244
+ });
2245
+ }
2246
+ //#endregion
2247
+ //#region src/trading/manage-betdex-account-modal.tsx
2248
+ /** Reuse the account controls without treating hosted cash as wallet cash. */
2249
+ function ManageBetdexAccountModal({ open, onOpenChange, userId }) {
2250
+ const labels = useLabels();
2251
+ const [fundingTarget, setFundingTarget] = useState(null);
2252
+ const currentTarget = fundingTarget?.userId === userId ? fundingTarget : null;
2253
+ useEffect(() => {
2254
+ if (!open) setFundingTarget(null);
2255
+ }, [open]);
2256
+ useEffect(() => setFundingTarget(null), [userId]);
2257
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Modal, {
2258
+ open: open && !currentTarget,
2259
+ onOpenChange,
2260
+ children: /* @__PURE__ */ jsxs(Modal.Container, {
2261
+ maxWidth: "600px",
2262
+ "aria-label": labels.trading.manageBetdexAccount,
2263
+ children: [/* @__PURE__ */ jsx(Dialog.Close, {
2264
+ "aria-label": labels.common.close,
2265
+ className: "absolute right-4 top-4 z-10 flex size-11 cursor-pointer items-center justify-center rounded-agg-full text-agg-muted-foreground hover:bg-agg-quaternary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-accent",
2266
+ children: /* @__PURE__ */ jsx(Icon, {
2267
+ name: "close",
2268
+ size: "medium"
2269
+ })
2270
+ }), /* @__PURE__ */ jsxs(Modal.Body, {
2271
+ classNames: { root: "!px-5 !py-16" },
2272
+ children: [
2273
+ /* @__PURE__ */ jsx(Dialog.Title, {
2274
+ className: "sr-only",
2275
+ children: labels.trading.manageBetdexAccount
2276
+ }),
2277
+ /* @__PURE__ */ jsx(Dialog.Description, {
2278
+ className: "sr-only",
2279
+ children: labels.userProfile.hostedBetdex.description
2280
+ }),
2281
+ open ? /* @__PURE__ */ jsx(BetdexAccountCard, { onWalletDeposit: userId ? (address) => setFundingTarget({
2282
+ userId,
2283
+ address
2284
+ }) : void 0 }) : null
2285
+ ]
2286
+ })]
2287
+ })
2288
+ }), open && currentTarget ? /* @__PURE__ */ jsx(BetdexWalletDeposit, {
2289
+ address: currentTarget.address,
2290
+ onClose: () => setFundingTarget(null)
2291
+ }, currentTarget.userId) : null] });
2292
+ }
2293
+ //#endregion
2294
+ export { DEFAULT_CURRENCY_OPTIONS as a, withNetworkIcons as c, ConnectProphetxModal as d, ConnectKalshiModal as f, subscribeAggDepositNotification as g, dispatchAggDepositNotification as h, TransferFeeSummary as i, withTokenIcons as l, GeoBlockBanner as m, WithdrawModal as n, mapNetworksToOptions as o, SharedKycModal as p, buildTerminalSummary as r, mergeSelectOptionsUnique as s, ManageBetdexAccountModal as t, ConnectNovigModal as u };