@daimo/pay 1.19.7 → 1.19.9

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 (457) hide show
  1. package/build/index.d.ts +52 -64
  2. package/build/package.json.js +6 -5
  3. package/build/package.json.js.map +1 -1
  4. package/build/src/assets/chains.js +24 -2
  5. package/build/src/assets/chains.js.map +1 -1
  6. package/build/src/components/Common/AmountInput/AmountInputField.js +6 -15
  7. package/build/src/components/Common/AmountInput/AmountInputField.js.map +1 -1
  8. package/build/src/components/Common/AmountInput/index.js +31 -24
  9. package/build/src/components/Common/AmountInput/index.js.map +1 -1
  10. package/build/src/components/Common/Modal/index.js +12 -1
  11. package/build/src/components/Common/Modal/index.js.map +1 -1
  12. package/build/src/components/Pages/WaitingExternal/index.js +1 -1
  13. package/build/src/components/Pages/WaitingExternal/index.js.map +1 -1
  14. package/build/src/defaultConfig.js +2 -1
  15. package/build/src/defaultConfig.js.map +1 -1
  16. package/build/src/hooks/usePaymentOptions.js +183 -0
  17. package/build/src/hooks/usePaymentOptions.js.map +1 -0
  18. package/build/src/hooks/usePaymentState.js +18 -29
  19. package/build/src/hooks/usePaymentState.js.map +1 -1
  20. package/build/src/hooks/useTokenOptions.js +8 -4
  21. package/build/src/hooks/useTokenOptions.js.map +1 -1
  22. package/build/src/utils/format.js +3 -0
  23. package/build/src/utils/format.js.map +1 -1
  24. package/build/src/world-mini-app/WorldPayButton.js.map +1 -1
  25. package/build/{types-1473bcf4.d.ts → types-26343050.d.ts} +2 -2
  26. package/build/world.d.ts +4 -6
  27. package/package.json +6 -5
  28. package/build/_virtual/common.js +0 -4
  29. package/build/_virtual/common.js.map +0 -1
  30. package/build/_virtual/common2.js +0 -4
  31. package/build/_virtual/common2.js.map +0 -1
  32. package/build/_virtual/hash.js +0 -4
  33. package/build/_virtual/hash.js.map +0 -1
  34. package/build/_virtual/hash2.js +0 -4
  35. package/build/_virtual/hash2.js.map +0 -1
  36. package/build/_virtual/index.js +0 -4
  37. package/build/_virtual/index.js.map +0 -1
  38. package/build/_virtual/index2.js +0 -4
  39. package/build/_virtual/index2.js.map +0 -1
  40. package/build/_virtual/inherits_browser.js +0 -4
  41. package/build/_virtual/inherits_browser.js.map +0 -1
  42. package/build/_virtual/ripemd.js +0 -4
  43. package/build/_virtual/ripemd.js.map +0 -1
  44. package/build/_virtual/sha.js +0 -4
  45. package/build/_virtual/sha.js.map +0 -1
  46. package/build/_virtual/utils.js +0 -4
  47. package/build/_virtual/utils.js.map +0 -1
  48. package/build/node_modules/@binance/w3w-utils/dist/index.js +0 -7
  49. package/build/node_modules/@binance/w3w-utils/dist/index.js.map +0 -1
  50. package/build/node_modules/@binance/w3w-utils/node_modules/eventemitter3/index.js +0 -349
  51. package/build/node_modules/@binance/w3w-utils/node_modules/eventemitter3/index.js.map +0 -1
  52. package/build/node_modules/hash.js/lib/hash/common.js +0 -105
  53. package/build/node_modules/hash.js/lib/hash/common.js.map +0 -1
  54. package/build/node_modules/hash.js/lib/hash/hmac.js +0 -60
  55. package/build/node_modules/hash.js/lib/hash/hmac.js.map +0 -1
  56. package/build/node_modules/hash.js/lib/hash/ripemd.js +0 -159
  57. package/build/node_modules/hash.js/lib/hash/ripemd.js.map +0 -1
  58. package/build/node_modules/hash.js/lib/hash/sha/1.js +0 -88
  59. package/build/node_modules/hash.js/lib/hash/sha/1.js.map +0 -1
  60. package/build/node_modules/hash.js/lib/hash/sha/224.js +0 -42
  61. package/build/node_modules/hash.js/lib/hash/sha/224.js.map +0 -1
  62. package/build/node_modules/hash.js/lib/hash/sha/256.js +0 -120
  63. package/build/node_modules/hash.js/lib/hash/sha/256.js.map +0 -1
  64. package/build/node_modules/hash.js/lib/hash/sha/384.js +0 -48
  65. package/build/node_modules/hash.js/lib/hash/sha/384.js.map +0 -1
  66. package/build/node_modules/hash.js/lib/hash/sha/512.js +0 -344
  67. package/build/node_modules/hash.js/lib/hash/sha/512.js.map +0 -1
  68. package/build/node_modules/hash.js/lib/hash/sha/common.js +0 -61
  69. package/build/node_modules/hash.js/lib/hash/sha/common.js.map +0 -1
  70. package/build/node_modules/hash.js/lib/hash/sha.js +0 -23
  71. package/build/node_modules/hash.js/lib/hash/sha.js.map +0 -1
  72. package/build/node_modules/hash.js/lib/hash/utils.js +0 -291
  73. package/build/node_modules/hash.js/lib/hash/utils.js.map +0 -1
  74. package/build/node_modules/hash.js/lib/hash.js +0 -34
  75. package/build/node_modules/hash.js/lib/hash.js.map +0 -1
  76. package/build/node_modules/inherits/inherits_browser.js +0 -39
  77. package/build/node_modules/inherits/inherits_browser.js.map +0 -1
  78. package/build/node_modules/minimalistic-assert/index.js +0 -22
  79. package/build/node_modules/minimalistic-assert/index.js.map +0 -1
  80. package/build/pay/packages/connectkit/package.json.js +0 -123
  81. package/build/pay/packages/connectkit/package.json.js.map +0 -1
  82. package/build/pay/packages/connectkit/src/assets/MobileWithLogos.js +0 -329
  83. package/build/pay/packages/connectkit/src/assets/MobileWithLogos.js.map +0 -1
  84. package/build/pay/packages/connectkit/src/assets/ScanIconWithLogos.js +0 -243
  85. package/build/pay/packages/connectkit/src/assets/ScanIconWithLogos.js.map +0 -1
  86. package/build/pay/packages/connectkit/src/assets/browsers.js +0 -969
  87. package/build/pay/packages/connectkit/src/assets/browsers.js.map +0 -1
  88. package/build/pay/packages/connectkit/src/assets/chains.js +0 -639
  89. package/build/pay/packages/connectkit/src/assets/chains.js.map +0 -1
  90. package/build/pay/packages/connectkit/src/assets/icons.js +0 -273
  91. package/build/pay/packages/connectkit/src/assets/icons.js.map +0 -1
  92. package/build/pay/packages/connectkit/src/assets/logos.js +0 -1722
  93. package/build/pay/packages/connectkit/src/assets/logos.js.map +0 -1
  94. package/build/pay/packages/connectkit/src/assets/wave.js +0 -46
  95. package/build/pay/packages/connectkit/src/assets/wave.js.map +0 -1
  96. package/build/pay/packages/connectkit/src/components/Common/Alert/index.js +0 -13
  97. package/build/pay/packages/connectkit/src/components/Common/Alert/index.js.map +0 -1
  98. package/build/pay/packages/connectkit/src/components/Common/Alert/styles.js +0 -55
  99. package/build/pay/packages/connectkit/src/components/Common/Alert/styles.js.map +0 -1
  100. package/build/pay/packages/connectkit/src/components/Common/AmountInput/AmountInputField.js +0 -71
  101. package/build/pay/packages/connectkit/src/components/Common/AmountInput/AmountInputField.js.map +0 -1
  102. package/build/pay/packages/connectkit/src/components/Common/AmountInput/index.js +0 -159
  103. package/build/pay/packages/connectkit/src/components/Common/AmountInput/index.js.map +0 -1
  104. package/build/pay/packages/connectkit/src/components/Common/Avatar/index.js +0 -78
  105. package/build/pay/packages/connectkit/src/components/Common/Avatar/index.js.map +0 -1
  106. package/build/pay/packages/connectkit/src/components/Common/Avatar/styles.js +0 -54
  107. package/build/pay/packages/connectkit/src/components/Common/Avatar/styles.js.map +0 -1
  108. package/build/pay/packages/connectkit/src/components/Common/BrowserIcon/index.js +0 -29
  109. package/build/pay/packages/connectkit/src/components/Common/BrowserIcon/index.js.map +0 -1
  110. package/build/pay/packages/connectkit/src/components/Common/BrowserIcon/styles.js +0 -20
  111. package/build/pay/packages/connectkit/src/components/Common/BrowserIcon/styles.js.map +0 -1
  112. package/build/pay/packages/connectkit/src/components/Common/Button/index.js +0 -144
  113. package/build/pay/packages/connectkit/src/components/Common/Button/index.js.map +0 -1
  114. package/build/pay/packages/connectkit/src/components/Common/Button/styles.js +0 -287
  115. package/build/pay/packages/connectkit/src/components/Common/Button/styles.js.map +0 -1
  116. package/build/pay/packages/connectkit/src/components/Common/Chain/index.js +0 -141
  117. package/build/pay/packages/connectkit/src/components/Common/Chain/index.js.map +0 -1
  118. package/build/pay/packages/connectkit/src/components/Common/Chain/styles.js +0 -90
  119. package/build/pay/packages/connectkit/src/components/Common/Chain/styles.js.map +0 -1
  120. package/build/pay/packages/connectkit/src/components/Common/ChainSelectList/index.js +0 -250
  121. package/build/pay/packages/connectkit/src/components/Common/ChainSelectList/index.js.map +0 -1
  122. package/build/pay/packages/connectkit/src/components/Common/ChainSelectList/styles.js +0 -226
  123. package/build/pay/packages/connectkit/src/components/Common/ChainSelectList/styles.js.map +0 -1
  124. package/build/pay/packages/connectkit/src/components/Common/CircleTimer.js +0 -92
  125. package/build/pay/packages/connectkit/src/components/Common/CircleTimer.js.map +0 -1
  126. package/build/pay/packages/connectkit/src/components/Common/ConnectorList/index.js +0 -121
  127. package/build/pay/packages/connectkit/src/components/Common/ConnectorList/index.js.map +0 -1
  128. package/build/pay/packages/connectkit/src/components/Common/ConnectorList/styles.js +0 -344
  129. package/build/pay/packages/connectkit/src/components/Common/ConnectorList/styles.js.map +0 -1
  130. package/build/pay/packages/connectkit/src/components/Common/CopyToClipboard/CopyToClipboardIcon.js +0 -78
  131. package/build/pay/packages/connectkit/src/components/Common/CopyToClipboard/CopyToClipboardIcon.js.map +0 -1
  132. package/build/pay/packages/connectkit/src/components/Common/CustomQRCode/QRCode.js +0 -132
  133. package/build/pay/packages/connectkit/src/components/Common/CustomQRCode/QRCode.js.map +0 -1
  134. package/build/pay/packages/connectkit/src/components/Common/CustomQRCode/index.js +0 -89
  135. package/build/pay/packages/connectkit/src/components/Common/CustomQRCode/index.js.map +0 -1
  136. package/build/pay/packages/connectkit/src/components/Common/CustomQRCode/styles.js +0 -142
  137. package/build/pay/packages/connectkit/src/components/Common/CustomQRCode/styles.js.map +0 -1
  138. package/build/pay/packages/connectkit/src/components/Common/FitText/index.js +0 -34
  139. package/build/pay/packages/connectkit/src/components/Common/FitText/index.js.map +0 -1
  140. package/build/pay/packages/connectkit/src/components/Common/Modal/index.js +0 -547
  141. package/build/pay/packages/connectkit/src/components/Common/Modal/index.js.map +0 -1
  142. package/build/pay/packages/connectkit/src/components/Common/Modal/styles.js +0 -665
  143. package/build/pay/packages/connectkit/src/components/Common/Modal/styles.js.map +0 -1
  144. package/build/pay/packages/connectkit/src/components/Common/OptionsList/index.js +0 -145
  145. package/build/pay/packages/connectkit/src/components/Common/OptionsList/index.js.map +0 -1
  146. package/build/pay/packages/connectkit/src/components/Common/OptionsList/styles.js +0 -138
  147. package/build/pay/packages/connectkit/src/components/Common/OptionsList/styles.js.map +0 -1
  148. package/build/pay/packages/connectkit/src/components/Common/OrderHeader/index.js +0 -148
  149. package/build/pay/packages/connectkit/src/components/Common/OrderHeader/index.js.map +0 -1
  150. package/build/pay/packages/connectkit/src/components/Common/PaymentBreakdown/index.js +0 -70
  151. package/build/pay/packages/connectkit/src/components/Common/PaymentBreakdown/index.js.map +0 -1
  152. package/build/pay/packages/connectkit/src/components/Common/Portal/index.js +0 -30
  153. package/build/pay/packages/connectkit/src/components/Common/Portal/index.js.map +0 -1
  154. package/build/pay/packages/connectkit/src/components/Common/PoweredByFooter/index.js +0 -39
  155. package/build/pay/packages/connectkit/src/components/Common/PoweredByFooter/index.js.map +0 -1
  156. package/build/pay/packages/connectkit/src/components/Common/ScrollArea/index.js +0 -120
  157. package/build/pay/packages/connectkit/src/components/Common/ScrollArea/index.js.map +0 -1
  158. package/build/pay/packages/connectkit/src/components/Common/ScrollArea/styles.js +0 -169
  159. package/build/pay/packages/connectkit/src/components/Common/ScrollArea/styles.js.map +0 -1
  160. package/build/pay/packages/connectkit/src/components/Common/SelectAnotherMethodButton/index.js +0 -96
  161. package/build/pay/packages/connectkit/src/components/Common/SelectAnotherMethodButton/index.js.map +0 -1
  162. package/build/pay/packages/connectkit/src/components/Common/Spinner/index.js +0 -64
  163. package/build/pay/packages/connectkit/src/components/Common/Spinner/index.js.map +0 -1
  164. package/build/pay/packages/connectkit/src/components/Common/Spinner/styles.js +0 -22
  165. package/build/pay/packages/connectkit/src/components/Common/Spinner/styles.js.map +0 -1
  166. package/build/pay/packages/connectkit/src/components/Common/SwitchButton/index.js +0 -43
  167. package/build/pay/packages/connectkit/src/components/Common/SwitchButton/index.js.map +0 -1
  168. package/build/pay/packages/connectkit/src/components/Common/ThemedButton/index.js +0 -46
  169. package/build/pay/packages/connectkit/src/components/Common/ThemedButton/index.js.map +0 -1
  170. package/build/pay/packages/connectkit/src/components/Common/ThemedButton/styles.js +0 -152
  171. package/build/pay/packages/connectkit/src/components/Common/ThemedButton/styles.js.map +0 -1
  172. package/build/pay/packages/connectkit/src/components/Common/TokenChainLogo/index.js +0 -62
  173. package/build/pay/packages/connectkit/src/components/Common/TokenChainLogo/index.js.map +0 -1
  174. package/build/pay/packages/connectkit/src/components/Common/Tooltip/index.js +0 -129
  175. package/build/pay/packages/connectkit/src/components/Common/Tooltip/index.js.map +0 -1
  176. package/build/pay/packages/connectkit/src/components/Common/Tooltip/styles.js +0 -81
  177. package/build/pay/packages/connectkit/src/components/Common/Tooltip/styles.js.map +0 -1
  178. package/build/pay/packages/connectkit/src/components/Common/WalletChainLogo/index.js +0 -31
  179. package/build/pay/packages/connectkit/src/components/Common/WalletChainLogo/index.js.map +0 -1
  180. package/build/pay/packages/connectkit/src/components/DaimoPayButton/index.js +0 -196
  181. package/build/pay/packages/connectkit/src/components/DaimoPayButton/index.js.map +0 -1
  182. package/build/pay/packages/connectkit/src/components/DaimoPayButton/styles.js +0 -50
  183. package/build/pay/packages/connectkit/src/components/DaimoPayButton/styles.js.map +0 -1
  184. package/build/pay/packages/connectkit/src/components/DaimoPayModal/ConnectUsing.js +0 -70
  185. package/build/pay/packages/connectkit/src/components/DaimoPayModal/ConnectUsing.js.map +0 -1
  186. package/build/pay/packages/connectkit/src/components/DaimoPayModal/ConnectWithInjector/index.js +0 -339
  187. package/build/pay/packages/connectkit/src/components/DaimoPayModal/ConnectWithInjector/index.js.map +0 -1
  188. package/build/pay/packages/connectkit/src/components/DaimoPayModal/ConnectWithInjector/styles.js +0 -131
  189. package/build/pay/packages/connectkit/src/components/DaimoPayModal/ConnectWithInjector/styles.js.map +0 -1
  190. package/build/pay/packages/connectkit/src/components/DaimoPayModal/ConnectWithQRCode.js +0 -86
  191. package/build/pay/packages/connectkit/src/components/DaimoPayModal/ConnectWithQRCode.js.map +0 -1
  192. package/build/pay/packages/connectkit/src/components/DaimoPayModal/index.js +0 -605
  193. package/build/pay/packages/connectkit/src/components/DaimoPayModal/index.js.map +0 -1
  194. package/build/pay/packages/connectkit/src/components/DaimoPayThemeProvider/DaimoPayThemeProvider.js +0 -25
  195. package/build/pay/packages/connectkit/src/components/DaimoPayThemeProvider/DaimoPayThemeProvider.js.map +0 -1
  196. package/build/pay/packages/connectkit/src/components/Pages/About/graphics.js +0 -853
  197. package/build/pay/packages/connectkit/src/components/Pages/About/graphics.js.map +0 -1
  198. package/build/pay/packages/connectkit/src/components/Pages/About/index.js +0 -222
  199. package/build/pay/packages/connectkit/src/components/Pages/About/index.js.map +0 -1
  200. package/build/pay/packages/connectkit/src/components/Pages/About/styles.js +0 -140
  201. package/build/pay/packages/connectkit/src/components/Pages/About/styles.js.map +0 -1
  202. package/build/pay/packages/connectkit/src/components/Pages/Confirmation/index.js +0 -126
  203. package/build/pay/packages/connectkit/src/components/Pages/Confirmation/index.js.map +0 -1
  204. package/build/pay/packages/connectkit/src/components/Pages/Connectors/index.js +0 -26
  205. package/build/pay/packages/connectkit/src/components/Pages/Connectors/index.js.map +0 -1
  206. package/build/pay/packages/connectkit/src/components/Pages/Error/index.js +0 -57
  207. package/build/pay/packages/connectkit/src/components/Pages/Error/index.js.map +0 -1
  208. package/build/pay/packages/connectkit/src/components/Pages/MobileConnectors/index.js +0 -108
  209. package/build/pay/packages/connectkit/src/components/Pages/MobileConnectors/index.js.map +0 -1
  210. package/build/pay/packages/connectkit/src/components/Pages/MobileConnectors/styles.js +0 -64
  211. package/build/pay/packages/connectkit/src/components/Pages/MobileConnectors/styles.js.map +0 -1
  212. package/build/pay/packages/connectkit/src/components/Pages/Onboarding/index.js +0 -34
  213. package/build/pay/packages/connectkit/src/components/Pages/Onboarding/index.js.map +0 -1
  214. package/build/pay/packages/connectkit/src/components/Pages/Onboarding/styles.js +0 -229
  215. package/build/pay/packages/connectkit/src/components/Pages/Onboarding/styles.js.map +0 -1
  216. package/build/pay/packages/connectkit/src/components/Pages/PayWithToken/index.js +0 -157
  217. package/build/pay/packages/connectkit/src/components/Pages/PayWithToken/index.js.map +0 -1
  218. package/build/pay/packages/connectkit/src/components/Pages/SelectAmount/index.js +0 -24
  219. package/build/pay/packages/connectkit/src/components/Pages/SelectAmount/index.js.map +0 -1
  220. package/build/pay/packages/connectkit/src/components/Pages/SelectDepositAddressAmount/index.js +0 -79
  221. package/build/pay/packages/connectkit/src/components/Pages/SelectDepositAddressAmount/index.js.map +0 -1
  222. package/build/pay/packages/connectkit/src/components/Pages/SelectDepositAddressChain/index.js +0 -80
  223. package/build/pay/packages/connectkit/src/components/Pages/SelectDepositAddressChain/index.js.map +0 -1
  224. package/build/pay/packages/connectkit/src/components/Pages/SelectExchange/index.js +0 -62
  225. package/build/pay/packages/connectkit/src/components/Pages/SelectExchange/index.js.map +0 -1
  226. package/build/pay/packages/connectkit/src/components/Pages/SelectExternalAmount/index.js +0 -80
  227. package/build/pay/packages/connectkit/src/components/Pages/SelectExternalAmount/index.js.map +0 -1
  228. package/build/pay/packages/connectkit/src/components/Pages/SelectMethod/index.js +0 -315
  229. package/build/pay/packages/connectkit/src/components/Pages/SelectMethod/index.js.map +0 -1
  230. package/build/pay/packages/connectkit/src/components/Pages/SelectToken/index.js +0 -99
  231. package/build/pay/packages/connectkit/src/components/Pages/SelectToken/index.js.map +0 -1
  232. package/build/pay/packages/connectkit/src/components/Pages/SelectWalletAmount/index.js +0 -71
  233. package/build/pay/packages/connectkit/src/components/Pages/SelectWalletAmount/index.js.map +0 -1
  234. package/build/pay/packages/connectkit/src/components/Pages/SelectWalletChain/index.js +0 -55
  235. package/build/pay/packages/connectkit/src/components/Pages/SelectWalletChain/index.js.map +0 -1
  236. package/build/pay/packages/connectkit/src/components/Pages/SelectZKP/index.js +0 -41
  237. package/build/pay/packages/connectkit/src/components/Pages/SelectZKP/index.js.map +0 -1
  238. package/build/pay/packages/connectkit/src/components/Pages/Solana/ConnectorSolana/index.js +0 -94
  239. package/build/pay/packages/connectkit/src/components/Pages/Solana/ConnectorSolana/index.js.map +0 -1
  240. package/build/pay/packages/connectkit/src/components/Pages/Solana/PayWithSolanaToken/index.js +0 -92
  241. package/build/pay/packages/connectkit/src/components/Pages/Solana/PayWithSolanaToken/index.js.map +0 -1
  242. package/build/pay/packages/connectkit/src/components/Pages/Solana/SelectSolanaAmount/index.js +0 -24
  243. package/build/pay/packages/connectkit/src/components/Pages/Solana/SelectSolanaAmount/index.js.map +0 -1
  244. package/build/pay/packages/connectkit/src/components/Pages/SwitchNetworks/index.js +0 -45
  245. package/build/pay/packages/connectkit/src/components/Pages/SwitchNetworks/index.js.map +0 -1
  246. package/build/pay/packages/connectkit/src/components/Pages/WaitingDepositAddress/index.js +0 -586
  247. package/build/pay/packages/connectkit/src/components/Pages/WaitingDepositAddress/index.js.map +0 -1
  248. package/build/pay/packages/connectkit/src/components/Pages/WaitingExternal/index.js +0 -174
  249. package/build/pay/packages/connectkit/src/components/Pages/WaitingExternal/index.js.map +0 -1
  250. package/build/pay/packages/connectkit/src/components/Pages/WaitingWallet/index.js +0 -49
  251. package/build/pay/packages/connectkit/src/components/Pages/WaitingWallet/index.js.map +0 -1
  252. package/build/pay/packages/connectkit/src/components/Pages/Warning/index.js +0 -56
  253. package/build/pay/packages/connectkit/src/components/Pages/Warning/index.js.map +0 -1
  254. package/build/pay/packages/connectkit/src/components/Spinners/CircleSpinner/index.js +0 -104
  255. package/build/pay/packages/connectkit/src/components/Spinners/CircleSpinner/index.js.map +0 -1
  256. package/build/pay/packages/connectkit/src/components/Spinners/CircleSpinner/styles.js +0 -117
  257. package/build/pay/packages/connectkit/src/components/Spinners/CircleSpinner/styles.js.map +0 -1
  258. package/build/pay/packages/connectkit/src/components/Spinners/ExternalPaymentSpinner/index.js +0 -29
  259. package/build/pay/packages/connectkit/src/components/Spinners/ExternalPaymentSpinner/index.js.map +0 -1
  260. package/build/pay/packages/connectkit/src/components/Spinners/SquircleSpinner/index.js +0 -68
  261. package/build/pay/packages/connectkit/src/components/Spinners/SquircleSpinner/index.js.map +0 -1
  262. package/build/pay/packages/connectkit/src/components/Spinners/SquircleSpinner/styles.js +0 -66
  263. package/build/pay/packages/connectkit/src/components/Spinners/SquircleSpinner/styles.js.map +0 -1
  264. package/build/pay/packages/connectkit/src/components/Spinners/TokenLogoSpinner/index.js +0 -24
  265. package/build/pay/packages/connectkit/src/components/Spinners/TokenLogoSpinner/index.js.map +0 -1
  266. package/build/pay/packages/connectkit/src/components/Spinners/TokenLogoSpinner/styles.js +0 -40
  267. package/build/pay/packages/connectkit/src/components/Spinners/TokenLogoSpinner/styles.js.map +0 -1
  268. package/build/pay/packages/connectkit/src/components/Spinners/WalletPaymentSpinner/index.js +0 -37
  269. package/build/pay/packages/connectkit/src/components/Spinners/WalletPaymentSpinner/index.js.map +0 -1
  270. package/build/pay/packages/connectkit/src/components/Spinners/styles.js +0 -32
  271. package/build/pay/packages/connectkit/src/components/Spinners/styles.js.map +0 -1
  272. package/build/pay/packages/connectkit/src/constants/defaultTheme.js +0 -6
  273. package/build/pay/packages/connectkit/src/constants/defaultTheme.js.map +0 -1
  274. package/build/pay/packages/connectkit/src/constants/limits.js +0 -4
  275. package/build/pay/packages/connectkit/src/constants/limits.js.map +0 -1
  276. package/build/pay/packages/connectkit/src/constants/paymentOptions.js +0 -62
  277. package/build/pay/packages/connectkit/src/constants/paymentOptions.js.map +0 -1
  278. package/build/pay/packages/connectkit/src/constants/routes.js +0 -31
  279. package/build/pay/packages/connectkit/src/constants/routes.js.map +0 -1
  280. package/build/pay/packages/connectkit/src/constants/wallets.js +0 -7
  281. package/build/pay/packages/connectkit/src/constants/wallets.js.map +0 -1
  282. package/build/pay/packages/connectkit/src/defaultConfig.js +0 -64
  283. package/build/pay/packages/connectkit/src/defaultConfig.js.map +0 -1
  284. package/build/pay/packages/connectkit/src/defaultConnectors.js +0 -37
  285. package/build/pay/packages/connectkit/src/defaultConnectors.js.map +0 -1
  286. package/build/pay/packages/connectkit/src/hooks/useChainIsSupported.js +0 -10
  287. package/build/pay/packages/connectkit/src/hooks/useChainIsSupported.js.map +0 -1
  288. package/build/pay/packages/connectkit/src/hooks/useChains.js +0 -10
  289. package/build/pay/packages/connectkit/src/hooks/useChains.js.map +0 -1
  290. package/build/pay/packages/connectkit/src/hooks/useConnect.js +0 -61
  291. package/build/pay/packages/connectkit/src/hooks/useConnect.js.map +0 -1
  292. package/build/pay/packages/connectkit/src/hooks/useConnectCallback.js +0 -21
  293. package/build/pay/packages/connectkit/src/hooks/useConnectCallback.js.map +0 -1
  294. package/build/pay/packages/connectkit/src/hooks/useConnectors.js +0 -20
  295. package/build/pay/packages/connectkit/src/hooks/useConnectors.js.map +0 -1
  296. package/build/pay/packages/connectkit/src/hooks/useDaimoPay.js +0 -131
  297. package/build/pay/packages/connectkit/src/hooks/useDaimoPay.js.map +0 -1
  298. package/build/pay/packages/connectkit/src/hooks/useDaimoPayStatus.js +0 -12
  299. package/build/pay/packages/connectkit/src/hooks/useDaimoPayStatus.js.map +0 -1
  300. package/build/pay/packages/connectkit/src/hooks/useDaimoPayUI.js +0 -15
  301. package/build/pay/packages/connectkit/src/hooks/useDaimoPayUI.js.map +0 -1
  302. package/build/pay/packages/connectkit/src/hooks/useDepositAddressOptions.js +0 -35
  303. package/build/pay/packages/connectkit/src/hooks/useDepositAddressOptions.js.map +0 -1
  304. package/build/pay/packages/connectkit/src/hooks/useEnsFallbackConfig.js +0 -16
  305. package/build/pay/packages/connectkit/src/hooks/useEnsFallbackConfig.js.map +0 -1
  306. package/build/pay/packages/connectkit/src/hooks/useExternalPaymentOptions.js +0 -79
  307. package/build/pay/packages/connectkit/src/hooks/useExternalPaymentOptions.js.map +0 -1
  308. package/build/pay/packages/connectkit/src/hooks/useFitText.js +0 -133
  309. package/build/pay/packages/connectkit/src/hooks/useFitText.js.map +0 -1
  310. package/build/pay/packages/connectkit/src/hooks/useFocusTrap.js +0 -53
  311. package/build/pay/packages/connectkit/src/hooks/useFocusTrap.js.map +0 -1
  312. package/build/pay/packages/connectkit/src/hooks/useIsMobile.js +0 -11
  313. package/build/pay/packages/connectkit/src/hooks/useIsMobile.js.map +0 -1
  314. package/build/pay/packages/connectkit/src/hooks/useIsMounted.js +0 -10
  315. package/build/pay/packages/connectkit/src/hooks/useIsMounted.js.map +0 -1
  316. package/build/pay/packages/connectkit/src/hooks/useLastConnector.js +0 -24
  317. package/build/pay/packages/connectkit/src/hooks/useLastConnector.js.map +0 -1
  318. package/build/pay/packages/connectkit/src/hooks/useLocales.js +0 -60
  319. package/build/pay/packages/connectkit/src/hooks/useLocales.js.map +0 -1
  320. package/build/pay/packages/connectkit/src/hooks/useLockBodyScroll.js +0 -47
  321. package/build/pay/packages/connectkit/src/hooks/useLockBodyScroll.js.map +0 -1
  322. package/build/pay/packages/connectkit/src/hooks/useOrderUsdLimits.js +0 -24
  323. package/build/pay/packages/connectkit/src/hooks/useOrderUsdLimits.js.map +0 -1
  324. package/build/pay/packages/connectkit/src/hooks/usePayContext.js +0 -11
  325. package/build/pay/packages/connectkit/src/hooks/usePayContext.js.map +0 -1
  326. package/build/pay/packages/connectkit/src/hooks/usePaymentState.js +0 -410
  327. package/build/pay/packages/connectkit/src/hooks/usePaymentState.js.map +0 -1
  328. package/build/pay/packages/connectkit/src/hooks/usePrevious.js +0 -13
  329. package/build/pay/packages/connectkit/src/hooks/usePrevious.js.map +0 -1
  330. package/build/pay/packages/connectkit/src/hooks/useSolanaPaymentOptions.js +0 -38
  331. package/build/pay/packages/connectkit/src/hooks/useSolanaPaymentOptions.js.map +0 -1
  332. package/build/pay/packages/connectkit/src/hooks/useTokenOptions.js +0 -152
  333. package/build/pay/packages/connectkit/src/hooks/useTokenOptions.js.map +0 -1
  334. package/build/pay/packages/connectkit/src/hooks/useUntronAvailability.js +0 -32
  335. package/build/pay/packages/connectkit/src/hooks/useUntronAvailability.js.map +0 -1
  336. package/build/pay/packages/connectkit/src/hooks/useWalletPaymentOptions.js +0 -97
  337. package/build/pay/packages/connectkit/src/hooks/useWalletPaymentOptions.js.map +0 -1
  338. package/build/pay/packages/connectkit/src/hooks/useWindowSize.js +0 -23
  339. package/build/pay/packages/connectkit/src/hooks/useWindowSize.js.map +0 -1
  340. package/build/pay/packages/connectkit/src/index.js +0 -14
  341. package/build/pay/packages/connectkit/src/index.js.map +0 -1
  342. package/build/pay/packages/connectkit/src/localizations/index.js +0 -48
  343. package/build/pay/packages/connectkit/src/localizations/index.js.map +0 -1
  344. package/build/pay/packages/connectkit/src/localizations/locales/ar-AE.js +0 -95
  345. package/build/pay/packages/connectkit/src/localizations/locales/ar-AE.js.map +0 -1
  346. package/build/pay/packages/connectkit/src/localizations/locales/ca-AD.js +0 -93
  347. package/build/pay/packages/connectkit/src/localizations/locales/ca-AD.js.map +0 -1
  348. package/build/pay/packages/connectkit/src/localizations/locales/ee-EE.js +0 -101
  349. package/build/pay/packages/connectkit/src/localizations/locales/ee-EE.js.map +0 -1
  350. package/build/pay/packages/connectkit/src/localizations/locales/en-US.js +0 -145
  351. package/build/pay/packages/connectkit/src/localizations/locales/en-US.js.map +0 -1
  352. package/build/pay/packages/connectkit/src/localizations/locales/es-ES.js +0 -138
  353. package/build/pay/packages/connectkit/src/localizations/locales/es-ES.js.map +0 -1
  354. package/build/pay/packages/connectkit/src/localizations/locales/fa-IR.js +0 -93
  355. package/build/pay/packages/connectkit/src/localizations/locales/fa-IR.js.map +0 -1
  356. package/build/pay/packages/connectkit/src/localizations/locales/fr-FR.js +0 -93
  357. package/build/pay/packages/connectkit/src/localizations/locales/fr-FR.js.map +0 -1
  358. package/build/pay/packages/connectkit/src/localizations/locales/ja-JP.js +0 -93
  359. package/build/pay/packages/connectkit/src/localizations/locales/ja-JP.js.map +0 -1
  360. package/build/pay/packages/connectkit/src/localizations/locales/pt-BR.js +0 -145
  361. package/build/pay/packages/connectkit/src/localizations/locales/pt-BR.js.map +0 -1
  362. package/build/pay/packages/connectkit/src/localizations/locales/ru-RU.js +0 -97
  363. package/build/pay/packages/connectkit/src/localizations/locales/ru-RU.js.map +0 -1
  364. package/build/pay/packages/connectkit/src/localizations/locales/tr-TR.js +0 -101
  365. package/build/pay/packages/connectkit/src/localizations/locales/tr-TR.js.map +0 -1
  366. package/build/pay/packages/connectkit/src/localizations/locales/vi-VN.js +0 -101
  367. package/build/pay/packages/connectkit/src/localizations/locales/vi-VN.js.map +0 -1
  368. package/build/pay/packages/connectkit/src/localizations/locales/zh-CN.js +0 -93
  369. package/build/pay/packages/connectkit/src/localizations/locales/zh-CN.js.map +0 -1
  370. package/build/pay/packages/connectkit/src/payment/paymentEffects.js +0 -268
  371. package/build/pay/packages/connectkit/src/payment/paymentEffects.js.map +0 -1
  372. package/build/pay/packages/connectkit/src/payment/paymentFsm.js +0 -234
  373. package/build/pay/packages/connectkit/src/payment/paymentFsm.js.map +0 -1
  374. package/build/pay/packages/connectkit/src/payment/paymentStore.js +0 -18
  375. package/build/pay/packages/connectkit/src/payment/paymentStore.js.map +0 -1
  376. package/build/pay/packages/connectkit/src/payment/paymentUtils.js +0 -10
  377. package/build/pay/packages/connectkit/src/payment/paymentUtils.js.map +0 -1
  378. package/build/pay/packages/connectkit/src/provider/DaimoPayProvider.js +0 -292
  379. package/build/pay/packages/connectkit/src/provider/DaimoPayProvider.js.map +0 -1
  380. package/build/pay/packages/connectkit/src/provider/PayContext.js +0 -6
  381. package/build/pay/packages/connectkit/src/provider/PayContext.js.map +0 -1
  382. package/build/pay/packages/connectkit/src/provider/PaymentProvider.js +0 -29
  383. package/build/pay/packages/connectkit/src/provider/PaymentProvider.js.map +0 -1
  384. package/build/pay/packages/connectkit/src/provider/SolanaContextProvider.js +0 -14
  385. package/build/pay/packages/connectkit/src/provider/SolanaContextProvider.js.map +0 -1
  386. package/build/pay/packages/connectkit/src/provider/Web3ContextProvider.js +0 -36
  387. package/build/pay/packages/connectkit/src/provider/Web3ContextProvider.js.map +0 -1
  388. package/build/pay/packages/connectkit/src/stateStore.js +0 -36
  389. package/build/pay/packages/connectkit/src/stateStore.js.map +0 -1
  390. package/build/pay/packages/connectkit/src/styles/defaultTheme.js +0 -80
  391. package/build/pay/packages/connectkit/src/styles/defaultTheme.js.map +0 -1
  392. package/build/pay/packages/connectkit/src/styles/index.js +0 -313
  393. package/build/pay/packages/connectkit/src/styles/index.js.map +0 -1
  394. package/build/pay/packages/connectkit/src/styles/styled/index.js +0 -6
  395. package/build/pay/packages/connectkit/src/styles/styled/index.js.map +0 -1
  396. package/build/pay/packages/connectkit/src/styles/themes/base.js +0 -141
  397. package/build/pay/packages/connectkit/src/styles/themes/base.js.map +0 -1
  398. package/build/pay/packages/connectkit/src/styles/themes/index.js +0 -13
  399. package/build/pay/packages/connectkit/src/styles/themes/index.js.map +0 -1
  400. package/build/pay/packages/connectkit/src/styles/themes/midnight.js +0 -76
  401. package/build/pay/packages/connectkit/src/styles/themes/midnight.js.map +0 -1
  402. package/build/pay/packages/connectkit/src/styles/themes/minimal.js +0 -96
  403. package/build/pay/packages/connectkit/src/styles/themes/minimal.js.map +0 -1
  404. package/build/pay/packages/connectkit/src/styles/themes/nouns.js +0 -81
  405. package/build/pay/packages/connectkit/src/styles/themes/nouns.js.map +0 -1
  406. package/build/pay/packages/connectkit/src/styles/themes/retro.js +0 -106
  407. package/build/pay/packages/connectkit/src/styles/themes/retro.js.map +0 -1
  408. package/build/pay/packages/connectkit/src/styles/themes/rounded.js +0 -106
  409. package/build/pay/packages/connectkit/src/styles/themes/rounded.js.map +0 -1
  410. package/build/pay/packages/connectkit/src/styles/themes/soft.js +0 -71
  411. package/build/pay/packages/connectkit/src/styles/themes/soft.js.map +0 -1
  412. package/build/pay/packages/connectkit/src/styles/themes/web95.js +0 -132
  413. package/build/pay/packages/connectkit/src/styles/themes/web95.js.map +0 -1
  414. package/build/pay/packages/connectkit/src/utils/exports.js +0 -6
  415. package/build/pay/packages/connectkit/src/utils/exports.js.map +0 -1
  416. package/build/pay/packages/connectkit/src/utils/format.js +0 -45
  417. package/build/pay/packages/connectkit/src/utils/format.js.map +0 -1
  418. package/build/pay/packages/connectkit/src/utils/index.js +0 -42
  419. package/build/pay/packages/connectkit/src/utils/index.js.map +0 -1
  420. package/build/pay/packages/connectkit/src/utils/p3.js +0 -15
  421. package/build/pay/packages/connectkit/src/utils/p3.js.map +0 -1
  422. package/build/pay/packages/connectkit/src/utils/platform.js +0 -11
  423. package/build/pay/packages/connectkit/src/utils/platform.js.map +0 -1
  424. package/build/pay/packages/connectkit/src/utils/polling.js +0 -35
  425. package/build/pay/packages/connectkit/src/utils/polling.js.map +0 -1
  426. package/build/pay/packages/connectkit/src/utils/supportUrl.js +0 -16
  427. package/build/pay/packages/connectkit/src/utils/supportUrl.js.map +0 -1
  428. package/build/pay/packages/connectkit/src/utils/trpc.js +0 -19
  429. package/build/pay/packages/connectkit/src/utils/trpc.js.map +0 -1
  430. package/build/pay/packages/connectkit/src/utils/validateInput.js +0 -16
  431. package/build/pay/packages/connectkit/src/utils/validateInput.js.map +0 -1
  432. package/build/pay/packages/connectkit/src/wallets/index.js +0 -21
  433. package/build/pay/packages/connectkit/src/wallets/index.js.map +0 -1
  434. package/build/pay/packages/connectkit/src/wallets/useWallets.js +0 -278
  435. package/build/pay/packages/connectkit/src/wallets/useWallets.js.map +0 -1
  436. package/build/pay/packages/connectkit/src/wallets/walletConfigs.js +0 -281
  437. package/build/pay/packages/connectkit/src/wallets/walletConfigs.js.map +0 -1
  438. package/build/pay/packages/connectkit/src/world-mini-app/WorldPayButton.js +0 -165
  439. package/build/pay/packages/connectkit/src/world-mini-app/WorldPayButton.js.map +0 -1
  440. package/build/pay/packages/connectkit/src/world-mini-app/promptWorldPayment.js +0 -59
  441. package/build/pay/packages/connectkit/src/world-mini-app/promptWorldPayment.js.map +0 -1
  442. package/build/pay/packages/connectkit/src/world-mini-app/useWithdrawToWorld.js +0 -76
  443. package/build/pay/packages/connectkit/src/world-mini-app/useWithdrawToWorld.js.map +0 -1
  444. package/build/pay/packages/connectkit/src/world-mini-app/useWorldSignIn.js +0 -74
  445. package/build/pay/packages/connectkit/src/world-mini-app/useWorldSignIn.js.map +0 -1
  446. package/build/pay/packages/connectkit/src/world.js +0 -4
  447. package/build/pay/packages/connectkit/src/world.js.map +0 -1
  448. package/build/src/hooks/useDepositAddressOptions.js +0 -35
  449. package/build/src/hooks/useDepositAddressOptions.js.map +0 -1
  450. package/build/src/hooks/useExternalPaymentOptions.js +0 -79
  451. package/build/src/hooks/useExternalPaymentOptions.js.map +0 -1
  452. package/build/src/hooks/useSolanaPaymentOptions.js +0 -38
  453. package/build/src/hooks/useSolanaPaymentOptions.js.map +0 -1
  454. package/build/src/hooks/useWalletPaymentOptions.js +0 -97
  455. package/build/src/hooks/useWalletPaymentOptions.js.map +0 -1
  456. package/build/src/utils/wallets.js +0 -9
  457. package/build/src/utils/wallets.js.map +0 -1
@@ -0,0 +1,183 @@
1
+ import { ExternalPaymentOptions, supportedChains } from '@daimo/pay-common';
2
+ import { useState, useMemo, useEffect } from 'react';
3
+ import { inferTopLevelFromArray } from '../constants/paymentOptions.js';
4
+
5
+ const DEFAULT_EXTERNAL_PAYMENT_OPTIONS = Object.values(
6
+ ExternalPaymentOptions
7
+ ).filter(
8
+ (opt) => opt !== ExternalPaymentOptions.AllAddresses && opt !== ExternalPaymentOptions.AllPaymentApps
9
+ );
10
+ function usePaymentOptions({
11
+ trpc,
12
+ appId,
13
+ orderId,
14
+ isDepositFlow,
15
+ usdRequired,
16
+ solanaPubKey,
17
+ ethWalletAddress,
18
+ platform,
19
+ // For filtering/preferences from order metadata
20
+ filterIds,
21
+ preferredChains,
22
+ preferredTokens,
23
+ evmChains,
24
+ destChainId,
25
+ passthroughTokens,
26
+ destAddress,
27
+ log
28
+ }) {
29
+ const [externalOptions, setExternalOptions] = useState(/* @__PURE__ */ new Map());
30
+ const [walletOptions, setWalletOptions] = useState(null);
31
+ const [solanaOptions, setSolanaOptions] = useState(null);
32
+ const [depositOptions, setDepositOptions] = useState([]);
33
+ const [parsedConfig, setParsedConfig] = useState({
34
+ walletOrder: []
35
+ });
36
+ const [loading, setLoading] = useState(false);
37
+ const memoizedPreferredChains = useMemo(
38
+ () => preferredChains,
39
+ // eslint-disable-next-line react-hooks/exhaustive-deps
40
+ [JSON.stringify(preferredChains)]
41
+ );
42
+ const memoizedPreferredTokens = useMemo(
43
+ () => preferredTokens,
44
+ // eslint-disable-next-line react-hooks/exhaustive-deps
45
+ [JSON.stringify(preferredTokens)]
46
+ );
47
+ const memoizedEvmChains = useMemo(
48
+ () => evmChains,
49
+ // eslint-disable-next-line react-hooks/exhaustive-deps
50
+ [JSON.stringify(evmChains)]
51
+ );
52
+ const memoizedFilterIds = useMemo(
53
+ () => filterIds,
54
+ // eslint-disable-next-line react-hooks/exhaustive-deps
55
+ [JSON.stringify(filterIds)]
56
+ );
57
+ useEffect(() => {
58
+ const fetchPaymentOptions = async () => {
59
+ if (!platform || !appId && !orderId) return;
60
+ setLoading(true);
61
+ try {
62
+ const result = await trpc.getPaymentOptionsV1.query({
63
+ appId,
64
+ orderId: orderId?.toString(),
65
+ platform,
66
+ ethWalletAddress,
67
+ preferredChains: memoizedPreferredChains,
68
+ preferredTokens: memoizedPreferredTokens,
69
+ evmChains: memoizedEvmChains,
70
+ destChainId,
71
+ solanaPubKey,
72
+ usdRequired,
73
+ isDepositFlow
74
+ });
75
+ let walletOrder = [];
76
+ if (memoizedFilterIds) {
77
+ const nestedArray = memoizedFilterIds.find(
78
+ (opt) => Array.isArray(opt)
79
+ );
80
+ if (nestedArray && Array.isArray(nestedArray)) {
81
+ walletOrder = nestedArray;
82
+ }
83
+ }
84
+ setParsedConfig({ walletOrder });
85
+ const flatFilterIds = memoizedFilterIds ? memoizedFilterIds.flatMap(
86
+ (opt) => Array.isArray(opt) ? inferTopLevelFromArray(opt) ?? "AllWallets" : opt
87
+ ) : null;
88
+ const enabledExtPaymentOptions = flatFilterIds || DEFAULT_EXTERNAL_PAYMENT_OPTIONS;
89
+ const hasAllPaymentApps = enabledExtPaymentOptions.includes(
90
+ ExternalPaymentOptions.AllPaymentApps
91
+ );
92
+ const hasAllExchanges = enabledExtPaymentOptions.includes(
93
+ ExternalPaymentOptions.AllExchanges
94
+ );
95
+ const filteredExternal = result.externalOptions.filter(
96
+ (option) => enabledExtPaymentOptions.includes(option.id) || hasAllPaymentApps && option.optionType === "zkp2p" || hasAllExchanges && option.optionType === "exchange"
97
+ );
98
+ const optionsByType = /* @__PURE__ */ new Map();
99
+ filteredExternal.forEach((option) => {
100
+ const { optionType } = option;
101
+ if (!optionsByType.has(optionType)) {
102
+ optionsByType.set(optionType, []);
103
+ }
104
+ optionsByType.get(optionType).push(option);
105
+ });
106
+ setExternalOptions(optionsByType);
107
+ if (result.walletOptions.length > 0) {
108
+ const isSupported = (o) => supportedChains.some((c) => c.chainId === o.balance.token.chainId);
109
+ const filtered = result.walletOptions.filter(isSupported);
110
+ if (filtered.length < result.walletOptions.length) {
111
+ log(
112
+ `[WALLET]: skipping ${result.walletOptions.length - filtered.length} unsupported-chain balances`
113
+ );
114
+ }
115
+ if (destAddress) {
116
+ addPassthroughTokens(filtered, passthroughTokens, destAddress);
117
+ }
118
+ setWalletOptions(filtered);
119
+ } else {
120
+ setWalletOptions(ethWalletAddress ? [] : null);
121
+ }
122
+ setSolanaOptions(solanaPubKey ? result.solanaOptions : null);
123
+ setDepositOptions(result.depositAddressOptions);
124
+ } catch (error) {
125
+ console.error("[usePaymentOptions] error:", error);
126
+ } finally {
127
+ setLoading(false);
128
+ }
129
+ };
130
+ fetchPaymentOptions();
131
+ }, [
132
+ trpc,
133
+ appId,
134
+ orderId,
135
+ isDepositFlow,
136
+ usdRequired,
137
+ solanaPubKey,
138
+ ethWalletAddress,
139
+ platform,
140
+ memoizedPreferredChains,
141
+ memoizedPreferredTokens,
142
+ memoizedEvmChains,
143
+ memoizedFilterIds,
144
+ destChainId,
145
+ destAddress,
146
+ passthroughTokens,
147
+ log
148
+ ]);
149
+ return {
150
+ externalPaymentOptions: {
151
+ options: externalOptions,
152
+ loading,
153
+ parsedConfig
154
+ },
155
+ walletPaymentOptions: {
156
+ options: walletOptions,
157
+ isLoading: loading
158
+ },
159
+ solanaPaymentOptions: {
160
+ options: solanaOptions,
161
+ isLoading: loading
162
+ },
163
+ depositAddressOptions: {
164
+ options: depositOptions,
165
+ loading
166
+ }
167
+ };
168
+ }
169
+ function addPassthroughTokens(options, passthroughTokens, passthroughAddress) {
170
+ if (passthroughTokens == null) return;
171
+ for (const option of options) {
172
+ const tok = option.balance.token;
173
+ if (option.disabledReason != null) continue;
174
+ const found = passthroughTokens.find(
175
+ (t) => t.address === tok.token && t.chain == tok.chainId
176
+ );
177
+ if (found == null) continue;
178
+ option.passthroughAddress = passthroughAddress;
179
+ }
180
+ }
181
+
182
+ export { addPassthroughTokens, usePaymentOptions };
183
+ //# sourceMappingURL=usePaymentOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePaymentOptions.js","sources":["../../../src/hooks/usePaymentOptions.ts"],"sourcesContent":["import {\n DepositAddressPaymentOptionMetadata,\n ExternalPaymentOptionMetadata,\n ExternalPaymentOptions,\n PlatformType,\n supportedChains,\n WalletPaymentOption,\n} from \"@daimo/pay-common\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { Address } from \"viem\";\nimport { inferTopLevelFromArray } from \"../constants/paymentOptions\";\nimport { TrpcClient } from \"../utils/trpc\";\n\nconst DEFAULT_EXTERNAL_PAYMENT_OPTIONS = Object.values(\n ExternalPaymentOptions,\n).filter(\n (opt) =>\n opt !== ExternalPaymentOptions.AllAddresses &&\n opt !== ExternalPaymentOptions.AllPaymentApps,\n);\n\nexport type PaymentOptionsResult = {\n externalPaymentOptions: {\n options: Map<\n \"external\" | \"zkp2p\" | \"exchange\",\n ExternalPaymentOptionMetadata[]\n >;\n loading: boolean;\n parsedConfig: { walletOrder: string[] };\n };\n walletPaymentOptions: {\n options: WalletPaymentOption[] | null;\n isLoading: boolean;\n };\n solanaPaymentOptions: {\n options: WalletPaymentOption[] | null;\n isLoading: boolean;\n };\n depositAddressOptions: {\n options: DepositAddressPaymentOptionMetadata[];\n loading: boolean;\n };\n};\n\nexport function usePaymentOptions({\n trpc,\n appId,\n orderId,\n isDepositFlow,\n usdRequired,\n solanaPubKey,\n ethWalletAddress,\n platform,\n // For filtering/preferences from order metadata\n filterIds,\n preferredChains,\n preferredTokens,\n evmChains,\n destChainId,\n passthroughTokens,\n destAddress,\n log,\n}: {\n trpc: TrpcClient;\n appId: string | undefined;\n orderId: bigint | undefined;\n isDepositFlow: boolean;\n usdRequired: number | undefined;\n solanaPubKey: string | undefined;\n ethWalletAddress: string | undefined;\n platform: PlatformType | undefined;\n filterIds: (string | string[])[] | undefined;\n preferredChains: number[] | undefined;\n preferredTokens: { chain: number; address: string }[] | undefined;\n evmChains: number[] | undefined;\n destChainId: number | undefined;\n passthroughTokens: { chain: number; address: string }[] | undefined;\n destAddress: Address | undefined;\n log: (msg: string) => void;\n}): PaymentOptionsResult {\n // State for each option type\n const [externalOptions, setExternalOptions] = useState<\n Map<\"external\" | \"zkp2p\" | \"exchange\", ExternalPaymentOptionMetadata[]>\n >(new Map());\n const [walletOptions, setWalletOptions] = useState<\n WalletPaymentOption[] | null\n >(null);\n const [solanaOptions, setSolanaOptions] = useState<\n WalletPaymentOption[] | null\n >(null);\n const [depositOptions, setDepositOptions] = useState<\n DepositAddressPaymentOptionMetadata[]\n >([]);\n const [parsedConfig, setParsedConfig] = useState<{ walletOrder: string[] }>({\n walletOrder: [],\n });\n const [loading, setLoading] = useState(false);\n\n // Memoize array dependencies\n const memoizedPreferredChains = useMemo(\n () => preferredChains,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(preferredChains)],\n );\n const memoizedPreferredTokens = useMemo(\n () => preferredTokens,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(preferredTokens)],\n );\n const memoizedEvmChains = useMemo(\n () => evmChains,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(evmChains)],\n );\n const memoizedFilterIds = useMemo(\n () => filterIds,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(filterIds)],\n );\n\n useEffect(() => {\n const fetchPaymentOptions = async () => {\n // Must have platform and at least one of appId or orderId\n if (!platform || (!appId && !orderId)) return;\n\n setLoading(true);\n try {\n const result = await trpc.getPaymentOptionsV1.query({\n appId,\n orderId: orderId?.toString(),\n platform,\n ethWalletAddress: ethWalletAddress as Address | undefined,\n preferredChains: memoizedPreferredChains,\n preferredTokens: memoizedPreferredTokens,\n evmChains: memoizedEvmChains,\n destChainId,\n solanaPubKey,\n usdRequired,\n isDepositFlow,\n });\n\n // Process external options (filter and group by type)\n let walletOrder: string[] = [];\n if (memoizedFilterIds) {\n const nestedArray = memoizedFilterIds.find((opt) =>\n Array.isArray(opt),\n );\n if (nestedArray && Array.isArray(nestedArray)) {\n walletOrder = nestedArray as string[];\n }\n }\n setParsedConfig({ walletOrder });\n\n const flatFilterIds = memoizedFilterIds\n ? memoizedFilterIds.flatMap((opt) =>\n Array.isArray(opt)\n ? (inferTopLevelFromArray(opt as string[]) ?? \"AllWallets\")\n : opt,\n )\n : null;\n const enabledExtPaymentOptions =\n flatFilterIds || DEFAULT_EXTERNAL_PAYMENT_OPTIONS;\n const hasAllPaymentApps = enabledExtPaymentOptions.includes(\n ExternalPaymentOptions.AllPaymentApps,\n );\n const hasAllExchanges = enabledExtPaymentOptions.includes(\n ExternalPaymentOptions.AllExchanges,\n );\n\n const filteredExternal = result.externalOptions.filter(\n (option: ExternalPaymentOptionMetadata) =>\n enabledExtPaymentOptions.includes(option.id) ||\n (hasAllPaymentApps && option.optionType === \"zkp2p\") ||\n (hasAllExchanges && option.optionType === \"exchange\"),\n );\n const optionsByType = new Map<\n \"external\" | \"zkp2p\" | \"exchange\",\n ExternalPaymentOptionMetadata[]\n >();\n filteredExternal.forEach((option: ExternalPaymentOptionMetadata) => {\n const { optionType } = option;\n if (!optionsByType.has(optionType)) {\n optionsByType.set(optionType, []);\n }\n optionsByType.get(optionType)!.push(option);\n });\n setExternalOptions(optionsByType);\n\n // Process wallet options (filter unsupported chains, add passthrough)\n if (result.walletOptions.length > 0) {\n const isSupported = (o: WalletPaymentOption) =>\n supportedChains.some((c) => c.chainId === o.balance.token.chainId);\n const filtered = result.walletOptions.filter(isSupported);\n if (filtered.length < result.walletOptions.length) {\n log(\n `[WALLET]: skipping ${result.walletOptions.length - filtered.length} unsupported-chain balances`,\n );\n }\n if (destAddress) {\n addPassthroughTokens(filtered, passthroughTokens, destAddress);\n }\n setWalletOptions(filtered);\n } else {\n setWalletOptions(ethWalletAddress ? [] : null);\n }\n\n // Solana options\n setSolanaOptions(solanaPubKey ? result.solanaOptions : null);\n\n // Deposit address options\n setDepositOptions(result.depositAddressOptions);\n } catch (error) {\n console.error(\"[usePaymentOptions] error:\", error);\n } finally {\n setLoading(false);\n }\n };\n\n fetchPaymentOptions();\n }, [\n trpc,\n appId,\n orderId,\n isDepositFlow,\n usdRequired,\n solanaPubKey,\n ethWalletAddress,\n platform,\n memoizedPreferredChains,\n memoizedPreferredTokens,\n memoizedEvmChains,\n memoizedFilterIds,\n destChainId,\n destAddress,\n passthroughTokens,\n log,\n ]);\n\n return {\n externalPaymentOptions: {\n options: externalOptions,\n loading,\n parsedConfig,\n },\n walletPaymentOptions: {\n options: walletOptions,\n isLoading: loading,\n },\n solanaPaymentOptions: {\n options: solanaOptions,\n isLoading: loading,\n },\n depositAddressOptions: {\n options: depositOptions,\n loading,\n },\n };\n}\n\n/** Updates and sorts `options`, marking the relevant oneas as pass-through. */\nexport function addPassthroughTokens(\n options: WalletPaymentOption[],\n passthroughTokens: { chain: number; address: string }[] | undefined,\n passthroughAddress: Address,\n) {\n if (passthroughTokens == null) return;\n\n for (const option of options) {\n const tok = option.balance.token;\n if (option.disabledReason != null) continue;\n const found = passthroughTokens.find(\n (t) => t.address === tok.token && t.chain == tok.chainId,\n );\n if (found == null) continue;\n\n option.passthroughAddress = passthroughAddress;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ethereum, readDaimoPayOrderID, assert, debugJson, isNativeToken, assertNotNull, writeDaimoPayOrderID } from '@daimo/pay-common';
1
+ import { ethereum, isHydrated, readDaimoPayOrderID, assert, debugJson, isNativeToken, assertNotNull, writeDaimoPayOrderID } from '@daimo/pay-common';
2
2
  import { useWallet, useConnection } from '@solana/wallet-adapter-react';
3
3
  import { VersionedTransaction } from '@solana/web3.js';
4
4
  import { useState, useEffect, useCallback } from 'react';
@@ -9,13 +9,10 @@ import { inferTopLevelFromArray, DEFAULT_TOP_OPTIONS_ORDER, TOP_LEVEL_PAYMENT_OP
9
9
  import { ROUTES } from '../constants/routes.js';
10
10
  import { detectPlatform } from '../utils/platform.js';
11
11
  import { useDaimoPay } from './useDaimoPay.js';
12
- import { useDepositAddressOptions } from './useDepositAddressOptions.js';
13
- import { useExternalPaymentOptions } from './useExternalPaymentOptions.js';
14
12
  import useIsMobile from './useIsMobile.js';
15
13
  import { useOrderUsdLimits } from './useOrderUsdLimits.js';
16
- import { useSolanaPaymentOptions } from './useSolanaPaymentOptions.js';
14
+ import { usePaymentOptions } from './usePaymentOptions.js';
17
15
  import { useUntronAvailability } from './useUntronAvailability.js';
18
- import { useWalletPaymentOptions } from './useWalletPaymentOptions.js';
19
16
 
20
17
  function getTopLevelOptions(paymentOptions) {
21
18
  if (!paymentOptions || paymentOptions.length === 0) return [];
@@ -66,38 +63,30 @@ function usePaymentState({
66
63
  const [currPayParams, setCurrPayParams] = useState();
67
64
  const [paymentWaitingMessage, setPaymentWaitingMessage] = useState();
68
65
  const [isDepositFlow, setIsDepositFlow] = useState(false);
69
- const externalPaymentOptions = useExternalPaymentOptions({
70
- trpc,
71
- // allow <DaimoPayButton payId={...} paymentOptions={override} />
72
- filterIds: buttonProps?.paymentOptions ?? pay.order?.metadata.payer?.paymentOptions,
73
- platform,
74
- usdRequired: pay.order?.destFinalCallTokenAmount.usd,
75
- mode: pay.order?.mode
76
- });
77
- const walletPaymentOptions = useWalletPaymentOptions({
66
+ const hydratedOrderId = pay.order != null && isHydrated(pay.order) ? pay.order.id : void 0;
67
+ const {
68
+ externalPaymentOptions,
69
+ walletPaymentOptions,
70
+ solanaPaymentOptions,
71
+ depositAddressOptions
72
+ } = usePaymentOptions({
78
73
  trpc,
79
- address: ethWalletAddress,
74
+ appId: currPayParams?.appId,
75
+ orderId: hydratedOrderId,
76
+ isDepositFlow,
80
77
  usdRequired: pay.order?.destFinalCallTokenAmount.usd,
81
- destChainId: pay.order?.destFinalCallTokenAmount.token.chainId,
82
- destAddress: pay.order?.destFinalCall.to,
78
+ solanaPubKey,
79
+ ethWalletAddress,
80
+ platform,
81
+ filterIds: buttonProps?.paymentOptions ?? pay.order?.metadata.payer?.paymentOptions,
83
82
  preferredChains: pay.order?.metadata.payer?.preferredChains,
84
83
  preferredTokens: pay.order?.metadata.payer?.preferredTokens,
85
84
  evmChains: pay.order?.metadata.payer?.evmChains,
85
+ destChainId: pay.order?.destFinalCallTokenAmount.token.chainId,
86
86
  passthroughTokens: pay.order?.metadata.payer?.passthroughTokens,
87
- isDepositFlow,
87
+ destAddress: pay.order?.destFinalCall.to,
88
88
  log
89
89
  });
90
- const solanaPaymentOptions = useSolanaPaymentOptions({
91
- trpc,
92
- address: solanaPubKey,
93
- usdRequired: pay.order?.destFinalCallTokenAmount.usd,
94
- isDepositFlow
95
- });
96
- const depositAddressOptions = useDepositAddressOptions({
97
- trpc,
98
- usdRequired: pay.order?.destFinalCallTokenAmount.usd,
99
- mode: pay.order?.mode
100
- });
101
90
  const { available: untronAvailable } = useUntronAvailability({ trpc });
102
91
  const chainOrderUsdLimits = useOrderUsdLimits({ trpc });
103
92
  const [selectedExternalOption, setSelectedExternalOption] = useState();
@@ -1 +1 @@
1
- {"version":3,"file":"usePaymentState.js","sources":["../../../src/hooks/usePaymentState.ts"],"sourcesContent":["import {\n assert,\n assertNotNull,\n DaimoPayHydratedOrderWithOrg,\n debugJson,\n DepositAddressPaymentOptionData,\n DepositAddressPaymentOptionMetadata,\n DepositAddressPaymentOptions,\n ethereum,\n ExternalPaymentOptionMetadata,\n ExternalPaymentOptions,\n ExternalPaymentOptionsString,\n isNativeToken,\n PlatformType,\n readDaimoPayOrderID,\n SolanaPublicKey,\n WalletPaymentOption,\n writeDaimoPayOrderID,\n} from \"@daimo/pay-common\";\nimport { useConnection, useWallet } from \"@solana/wallet-adapter-react\";\nimport { VersionedTransaction } from \"@solana/web3.js\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { erc20Abi, getAddress, Hex, hexToBytes, isHex } from \"viem\";\nimport {\n useAccount,\n useEnsName,\n useSendTransaction,\n useWriteContract,\n} from \"wagmi\";\n\nimport { PayButtonPaymentProps } from \"../components/DaimoPayButton\";\nimport { DEFAULT_USD_LIMIT } from \"../constants/limits\";\nimport {\n DEFAULT_TOP_OPTIONS_ORDER,\n inferTopLevelFromArray,\n TOP_LEVEL_PAYMENT_OPTIONS,\n} from \"../constants/paymentOptions\";\nimport { ROUTES } from \"../constants/routes\";\nimport { PayParams } from \"../payment/paymentFsm\";\nimport { detectPlatform } from \"../utils/platform\";\nimport { TrpcClient } from \"../utils/trpc\";\nimport { WalletConfigProps } from \"../wallets/walletConfigs\";\nimport { useDaimoPay } from \"./useDaimoPay\";\nimport { useDepositAddressOptions } from \"./useDepositAddressOptions\";\nimport { useExternalPaymentOptions } from \"./useExternalPaymentOptions\";\nimport useIsMobile from \"./useIsMobile\";\nimport { useOrderUsdLimits } from \"./useOrderUsdLimits\";\nimport { useSolanaPaymentOptions } from \"./useSolanaPaymentOptions\";\nimport { useUntronAvailability } from \"./useUntronAvailability\";\nimport { useWalletPaymentOptions } from \"./useWalletPaymentOptions\";\n\n/** Wallet payment details, sent to processSourcePayment after submitting tx. */\nexport type SourcePayment = Parameters<\n TrpcClient[\"processSourcePayment\"][\"mutate\"]\n>[0];\n\n/**\n * Extract the ordered list of top-level options from paymentOptions.\n * Returns an empty list if none are provided. Throws if top-level and\n * specific options are mixed.\n */\nfunction getTopLevelOptions(\n paymentOptions: (string | string[])[] | undefined,\n): ExternalPaymentOptionsString[] {\n if (!paymentOptions || paymentOptions.length === 0) return [];\n\n const topLevelOptions = TOP_LEVEL_PAYMENT_OPTIONS;\n const isString = (opt: unknown): opt is string => typeof opt === \"string\";\n\n const stringOptions = paymentOptions.filter(isString);\n const topLevel = stringOptions.filter((opt) =>\n topLevelOptions.includes(opt as ExternalPaymentOptionsString),\n );\n const specific = stringOptions.filter(\n (opt) => !topLevelOptions.includes(opt as ExternalPaymentOptionsString),\n );\n\n if (topLevel.length && specific.length) {\n throw new Error(\n `invalid paymentOptions: cannot mix top-level options ${JSON.stringify(topLevel)} with specific options ${JSON.stringify(specific)}. ` +\n `use either [\"AllWallets\", \"AllExchanges\", ...] or [\"MiniPay\", \"Binance\", ...], not both`,\n );\n }\n\n // Flatten nested arrays and infer a top-level entry when needed\n const flattened = paymentOptions.map((opt) =>\n Array.isArray(opt)\n ? (inferTopLevelFromArray(opt as string[]) ?? \"AllWallets\")\n : opt,\n );\n\n // Keep only top-level options, preserving order\n return flattened.filter((opt) =>\n topLevelOptions.includes(opt as ExternalPaymentOptionsString),\n ) as ExternalPaymentOptionsString[];\n}\n\n/** Creates (or loads) a payment and manages the corresponding modal. */\nexport interface PaymentState {\n generatePreviewOrder: () => void;\n resetOrder: (payParams?: Partial<PayParams>) => Promise<void>;\n\n /// DaimoPayButton props\n buttonProps: PayButtonPaymentProps | undefined;\n setButtonProps: (props: PayButtonPaymentProps | undefined) => void;\n /// Order of top-level payment options in SelectMethod\n topOptionsOrder: string[];\n\n /// Pay ID for loading an existing order\n setPayId: (id: string | undefined) => Promise<void>;\n /// Pay params for creating an order on the fly,\n setPayParams: (payParams: PayParams | undefined) => Promise<void>;\n\n /// True if the user is entering an amount (deposit) vs preset (checkout).\n isDepositFlow: boolean;\n paymentWaitingMessage: string | undefined;\n /// External payment options, loaded from server and filtered by EITHER\n /// 1. the DaimoPayButton paymentOptions, or 2. those of daimoPayOrder\n externalPaymentOptions: ReturnType<typeof useExternalPaymentOptions>;\n selectedWallet: WalletConfigProps | undefined;\n selectedWalletDeepLink: string | undefined;\n walletPaymentOptions: ReturnType<typeof useWalletPaymentOptions>;\n solanaPaymentOptions: ReturnType<typeof useSolanaPaymentOptions>;\n depositAddressOptions: ReturnType<typeof useDepositAddressOptions>;\n /** Whether Untron receivers are currently available. `null` when unknown. */\n untronAvailable: boolean | null;\n selectedExternalOption: ExternalPaymentOptionMetadata | undefined;\n selectedTokenOption: WalletPaymentOption | undefined;\n selectedSolanaTokenOption: WalletPaymentOption | undefined;\n selectedDepositAddressOption: DepositAddressPaymentOptionMetadata | undefined;\n getOrderUsdLimit: () => number;\n setPaymentWaitingMessage: (message: string | undefined) => void;\n tokenMode: \"evm\" | \"solana\" | \"all\";\n setTokenMode: (mode: \"evm\" | \"solana\" | \"all\") => void;\n setSelectedWallet: (wallet: WalletConfigProps | undefined) => void;\n setSelectedWalletDeepLink: (deepLink: string | undefined) => void;\n setSelectedExternalOption: (\n option: ExternalPaymentOptionMetadata | undefined,\n ) => void;\n setSelectedTokenOption: (option: WalletPaymentOption | undefined) => void;\n setSelectedSolanaTokenOption: (\n option: WalletPaymentOption | undefined,\n ) => void;\n setSelectedDepositAddressOption: (\n option: DepositAddressPaymentOptionMetadata | undefined,\n ) => void;\n setChosenUsd: (usd: number) => void;\n payWithToken: (\n walletOption: WalletPaymentOption,\n ) => Promise<{ txHash?: Hex; success: boolean }>;\n payWithExternal: (option: ExternalPaymentOptions) => Promise<string>;\n payWithDepositAddress: (\n option: DepositAddressPaymentOptions,\n ) => Promise<DepositAddressPaymentOptionData | null>;\n payWithSolanaToken: (\n inputToken: SolanaPublicKey,\n ) => Promise<{ txHash: string; success: boolean }>;\n openInWalletBrowser: (\n wallet: WalletConfigProps,\n amountUsd?: number,\n ) => Promise<void>;\n senderEnsName: string | undefined;\n}\n\nexport function usePaymentState({\n trpc,\n lockPayParams,\n setRoute,\n log,\n redirectReturnUrl,\n}: {\n trpc: TrpcClient;\n lockPayParams: boolean;\n setRoute: (route: ROUTES, data?: Record<string, any>) => void;\n log: (...args: any[]) => void;\n redirectReturnUrl?: string;\n}): PaymentState {\n const pay = useDaimoPay();\n\n // Browser state.\n const [platform, setPlatform] = useState<PlatformType>();\n useEffect(() => {\n setPlatform(detectPlatform(window.navigator.userAgent));\n }, []);\n\n // Wallet state.\n const { address: ethWalletAddress } = useAccount();\n const { data: senderEnsName } = useEnsName({\n chainId: ethereum.chainId,\n address: ethWalletAddress,\n });\n const { sendTransactionAsync } = useSendTransaction();\n const { writeContractAsync } = useWriteContract();\n\n // Solana wallet state.\n const solanaWallet = useWallet();\n const { connection } = useConnection();\n const solanaPubKey = solanaWallet.publicKey?.toBase58();\n\n // From DaimoPayButton props\n const [buttonProps, setButtonProps] = useState<PayButtonPaymentProps>();\n const [currPayParams, setCurrPayParams] = useState<PayParams>();\n\n const [paymentWaitingMessage, setPaymentWaitingMessage] = useState<string>();\n const [isDepositFlow, setIsDepositFlow] = useState<boolean>(false);\n\n // UI state. Selection for external payment (Binance, etc) vs wallet payment.\n const externalPaymentOptions = useExternalPaymentOptions({\n trpc,\n // allow <DaimoPayButton payId={...} paymentOptions={override} />\n filterIds:\n buttonProps?.paymentOptions ?? pay.order?.metadata.payer?.paymentOptions,\n platform,\n usdRequired: pay.order?.destFinalCallTokenAmount.usd,\n mode: pay.order?.mode,\n });\n const walletPaymentOptions = useWalletPaymentOptions({\n trpc,\n address: ethWalletAddress,\n usdRequired: pay.order?.destFinalCallTokenAmount.usd,\n destChainId: pay.order?.destFinalCallTokenAmount.token.chainId,\n destAddress: pay.order?.destFinalCall.to,\n preferredChains: pay.order?.metadata.payer?.preferredChains,\n preferredTokens: pay.order?.metadata.payer?.preferredTokens,\n evmChains: pay.order?.metadata.payer?.evmChains,\n passthroughTokens: pay.order?.metadata.payer?.passthroughTokens,\n isDepositFlow,\n log,\n });\n const solanaPaymentOptions = useSolanaPaymentOptions({\n trpc,\n address: solanaPubKey,\n usdRequired: pay.order?.destFinalCallTokenAmount.usd,\n isDepositFlow,\n });\n const depositAddressOptions = useDepositAddressOptions({\n trpc,\n usdRequired: pay.order?.destFinalCallTokenAmount.usd,\n mode: pay.order?.mode,\n });\n\n // Poll for Untron receiver availability so components can disable unsupported chains promptly.\n const { available: untronAvailable } = useUntronAvailability({ trpc });\n\n const chainOrderUsdLimits = useOrderUsdLimits({ trpc });\n\n const [selectedExternalOption, setSelectedExternalOption] =\n useState<ExternalPaymentOptionMetadata>();\n\n const [selectedTokenOption, setSelectedTokenOption] =\n useState<WalletPaymentOption>();\n\n const [selectedSolanaTokenOption, setSelectedSolanaTokenOption] =\n useState<WalletPaymentOption>();\n\n const [selectedDepositAddressOption, setSelectedDepositAddressOption] =\n useState<DepositAddressPaymentOptionMetadata>();\n\n const [selectedWallet, setSelectedWallet] = useState<WalletConfigProps>();\n const [selectedWalletDeepLink, setSelectedWalletDeepLink] =\n useState<string>();\n\n const getOrderUsdLimit = () => {\n if (pay.order == null || chainOrderUsdLimits.loading) {\n return DEFAULT_USD_LIMIT;\n }\n const destChainId = pay.order.destFinalCallTokenAmount.token.chainId;\n return destChainId in chainOrderUsdLimits.limits\n ? chainOrderUsdLimits.limits[destChainId]\n : DEFAULT_USD_LIMIT;\n };\n\n /** Commit to a token + amount = initiate payment. */\n const payWithToken = async (\n walletOption: WalletPaymentOption,\n ): Promise<{ txHash?: Hex; success: boolean }> => {\n assert(\n ethWalletAddress != null,\n `[PAY TOKEN] null ethWalletAddress when paying on ethereum`,\n );\n assert(\n pay.paymentState === \"preview\" ||\n pay.paymentState === \"unhydrated\" ||\n pay.paymentState === \"payment_unpaid\",\n `[PAY TOKEN] paymentState is ${pay.paymentState}, must be preview or unhydrated or payment_unpaid`,\n );\n\n let hydratedOrder: DaimoPayHydratedOrderWithOrg;\n const { required, fees } = walletOption;\n const paymentAmount = BigInt(required.amount) + BigInt(fees.amount);\n if (pay.paymentState !== \"payment_unpaid\") {\n assert(\n required.token.token === fees.token.token,\n `[PAY TOKEN] required token ${debugJson(required)} does not match fees token ${debugJson(fees)}`,\n );\n\n // Will refund to ethWalletAddress if refundAddress was not set in payParams\n const res = await pay.hydrateOrder(ethWalletAddress);\n hydratedOrder = res.order;\n\n log(\n `[PAY TOKEN] hydrated order: ${debugJson(\n hydratedOrder,\n )}, paying ${paymentAmount} of token ${required.token.token}`,\n );\n } else {\n hydratedOrder = pay.order;\n }\n\n const paymentTxHash = await (async () => {\n const dest = walletOption.passthroughAddress ?? hydratedOrder.intentAddr;\n try {\n if (\n isNativeToken(\n required.token.chainId,\n getAddress(required.token.token),\n )\n ) {\n return await sendTransactionAsync({\n to: dest,\n value: paymentAmount,\n });\n } else {\n return await writeContractAsync({\n abi: erc20Abi,\n address: getAddress(required.token.token),\n functionName: \"transfer\",\n args: [dest, paymentAmount],\n });\n }\n } catch (e) {\n console.error(`[PAY TOKEN] error sending token: ${e}`);\n throw e;\n }\n })();\n\n // Special case. Handle Rabby bug, where it returns the *Safe signature*\n // instead of a txHash for a queued, unsubmitted Safe transaction.\n if (!isHex(paymentTxHash) || paymentTxHash.length !== 66) {\n log(\n `[PAY TOKEN] wallet bug detected. ignoring invalid payment txHash: ${paymentTxHash}`,\n );\n return { success: true };\n }\n\n try {\n await pay.payEthSource({\n paymentTxHash,\n sourceChainId: required.token.chainId,\n payerAddress: ethWalletAddress,\n sourceToken: getAddress(required.token.token),\n sourceAmount: paymentAmount,\n });\n return { txHash: paymentTxHash, success: true };\n } catch {\n console.error(\n `[PAY TOKEN] could not verify payment tx on chain: ${paymentTxHash}`,\n );\n return { txHash: paymentTxHash, success: false };\n }\n };\n\n const payWithSolanaToken = async (\n inputToken: SolanaPublicKey,\n ): Promise<{ txHash: string; success: boolean }> => {\n const payerPublicKey = solanaWallet.publicKey;\n assert(\n payerPublicKey != null,\n \"[PAY SOLANA] null payerPublicKey when paying on solana\",\n );\n assert(\n pay.order?.id != null,\n \"[PAY SOLANA] null orderId when paying on solana\",\n );\n assert(\n pay.paymentState === \"preview\" ||\n pay.paymentState === \"unhydrated\" ||\n pay.paymentState === \"payment_unpaid\",\n `[PAY SOLANA] paymentState is ${pay.paymentState}, must be preview or unhydrated or payment_unpaid`,\n );\n\n let hydratedOrder: DaimoPayHydratedOrderWithOrg;\n if (pay.paymentState !== \"payment_unpaid\") {\n const res = await pay.hydrateOrder();\n hydratedOrder = res.order;\n\n log(\n `[PAY SOLANA] Hydrated order: ${JSON.stringify(\n hydratedOrder,\n )}, checking out with Solana ${inputToken}`,\n );\n } else {\n hydratedOrder = pay.order;\n }\n\n const paymentTxHash = await (async () => {\n try {\n const serializedTx = await trpc.getSolanaSwapAndBurnTx.query({\n orderId: pay.order.id.toString(),\n userPublicKey: assertNotNull(\n payerPublicKey,\n \"[PAY SOLANA] wallet.publicKey cannot be null\",\n ).toString(),\n inputTokenMint: inputToken,\n });\n const tx = VersionedTransaction.deserialize(hexToBytes(serializedTx));\n const txHash = await solanaWallet.sendTransaction(tx, connection);\n return txHash;\n } catch (e) {\n console.error(e);\n throw e;\n }\n })();\n\n try {\n await pay.paySolanaSource({\n paymentTxHash: paymentTxHash,\n sourceToken: inputToken,\n });\n return { txHash: paymentTxHash, success: true };\n } catch {\n console.error(\n `[PAY SOLANA] could not verify payment tx on chain: ${paymentTxHash}`,\n );\n return { txHash: paymentTxHash, success: false };\n }\n };\n\n const payWithExternal = async (option: ExternalPaymentOptions) => {\n assert(pay.order != null, \"[PAY EXTERNAL] order cannot be null\");\n assert(platform != null, \"[PAY EXTERNAL] platform cannot be null\");\n\n const { order } = await pay.hydrateOrder();\n const externalPaymentOptionData =\n await trpc.getExternalPaymentOptionData.query({\n id: order.id.toString(),\n externalPaymentOption: option,\n platform,\n redirectReturnUrl,\n });\n assert(\n externalPaymentOptionData != null,\n \"[PAY EXTERNAL] missing externalPaymentOptionData\",\n );\n\n log(\n `[PAY EXTERNAL] hydrated order: ${debugJson(\n order,\n )}, checking out with external payment: ${option}`,\n );\n\n setPaymentWaitingMessage(externalPaymentOptionData.waitingMessage);\n\n return externalPaymentOptionData.url;\n };\n\n const payWithDepositAddress = async (\n option: DepositAddressPaymentOptions,\n ) => {\n const { order } = await pay.hydrateOrder();\n\n log(\n `[PAY DEPOSIT ADDRESS] hydrated order ${order.id} for ${order.usdValue} USD, checking out with deposit address: ${option}`,\n );\n\n const result = await trpc.getDepositAddressForOrder.query({\n orderId: order.id.toString(),\n option,\n });\n\n return \"error\" in result ? null : result;\n };\n\n const { isIOS, isAndroid } = useIsMobile();\n\n const openInWalletBrowser = async (\n wallet: WalletConfigProps,\n amountUsd?: number,\n ) => {\n const paymentState = pay.paymentState;\n assert(\n paymentState === \"preview\" ||\n paymentState === \"unhydrated\" ||\n paymentState === \"payment_unpaid\",\n `[OPEN IN WALLET BROWSER] paymentState is ${paymentState}, must be preview or unhydrated or payment_unpaid`,\n );\n assert(\n wallet.getDaimoPayDeeplink != null,\n `openInWalletBrowser: missing deeplink for ${wallet.name}`,\n );\n\n // hydrate order if not already hydrated\n if (pay.paymentState !== \"payment_unpaid\") {\n await pay.hydrateOrder();\n }\n\n const payId = writeDaimoPayOrderID(pay.order.id);\n const platform = isIOS ? \"ios\" : isAndroid ? \"android\" : \"other\";\n const deeplink = wallet.getDaimoPayDeeplink(payId, platform);\n // If we are in IOS, we don't open the deeplink in a new window, because it\n // will not work, the link will be opened in the page WAITING_WALLET\n if (!isIOS) {\n window.open(deeplink, \"_blank\");\n }\n setSelectedWallet(wallet);\n setSelectedWalletDeepLink(deeplink);\n setRoute(ROUTES.WAITING_WALLET, {\n amountUsd,\n payId,\n wallet_name: wallet.name,\n });\n };\n\n /** User picked a different deposit amount. */\n const setChosenUsd = (usd: number) => {\n assert(\n pay.paymentState === \"preview\",\n \"[SET CHOSEN USD] paymentState is not preview\",\n );\n\n // Too expensive to make an API call to regenerate preview order each time\n // the user changes the amount. Instead, we modify the order in memory.\n pay.setChosenUsd(usd);\n };\n\n const setPayId = useCallback(\n async (payId: string | undefined) => {\n if (payId == null) return;\n const id = readDaimoPayOrderID(payId).toString();\n\n if (pay.order?.id && BigInt(id) == pay.order.id) {\n // Already loaded, ignore.\n return;\n }\n\n pay.reset();\n await pay.setPayId(payId);\n setIsDepositFlow(false);\n },\n [pay],\n );\n\n /** Called whenever params change. */\n const setPayParams = async (payParams: PayParams | undefined) => {\n if (lockPayParams) return;\n assert(payParams != null, \"[SET PAY PARAMS] payParams cannot be null\");\n\n log(\"[SET PAY PARAMS] setting payParams\", payParams);\n pay.reset();\n setCurrPayParams(payParams);\n setIsDepositFlow(payParams.toUnits == null);\n await pay.createPreviewOrder(payParams);\n };\n\n const generatePreviewOrder = async () => {\n pay.reset();\n if (currPayParams == null) return;\n await pay.createPreviewOrder(currPayParams);\n };\n\n const resetOrder = useCallback(\n async (payParams?: Partial<PayParams>) => {\n const mergedPayParams: PayParams | undefined =\n payParams != null && currPayParams != null\n ? { ...currPayParams, ...payParams }\n : currPayParams;\n\n // Clear the old order & state\n pay.reset();\n setSelectedExternalOption(undefined);\n setSelectedTokenOption(undefined);\n setSelectedSolanaTokenOption(undefined);\n setSelectedDepositAddressOption(undefined);\n setSelectedWallet(undefined);\n setSelectedWalletDeepLink(undefined);\n setPaymentWaitingMessage(undefined);\n\n // Set the new payParams\n if (mergedPayParams) {\n setCurrPayParams(mergedPayParams);\n setIsDepositFlow(mergedPayParams.toUnits == null);\n await pay.createPreviewOrder(mergedPayParams);\n }\n\n setRoute(ROUTES.SELECT_METHOD);\n },\n [setRoute, pay, currPayParams],\n );\n\n const [tokenMode, setTokenMode] = useState<\"evm\" | \"solana\" | \"all\">(\"evm\");\n\n // Compute the order of top-level payment options from paymentOptions\n const topOptionsOrder = (() => {\n const defaultOrder = DEFAULT_TOP_OPTIONS_ORDER;\n const paymentOptions =\n buttonProps?.paymentOptions ?? pay.order?.metadata.payer?.paymentOptions;\n const found = getTopLevelOptions(paymentOptions);\n return found.length ? found : defaultOrder;\n })();\n\n return {\n buttonProps,\n setButtonProps,\n topOptionsOrder,\n setPayId,\n setPayParams,\n tokenMode,\n setTokenMode,\n generatePreviewOrder,\n isDepositFlow,\n paymentWaitingMessage,\n selectedExternalOption,\n selectedTokenOption,\n selectedSolanaTokenOption,\n externalPaymentOptions,\n selectedWallet,\n selectedWalletDeepLink,\n walletPaymentOptions,\n solanaPaymentOptions,\n depositAddressOptions,\n selectedDepositAddressOption,\n getOrderUsdLimit,\n resetOrder,\n setSelectedWallet,\n setSelectedWalletDeepLink,\n setPaymentWaitingMessage,\n setSelectedExternalOption,\n setSelectedTokenOption,\n setSelectedSolanaTokenOption,\n setSelectedDepositAddressOption,\n setChosenUsd,\n payWithToken,\n payWithExternal,\n payWithDepositAddress,\n payWithSolanaToken,\n openInWalletBrowser,\n senderEnsName: senderEnsName ?? undefined,\n untronAvailable,\n };\n}\n"],"names":["platform"],"mappings":"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"}
1
+ {"version":3,"file":"usePaymentState.js","sources":["../../../src/hooks/usePaymentState.ts"],"sourcesContent":["import {\n assert,\n assertNotNull,\n DaimoPayHydratedOrderWithOrg,\n debugJson,\n DepositAddressPaymentOptionData,\n DepositAddressPaymentOptionMetadata,\n DepositAddressPaymentOptions,\n ethereum,\n ExternalPaymentOptionMetadata,\n ExternalPaymentOptions,\n ExternalPaymentOptionsString,\n isHydrated,\n isNativeToken,\n PlatformType,\n readDaimoPayOrderID,\n SolanaPublicKey,\n WalletPaymentOption,\n writeDaimoPayOrderID,\n} from \"@daimo/pay-common\";\nimport { useConnection, useWallet } from \"@solana/wallet-adapter-react\";\nimport { VersionedTransaction } from \"@solana/web3.js\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { erc20Abi, getAddress, Hex, hexToBytes, isHex } from \"viem\";\nimport {\n useAccount,\n useEnsName,\n useSendTransaction,\n useWriteContract,\n} from \"wagmi\";\n\nimport { PayButtonPaymentProps } from \"../components/DaimoPayButton\";\nimport { DEFAULT_USD_LIMIT } from \"../constants/limits\";\nimport {\n DEFAULT_TOP_OPTIONS_ORDER,\n inferTopLevelFromArray,\n TOP_LEVEL_PAYMENT_OPTIONS,\n} from \"../constants/paymentOptions\";\nimport { ROUTES } from \"../constants/routes\";\nimport { PayParams } from \"../payment/paymentFsm\";\nimport { detectPlatform } from \"../utils/platform\";\nimport { TrpcClient } from \"../utils/trpc\";\nimport { WalletConfigProps } from \"../wallets/walletConfigs\";\nimport { useDaimoPay } from \"./useDaimoPay\";\nimport useIsMobile from \"./useIsMobile\";\nimport { useOrderUsdLimits } from \"./useOrderUsdLimits\";\nimport { usePaymentOptions } from \"./usePaymentOptions\";\nimport { useUntronAvailability } from \"./useUntronAvailability\";\n\n/** Wallet payment details, sent to processSourcePayment after submitting tx. */\nexport type SourcePayment = Parameters<\n TrpcClient[\"processSourcePayment\"][\"mutate\"]\n>[0];\n\n/**\n * Extract the ordered list of top-level options from paymentOptions.\n * Returns an empty list if none are provided. Throws if top-level and\n * specific options are mixed.\n */\nfunction getTopLevelOptions(\n paymentOptions: (string | string[])[] | undefined,\n): ExternalPaymentOptionsString[] {\n if (!paymentOptions || paymentOptions.length === 0) return [];\n\n const topLevelOptions = TOP_LEVEL_PAYMENT_OPTIONS;\n const isString = (opt: unknown): opt is string => typeof opt === \"string\";\n\n const stringOptions = paymentOptions.filter(isString);\n const topLevel = stringOptions.filter((opt) =>\n topLevelOptions.includes(opt as ExternalPaymentOptionsString),\n );\n const specific = stringOptions.filter(\n (opt) => !topLevelOptions.includes(opt as ExternalPaymentOptionsString),\n );\n\n if (topLevel.length && specific.length) {\n throw new Error(\n `invalid paymentOptions: cannot mix top-level options ${JSON.stringify(topLevel)} with specific options ${JSON.stringify(specific)}. ` +\n `use either [\"AllWallets\", \"AllExchanges\", ...] or [\"MiniPay\", \"Binance\", ...], not both`,\n );\n }\n\n // Flatten nested arrays and infer a top-level entry when needed\n const flattened = paymentOptions.map((opt) =>\n Array.isArray(opt)\n ? (inferTopLevelFromArray(opt as string[]) ?? \"AllWallets\")\n : opt,\n );\n\n // Keep only top-level options, preserving order\n return flattened.filter((opt) =>\n topLevelOptions.includes(opt as ExternalPaymentOptionsString),\n ) as ExternalPaymentOptionsString[];\n}\n\n/** Creates (or loads) a payment and manages the corresponding modal. */\nexport interface PaymentState {\n generatePreviewOrder: () => void;\n resetOrder: (payParams?: Partial<PayParams>) => Promise<void>;\n\n /// DaimoPayButton props\n buttonProps: PayButtonPaymentProps | undefined;\n setButtonProps: (props: PayButtonPaymentProps | undefined) => void;\n /// Order of top-level payment options in SelectMethod\n topOptionsOrder: string[];\n\n /// Pay ID for loading an existing order\n setPayId: (id: string | undefined) => Promise<void>;\n /// Pay params for creating an order on the fly,\n setPayParams: (payParams: PayParams | undefined) => Promise<void>;\n\n /// True if the user is entering an amount (deposit) vs preset (checkout).\n isDepositFlow: boolean;\n paymentWaitingMessage: string | undefined;\n selectedWallet: WalletConfigProps | undefined;\n selectedWalletDeepLink: string | undefined;\n /// External payment options, loaded from server and filtered by EITHER\n /// 1. the DaimoPayButton paymentOptions, or 2. those of daimoPayOrder\n externalPaymentOptions: ReturnType<\n typeof usePaymentOptions\n >[\"externalPaymentOptions\"];\n walletPaymentOptions: ReturnType<\n typeof usePaymentOptions\n >[\"walletPaymentOptions\"];\n solanaPaymentOptions: ReturnType<\n typeof usePaymentOptions\n >[\"solanaPaymentOptions\"];\n depositAddressOptions: ReturnType<\n typeof usePaymentOptions\n >[\"depositAddressOptions\"];\n /** Whether Untron receivers are currently available. `null` when unknown. */\n untronAvailable: boolean | null;\n selectedExternalOption: ExternalPaymentOptionMetadata | undefined;\n selectedTokenOption: WalletPaymentOption | undefined;\n selectedSolanaTokenOption: WalletPaymentOption | undefined;\n selectedDepositAddressOption: DepositAddressPaymentOptionMetadata | undefined;\n getOrderUsdLimit: () => number;\n setPaymentWaitingMessage: (message: string | undefined) => void;\n tokenMode: \"evm\" | \"solana\" | \"all\";\n setTokenMode: (mode: \"evm\" | \"solana\" | \"all\") => void;\n setSelectedWallet: (wallet: WalletConfigProps | undefined) => void;\n setSelectedWalletDeepLink: (deepLink: string | undefined) => void;\n setSelectedExternalOption: (\n option: ExternalPaymentOptionMetadata | undefined,\n ) => void;\n setSelectedTokenOption: (option: WalletPaymentOption | undefined) => void;\n setSelectedSolanaTokenOption: (\n option: WalletPaymentOption | undefined,\n ) => void;\n setSelectedDepositAddressOption: (\n option: DepositAddressPaymentOptionMetadata | undefined,\n ) => void;\n setChosenUsd: (usd: number) => void;\n payWithToken: (\n walletOption: WalletPaymentOption,\n ) => Promise<{ txHash?: Hex; success: boolean }>;\n payWithExternal: (option: ExternalPaymentOptions) => Promise<string>;\n payWithDepositAddress: (\n option: DepositAddressPaymentOptions,\n ) => Promise<DepositAddressPaymentOptionData | null>;\n payWithSolanaToken: (\n inputToken: SolanaPublicKey,\n ) => Promise<{ txHash: string; success: boolean }>;\n openInWalletBrowser: (\n wallet: WalletConfigProps,\n amountUsd?: number,\n ) => Promise<void>;\n senderEnsName: string | undefined;\n}\n\nexport function usePaymentState({\n trpc,\n lockPayParams,\n setRoute,\n log,\n redirectReturnUrl,\n}: {\n trpc: TrpcClient;\n lockPayParams: boolean;\n setRoute: (route: ROUTES, data?: Record<string, any>) => void;\n log: (...args: any[]) => void;\n redirectReturnUrl?: string;\n}): PaymentState {\n const pay = useDaimoPay();\n\n // Browser state.\n const [platform, setPlatform] = useState<PlatformType>();\n useEffect(() => {\n setPlatform(detectPlatform(window.navigator.userAgent));\n }, []);\n\n // Wallet state.\n const { address: ethWalletAddress } = useAccount();\n const { data: senderEnsName } = useEnsName({\n chainId: ethereum.chainId,\n address: ethWalletAddress,\n });\n const { sendTransactionAsync } = useSendTransaction();\n const { writeContractAsync } = useWriteContract();\n\n // Solana wallet state.\n const solanaWallet = useWallet();\n const { connection } = useConnection();\n const solanaPubKey = solanaWallet.publicKey?.toBase58();\n\n // From DaimoPayButton props\n const [buttonProps, setButtonProps] = useState<PayButtonPaymentProps>();\n const [currPayParams, setCurrPayParams] = useState<PayParams>();\n\n const [paymentWaitingMessage, setPaymentWaitingMessage] = useState<string>();\n const [isDepositFlow, setIsDepositFlow] = useState<boolean>(false);\n\n // UI state. Selection for external payment (Binance, etc) vs wallet payment.\n // Pass orderId only when order is hydrated; always pass appId when available\n const hydratedOrderId =\n pay.order != null && isHydrated(pay.order) ? pay.order.id : undefined;\n const {\n externalPaymentOptions,\n walletPaymentOptions,\n solanaPaymentOptions,\n depositAddressOptions,\n } = usePaymentOptions({\n trpc,\n appId: currPayParams?.appId,\n orderId: hydratedOrderId,\n isDepositFlow,\n usdRequired: pay.order?.destFinalCallTokenAmount.usd,\n solanaPubKey,\n ethWalletAddress,\n platform,\n filterIds:\n buttonProps?.paymentOptions ?? pay.order?.metadata.payer?.paymentOptions,\n preferredChains: pay.order?.metadata.payer?.preferredChains,\n preferredTokens: pay.order?.metadata.payer?.preferredTokens,\n evmChains: pay.order?.metadata.payer?.evmChains,\n destChainId: pay.order?.destFinalCallTokenAmount.token.chainId,\n passthroughTokens: pay.order?.metadata.payer?.passthroughTokens,\n destAddress: pay.order?.destFinalCall.to,\n log,\n });\n\n // Poll for Untron receiver availability so components can disable unsupported chains promptly.\n const { available: untronAvailable } = useUntronAvailability({ trpc });\n\n const chainOrderUsdLimits = useOrderUsdLimits({ trpc });\n\n const [selectedExternalOption, setSelectedExternalOption] =\n useState<ExternalPaymentOptionMetadata>();\n\n const [selectedTokenOption, setSelectedTokenOption] =\n useState<WalletPaymentOption>();\n\n const [selectedSolanaTokenOption, setSelectedSolanaTokenOption] =\n useState<WalletPaymentOption>();\n\n const [selectedDepositAddressOption, setSelectedDepositAddressOption] =\n useState<DepositAddressPaymentOptionMetadata>();\n\n const [selectedWallet, setSelectedWallet] = useState<WalletConfigProps>();\n const [selectedWalletDeepLink, setSelectedWalletDeepLink] =\n useState<string>();\n\n const getOrderUsdLimit = () => {\n if (pay.order == null || chainOrderUsdLimits.loading) {\n return DEFAULT_USD_LIMIT;\n }\n const destChainId = pay.order.destFinalCallTokenAmount.token.chainId;\n return destChainId in chainOrderUsdLimits.limits\n ? chainOrderUsdLimits.limits[destChainId]\n : DEFAULT_USD_LIMIT;\n };\n\n /** Commit to a token + amount = initiate payment. */\n const payWithToken = async (\n walletOption: WalletPaymentOption,\n ): Promise<{ txHash?: Hex; success: boolean }> => {\n assert(\n ethWalletAddress != null,\n `[PAY TOKEN] null ethWalletAddress when paying on ethereum`,\n );\n assert(\n pay.paymentState === \"preview\" ||\n pay.paymentState === \"unhydrated\" ||\n pay.paymentState === \"payment_unpaid\",\n `[PAY TOKEN] paymentState is ${pay.paymentState}, must be preview or unhydrated or payment_unpaid`,\n );\n\n let hydratedOrder: DaimoPayHydratedOrderWithOrg;\n const { required, fees } = walletOption;\n const paymentAmount = BigInt(required.amount) + BigInt(fees.amount);\n if (pay.paymentState !== \"payment_unpaid\") {\n assert(\n required.token.token === fees.token.token,\n `[PAY TOKEN] required token ${debugJson(required)} does not match fees token ${debugJson(fees)}`,\n );\n\n // Will refund to ethWalletAddress if refundAddress was not set in payParams\n const res = await pay.hydrateOrder(ethWalletAddress);\n hydratedOrder = res.order;\n\n log(\n `[PAY TOKEN] hydrated order: ${debugJson(\n hydratedOrder,\n )}, paying ${paymentAmount} of token ${required.token.token}`,\n );\n } else {\n hydratedOrder = pay.order;\n }\n\n const paymentTxHash = await (async () => {\n const dest = walletOption.passthroughAddress ?? hydratedOrder.intentAddr;\n try {\n if (\n isNativeToken(\n required.token.chainId,\n getAddress(required.token.token),\n )\n ) {\n return await sendTransactionAsync({\n to: dest,\n value: paymentAmount,\n });\n } else {\n return await writeContractAsync({\n abi: erc20Abi,\n address: getAddress(required.token.token),\n functionName: \"transfer\",\n args: [dest, paymentAmount],\n });\n }\n } catch (e) {\n console.error(`[PAY TOKEN] error sending token: ${e}`);\n throw e;\n }\n })();\n\n // Special case. Handle Rabby bug, where it returns the *Safe signature*\n // instead of a txHash for a queued, unsubmitted Safe transaction.\n if (!isHex(paymentTxHash) || paymentTxHash.length !== 66) {\n log(\n `[PAY TOKEN] wallet bug detected. ignoring invalid payment txHash: ${paymentTxHash}`,\n );\n return { success: true };\n }\n\n try {\n await pay.payEthSource({\n paymentTxHash,\n sourceChainId: required.token.chainId,\n payerAddress: ethWalletAddress,\n sourceToken: getAddress(required.token.token),\n sourceAmount: paymentAmount,\n });\n return { txHash: paymentTxHash, success: true };\n } catch {\n console.error(\n `[PAY TOKEN] could not verify payment tx on chain: ${paymentTxHash}`,\n );\n return { txHash: paymentTxHash, success: false };\n }\n };\n\n const payWithSolanaToken = async (\n inputToken: SolanaPublicKey,\n ): Promise<{ txHash: string; success: boolean }> => {\n const payerPublicKey = solanaWallet.publicKey;\n assert(\n payerPublicKey != null,\n \"[PAY SOLANA] null payerPublicKey when paying on solana\",\n );\n assert(\n pay.order?.id != null,\n \"[PAY SOLANA] null orderId when paying on solana\",\n );\n assert(\n pay.paymentState === \"preview\" ||\n pay.paymentState === \"unhydrated\" ||\n pay.paymentState === \"payment_unpaid\",\n `[PAY SOLANA] paymentState is ${pay.paymentState}, must be preview or unhydrated or payment_unpaid`,\n );\n\n let hydratedOrder: DaimoPayHydratedOrderWithOrg;\n if (pay.paymentState !== \"payment_unpaid\") {\n const res = await pay.hydrateOrder();\n hydratedOrder = res.order;\n\n log(\n `[PAY SOLANA] Hydrated order: ${JSON.stringify(\n hydratedOrder,\n )}, checking out with Solana ${inputToken}`,\n );\n } else {\n hydratedOrder = pay.order;\n }\n\n const paymentTxHash = await (async () => {\n try {\n const serializedTx = await trpc.getSolanaSwapAndBurnTx.query({\n orderId: pay.order.id.toString(),\n userPublicKey: assertNotNull(\n payerPublicKey,\n \"[PAY SOLANA] wallet.publicKey cannot be null\",\n ).toString(),\n inputTokenMint: inputToken,\n });\n const tx = VersionedTransaction.deserialize(hexToBytes(serializedTx));\n const txHash = await solanaWallet.sendTransaction(tx, connection);\n return txHash;\n } catch (e) {\n console.error(e);\n throw e;\n }\n })();\n\n try {\n await pay.paySolanaSource({\n paymentTxHash: paymentTxHash,\n sourceToken: inputToken,\n });\n return { txHash: paymentTxHash, success: true };\n } catch {\n console.error(\n `[PAY SOLANA] could not verify payment tx on chain: ${paymentTxHash}`,\n );\n return { txHash: paymentTxHash, success: false };\n }\n };\n\n const payWithExternal = async (option: ExternalPaymentOptions) => {\n assert(pay.order != null, \"[PAY EXTERNAL] order cannot be null\");\n assert(platform != null, \"[PAY EXTERNAL] platform cannot be null\");\n\n const { order } = await pay.hydrateOrder();\n const externalPaymentOptionData =\n await trpc.getExternalPaymentOptionData.query({\n id: order.id.toString(),\n externalPaymentOption: option,\n platform,\n redirectReturnUrl,\n });\n assert(\n externalPaymentOptionData != null,\n \"[PAY EXTERNAL] missing externalPaymentOptionData\",\n );\n\n log(\n `[PAY EXTERNAL] hydrated order: ${debugJson(\n order,\n )}, checking out with external payment: ${option}`,\n );\n\n setPaymentWaitingMessage(externalPaymentOptionData.waitingMessage);\n\n return externalPaymentOptionData.url;\n };\n\n const payWithDepositAddress = async (\n option: DepositAddressPaymentOptions,\n ) => {\n const { order } = await pay.hydrateOrder();\n\n log(\n `[PAY DEPOSIT ADDRESS] hydrated order ${order.id} for ${order.usdValue} USD, checking out with deposit address: ${option}`,\n );\n\n const result = await trpc.getDepositAddressForOrder.query({\n orderId: order.id.toString(),\n option,\n });\n\n return \"error\" in result ? null : result;\n };\n\n const { isIOS, isAndroid } = useIsMobile();\n\n const openInWalletBrowser = async (\n wallet: WalletConfigProps,\n amountUsd?: number,\n ) => {\n const paymentState = pay.paymentState;\n assert(\n paymentState === \"preview\" ||\n paymentState === \"unhydrated\" ||\n paymentState === \"payment_unpaid\",\n `[OPEN IN WALLET BROWSER] paymentState is ${paymentState}, must be preview or unhydrated or payment_unpaid`,\n );\n assert(\n wallet.getDaimoPayDeeplink != null,\n `openInWalletBrowser: missing deeplink for ${wallet.name}`,\n );\n\n // hydrate order if not already hydrated\n if (pay.paymentState !== \"payment_unpaid\") {\n await pay.hydrateOrder();\n }\n\n const payId = writeDaimoPayOrderID(pay.order.id);\n const platform = isIOS ? \"ios\" : isAndroid ? \"android\" : \"other\";\n const deeplink = wallet.getDaimoPayDeeplink(payId, platform);\n // If we are in IOS, we don't open the deeplink in a new window, because it\n // will not work, the link will be opened in the page WAITING_WALLET\n if (!isIOS) {\n window.open(deeplink, \"_blank\");\n }\n setSelectedWallet(wallet);\n setSelectedWalletDeepLink(deeplink);\n setRoute(ROUTES.WAITING_WALLET, {\n amountUsd,\n payId,\n wallet_name: wallet.name,\n });\n };\n\n /** User picked a different deposit amount. */\n const setChosenUsd = (usd: number) => {\n assert(\n pay.paymentState === \"preview\",\n \"[SET CHOSEN USD] paymentState is not preview\",\n );\n\n // Too expensive to make an API call to regenerate preview order each time\n // the user changes the amount. Instead, we modify the order in memory.\n pay.setChosenUsd(usd);\n };\n\n const setPayId = useCallback(\n async (payId: string | undefined) => {\n if (payId == null) return;\n const id = readDaimoPayOrderID(payId).toString();\n\n if (pay.order?.id && BigInt(id) == pay.order.id) {\n // Already loaded, ignore.\n return;\n }\n\n pay.reset();\n await pay.setPayId(payId);\n setIsDepositFlow(false);\n },\n [pay],\n );\n\n /** Called whenever params change. */\n const setPayParams = async (payParams: PayParams | undefined) => {\n if (lockPayParams) return;\n assert(payParams != null, \"[SET PAY PARAMS] payParams cannot be null\");\n\n log(\"[SET PAY PARAMS] setting payParams\", payParams);\n pay.reset();\n setCurrPayParams(payParams);\n setIsDepositFlow(payParams.toUnits == null);\n await pay.createPreviewOrder(payParams);\n };\n\n const generatePreviewOrder = async () => {\n pay.reset();\n if (currPayParams == null) return;\n await pay.createPreviewOrder(currPayParams);\n };\n\n const resetOrder = useCallback(\n async (payParams?: Partial<PayParams>) => {\n const mergedPayParams: PayParams | undefined =\n payParams != null && currPayParams != null\n ? { ...currPayParams, ...payParams }\n : currPayParams;\n\n // Clear the old order & state\n pay.reset();\n setSelectedExternalOption(undefined);\n setSelectedTokenOption(undefined);\n setSelectedSolanaTokenOption(undefined);\n setSelectedDepositAddressOption(undefined);\n setSelectedWallet(undefined);\n setSelectedWalletDeepLink(undefined);\n setPaymentWaitingMessage(undefined);\n\n // Set the new payParams\n if (mergedPayParams) {\n setCurrPayParams(mergedPayParams);\n setIsDepositFlow(mergedPayParams.toUnits == null);\n await pay.createPreviewOrder(mergedPayParams);\n }\n\n setRoute(ROUTES.SELECT_METHOD);\n },\n [setRoute, pay, currPayParams],\n );\n\n const [tokenMode, setTokenMode] = useState<\"evm\" | \"solana\" | \"all\">(\"evm\");\n\n // Compute the order of top-level payment options from paymentOptions\n const topOptionsOrder = (() => {\n const defaultOrder = DEFAULT_TOP_OPTIONS_ORDER;\n const paymentOptions =\n buttonProps?.paymentOptions ?? pay.order?.metadata.payer?.paymentOptions;\n const found = getTopLevelOptions(paymentOptions);\n return found.length ? found : defaultOrder;\n })();\n\n return {\n buttonProps,\n setButtonProps,\n topOptionsOrder,\n setPayId,\n setPayParams,\n tokenMode,\n setTokenMode,\n generatePreviewOrder,\n isDepositFlow,\n paymentWaitingMessage,\n selectedExternalOption,\n selectedTokenOption,\n selectedSolanaTokenOption,\n externalPaymentOptions,\n selectedWallet,\n selectedWalletDeepLink,\n walletPaymentOptions,\n solanaPaymentOptions,\n depositAddressOptions,\n selectedDepositAddressOption,\n getOrderUsdLimit,\n resetOrder,\n setSelectedWallet,\n setSelectedWalletDeepLink,\n setPaymentWaitingMessage,\n setSelectedExternalOption,\n setSelectedTokenOption,\n setSelectedSolanaTokenOption,\n setSelectedDepositAddressOption,\n setChosenUsd,\n payWithToken,\n payWithExternal,\n payWithDepositAddress,\n payWithSolanaToken,\n openInWalletBrowser,\n senderEnsName: senderEnsName ?? undefined,\n untronAvailable,\n };\n}\n"],"names":["platform"],"mappings":"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"}
@@ -62,9 +62,11 @@ function getEvmTokenOptions(options, isDepositFlow, setSelectedTokenOption, setR
62
62
  const chainName = getChainName(option.balance.token.chainId);
63
63
  const titlePrice = isDepositFlow ? formatUsd(option.balance.usd) : roundTokenAmount(option.required.amount, option.required.token);
64
64
  const title = `${titlePrice} ${option.balance.token.symbol} ${onString} ${chainName}`;
65
+ const isBelowMinimum = isDepositFlow && option.balance.usd < option.minimumRequired.usd;
66
+ const belowMinimumReason = `Minimum ${formatUsd(option.minimumRequired.usd, "up")}`;
65
67
  const balanceStr = `${roundTokenAmount(option.balance.amount, option.balance.token)} ${option.balance.token.symbol}`;
66
- let subtitle = option.disabledReason ?? `${isDepositFlow ? "" : "Balance: "}${balanceStr}`;
67
- const disabled = option.disabledReason != null;
68
+ let subtitle = option.disabledReason ?? (isBelowMinimum ? belowMinimumReason : null) ?? `${isDepositFlow ? "" : "Balance: "}${balanceStr}`;
69
+ const disabled = option.disabledReason != null || isBelowMinimum;
68
70
  if (nonPassthroughToken != null) {
69
71
  const defaultSym = nonPassthroughToken.symbol;
70
72
  const optSym = option.balance.token.symbol;
@@ -110,9 +112,11 @@ function getSolanaTokenOptions(options, isDepositFlow, setSelectedSolanaTokenOpt
110
112
  return options.map((option) => {
111
113
  const titlePrice = isDepositFlow ? formatUsd(option.balance.usd) : roundTokenAmount(option.required.amount, option.required.token);
112
114
  const title = `${titlePrice} ${option.balance.token.symbol} ${onString} Solana`;
115
+ const isBelowMinimum = isDepositFlow && option.balance.usd < option.minimumRequired.usd;
116
+ const belowMinimumReason = `Minimum ${formatUsd(option.minimumRequired.usd, "up")}`;
113
117
  const balanceStr = `${roundTokenAmount(option.balance.amount, option.balance.token)} ${option.balance.token.symbol}`;
114
- const subtitle = option.disabledReason ?? `${isDepositFlow ? "" : "Balance: "}${balanceStr}`;
115
- const disabled = option.disabledReason != null;
118
+ const subtitle = option.disabledReason ?? (isBelowMinimum ? belowMinimumReason : null) ?? `${isDepositFlow ? "" : "Balance: "}${balanceStr}`;
119
+ const disabled = option.disabledReason != null || isBelowMinimum;
116
120
  return {
117
121
  id: getDaimoTokenKey(option.balance.token),
118
122
  sortValue: option.balance.usd,
@@ -1 +1 @@
1
- {"version":3,"file":"useTokenOptions.js","sources":["../../../src/hooks/useTokenOptions.tsx"],"sourcesContent":["/// Gets token options when paying from a connected wallet. Supports both EVM\n\nimport {\n DaimoPayToken,\n getChainName,\n Token,\n WalletPaymentOption,\n} from \"@daimo/pay-common\";\nimport { Option } from \"../components/Common/OptionsList\";\nimport TokenChainLogo from \"../components/Common/TokenChainLogo\";\nimport { ROUTES } from \"../constants/routes\";\nimport { flattenChildren } from \"../utils\";\nimport { formatUsd, roundTokenAmount } from \"../utils/format\";\nimport { useDaimoPay } from \"./useDaimoPay\";\nimport useLocales from \"./useLocales\";\nimport { usePayContext } from \"./usePayContext\";\n\n/// and Solana tokens. See OptionsList.\nexport function useTokenOptions(mode: \"evm\" | \"solana\" | \"all\"): {\n optionsList: Option[];\n isLoading: boolean;\n} {\n const { setRoute, paymentState } = usePayContext();\n const {\n isDepositFlow,\n walletPaymentOptions,\n solanaPaymentOptions,\n setSelectedTokenOption,\n setSelectedSolanaTokenOption,\n } = paymentState;\n\n // Get translations once and pass down to helpers to avoid violating\n // the Rules-of-Hooks (hooks can only be called inside React components\n // or custom hooks).\n const locales = useLocales();\n const onString = flattenChildren(locales.on).join(\"\");\n\n // HACK: special handling for portfolio deposits\n const pay = useDaimoPay();\n const isPassthrough = !!pay.order?.metadata.payer?.passthroughTokens?.length;\n const nonPassthroughToken = isPassthrough\n ? pay.order?.destFinalCallTokenAmount.token\n : undefined;\n\n let optionsList: Option[] = [];\n let isLoading = false;\n if ([\"evm\", \"all\"].includes(mode)) {\n optionsList.push(\n ...getEvmTokenOptions(\n walletPaymentOptions.options ?? [],\n isDepositFlow,\n setSelectedTokenOption,\n setRoute,\n onString,\n nonPassthroughToken,\n ),\n );\n isLoading ||= walletPaymentOptions.isLoading;\n }\n if ([\"solana\", \"all\"].includes(mode)) {\n optionsList.push(\n ...getSolanaTokenOptions(\n solanaPaymentOptions.options ?? [],\n isDepositFlow,\n setSelectedSolanaTokenOption,\n setRoute,\n onString,\n ),\n );\n isLoading ||= solanaPaymentOptions.isLoading;\n }\n\n optionsList.sort((a, b) => {\n const dDisabled = (a.disabled ? 1 : 0) - (b.disabled ? 1 : 0);\n if (dDisabled !== 0) return dDisabled;\n const dSort = (b.sortValue ?? 0) - (a.sortValue ?? 0);\n return dSort;\n });\n\n return { optionsList, isLoading };\n}\n\nfunction getEvmTokenOptions(\n options: WalletPaymentOption[],\n isDepositFlow: boolean,\n setSelectedTokenOption: (option: WalletPaymentOption) => void,\n setRoute: (route: ROUTES, meta?: any) => void,\n onString: string,\n nonPassthroughToken?: Token,\n) {\n return options.map((option) => {\n const chainName = getChainName(option.balance.token.chainId);\n const titlePrice = isDepositFlow\n ? formatUsd(option.balance.usd)\n : roundTokenAmount(option.required.amount, option.required.token);\n const title = `${titlePrice} ${option.balance.token.symbol} ${onString} ${chainName}`;\n\n const balanceStr = `${roundTokenAmount(option.balance.amount, option.balance.token)} ${option.balance.token.symbol}`;\n let subtitle =\n option.disabledReason ??\n `${isDepositFlow ? \"\" : \"Balance: \"}${balanceStr}`;\n const disabled = option.disabledReason != null;\n\n // HACK: special handling for portfolio deposits\n if (nonPassthroughToken != null) {\n const defaultSym = nonPassthroughToken.symbol;\n const optSym = option.balance.token.symbol;\n if (option.passthroughAddress == null && optSym !== defaultSym) {\n subtitle = `Convert to ${defaultSym}`;\n } else {\n subtitle = `Deposit ${optSym}`;\n }\n }\n const sortValue =\n option.balance.usd + (option.passthroughAddress == null ? 0 : 1e9);\n\n return {\n id: getDaimoTokenKey(option.balance.token),\n sortValue,\n title,\n subtitle,\n icons: [\n <TokenChainLogo\n key={getDaimoTokenKey(option.balance.token)}\n token={option.balance.token}\n />,\n ],\n onClick: () => {\n setSelectedTokenOption(option);\n const meta = {\n event: \"click-token\",\n tokenSymbol: option.balance.token.symbol,\n chainId: option.balance.token.chainId,\n };\n if (isDepositFlow) {\n setRoute(ROUTES.SELECT_AMOUNT, meta);\n } else {\n setRoute(ROUTES.PAY_WITH_TOKEN, meta);\n }\n },\n disabled,\n };\n });\n}\n\nfunction getSolanaTokenOptions(\n options: WalletPaymentOption[],\n isDepositFlow: boolean,\n setSelectedSolanaTokenOption: (option: WalletPaymentOption) => void,\n setRoute: (route: ROUTES, meta?: any) => void,\n onString: string,\n) {\n return options.map((option) => {\n const titlePrice = isDepositFlow\n ? formatUsd(option.balance.usd)\n : roundTokenAmount(option.required.amount, option.required.token);\n const title = `${titlePrice} ${option.balance.token.symbol} ${onString} Solana`;\n const balanceStr = `${roundTokenAmount(option.balance.amount, option.balance.token)} ${option.balance.token.symbol}`;\n const subtitle =\n option.disabledReason ??\n `${isDepositFlow ? \"\" : \"Balance: \"}${balanceStr}`;\n const disabled = option.disabledReason != null;\n\n return {\n id: getDaimoTokenKey(option.balance.token),\n sortValue: option.balance.usd,\n title,\n subtitle,\n icons: [\n <TokenChainLogo\n key={getDaimoTokenKey(option.balance.token)}\n token={option.balance.token}\n />,\n ],\n onClick: () => {\n setSelectedSolanaTokenOption(option);\n const meta = {\n event: \"click-solana-token\",\n tokenSymbol: option.balance.token.symbol,\n chainId: option.balance.token.chainId,\n };\n if (isDepositFlow) {\n setRoute(ROUTES.SOLANA_SELECT_AMOUNT, meta);\n } else {\n setRoute(ROUTES.SOLANA_PAY_WITH_TOKEN, meta);\n }\n },\n disabled,\n };\n });\n}\n\nfunction getDaimoTokenKey(token: DaimoPayToken) {\n return `${token.chainId}-${token.token}`;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useTokenOptions.js","sources":["../../../src/hooks/useTokenOptions.tsx"],"sourcesContent":["/// Gets token options when paying from a connected wallet. Supports both EVM\n\nimport {\n DaimoPayToken,\n getChainName,\n Token,\n WalletPaymentOption,\n} from \"@daimo/pay-common\";\nimport { Option } from \"../components/Common/OptionsList\";\nimport TokenChainLogo from \"../components/Common/TokenChainLogo\";\nimport { ROUTES } from \"../constants/routes\";\nimport { flattenChildren } from \"../utils\";\nimport { formatUsd, roundTokenAmount } from \"../utils/format\";\nimport { useDaimoPay } from \"./useDaimoPay\";\nimport useLocales from \"./useLocales\";\nimport { usePayContext } from \"./usePayContext\";\n\n/// and Solana tokens. See OptionsList.\nexport function useTokenOptions(mode: \"evm\" | \"solana\" | \"all\"): {\n optionsList: Option[];\n isLoading: boolean;\n} {\n const { setRoute, paymentState } = usePayContext();\n const {\n isDepositFlow,\n walletPaymentOptions,\n solanaPaymentOptions,\n setSelectedTokenOption,\n setSelectedSolanaTokenOption,\n } = paymentState;\n\n // Get translations once and pass down to helpers to avoid violating\n // the Rules-of-Hooks (hooks can only be called inside React components\n // or custom hooks).\n const locales = useLocales();\n const onString = flattenChildren(locales.on).join(\"\");\n\n // HACK: special handling for portfolio deposits\n const pay = useDaimoPay();\n const isPassthrough = !!pay.order?.metadata.payer?.passthroughTokens?.length;\n const nonPassthroughToken = isPassthrough\n ? pay.order?.destFinalCallTokenAmount.token\n : undefined;\n\n let optionsList: Option[] = [];\n let isLoading = false;\n if ([\"evm\", \"all\"].includes(mode)) {\n optionsList.push(\n ...getEvmTokenOptions(\n walletPaymentOptions.options ?? [],\n isDepositFlow,\n setSelectedTokenOption,\n setRoute,\n onString,\n nonPassthroughToken,\n ),\n );\n isLoading ||= walletPaymentOptions.isLoading;\n }\n if ([\"solana\", \"all\"].includes(mode)) {\n optionsList.push(\n ...getSolanaTokenOptions(\n solanaPaymentOptions.options ?? [],\n isDepositFlow,\n setSelectedSolanaTokenOption,\n setRoute,\n onString,\n ),\n );\n isLoading ||= solanaPaymentOptions.isLoading;\n }\n\n optionsList.sort((a, b) => {\n const dDisabled = (a.disabled ? 1 : 0) - (b.disabled ? 1 : 0);\n if (dDisabled !== 0) return dDisabled;\n const dSort = (b.sortValue ?? 0) - (a.sortValue ?? 0);\n return dSort;\n });\n\n return { optionsList, isLoading };\n}\n\nfunction getEvmTokenOptions(\n options: WalletPaymentOption[],\n isDepositFlow: boolean,\n setSelectedTokenOption: (option: WalletPaymentOption) => void,\n setRoute: (route: ROUTES, meta?: any) => void,\n onString: string,\n nonPassthroughToken?: Token,\n) {\n return options.map((option) => {\n const chainName = getChainName(option.balance.token.chainId);\n const titlePrice = isDepositFlow\n ? formatUsd(option.balance.usd)\n : roundTokenAmount(option.required.amount, option.required.token);\n const title = `${titlePrice} ${option.balance.token.symbol} ${onString} ${chainName}`;\n\n // In deposit mode, check if balance is under the minimum\n const isBelowMinimum =\n isDepositFlow && option.balance.usd < option.minimumRequired.usd;\n const belowMinimumReason = `Minimum ${formatUsd(option.minimumRequired.usd, \"up\")}`;\n\n const balanceStr = `${roundTokenAmount(option.balance.amount, option.balance.token)} ${option.balance.token.symbol}`;\n\n let subtitle =\n option.disabledReason ??\n (isBelowMinimum ? belowMinimumReason : null) ??\n `${isDepositFlow ? \"\" : \"Balance: \"}${balanceStr}`;\n const disabled = option.disabledReason != null || isBelowMinimum;\n\n // HACK: special handling for portfolio deposits\n if (nonPassthroughToken != null) {\n const defaultSym = nonPassthroughToken.symbol;\n const optSym = option.balance.token.symbol;\n if (option.passthroughAddress == null && optSym !== defaultSym) {\n subtitle = `Convert to ${defaultSym}`;\n } else {\n subtitle = `Deposit ${optSym}`;\n }\n }\n const sortValue =\n option.balance.usd + (option.passthroughAddress == null ? 0 : 1e9);\n\n return {\n id: getDaimoTokenKey(option.balance.token),\n sortValue,\n title,\n subtitle,\n icons: [\n <TokenChainLogo\n key={getDaimoTokenKey(option.balance.token)}\n token={option.balance.token}\n />,\n ],\n onClick: () => {\n setSelectedTokenOption(option);\n const meta = {\n event: \"click-token\",\n tokenSymbol: option.balance.token.symbol,\n chainId: option.balance.token.chainId,\n };\n if (isDepositFlow) {\n setRoute(ROUTES.SELECT_AMOUNT, meta);\n } else {\n setRoute(ROUTES.PAY_WITH_TOKEN, meta);\n }\n },\n disabled,\n };\n });\n}\n\nfunction getSolanaTokenOptions(\n options: WalletPaymentOption[],\n isDepositFlow: boolean,\n setSelectedSolanaTokenOption: (option: WalletPaymentOption) => void,\n setRoute: (route: ROUTES, meta?: any) => void,\n onString: string,\n) {\n return options.map((option) => {\n const titlePrice = isDepositFlow\n ? formatUsd(option.balance.usd)\n : roundTokenAmount(option.required.amount, option.required.token);\n const title = `${titlePrice} ${option.balance.token.symbol} ${onString} Solana`;\n\n // In deposit mode, check if balance is under the minimum\n const isBelowMinimum =\n isDepositFlow && option.balance.usd < option.minimumRequired.usd;\n const belowMinimumReason = `Minimum ${formatUsd(option.minimumRequired.usd, \"up\")}`;\n\n const balanceStr = `${roundTokenAmount(option.balance.amount, option.balance.token)} ${option.balance.token.symbol}`;\n\n const subtitle =\n option.disabledReason ??\n (isBelowMinimum ? belowMinimumReason : null) ??\n `${isDepositFlow ? \"\" : \"Balance: \"}${balanceStr}`;\n const disabled = option.disabledReason != null || isBelowMinimum;\n\n return {\n id: getDaimoTokenKey(option.balance.token),\n sortValue: option.balance.usd,\n title,\n subtitle,\n icons: [\n <TokenChainLogo\n key={getDaimoTokenKey(option.balance.token)}\n token={option.balance.token}\n />,\n ],\n onClick: () => {\n setSelectedSolanaTokenOption(option);\n const meta = {\n event: \"click-solana-token\",\n tokenSymbol: option.balance.token.symbol,\n chainId: option.balance.token.chainId,\n };\n if (isDepositFlow) {\n setRoute(ROUTES.SOLANA_SELECT_AMOUNT, meta);\n } else {\n setRoute(ROUTES.SOLANA_PAY_WITH_TOKEN, meta);\n }\n },\n disabled,\n };\n });\n}\n\nfunction getDaimoTokenKey(token: DaimoPayToken) {\n return `${token.chainId}-${token.token}`;\n}\n"],"names":[],"mappings":"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"}
@@ -31,6 +31,9 @@ function roundTokenAmount(amount, token, round = "down") {
31
31
  );
32
32
  }
33
33
  function roundTokenAmountUnits(amountUnits, token, round = "down") {
34
+ if (amountUnits === 0) {
35
+ return "0";
36
+ }
34
37
  return roundDecimals(amountUnits, token.displayDecimals, round);
35
38
  }
36
39
  function usdToRoundedTokenAmount(usd, token, round = "down") {
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sources":["../../../src/utils/format.ts"],"sourcesContent":["import { BigIntStr, DaimoPayToken } from \"@daimo/pay-common\";\nimport { formatUnits } from \"viem\";\n\nexport const USD_DECIMALS = 2;\n\n/**\n * Round a number to a given number of decimal places\n *\n * @param round - The rounding strategy to use:\n * - \"up\": Always rounds up to the next decimal place (ceiling)\n * - \"down\": Always rounds down to the previous decimal place (floor)\n * - \"nearest\": Rounds to the nearest decimal place (standard rounding)\n */\nexport function roundDecimals(\n value: number,\n decimals: number,\n round: \"up\" | \"down\" | \"nearest\",\n): string {\n const factor = 10 ** decimals;\n const multiplied = value * factor;\n\n let rounded: number;\n if (round === \"up\") {\n rounded = Math.ceil(multiplied);\n } else if (round === \"down\") {\n rounded = Math.floor(multiplied);\n } else {\n rounded = Math.round(multiplied);\n }\n\n return (rounded / factor).toFixed(decimals);\n}\n\n/**\n * Format a number as a USD amount\n *\n * @param usd - The USD amount to format\n * @param round - The rounding strategy to use (\"up\", \"down\", or \"nearest\")\n * @returns The formatted USD amount\n */\nexport function formatUsd(\n usd: number,\n round: \"up\" | \"down\" | \"nearest\" = \"down\",\n): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n }).format(Number(roundUsd(usd, round)));\n}\n\n/**\n * Round a USD amount to `USD_DECIMALS` precision\n */\nexport function roundUsd(\n usd: number,\n round: \"up\" | \"down\" | \"nearest\" = \"down\",\n): string {\n return roundDecimals(usd, USD_DECIMALS, round);\n}\n\n/**\n * Round a token amount to `displayDecimals` precision\n */\nexport function roundTokenAmount(\n amount: bigint | BigIntStr,\n token: DaimoPayToken,\n round: \"up\" | \"down\" | \"nearest\" = \"down\",\n): string {\n return roundDecimals(\n Number(formatUnits(BigInt(amount), token.decimals)),\n token.displayDecimals,\n round,\n );\n}\n\n/**\n * Round a token amount in units to `displayDecimals` precision\n */\nexport function roundTokenAmountUnits(\n amountUnits: number,\n token: DaimoPayToken,\n round: \"up\" | \"down\" | \"nearest\" = \"down\",\n): string {\n return roundDecimals(amountUnits, token.displayDecimals, round);\n}\n\n/**\n * Convert a USD amount to a token amount with `displayDecimals` precision\n *\n * @param usd - The USD amount to convert\n * @param token - The token to convert to\n * @param round - The rounding strategy to use (\"up\", \"down\", or \"nearest\")\n * @returns The token amount\n */\nexport function usdToRoundedTokenAmount(\n usd: number,\n token: DaimoPayToken,\n round: \"up\" | \"down\" | \"nearest\" = \"down\",\n): string {\n return roundTokenAmountUnits(usd / token.usd, token, round);\n}\n\n/**\n * Convert a token amount to a USD amount with `USD_DECIMALS` precision\n *\n * @param amount - The token amount to convert\n * @param token - The token to convert from\n * @param round - The rounding strategy to use (\"up\", \"down\", or \"nearest\")\n * @returns The formatted USD amount\n */\nexport function tokenAmountToRoundedUsd(\n amount: bigint | BigIntStr,\n token: DaimoPayToken,\n round: \"up\" | \"down\" | \"nearest\" = \"nearest\",\n): string {\n const amountUnits = formatUnits(BigInt(amount), token.decimals);\n return roundUsd(Number(amountUnits) * token.usd, round);\n}\n"],"names":[],"mappings":";;AAGO,MAAM,YAAe,GAAA,EAAA;AAUZ,SAAA,aAAA,CACd,KACA,EAAA,QAAA,EACA,KACQ,EAAA;AACR,EAAA,MAAM,SAAS,EAAM,IAAA,QAAA,CAAA;AACrB,EAAA,MAAM,aAAa,KAAQ,GAAA,MAAA,CAAA;AAE3B,EAAI,IAAA,OAAA,CAAA;AACJ,EAAA,IAAI,UAAU,IAAM,EAAA;AAClB,IAAU,OAAA,GAAA,IAAA,CAAK,KAAK,UAAU,CAAA,CAAA;AAAA,GAChC,MAAA,IAAW,UAAU,MAAQ,EAAA;AAC3B,IAAU,OAAA,GAAA,IAAA,CAAK,MAAM,UAAU,CAAA,CAAA;AAAA,GAC1B,MAAA;AACL,IAAU,OAAA,GAAA,IAAA,CAAK,MAAM,UAAU,CAAA,CAAA;AAAA,GACjC;AAEA,EAAQ,OAAA,CAAA,OAAA,GAAU,MAAQ,EAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAC5C,CAAA;AASgB,SAAA,SAAA,CACd,GACA,EAAA,KAAA,GAAmC,MAC3B,EAAA;AACR,EAAO,OAAA,IAAI,IAAK,CAAA,YAAA,CAAa,OAAS,EAAA;AAAA,IACpC,KAAO,EAAA,UAAA;AAAA,IACP,QAAU,EAAA,KAAA;AAAA,GACX,EAAE,MAAO,CAAA,MAAA,CAAO,SAAS,GAAK,EAAA,KAAK,CAAC,CAAC,CAAA,CAAA;AACxC,CAAA;AAKgB,SAAA,QAAA,CACd,GACA,EAAA,KAAA,GAAmC,MAC3B,EAAA;AACR,EAAO,OAAA,aAAA,CAAc,GAAK,EAAA,YAAA,EAAc,KAAK,CAAA,CAAA;AAC/C,CAAA;AAKO,SAAS,gBACd,CAAA,MAAA,EACA,KACA,EAAA,KAAA,GAAmC,MAC3B,EAAA;AACR,EAAO,OAAA,aAAA;AAAA,IACL,OAAO,WAAY,CAAA,MAAA,CAAO,MAAM,CAAG,EAAA,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,IAClD,KAAM,CAAA,eAAA;AAAA,IACN,KAAA;AAAA,GACF,CAAA;AACF,CAAA;AAKO,SAAS,qBACd,CAAA,WAAA,EACA,KACA,EAAA,KAAA,GAAmC,MAC3B,EAAA;AACR,EAAA,OAAO,aAAc,CAAA,WAAA,EAAa,KAAM,CAAA,eAAA,EAAiB,KAAK,CAAA,CAAA;AAChE,CAAA;AAUO,SAAS,uBACd,CAAA,GAAA,EACA,KACA,EAAA,KAAA,GAAmC,MAC3B,EAAA;AACR,EAAA,OAAO,qBAAsB,CAAA,GAAA,GAAM,KAAM,CAAA,GAAA,EAAK,OAAO,KAAK,CAAA,CAAA;AAC5D,CAAA;AAUO,SAAS,uBACd,CAAA,MAAA,EACA,KACA,EAAA,KAAA,GAAmC,SAC3B,EAAA;AACR,EAAA,MAAM,cAAc,WAAY,CAAA,MAAA,CAAO,MAAM,CAAA,EAAG,MAAM,QAAQ,CAAA,CAAA;AAC9D,EAAA,OAAO,SAAS,MAAO,CAAA,WAAW,CAAI,GAAA,KAAA,CAAM,KAAK,KAAK,CAAA,CAAA;AACxD;;;;"}
1
+ {"version":3,"file":"format.js","sources":["../../../src/utils/format.ts"],"sourcesContent":["import { BigIntStr, DaimoPayToken } from \"@daimo/pay-common\";\nimport { formatUnits } from \"viem\";\n\nexport const USD_DECIMALS = 2;\n\n/**\n * Round a number to a given number of decimal places\n *\n * @param round - The rounding strategy to use:\n * - \"up\": Always rounds up to the next decimal place (ceiling)\n * - \"down\": Always rounds down to the previous decimal place (floor)\n * - \"nearest\": Rounds to the nearest decimal place (standard rounding)\n */\nexport function roundDecimals(\n value: number,\n decimals: number,\n round: \"up\" | \"down\" | \"nearest\",\n): string {\n const factor = 10 ** decimals;\n const multiplied = value * factor;\n\n let rounded: number;\n if (round === \"up\") {\n rounded = Math.ceil(multiplied);\n } else if (round === \"down\") {\n rounded = Math.floor(multiplied);\n } else {\n rounded = Math.round(multiplied);\n }\n\n return (rounded / factor).toFixed(decimals);\n}\n\n/**\n * Format a number as a USD amount\n *\n * @param usd - The USD amount to format\n * @param round - The rounding strategy to use (\"up\", \"down\", or \"nearest\")\n * @returns The formatted USD amount\n */\nexport function formatUsd(\n usd: number,\n round: \"up\" | \"down\" | \"nearest\" = \"down\",\n): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n }).format(Number(roundUsd(usd, round)));\n}\n\n/**\n * Round a USD amount to `USD_DECIMALS` precision\n */\nexport function roundUsd(\n usd: number,\n round: \"up\" | \"down\" | \"nearest\" = \"down\",\n): string {\n return roundDecimals(usd, USD_DECIMALS, round);\n}\n\n/**\n * Round a token amount to `displayDecimals` precision\n */\nexport function roundTokenAmount(\n amount: bigint | BigIntStr,\n token: DaimoPayToken,\n round: \"up\" | \"down\" | \"nearest\" = \"down\",\n): string {\n return roundDecimals(\n Number(formatUnits(BigInt(amount), token.decimals)),\n token.displayDecimals,\n round,\n );\n}\n\n/**\n * Round a token amount in units to `displayDecimals` precision\n */\nexport function roundTokenAmountUnits(\n amountUnits: number,\n token: DaimoPayToken,\n round: \"up\" | \"down\" | \"nearest\" = \"down\",\n): string {\n if (amountUnits === 0) {\n return \"0\";\n }\n return roundDecimals(amountUnits, token.displayDecimals, round);\n}\n\n/**\n * Convert a USD amount to a token amount with `displayDecimals` precision\n *\n * @param usd - The USD amount to convert\n * @param token - The token to convert to\n * @param round - The rounding strategy to use (\"up\", \"down\", or \"nearest\")\n * @returns The token amount\n */\nexport function usdToRoundedTokenAmount(\n usd: number,\n token: DaimoPayToken,\n round: \"up\" | \"down\" | \"nearest\" = \"down\",\n): string {\n return roundTokenAmountUnits(usd / token.usd, token, round);\n}\n\n/**\n * Convert a token amount to a USD amount with `USD_DECIMALS` precision\n *\n * @param amount - The token amount to convert\n * @param token - The token to convert from\n * @param round - The rounding strategy to use (\"up\", \"down\", or \"nearest\")\n * @returns The formatted USD amount\n */\nexport function tokenAmountToRoundedUsd(\n amount: bigint | BigIntStr,\n token: DaimoPayToken,\n round: \"up\" | \"down\" | \"nearest\" = \"nearest\",\n): string {\n const amountUnits = formatUnits(BigInt(amount), token.decimals);\n return roundUsd(Number(amountUnits) * token.usd, round);\n}\n"],"names":[],"mappings":";;AAGO,MAAM,YAAe,GAAA,EAAA;AAUZ,SAAA,aAAA,CACd,KACA,EAAA,QAAA,EACA,KACQ,EAAA;AACR,EAAA,MAAM,SAAS,EAAM,IAAA,QAAA,CAAA;AACrB,EAAA,MAAM,aAAa,KAAQ,GAAA,MAAA,CAAA;AAE3B,EAAI,IAAA,OAAA,CAAA;AACJ,EAAA,IAAI,UAAU,IAAM,EAAA;AAClB,IAAU,OAAA,GAAA,IAAA,CAAK,KAAK,UAAU,CAAA,CAAA;AAAA,GAChC,MAAA,IAAW,UAAU,MAAQ,EAAA;AAC3B,IAAU,OAAA,GAAA,IAAA,CAAK,MAAM,UAAU,CAAA,CAAA;AAAA,GAC1B,MAAA;AACL,IAAU,OAAA,GAAA,IAAA,CAAK,MAAM,UAAU,CAAA,CAAA;AAAA,GACjC;AAEA,EAAQ,OAAA,CAAA,OAAA,GAAU,MAAQ,EAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAC5C,CAAA;AASgB,SAAA,SAAA,CACd,GACA,EAAA,KAAA,GAAmC,MAC3B,EAAA;AACR,EAAO,OAAA,IAAI,IAAK,CAAA,YAAA,CAAa,OAAS,EAAA;AAAA,IACpC,KAAO,EAAA,UAAA;AAAA,IACP,QAAU,EAAA,KAAA;AAAA,GACX,EAAE,MAAO,CAAA,MAAA,CAAO,SAAS,GAAK,EAAA,KAAK,CAAC,CAAC,CAAA,CAAA;AACxC,CAAA;AAKgB,SAAA,QAAA,CACd,GACA,EAAA,KAAA,GAAmC,MAC3B,EAAA;AACR,EAAO,OAAA,aAAA,CAAc,GAAK,EAAA,YAAA,EAAc,KAAK,CAAA,CAAA;AAC/C,CAAA;AAKO,SAAS,gBACd,CAAA,MAAA,EACA,KACA,EAAA,KAAA,GAAmC,MAC3B,EAAA;AACR,EAAO,OAAA,aAAA;AAAA,IACL,OAAO,WAAY,CAAA,MAAA,CAAO,MAAM,CAAG,EAAA,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,IAClD,KAAM,CAAA,eAAA;AAAA,IACN,KAAA;AAAA,GACF,CAAA;AACF,CAAA;AAKO,SAAS,qBACd,CAAA,WAAA,EACA,KACA,EAAA,KAAA,GAAmC,MAC3B,EAAA;AACR,EAAA,IAAI,gBAAgB,CAAG,EAAA;AACrB,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AACA,EAAA,OAAO,aAAc,CAAA,WAAA,EAAa,KAAM,CAAA,eAAA,EAAiB,KAAK,CAAA,CAAA;AAChE,CAAA;AAUO,SAAS,uBACd,CAAA,GAAA,EACA,KACA,EAAA,KAAA,GAAmC,MAC3B,EAAA;AACR,EAAA,OAAO,qBAAsB,CAAA,GAAA,GAAM,KAAM,CAAA,GAAA,EAAK,OAAO,KAAK,CAAA,CAAA;AAC5D,CAAA;AAUO,SAAS,uBACd,CAAA,MAAA,EACA,KACA,EAAA,KAAA,GAAmC,SAC3B,EAAA;AACR,EAAA,MAAM,cAAc,WAAY,CAAA,MAAA,CAAO,MAAM,CAAA,EAAG,MAAM,QAAQ,CAAA,CAAA;AAC9D,EAAA,OAAO,SAAS,MAAO,CAAA,WAAW,CAAI,GAAA,KAAA,CAAM,KAAK,KAAK,CAAA,CAAA;AACxD;;;;"}