@daimo/pay 1.16.1 → 1.16.2
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.
- package/build/index.d.ts +5 -3
- package/build/package.json.js +2 -2
- package/build/src/components/Common/SelectAnotherMethodButton/index.js +15 -3
- package/build/src/components/Common/SelectAnotherMethodButton/index.js.map +1 -1
- package/build/src/components/DaimoPayButton/index.js +2 -1
- package/build/src/components/DaimoPayButton/index.js.map +1 -1
- package/build/src/components/Pages/SelectMethod/index.js +0 -1
- package/build/src/components/Pages/SelectMethod/index.js.map +1 -1
- package/build/src/payment/paymentFsm.js.map +1 -1
- package/package.json +3 -3
- package/build/assets/MobileWithLogos.d.ts +0 -2
- package/build/assets/ScanIconWithLogos.d.ts +0 -6
- package/build/assets/browsers.d.ts +0 -10
- package/build/assets/chains.d.ts +0 -28
- package/build/assets/coins.d.ts +0 -2
- package/build/assets/crepe.d.ts +0 -3
- package/build/assets/icons.d.ts +0 -35
- package/build/assets/logos.d.ts +0 -207
- package/build/assets/wallet.d.ts +0 -3
- package/build/assets/wave.d.ts +0 -2
- package/build/components/Common/Alert/index.d.ts +0 -6
- package/build/components/Common/Alert/styles.d.ts +0 -2
- package/build/components/Common/Alert/types.d.ts +0 -5
- package/build/components/Common/AmountInput/AmountInputField.d.ts +0 -8
- package/build/components/Common/AmountInput/index.d.ts +0 -9
- package/build/components/Common/Avatar/index.d.ts +0 -17
- package/build/components/Common/Avatar/styles.d.ts +0 -2
- package/build/components/Common/BrowserIcon/index.d.ts +0 -4
- package/build/components/Common/BrowserIcon/styles.d.ts +0 -1
- package/build/components/Common/BrowserIcon/types.d.ts +0 -3
- package/build/components/Common/Button/index.d.ts +0 -4
- package/build/components/Common/Button/styles.d.ts +0 -10
- package/build/components/Common/Button/types.d.ts +0 -15
- package/build/components/Common/Chain/index.d.ts +0 -9
- package/build/components/Common/Chain/styles.d.ts +0 -4
- package/build/components/Common/ChainSelectList/index.d.ts +0 -4
- package/build/components/Common/ChainSelectList/styles.d.ts +0 -9
- package/build/components/Common/CircleTimer.d.ts +0 -17
- package/build/components/Common/ConnectorList/index.d.ts +0 -2
- package/build/components/Common/ConnectorList/styles.d.ts +0 -8
- package/build/components/Common/CopyToClipboard/CopyToClipboardIcon.d.ts +0 -6
- package/build/components/Common/CopyToClipboard/index.d.ts +0 -7
- package/build/components/Common/CustomQRCode/QRCode.d.ts +0 -12
- package/build/components/Common/CustomQRCode/index.d.ts +0 -6
- package/build/components/Common/CustomQRCode/styles.d.ts +0 -6
- package/build/components/Common/CustomQRCode/types.d.ts +0 -11
- package/build/components/Common/DynamicContainer/index.d.ts +0 -7
- package/build/components/Common/FitText/index.d.ts +0 -8
- package/build/components/Common/LazyImage/index.d.ts +0 -8
- package/build/components/Common/Logo/index.d.ts +0 -8
- package/build/components/Common/Logo/styles.d.ts +0 -3
- package/build/components/Common/Modal/index.d.ts +0 -25
- package/build/components/Common/Modal/styles.d.ts +0 -25
- package/build/components/Common/OptionsList/index.d.ts +0 -17
- package/build/components/Common/OptionsList/styles.d.ts +0 -5
- package/build/components/Common/OrderHeader/index.d.ts +0 -5
- package/build/components/Common/PaymentBreakdown/index.d.ts +0 -6
- package/build/components/Common/Portal/index.d.ts +0 -2
- package/build/components/Common/PoweredByFooter/index.d.ts +0 -5
- package/build/components/Common/ScrollArea/index.d.ts +0 -9
- package/build/components/Common/ScrollArea/styles.d.ts +0 -3
- package/build/components/Common/SelectAnotherMethodButton/index.d.ts +0 -1
- package/build/components/Common/Spinner/index.d.ts +0 -1
- package/build/components/Common/Spinner/styles.d.ts +0 -1
- package/build/components/Common/SquareTimer.d.ts +0 -19
- package/build/components/Common/SwitchButton/index.d.ts +0 -6
- package/build/components/Common/ThemedButton/index.d.ts +0 -15
- package/build/components/Common/ThemedButton/styles.d.ts +0 -2
- package/build/components/Common/TokenChainLogo/index.d.ts +0 -7
- package/build/components/Common/Tooltip/index.d.ts +0 -4
- package/build/components/Common/Tooltip/styles.d.ts +0 -3
- package/build/components/Common/Tooltip/types.d.ts +0 -9
- package/build/components/Common/WalletChainLogo/index.d.ts +0 -6
- package/build/components/DaimoPayButton/index.d.ts +0 -149
- package/build/components/DaimoPayButton/styles.d.ts +0 -4
- package/build/components/DaimoPayModal/ConnectUsing.d.ts +0 -2
- package/build/components/DaimoPayModal/ConnectWithInjector/index.d.ts +0 -15
- package/build/components/DaimoPayModal/ConnectWithInjector/styles.d.ts +0 -6
- package/build/components/DaimoPayModal/ConnectWithQRCode.d.ts +0 -12
- package/build/components/DaimoPayModal/index.d.ts +0 -8
- package/build/components/DaimoPayThemeProvider/DaimoPayThemeProvider.d.ts +0 -16
- package/build/components/Pages/About/graphics.d.ts +0 -11
- package/build/components/Pages/About/index.d.ts +0 -3
- package/build/components/Pages/About/styles.d.ts +0 -8
- package/build/components/Pages/Confirmation/index.d.ts +0 -3
- package/build/components/Pages/Connectors/index.d.ts +0 -3
- package/build/components/Pages/Connectors/styles.d.ts +0 -9
- package/build/components/Pages/DownloadApp/index.d.ts +0 -2
- package/build/components/Pages/Error/index.d.ts +0 -1
- package/build/components/Pages/MobileConnectors/index.d.ts +0 -3
- package/build/components/Pages/MobileConnectors/styles.d.ts +0 -5
- package/build/components/Pages/Onboarding/index.d.ts +0 -3
- package/build/components/Pages/Onboarding/styles.d.ts +0 -9
- package/build/components/Pages/PayWithToken/index.d.ts +0 -3
- package/build/components/Pages/SelectAmount/index.d.ts +0 -3
- package/build/components/Pages/SelectDepositAddressAmount/index.d.ts +0 -3
- package/build/components/Pages/SelectDepositAddressChain/index.d.ts +0 -3
- package/build/components/Pages/SelectExchange/index.d.ts +0 -3
- package/build/components/Pages/SelectExternalAmount/index.d.ts +0 -3
- package/build/components/Pages/SelectMethod/index.d.ts +0 -1
- package/build/components/Pages/SelectMethod/styles.d.ts +0 -9
- package/build/components/Pages/SelectToken/index.d.ts +0 -1
- package/build/components/Pages/SelectWalletAmount/index.d.ts +0 -3
- package/build/components/Pages/SelectWalletChain/index.d.ts +0 -3
- package/build/components/Pages/SelectZKP/index.d.ts +0 -3
- package/build/components/Pages/Solana/ConnectorSolana/index.d.ts +0 -4
- package/build/components/Pages/Solana/PayWithSolanaToken/index.d.ts +0 -3
- package/build/components/Pages/Solana/SelectSolanaAmount/index.d.ts +0 -3
- package/build/components/Pages/SwitchNetworks/index.d.ts +0 -3
- package/build/components/Pages/WaitingDepositAddress/index.d.ts +0 -1
- package/build/components/Pages/WaitingExternal/index.d.ts +0 -3
- package/build/components/Pages/WaitingWallet/index.d.ts +0 -3
- package/build/components/Spinners/CircleSpinner/index.d.ts +0 -9
- package/build/components/Spinners/CircleSpinner/styles.d.ts +0 -5
- package/build/components/Spinners/ExternalPaymentSpinner/index.d.ts +0 -5
- package/build/components/Spinners/SquircleSpinner/index.d.ts +0 -5
- package/build/components/Spinners/SquircleSpinner/styles.d.ts +0 -4
- package/build/components/Spinners/TokenLogoSpinner/index.d.ts +0 -5
- package/build/components/Spinners/TokenLogoSpinner/styles.d.ts +0 -1
- package/build/components/Spinners/WalletPaymentSpinner/index.d.ts +0 -5
- package/build/components/Spinners/styles.d.ts +0 -2
- package/build/constants/defaultTheme.d.ts +0 -4
- package/build/constants/routes.d.ts +0 -28
- package/build/defaultConfig.d.ts +0 -17
- package/build/defaultConnectors.d.ts +0 -14
- package/build/hooks/useChainIsSupported.d.ts +0 -2
- package/build/hooks/useChains.d.ts +0 -3
- package/build/hooks/useConnect.d.ts +0 -110
- package/build/hooks/useConnectCallback.d.ts +0 -8
- package/build/hooks/useConnectors.d.ts +0 -3
- package/build/hooks/useDaimoPay.d.ts +0 -94
- package/build/hooks/useDaimoPayStatus.d.ts +0 -15
- package/build/hooks/useDaimoPayUI.d.ts +0 -6
- package/build/hooks/useDepositAddressOptions.d.ts +0 -10
- package/build/hooks/useEnsFallbackConfig.d.ts +0 -2
- package/build/hooks/useExternalPaymentOptions.d.ts +0 -12
- package/build/hooks/useFitText.d.ts +0 -14
- package/build/hooks/useFocusTrap.d.ts +0 -1
- package/build/hooks/useGoogleFont.d.ts +0 -3
- package/build/hooks/useIsMobile.d.ts +0 -5
- package/build/hooks/useIsMounted.d.ts +0 -3
- package/build/hooks/useLastConnector.d.ts +0 -4
- package/build/hooks/useLocalStorage.d.ts +0 -7
- package/build/hooks/useLocales.d.ts +0 -2
- package/build/hooks/useLockBodyScroll.d.ts +0 -1
- package/build/hooks/useModal.d.ts +0 -8
- package/build/hooks/useOrderUsdLimits.d.ts +0 -7
- package/build/hooks/usePayContext.d.ts +0 -2
- package/build/hooks/usePaymentState.d.ts +0 -67
- package/build/hooks/usePrevious.d.ts +0 -1
- package/build/hooks/useSolanaPaymentOptions.d.ts +0 -13
- package/build/hooks/useTokenOptions.d.ts +0 -5
- package/build/hooks/useUntronAvailability.d.ts +0 -14
- package/build/hooks/useWalletPaymentOptions.d.ts +0 -31
- package/build/hooks/useWindowSize.d.ts +0 -4
- package/build/localizations/index.d.ts +0 -2
- package/build/localizations/locales/ar-AE.d.ts +0 -3
- package/build/localizations/locales/ca-AD.d.ts +0 -3
- package/build/localizations/locales/ee-EE.d.ts +0 -3
- package/build/localizations/locales/en-US.d.ts +0 -128
- package/build/localizations/locales/es-ES.d.ts +0 -3
- package/build/localizations/locales/fa-IR.d.ts +0 -3
- package/build/localizations/locales/fr-FR.d.ts +0 -3
- package/build/localizations/locales/index.d.ts +0 -3
- package/build/localizations/locales/ja-JP.d.ts +0 -91
- package/build/localizations/locales/pt-BR.d.ts +0 -3
- package/build/localizations/locales/ru-RU.d.ts +0 -3
- package/build/localizations/locales/tr-TR.d.ts +0 -3
- package/build/localizations/locales/vi-VN.d.ts +0 -3
- package/build/localizations/locales/zh-CN.d.ts +0 -3
- package/build/payment/paymentEffects.d.ts +0 -12
- package/build/payment/paymentFsm.d.ts +0 -131
- package/build/payment/paymentStore.d.ts +0 -14
- package/build/payment/paymentUtils.d.ts +0 -6
- package/build/provider/DaimoPayProvider.d.ts +0 -24
- package/build/provider/PayContext.d.ts +0 -66
- package/build/provider/PaymentProvider.d.ts +0 -8
- package/build/provider/SolanaContextProvider.d.ts +0 -6
- package/build/provider/Web3ContextProvider.d.ts +0 -24
- package/build/stateStore.d.ts +0 -66
- package/build/styles/defaultTheme.d.ts +0 -3
- package/build/styles/index.d.ts +0 -1
- package/build/styles/styled/index.d.ts +0 -12
- package/build/styles/themes/base.d.ts +0 -129
- package/build/styles/themes/index.d.ts +0 -673
- package/build/styles/themes/midnight.d.ts +0 -74
- package/build/styles/themes/minimal.d.ts +0 -94
- package/build/styles/themes/nouns.d.ts +0 -79
- package/build/styles/themes/retro.d.ts +0 -89
- package/build/styles/themes/rounded.d.ts +0 -86
- package/build/styles/themes/soft.d.ts +0 -69
- package/build/styles/themes/web95.d.ts +0 -91
- package/build/styles/types.d.ts +0 -80
- package/build/types.d.ts +0 -46
- package/build/utils/exports.d.ts +0 -1
- package/build/utils/format.d.ts +0 -49
- package/build/utils/index.d.ts +0 -17
- package/build/utils/localstorage.d.ts +0 -9
- package/build/utils/p3.d.ts +0 -2
- package/build/utils/platform.d.ts +0 -2
- package/build/utils/polling.d.ts +0 -13
- package/build/utils/supportUrl.d.ts +0 -2
- package/build/utils/trpc.d.ts +0 -4
- package/build/utils/validateInput.d.ts +0 -16
- package/build/utils/wallets.d.ts +0 -24
- package/build/wallets/index.d.ts +0 -5
- package/build/wallets/useWallets.d.ts +0 -16
- package/build/wallets/walletConfigs.d.ts +0 -29
- package/build/world-mini-app/WorldPayButton.d.ts +0 -84
- package/build/world-mini-app/promptWorldPayment.d.ts +0 -9
package/build/index.d.ts
CHANGED
|
@@ -123,14 +123,14 @@ type PayButtonPaymentProps = {
|
|
|
123
123
|
* token, it is sent directly to `toAddress` with no swapping or bridging.
|
|
124
124
|
*/
|
|
125
125
|
passthroughTokens?: PassthroughToken[];
|
|
126
|
+
/** Only show one payment option to the user. */
|
|
127
|
+
uniquePaymentOption?: UniquePaymentOptionsString;
|
|
126
128
|
} | {
|
|
127
129
|
/** The payment ID, generated via the Daimo Pay API. Replaces params above. */
|
|
128
130
|
payId: string;
|
|
129
131
|
/** Payment options. By default, all are enabled. */
|
|
130
132
|
paymentOptions?: ExternalPaymentOptionsString[];
|
|
131
|
-
/**
|
|
132
|
-
* The page to start on.
|
|
133
|
-
*/
|
|
133
|
+
/** Only show one payment option to the user. */
|
|
134
134
|
uniquePaymentOption?: UniquePaymentOptionsString;
|
|
135
135
|
};
|
|
136
136
|
/**
|
|
@@ -238,6 +238,8 @@ interface PayParams {
|
|
|
238
238
|
chain: number;
|
|
239
239
|
address: Address;
|
|
240
240
|
}[];
|
|
241
|
+
/** Only show one payment option to the user. */
|
|
242
|
+
uniquePaymentOption?: UniquePaymentOptionsString;
|
|
241
243
|
}
|
|
242
244
|
type PaymentState$1 = {
|
|
243
245
|
type: "idle";
|
package/build/package.json.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
var name = "@daimo/pay";
|
|
2
|
-
var version = "1.16.
|
|
2
|
+
var version = "1.16.2-dev";
|
|
3
3
|
var author = "Daimo";
|
|
4
4
|
var homepage = "https://pay.daimo.com";
|
|
5
5
|
var license = "BSD-2-Clause license";
|
|
@@ -31,7 +31,7 @@ var scripts = {
|
|
|
31
31
|
lint: "eslint 'src/**/*.{js,jsx,ts,tsx}' --max-warnings=0"
|
|
32
32
|
};
|
|
33
33
|
var dependencies = {
|
|
34
|
-
"@daimo/pay-common": "1.16.
|
|
34
|
+
"@daimo/pay-common": "1.16.2-dev",
|
|
35
35
|
"@solana/wallet-adapter-base": "^0.9.23",
|
|
36
36
|
"@solana/wallet-adapter-react": "^0.15.35",
|
|
37
37
|
"@solana/web3.js": "^1.95.4",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { ExternalPaymentOptions } from '@daimo/pay-common';
|
|
3
|
-
import {
|
|
3
|
+
import { useWallet } from '@solana/wallet-adapter-react';
|
|
4
|
+
import { useAccount, useDisconnect } from 'wagmi';
|
|
4
5
|
import { Phantom, MetaMask, Rainbow, Rabby } from '../../../assets/logos.js';
|
|
5
6
|
import { ROUTES } from '../../../constants/routes.js';
|
|
6
7
|
import useLocales from '../../../hooks/useLocales.js';
|
|
@@ -17,9 +18,12 @@ function SelectAnotherMethodButton() {
|
|
|
17
18
|
const { paymentState, setRoute } = usePayContext();
|
|
18
19
|
const { externalPaymentOptions } = paymentState;
|
|
19
20
|
const { connector } = useAccount();
|
|
21
|
+
const { disconnectAsync } = useDisconnect();
|
|
22
|
+
const { disconnect: disconnectSolana } = useWallet();
|
|
20
23
|
const allPaymentOptions = Array.from(
|
|
21
24
|
externalPaymentOptions.options.values()
|
|
22
25
|
).flat();
|
|
26
|
+
const uniquePaymentOption = paymentState.buttonProps?.uniquePaymentOption;
|
|
23
27
|
const createIconDiv = (content, key) => /* @__PURE__ */ jsx("div", { style: { borderRadius: "22.5%", overflow: "hidden" }, children: content }, key);
|
|
24
28
|
const getWalletIcons = (connector2) => {
|
|
25
29
|
const connectorId = connector2?.id.toLowerCase();
|
|
@@ -70,12 +74,20 @@ function SelectAnotherMethodButton() {
|
|
|
70
74
|
id: "select-wallet",
|
|
71
75
|
title: locales.payWithAnotherWallet,
|
|
72
76
|
icons: getWalletIcons(connector),
|
|
73
|
-
onClick: () =>
|
|
77
|
+
onClick: async () => {
|
|
78
|
+
await disconnectAsync();
|
|
79
|
+
await disconnectSolana();
|
|
80
|
+
setRoute(ROUTES.CONNECTORS);
|
|
81
|
+
}
|
|
74
82
|
};
|
|
75
83
|
return /* @__PURE__ */ jsx(OptionsContainer, { children: /* @__PURE__ */ jsx(
|
|
76
84
|
OptionsList,
|
|
77
85
|
{
|
|
78
|
-
options:
|
|
86
|
+
options: (
|
|
87
|
+
// If there are non-wallet payment options, show the full select
|
|
88
|
+
// method menu. Otherwise, show the wallet menu.
|
|
89
|
+
allPaymentOptions.length > 0 && uniquePaymentOption !== "Wallets" ? [selectMethodOption] : [selectWalletOption]
|
|
90
|
+
)
|
|
79
91
|
}
|
|
80
92
|
) });
|
|
81
93
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../src/components/Common/SelectAnotherMethodButton/index.tsx"],"sourcesContent":["import { ExternalPaymentOptions } from \"@daimo/pay-common\";\nimport { Connector, useAccount } from \"wagmi\";\nimport { MetaMask, Phantom, Rabby, Rainbow } from \"../../../assets/logos\";\nimport { ROUTES } from \"../../../constants/routes\";\nimport useLocales from \"../../../hooks/useLocales\";\nimport { usePayContext } from \"../../../hooks/usePayContext\";\nimport styled from \"../../../styles/styled\";\nimport { OptionsList } from \"../OptionsList\";\n\nconst OptionsContainer = styled.div`\n width: 100%;\n margin-top: 1rem;\n`;\n\nexport default function SelectAnotherMethodButton() {\n const locales = useLocales();\n const { paymentState, setRoute } = usePayContext();\n const { externalPaymentOptions } = paymentState;\n const { connector } = useAccount();\n const allPaymentOptions = Array.from(\n externalPaymentOptions.options.values(),\n ).flat();\n\n const createIconDiv = (content: React.ReactNode, key: string) => (\n <div key={key} style={{ borderRadius: \"22.5%\", overflow: \"hidden\" }}>\n {content}\n </div>\n );\n\n const getWalletIcons = (connector: Connector | undefined) => {\n const connectorId = connector?.id.toLowerCase();\n const walletTypes = [\n { component: <MetaMask />, id: \"metamask\" },\n { component: <Rainbow />, id: \"rainbow\" },\n { component: <Rabby />, id: \"rabby\" },\n ];\n\n const icons = walletTypes\n .filter(({ id }) => !connectorId?.includes(id))\n .map(({ component }) => component);\n\n if (icons.length < 3) icons.push(<Phantom />);\n return icons;\n };\n\n const getPaymentMethodIcons = () => {\n const icons: JSX.Element[] = [];\n\n // Add TRON USDT as first priority\n icons.push(\n createIconDiv(\n <img\n src=\"https://pay.daimo.com/chain-logos/tronusdt.svg\"\n alt=\"TRON USDT\"\n />,\n \"tron-usdt\",\n ),\n );\n\n // Add external payment options\n const externalIcons = allPaymentOptions\n .filter((option) => option.id !== ExternalPaymentOptions.Daimo)\n .slice(0, 1)\n .map((option) =>\n createIconDiv(\n typeof option.logoURI === \"string\" ? (\n <img src={option.logoURI} alt={option.id} />\n ) : (\n option.logoURI\n ),\n option.id,\n ),\n );\n\n icons.push(...externalIcons);\n\n // Fill remaining slots with wallet icons\n if (icons.length < 3) {\n const walletIcons = getWalletIcons(connector);\n const remainingSlots = 3 - icons.length;\n icons.push(...walletIcons.slice(0, remainingSlots));\n }\n\n return icons.slice(0, 3);\n };\n\n const selectMethodOption = {\n id: \"select-method\",\n title: locales.payWithAnotherMethod,\n icons: getPaymentMethodIcons(),\n onClick: () => setRoute(ROUTES.SELECT_METHOD),\n };\n\n const selectWalletOption = {\n id: \"select-wallet\",\n title: locales.payWithAnotherWallet,\n icons: getWalletIcons(connector),\n onClick: () => setRoute(ROUTES.
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/components/Common/SelectAnotherMethodButton/index.tsx"],"sourcesContent":["import { ExternalPaymentOptions } from \"@daimo/pay-common\";\nimport { useWallet } from \"@solana/wallet-adapter-react\";\nimport { Connector, useAccount, useDisconnect } from \"wagmi\";\nimport { MetaMask, Phantom, Rabby, Rainbow } from \"../../../assets/logos\";\nimport { ROUTES } from \"../../../constants/routes\";\nimport useLocales from \"../../../hooks/useLocales\";\nimport { usePayContext } from \"../../../hooks/usePayContext\";\nimport styled from \"../../../styles/styled\";\nimport { OptionsList } from \"../OptionsList\";\n\nconst OptionsContainer = styled.div`\n width: 100%;\n margin-top: 1rem;\n`;\n\nexport default function SelectAnotherMethodButton() {\n const locales = useLocales();\n const { paymentState, setRoute } = usePayContext();\n const { externalPaymentOptions } = paymentState;\n const { connector } = useAccount();\n const { disconnectAsync } = useDisconnect();\n const { disconnect: disconnectSolana } = useWallet();\n\n const allPaymentOptions = Array.from(\n externalPaymentOptions.options.values(),\n ).flat();\n const uniquePaymentOption = paymentState.buttonProps?.uniquePaymentOption;\n\n const createIconDiv = (content: React.ReactNode, key: string) => (\n <div key={key} style={{ borderRadius: \"22.5%\", overflow: \"hidden\" }}>\n {content}\n </div>\n );\n\n const getWalletIcons = (connector: Connector | undefined) => {\n const connectorId = connector?.id.toLowerCase();\n const walletTypes = [\n { component: <MetaMask />, id: \"metamask\" },\n { component: <Rainbow />, id: \"rainbow\" },\n { component: <Rabby />, id: \"rabby\" },\n ];\n\n const icons = walletTypes\n .filter(({ id }) => !connectorId?.includes(id))\n .map(({ component }) => component);\n\n if (icons.length < 3) icons.push(<Phantom />);\n return icons;\n };\n\n const getPaymentMethodIcons = () => {\n const icons: JSX.Element[] = [];\n\n // Add TRON USDT as first priority\n icons.push(\n createIconDiv(\n <img\n src=\"https://pay.daimo.com/chain-logos/tronusdt.svg\"\n alt=\"TRON USDT\"\n />,\n \"tron-usdt\",\n ),\n );\n\n // Add external payment options\n const externalIcons = allPaymentOptions\n .filter((option) => option.id !== ExternalPaymentOptions.Daimo)\n .slice(0, 1)\n .map((option) =>\n createIconDiv(\n typeof option.logoURI === \"string\" ? (\n <img src={option.logoURI} alt={option.id} />\n ) : (\n option.logoURI\n ),\n option.id,\n ),\n );\n\n icons.push(...externalIcons);\n\n // Fill remaining slots with wallet icons\n if (icons.length < 3) {\n const walletIcons = getWalletIcons(connector);\n const remainingSlots = 3 - icons.length;\n icons.push(...walletIcons.slice(0, remainingSlots));\n }\n\n return icons.slice(0, 3);\n };\n\n const selectMethodOption = {\n id: \"select-method\",\n title: locales.payWithAnotherMethod,\n icons: getPaymentMethodIcons(),\n onClick: () => setRoute(ROUTES.SELECT_METHOD),\n };\n\n const selectWalletOption = {\n id: \"select-wallet\",\n title: locales.payWithAnotherWallet,\n icons: getWalletIcons(connector),\n onClick: async () => {\n await disconnectAsync();\n await disconnectSolana();\n setRoute(ROUTES.CONNECTORS);\n },\n };\n\n return (\n <OptionsContainer>\n <OptionsList\n options={\n // If there are non-wallet payment options, show the full select\n // method menu. Otherwise, show the wallet menu.\n allPaymentOptions.length > 0 && uniquePaymentOption !== \"Wallets\"\n ? [selectMethodOption]\n : [selectWalletOption]\n }\n />\n </OptionsContainer>\n );\n}\n"],"names":["connector"],"mappings":"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"}
|
|
@@ -48,7 +48,8 @@ function DaimoPayButtonCustom(props) {
|
|
|
48
48
|
externalId: props.externalId,
|
|
49
49
|
metadata: props.metadata,
|
|
50
50
|
refundAddress: props.refundAddress,
|
|
51
|
-
passthroughTokens: props.passthroughTokens
|
|
51
|
+
passthroughTokens: props.passthroughTokens,
|
|
52
|
+
uniquePaymentOption: props.uniquePaymentOption
|
|
52
53
|
} : null;
|
|
53
54
|
let payId = "payId" in props ? props.payId : null;
|
|
54
55
|
const { paymentState } = context;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/DaimoPayButton/index.tsx"],"sourcesContent":["import { ReactElement, useCallback, useEffect, useRef } from \"react\";\n\nimport { usePayContext } from \"../../hooks/usePayContext\";\nimport { TextContainer } from \"./styles\";\n\nimport {\n assertNotNull,\n DaimoPayEventType,\n DaimoPayOrderView,\n DaimoPayUserMetadata,\n ExternalPaymentOptionsString,\n getDaimoPayOrderView,\n getOrderDestChainId,\n getOrderSourceChainId,\n PaymentBouncedEvent,\n PaymentCompletedEvent,\n PaymentStartedEvent,\n UniquePaymentOptionsString,\n writeDaimoPayOrderID,\n} from \"@daimo/pay-common\";\nimport { AnimatePresence, Variants } from \"framer-motion\";\nimport { Address, Hex } from \"viem\";\nimport { useDaimoPay } from \"../../hooks/useDaimoPay\";\nimport useLocales from \"../../hooks/useLocales\";\nimport { PayParams } from \"../../payment/paymentFsm\";\nimport { ResetContainer } from \"../../styles\";\nimport { CustomTheme, Mode, Theme } from \"../../types\";\nimport ThemedButton, { ThemeContainer } from \"../Common/ThemedButton\";\n\n/** Payment details and status. */\nexport type DaimoPayment = DaimoPayOrderView;\n\n/** Props for DaimoPayButton. */\nexport type PayButtonPaymentProps =\n | {\n /**\n * Your public app ID. Specify either (payId) or (appId + parameters).\n */\n appId: string;\n /**\n * Destination chain ID.\n */\n toChain: number;\n /**\n * The destination token to send, completing payment. Must be an ERC-20\n * token or the zero address, indicating the native token / ETH.\n */\n toToken: Address;\n /**\n * The amount of destination token to send (transfer or approve).\n * If not provided, the user will be prompted to enter an amount.\n */\n toUnits?: string;\n /**\n * The destination address to transfer to, or contract to call.\n */\n toAddress: Address;\n /**\n * Optional calldata to call an arbitrary function on `toAddress`.\n */\n toCallData?: Hex;\n /**\n * The intent verb, such as \"Pay\", \"Deposit\", or \"Purchase\".\n */\n intent?: string;\n /**\n * Payment options. By default, all are enabled.\n */\n paymentOptions?: ExternalPaymentOptionsString[];\n /**\n * Preferred chain IDs. Assets on these chains will appear first.\n */\n preferredChains?: number[];\n /**\n * Preferred tokens. These appear first in the token list.\n */\n preferredTokens?: { chain: number; address: Address }[];\n /**\n * Only allow payments on these EVM chains.\n */\n evmChains?: number[];\n /**\n * External ID. E.g. a correlation ID.\n */\n externalId?: string;\n /**\n * Developer metadata. E.g. correlation ID.\n * */\n metadata?: DaimoPayUserMetadata;\n /**\n * The address to refund to if the payment bounces.\n */\n refundAddress?: Address;\n /**\n * Pass-through tokens. If the user pays via a pass-through\n * token, it is sent directly to `toAddress` with no swapping or bridging.\n */\n passthroughTokens?: PassthroughToken[];\n }\n | {\n /** The payment ID, generated via the Daimo Pay API. Replaces params above. */\n payId: string;\n /** Payment options. By default, all are enabled. */\n paymentOptions?: ExternalPaymentOptionsString[];\n /**\n * The page to start on.\n */\n uniquePaymentOption?: UniquePaymentOptionsString;\n };\n\n/**\n * Represents a pass-through token. If the user pays via a pass-through\n * token, it is sent directly to `toAddress` with no swapping or bridging.\n */\ntype PassthroughToken = {\n chain: number;\n address: Address;\n};\n\ntype PayButtonCommonProps = PayButtonPaymentProps & {\n /** Called when user sends payment and transaction is seen on chain */\n onPaymentStarted?: (event: PaymentStartedEvent) => void;\n /** Called when destination transfer or call completes successfully */\n onPaymentCompleted?: (event: PaymentCompletedEvent) => void;\n /** Called when destination call reverts and funds are refunded */\n onPaymentBounced?: (event: PaymentBouncedEvent) => void;\n /** Called when the modal is opened. */\n onOpen?: () => void;\n /** Called when the modal is closed. */\n onClose?: () => void;\n /** Open the modal by default. */\n defaultOpen?: boolean;\n /** Automatically close the modal after a successful payment. */\n closeOnSuccess?: boolean;\n /** Reset the payment after a successful payment. */\n resetOnSuccess?: boolean;\n /** Go directly to tokens in already-connected Ethereum and Solana wallet(s).\n * Don't let the user pick any other payment method. Used in embedded flows.*/\n connectedWalletOnly?: boolean;\n /** Custom message to display on confirmation page. */\n confirmationMessage?: string;\n /** Redirect URL to return to the app. E.g. after Coinbase, Binance, RampNetwork. */\n redirectReturnUrl?: string;\n};\n\nexport type DaimoPayButtonProps = PayButtonCommonProps & {\n /** Light mode, dark mode, or auto. */\n mode?: Mode;\n /** Named theme. See docs for options. */\n theme?: Theme;\n /** Custom theme. See docs for options. */\n customTheme?: CustomTheme;\n /** Disable interaction. */\n disabled?: boolean;\n};\n\nexport type DaimoPayButtonCustomProps = PayButtonCommonProps & {\n /** Custom renderer */\n children: (renderProps: {\n show: () => void;\n hide: () => void;\n }) => ReactElement;\n};\n\n/**\n * A button that shows the Daimo Pay checkout. Replaces the traditional\n * Connect Wallet » approve » execute sequence with a single action.\n */\nexport function DaimoPayButton(props: DaimoPayButtonProps): JSX.Element {\n const { theme, mode, customTheme } = props;\n const context = usePayContext();\n\n return (\n <DaimoPayButtonCustom {...props}>\n {({ show }) => (\n <ResetContainer\n $useTheme={theme ?? context.theme}\n $useMode={mode ?? context.mode}\n $customTheme={customTheme ?? context.customTheme}\n >\n <ThemeContainer onClick={props.disabled ? undefined : show}>\n <ThemedButton\n theme={theme ?? context.theme}\n mode={mode ?? context.mode}\n customTheme={customTheme ?? context.customTheme}\n >\n <DaimoPayButtonInner />\n </ThemedButton>\n </ThemeContainer>\n </ResetContainer>\n )}\n </DaimoPayButtonCustom>\n );\n}\n\n/** Like DaimoPayButton, but with custom styling. */\nfunction DaimoPayButtonCustom(props: DaimoPayButtonCustomProps): JSX.Element {\n const context = usePayContext();\n\n // Pre-load payment info in background.\n // Reload when any of the info changes.\n let payParams: PayParams | null =\n \"appId\" in props\n ? {\n appId: props.appId,\n toChain: props.toChain,\n toAddress: props.toAddress,\n toToken: props.toToken,\n toUnits: props.toUnits,\n toCallData: props.toCallData,\n intent: props.intent,\n paymentOptions: props.paymentOptions,\n preferredChains: props.preferredChains,\n preferredTokens: props.preferredTokens,\n evmChains: props.evmChains,\n externalId: props.externalId,\n metadata: props.metadata,\n refundAddress: props.refundAddress,\n passthroughTokens: props.passthroughTokens,\n }\n : null;\n let payId = \"payId\" in props ? props.payId : null;\n\n const { paymentState } = context;\n const { order, paymentState: payState } = useDaimoPay();\n\n // Set the payId or payParams\n useEffect(() => {\n if (payId != null) {\n paymentState.setPayId(payId);\n } else if (payParams != null) {\n paymentState.setPayParams(payParams);\n }\n paymentState.setButtonProps(props);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [payId, JSON.stringify(payParams || {})]);\n\n // Set the confirmation message\n const { setConfirmationMessage } = context;\n useEffect(() => {\n if (props.confirmationMessage) {\n setConfirmationMessage(props.confirmationMessage);\n }\n }, [props.confirmationMessage, setConfirmationMessage]);\n\n // Set the redirect return url\n const { setRedirectReturnUrl } = context;\n useEffect(() => {\n if (props.redirectReturnUrl) {\n setRedirectReturnUrl(props.redirectReturnUrl);\n }\n }, [props.redirectReturnUrl, setRedirectReturnUrl]);\n\n // Set the onOpen and onClose callbacks\n const { setOnOpen, setOnClose } = context;\n useEffect(() => {\n setOnOpen(props.onOpen);\n return () => setOnOpen(undefined);\n }, [props.onOpen, setOnOpen]);\n\n useEffect(() => {\n setOnClose(props.onClose);\n return () => setOnClose(undefined);\n }, [props.onClose, setOnClose]);\n\n // Payment events: call these three event handlers.\n const { onPaymentStarted, onPaymentCompleted, onPaymentBounced } = props;\n\n // Functions to show and hide the modal\n const { children, closeOnSuccess, resetOnSuccess, connectedWalletOnly } =\n props;\n const show = useCallback(() => {\n const modalOptions = {\n closeOnSuccess,\n resetOnSuccess,\n connectedWalletOnly,\n };\n context.showPayment(modalOptions);\n }, [connectedWalletOnly, closeOnSuccess, resetOnSuccess, context]);\n const hide = useCallback(() => context.setOpen(false), [context]);\n\n // Emit onPaymentStart handler when payment state changes to payment_started\n const sentStart = useRef(false);\n useEffect(() => {\n if (sentStart.current) return;\n if (payState !== \"payment_started\") return;\n\n // TODO: Populate source payment details immediately when the user pays.\n // Use this hack because source chain id is not immediately populated when\n // payment_started\n const sourceChainId = getOrderSourceChainId(order);\n if (sourceChainId == null) return;\n\n sentStart.current = true;\n onPaymentStarted?.({\n type: DaimoPayEventType.PaymentStarted,\n paymentId: writeDaimoPayOrderID(order.id),\n chainId: sourceChainId,\n txHash: order.sourceInitiateTxHash,\n payment: getDaimoPayOrderView(order),\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [order, payState]);\n\n // Emit onPaymentComplete or onPaymentBounced handler when payment state\n // changes to payment_completed or payment_bounced\n const sentComplete = useRef(false);\n useEffect(() => {\n if (sentComplete.current) return;\n if (payState !== \"payment_completed\" && payState !== \"payment_bounced\")\n return;\n\n sentComplete.current = true;\n const eventType =\n payState === \"payment_completed\"\n ? DaimoPayEventType.PaymentCompleted\n : DaimoPayEventType.PaymentBounced;\n const passthroughTxHash =\n order.passedToAddress == null ? undefined : order.sourceInitiateTxHash;\n const event = {\n type: eventType,\n paymentId: writeDaimoPayOrderID(order.id),\n chainId: getOrderDestChainId(order),\n txHash: assertNotNull(\n order.destFastFinishTxHash ??\n order.destClaimTxHash ??\n passthroughTxHash,\n `[PAY BUTTON] dest tx hash null on order ${order.id} when intent status is ${order.intentStatus}`,\n ),\n payment: getDaimoPayOrderView(order),\n };\n\n if (payState === \"payment_completed\") {\n onPaymentCompleted?.(event as PaymentCompletedEvent);\n } else if (payState === \"payment_bounced\") {\n onPaymentBounced?.(event as PaymentBouncedEvent);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [order, payState]);\n\n // Open the modal by default if the defaultOpen prop is true\n const hasAutoOpened = useRef(false);\n useEffect(() => {\n if (!props.defaultOpen || hasAutoOpened.current) return;\n if (order == null) return;\n show();\n hasAutoOpened.current = true;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [order, props.defaultOpen, hasAutoOpened.current]);\n\n // Validation\n if ((payId == null) == (payParams == null)) {\n throw new Error(\"Must specify either payId or appId, not both\");\n }\n\n return children({ show, hide });\n}\n\nDaimoPayButtonCustom.displayName = \"DaimoPayButton.Custom\";\n\nDaimoPayButton.Custom = DaimoPayButtonCustom;\n\nconst contentVariants: Variants = {\n initial: {\n zIndex: 2,\n opacity: 0,\n x: \"-100%\",\n },\n animate: {\n opacity: 1,\n x: 0.1,\n transition: {\n duration: 0.4,\n ease: [0.25, 1, 0.5, 1],\n },\n },\n exit: {\n zIndex: 1,\n opacity: 0,\n x: \"-100%\",\n pointerEvents: \"none\",\n position: \"absolute\",\n transition: {\n duration: 0.4,\n ease: [0.25, 1, 0.5, 1],\n },\n },\n};\n\nexport function DaimoPayButtonInner() {\n const { order } = useDaimoPay();\n const locales = useLocales();\n const defaultLabel = locales.payButton_defaultLabel;\n const label = order?.metadata?.intent ?? defaultLabel;\n\n return (\n <AnimatePresence initial={false}>\n <TextContainer\n initial={\"initial\"}\n animate={\"animate\"}\n exit={\"exit\"}\n variants={contentVariants}\n style={{\n height: 40,\n }}\n >\n {label}\n </TextContainer>\n </AnimatePresence>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/DaimoPayButton/index.tsx"],"sourcesContent":["import { ReactElement, useCallback, useEffect, useRef } from \"react\";\n\nimport { usePayContext } from \"../../hooks/usePayContext\";\nimport { TextContainer } from \"./styles\";\n\nimport {\n assertNotNull,\n DaimoPayEventType,\n DaimoPayOrderView,\n DaimoPayUserMetadata,\n ExternalPaymentOptionsString,\n getDaimoPayOrderView,\n getOrderDestChainId,\n getOrderSourceChainId,\n PaymentBouncedEvent,\n PaymentCompletedEvent,\n PaymentStartedEvent,\n UniquePaymentOptionsString,\n writeDaimoPayOrderID,\n} from \"@daimo/pay-common\";\nimport { AnimatePresence, Variants } from \"framer-motion\";\nimport { Address, Hex } from \"viem\";\nimport { useDaimoPay } from \"../../hooks/useDaimoPay\";\nimport useLocales from \"../../hooks/useLocales\";\nimport { PayParams } from \"../../payment/paymentFsm\";\nimport { ResetContainer } from \"../../styles\";\nimport { CustomTheme, Mode, Theme } from \"../../types\";\nimport ThemedButton, { ThemeContainer } from \"../Common/ThemedButton\";\n\n/** Payment details and status. */\nexport type DaimoPayment = DaimoPayOrderView;\n\n/** Props for DaimoPayButton. */\nexport type PayButtonPaymentProps =\n | {\n /**\n * Your public app ID. Specify either (payId) or (appId + parameters).\n */\n appId: string;\n /**\n * Destination chain ID.\n */\n toChain: number;\n /**\n * The destination token to send, completing payment. Must be an ERC-20\n * token or the zero address, indicating the native token / ETH.\n */\n toToken: Address;\n /**\n * The amount of destination token to send (transfer or approve).\n * If not provided, the user will be prompted to enter an amount.\n */\n toUnits?: string;\n /**\n * The destination address to transfer to, or contract to call.\n */\n toAddress: Address;\n /**\n * Optional calldata to call an arbitrary function on `toAddress`.\n */\n toCallData?: Hex;\n /**\n * The intent verb, such as \"Pay\", \"Deposit\", or \"Purchase\".\n */\n intent?: string;\n /**\n * Payment options. By default, all are enabled.\n */\n paymentOptions?: ExternalPaymentOptionsString[];\n /**\n * Preferred chain IDs. Assets on these chains will appear first.\n */\n preferredChains?: number[];\n /**\n * Preferred tokens. These appear first in the token list.\n */\n preferredTokens?: { chain: number; address: Address }[];\n /**\n * Only allow payments on these EVM chains.\n */\n evmChains?: number[];\n /**\n * External ID. E.g. a correlation ID.\n */\n externalId?: string;\n /**\n * Developer metadata. E.g. correlation ID.\n * */\n metadata?: DaimoPayUserMetadata;\n /**\n * The address to refund to if the payment bounces.\n */\n refundAddress?: Address;\n /**\n * Pass-through tokens. If the user pays via a pass-through\n * token, it is sent directly to `toAddress` with no swapping or bridging.\n */\n passthroughTokens?: PassthroughToken[];\n /** Only show one payment option to the user. */\n uniquePaymentOption?: UniquePaymentOptionsString;\n }\n | {\n /** The payment ID, generated via the Daimo Pay API. Replaces params above. */\n payId: string;\n /** Payment options. By default, all are enabled. */\n paymentOptions?: ExternalPaymentOptionsString[];\n /** Only show one payment option to the user. */\n uniquePaymentOption?: UniquePaymentOptionsString;\n };\n\n/**\n * Represents a pass-through token. If the user pays via a pass-through\n * token, it is sent directly to `toAddress` with no swapping or bridging.\n */\ntype PassthroughToken = {\n chain: number;\n address: Address;\n};\n\ntype PayButtonCommonProps = PayButtonPaymentProps & {\n /** Called when user sends payment and transaction is seen on chain */\n onPaymentStarted?: (event: PaymentStartedEvent) => void;\n /** Called when destination transfer or call completes successfully */\n onPaymentCompleted?: (event: PaymentCompletedEvent) => void;\n /** Called when destination call reverts and funds are refunded */\n onPaymentBounced?: (event: PaymentBouncedEvent) => void;\n /** Called when the modal is opened. */\n onOpen?: () => void;\n /** Called when the modal is closed. */\n onClose?: () => void;\n /** Open the modal by default. */\n defaultOpen?: boolean;\n /** Automatically close the modal after a successful payment. */\n closeOnSuccess?: boolean;\n /** Reset the payment after a successful payment. */\n resetOnSuccess?: boolean;\n /** Go directly to tokens in already-connected Ethereum and Solana wallet(s).\n * Don't let the user pick any other payment method. Used in embedded flows.*/\n connectedWalletOnly?: boolean;\n /** Custom message to display on confirmation page. */\n confirmationMessage?: string;\n /** Redirect URL to return to the app. E.g. after Coinbase, Binance, RampNetwork. */\n redirectReturnUrl?: string;\n};\n\nexport type DaimoPayButtonProps = PayButtonCommonProps & {\n /** Light mode, dark mode, or auto. */\n mode?: Mode;\n /** Named theme. See docs for options. */\n theme?: Theme;\n /** Custom theme. See docs for options. */\n customTheme?: CustomTheme;\n /** Disable interaction. */\n disabled?: boolean;\n};\n\nexport type DaimoPayButtonCustomProps = PayButtonCommonProps & {\n /** Custom renderer */\n children: (renderProps: {\n show: () => void;\n hide: () => void;\n }) => ReactElement;\n};\n\n/**\n * A button that shows the Daimo Pay checkout. Replaces the traditional\n * Connect Wallet » approve » execute sequence with a single action.\n */\nexport function DaimoPayButton(props: DaimoPayButtonProps): JSX.Element {\n const { theme, mode, customTheme } = props;\n const context = usePayContext();\n\n return (\n <DaimoPayButtonCustom {...props}>\n {({ show }) => (\n <ResetContainer\n $useTheme={theme ?? context.theme}\n $useMode={mode ?? context.mode}\n $customTheme={customTheme ?? context.customTheme}\n >\n <ThemeContainer onClick={props.disabled ? undefined : show}>\n <ThemedButton\n theme={theme ?? context.theme}\n mode={mode ?? context.mode}\n customTheme={customTheme ?? context.customTheme}\n >\n <DaimoPayButtonInner />\n </ThemedButton>\n </ThemeContainer>\n </ResetContainer>\n )}\n </DaimoPayButtonCustom>\n );\n}\n\n/** Like DaimoPayButton, but with custom styling. */\nfunction DaimoPayButtonCustom(props: DaimoPayButtonCustomProps): JSX.Element {\n const context = usePayContext();\n\n // Pre-load payment info in background.\n // Reload when any of the info changes.\n let payParams: PayParams | null =\n \"appId\" in props\n ? {\n appId: props.appId,\n toChain: props.toChain,\n toAddress: props.toAddress,\n toToken: props.toToken,\n toUnits: props.toUnits,\n toCallData: props.toCallData,\n intent: props.intent,\n paymentOptions: props.paymentOptions,\n preferredChains: props.preferredChains,\n preferredTokens: props.preferredTokens,\n evmChains: props.evmChains,\n externalId: props.externalId,\n metadata: props.metadata,\n refundAddress: props.refundAddress,\n passthroughTokens: props.passthroughTokens,\n uniquePaymentOption: props.uniquePaymentOption,\n }\n : null;\n let payId = \"payId\" in props ? props.payId : null;\n\n const { paymentState } = context;\n const { order, paymentState: payState } = useDaimoPay();\n\n // Set the payId or payParams\n useEffect(() => {\n if (payId != null) {\n paymentState.setPayId(payId);\n } else if (payParams != null) {\n paymentState.setPayParams(payParams);\n }\n paymentState.setButtonProps(props);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [payId, JSON.stringify(payParams || {})]);\n\n // Set the confirmation message\n const { setConfirmationMessage } = context;\n useEffect(() => {\n if (props.confirmationMessage) {\n setConfirmationMessage(props.confirmationMessage);\n }\n }, [props.confirmationMessage, setConfirmationMessage]);\n\n // Set the redirect return url\n const { setRedirectReturnUrl } = context;\n useEffect(() => {\n if (props.redirectReturnUrl) {\n setRedirectReturnUrl(props.redirectReturnUrl);\n }\n }, [props.redirectReturnUrl, setRedirectReturnUrl]);\n\n // Set the onOpen and onClose callbacks\n const { setOnOpen, setOnClose } = context;\n useEffect(() => {\n setOnOpen(props.onOpen);\n return () => setOnOpen(undefined);\n }, [props.onOpen, setOnOpen]);\n\n useEffect(() => {\n setOnClose(props.onClose);\n return () => setOnClose(undefined);\n }, [props.onClose, setOnClose]);\n\n // Payment events: call these three event handlers.\n const { onPaymentStarted, onPaymentCompleted, onPaymentBounced } = props;\n\n // Functions to show and hide the modal\n const { children, closeOnSuccess, resetOnSuccess, connectedWalletOnly } =\n props;\n const show = useCallback(() => {\n const modalOptions = {\n closeOnSuccess,\n resetOnSuccess,\n connectedWalletOnly,\n };\n context.showPayment(modalOptions);\n }, [connectedWalletOnly, closeOnSuccess, resetOnSuccess, context]);\n const hide = useCallback(() => context.setOpen(false), [context]);\n\n // Emit onPaymentStart handler when payment state changes to payment_started\n const sentStart = useRef(false);\n useEffect(() => {\n if (sentStart.current) return;\n if (payState !== \"payment_started\") return;\n\n // TODO: Populate source payment details immediately when the user pays.\n // Use this hack because source chain id is not immediately populated when\n // payment_started\n const sourceChainId = getOrderSourceChainId(order);\n if (sourceChainId == null) return;\n\n sentStart.current = true;\n onPaymentStarted?.({\n type: DaimoPayEventType.PaymentStarted,\n paymentId: writeDaimoPayOrderID(order.id),\n chainId: sourceChainId,\n txHash: order.sourceInitiateTxHash,\n payment: getDaimoPayOrderView(order),\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [order, payState]);\n\n // Emit onPaymentComplete or onPaymentBounced handler when payment state\n // changes to payment_completed or payment_bounced\n const sentComplete = useRef(false);\n useEffect(() => {\n if (sentComplete.current) return;\n if (payState !== \"payment_completed\" && payState !== \"payment_bounced\")\n return;\n\n sentComplete.current = true;\n const eventType =\n payState === \"payment_completed\"\n ? DaimoPayEventType.PaymentCompleted\n : DaimoPayEventType.PaymentBounced;\n const passthroughTxHash =\n order.passedToAddress == null ? undefined : order.sourceInitiateTxHash;\n const event = {\n type: eventType,\n paymentId: writeDaimoPayOrderID(order.id),\n chainId: getOrderDestChainId(order),\n txHash: assertNotNull(\n order.destFastFinishTxHash ??\n order.destClaimTxHash ??\n passthroughTxHash,\n `[PAY BUTTON] dest tx hash null on order ${order.id} when intent status is ${order.intentStatus}`,\n ),\n payment: getDaimoPayOrderView(order),\n };\n\n if (payState === \"payment_completed\") {\n onPaymentCompleted?.(event as PaymentCompletedEvent);\n } else if (payState === \"payment_bounced\") {\n onPaymentBounced?.(event as PaymentBouncedEvent);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [order, payState]);\n\n // Open the modal by default if the defaultOpen prop is true\n const hasAutoOpened = useRef(false);\n useEffect(() => {\n if (!props.defaultOpen || hasAutoOpened.current) return;\n if (order == null) return;\n show();\n hasAutoOpened.current = true;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [order, props.defaultOpen, hasAutoOpened.current]);\n\n // Validation\n if ((payId == null) == (payParams == null)) {\n throw new Error(\"Must specify either payId or appId, not both\");\n }\n\n return children({ show, hide });\n}\n\nDaimoPayButtonCustom.displayName = \"DaimoPayButton.Custom\";\n\nDaimoPayButton.Custom = DaimoPayButtonCustom;\n\nconst contentVariants: Variants = {\n initial: {\n zIndex: 2,\n opacity: 0,\n x: \"-100%\",\n },\n animate: {\n opacity: 1,\n x: 0.1,\n transition: {\n duration: 0.4,\n ease: [0.25, 1, 0.5, 1],\n },\n },\n exit: {\n zIndex: 1,\n opacity: 0,\n x: \"-100%\",\n pointerEvents: \"none\",\n position: \"absolute\",\n transition: {\n duration: 0.4,\n ease: [0.25, 1, 0.5, 1],\n },\n },\n};\n\nexport function DaimoPayButtonInner() {\n const { order } = useDaimoPay();\n const locales = useLocales();\n const defaultLabel = locales.payButton_defaultLabel;\n const label = order?.metadata?.intent ?? defaultLabel;\n\n return (\n <AnimatePresence initial={false}>\n <TextContainer\n initial={\"initial\"}\n animate={\"animate\"}\n exit={\"exit\"}\n variants={contentVariants}\n style={{\n height: 40,\n }}\n >\n {label}\n </TextContainer>\n </AnimatePresence>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../src/components/Pages/SelectMethod/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { ROUTES } from \"../../../constants/routes\";\nimport { usePayContext } from \"../../../hooks/usePayContext\";\n\nimport { PageContent } from \"../../Common/Modal/styles\";\n\nimport { getAddressContraction } from \"@daimo/pay-common\";\nimport { useWallet } from \"@solana/wallet-adapter-react\";\nimport { Connector, useAccount, useDisconnect } from \"wagmi\";\nimport { Base, Ethereum, Solana, Tron } from \"../../../assets/chains\";\nimport {\n MetaMask,\n Phantom,\n Rabby,\n Rainbow,\n Trust,\n WalletIcon,\n} from \"../../../assets/logos\";\nimport useIsMobile from \"../../../hooks/useIsMobile\";\nimport useLocales from \"../../../hooks/useLocales\";\nimport { flattenChildren } from \"../../../utils\";\nimport { walletConfigs } from \"../../../wallets/walletConfigs\";\nimport { Option, OptionsList } from \"../../Common/OptionsList\";\nimport { OrderHeader } from \"../../Common/OrderHeader\";\nimport PoweredByFooter from \"../../Common/PoweredByFooter\";\nimport WalletChainLogo from \"../../Common/WalletChainLogo\";\n\nexport default function SelectMethod() {\n const locales = useLocales();\n const payWithString = flattenChildren(locales.payWith).join(\"\");\n const { isMobile, isIOS, isAndroid } = useIsMobile();\n\n const {\n address,\n chain,\n isConnected: isEthConnected,\n connector,\n } = useAccount();\n const {\n connected: isSolanaConnected,\n wallet: solanaWallet,\n wallets: solanaWallets,\n disconnect: disconnectSolana,\n publicKey,\n } = useWallet();\n const { setRoute, paymentState, log, disableMobileInjector } =\n usePayContext();\n const { showSolanaPaymentMethod } = paymentState;\n const { disconnectAsync } = useDisconnect();\n\n const { externalPaymentOptions, senderEnsName } = paymentState;\n\n // Decide whether to show the connected eth account, solana account, or both.\n // Desktop: Always show connected wallets when available\n // Mobile: Only show connected wallets when mobile injector is enabled (!disableMobileInjector)\n const showConnectedEth =\n isEthConnected && (!isMobile || !disableMobileInjector);\n const showConnectedSolana =\n isSolanaConnected && (!isMobile || !disableMobileInjector);\n\n const getConnectedWalletOptions = () => {\n const showChainLogo =\n isEthConnected && isSolanaConnected && showSolanaPaymentMethod;\n\n const connectedOptions: Option[] = [];\n\n if (showConnectedEth) {\n const ethWalletDisplayName =\n senderEnsName ?? (address ? getAddressContraction(address) : \"wallet\");\n\n // Prefer icon from walletConfigs if there's a name match, otherwise fall back\n // to the connector-provided icon, and finally to the generic WalletIcon.\n let walletIcon: JSX.Element;\n\n const matchedConfig = Object.values(walletConfigs).find((cfg) => {\n if (!cfg.name || !connector?.name) return false;\n const cfgName = cfg.name.toLowerCase();\n const connName = connector.name.toLowerCase();\n return cfgName.includes(connName) || connName.includes(cfgName);\n });\n\n if (matchedConfig?.icon) {\n walletIcon =\n typeof matchedConfig.icon === \"string\" ? (\n <img src={matchedConfig.icon} alt={matchedConfig.name} />\n ) : (\n (matchedConfig.icon as JSX.Element)\n );\n } else if (connector?.icon) {\n walletIcon = (\n <div style={{ borderRadius: \"22.5%\", overflow: \"hidden\" }}>\n <img src={connector.icon} alt={connector.name} />\n </div>\n );\n } else {\n walletIcon = <WalletIcon />;\n }\n\n const connectedEthWalletOption = {\n id: \"connectedWallet\",\n title: `${payWithString} ${ethWalletDisplayName}`,\n icons: [\n <WalletChainLogo\n key=\"eth\"\n walletIcon={walletIcon}\n walletName={connector?.name || \"Wallet\"}\n chainLogo={showChainLogo ? <Ethereum /> : null}\n />,\n ],\n onClick: () => {\n paymentState.setTokenMode(\"evm\");\n setRoute(ROUTES.SELECT_TOKEN, {\n event: \"click-wallet\",\n walletId: connector?.id,\n chainId: chain?.id,\n address: address,\n });\n },\n };\n connectedOptions.push(connectedEthWalletOption);\n }\n\n if (showConnectedSolana && showSolanaPaymentMethod) {\n const solWalletDisplayName = getAddressContraction(\n publicKey?.toBase58() ?? \"\",\n );\n\n // Prefer icon from walletConfigs if available\n let solWalletIcon: React.ReactNode;\n const solMatchedConfig = Object.values(walletConfigs).find((cfg) => {\n if (!cfg.name) return false;\n const cfgName = cfg.name.toLowerCase();\n const solName = solanaWallet?.adapter.name.toLowerCase() || \"\";\n return cfgName.includes(solName) || solName.includes(cfgName);\n });\n\n if (solMatchedConfig?.icon) {\n solWalletIcon =\n typeof solMatchedConfig.icon === \"string\" ? (\n <img src={solMatchedConfig.icon} alt={solMatchedConfig.name} />\n ) : (\n (solMatchedConfig.icon as JSX.Element)\n );\n } else if (solanaWallet?.adapter.icon) {\n solWalletIcon = solanaWallet.adapter.icon;\n } else {\n solWalletIcon = <Solana />;\n }\n\n const connectedSolWalletOption = {\n id: \"connectedSolanaWallet\",\n title: `${payWithString} ${solWalletDisplayName}`,\n icons: [\n <WalletChainLogo\n key=\"sol-wallet\"\n walletIcon={solWalletIcon}\n walletName={solanaWallet?.adapter.name || \"Wallet\"}\n chainLogo={showChainLogo && <Solana />}\n />,\n ],\n onClick: () => {\n paymentState.setTokenMode(\"solana\");\n setRoute(ROUTES.SELECT_TOKEN, {\n event: \"click-wallet\",\n walletId: solanaWallet?.adapter.name,\n chainId: \"solana\",\n address: publicKey?.toBase58(),\n });\n },\n };\n\n connectedOptions.push(connectedSolWalletOption);\n }\n\n return connectedOptions;\n };\n\n const connectedWalletOptions = getConnectedWalletOptions();\n const unconnectedWalletOption = {\n id: \"unconnectedWallet\",\n title:\n isEthConnected || isSolanaConnected\n ? locales.payWithAnotherWallet\n : locales.payWithWallet,\n icons: getBestUnconnectedWalletIcons(connector, isMobile),\n onClick: async () => {\n await disconnectAsync();\n await disconnectSolana();\n setRoute(ROUTES.CONNECTORS);\n },\n };\n\n const options: {\n id: string;\n title: string;\n subtitle?: string;\n icons: (React.ReactNode | string)[];\n onClick: () => void;\n disabled?: boolean;\n }[] = [];\n options.push(...connectedWalletOptions);\n options.push(unconnectedWalletOption);\n\n log(\n `[SELECT_METHOD] loading: ${externalPaymentOptions.loading}, options: ${JSON.stringify(\n externalPaymentOptions.options,\n )}`,\n );\n\n // Pay with Exchange\n const exchangeOptions = externalPaymentOptions.options.get(\"exchange\") ?? [];\n\n const showExchangePaymentMethod = exchangeOptions.length > 0;\n if (showExchangePaymentMethod) {\n options.push({\n id: \"exchange\",\n title: locales.payWithExchange,\n icons: exchangeOptions.slice(0, 3).map((option) => option.logoURI),\n onClick: () => {\n setRoute(ROUTES.SELECT_EXCHANGE, {\n event: \"click-option\",\n option: \"exchange\",\n });\n },\n });\n }\n\n const depositAddressOption = getDepositAddressOption(setRoute, locales);\n options.push(depositAddressOption);\n\n // ZKP2P is currently only available on desktop. Check if the user is on\n // desktop and if any ZKP2P options are available.\n const zkp2pOptions = externalPaymentOptions.options.get(\"zkp2p\") ?? [];\n const showZkp2pPaymentMethod = !isMobile && zkp2pOptions.length > 0;\n if (showZkp2pPaymentMethod) {\n options.push({\n id: \"ZKP2P\",\n title: locales.payViaPaymentApp,\n icons: zkp2pOptions.slice(0, 2).map((option) => option.logoURI),\n onClick: () => {\n setRoute(ROUTES.SELECT_ZKP2P);\n },\n });\n }\n\n // Order disabled to bottom\n options.sort((a, b) => (a.disabled ? 1 : 0) - (b.disabled ? 1 : 0));\n\n return (\n <PageContent>\n <OrderHeader />\n\n <OptionsList\n requiredSkeletons={isMobile ? 4 : 3} // TODO: programmatically determine skeletons to best avoid layout shifts\n isLoading={externalPaymentOptions.loading}\n options={externalPaymentOptions.loading ? [] : options}\n />\n <PoweredByFooter />\n </PageContent>\n );\n}\n\n// Get 3 icons, skipping the one that is already connected\nfunction getBestUnconnectedWalletIcons(\n connector: Connector | undefined,\n isMobile: boolean,\n) {\n const icons: JSX.Element[] = [];\n const strippedId = connector?.id.toLowerCase(); // some connector ids can have weird casing and or suffixes and prefixes\n const [isRainbow, isPhantom, isRabby, isMetaMask] = [\n strippedId?.includes(\"rainbow\"),\n strippedId?.includes(\"trust\"),\n strippedId?.includes(\"phantom\"),\n strippedId?.includes(\"coinbase\"),\n strippedId?.includes(\"metamask\"),\n strippedId?.includes(\"rabby\"),\n strippedId?.includes(\"metamask\"),\n ];\n\n if (isMobile) {\n icons.push(<MetaMask />);\n icons.push(<Trust background />);\n icons.push(<Rainbow />);\n } else {\n if (!isMetaMask) icons.push(<MetaMask />);\n if (!isRainbow) icons.push(<Rainbow />);\n if (!isPhantom) icons.push(<Phantom />);\n if (!isRabby && icons.length < 3) icons.push(<Rabby />);\n }\n\n return icons;\n}\n\nfunction getDepositAddressOption(\n setRoute: (route: ROUTES, data?: Record<string, any>) => void,\n locales: ReturnType<typeof useLocales>,\n) {\n return {\n id: \"depositAddress\",\n title: locales.payToAddress,\n icons: [<Ethereum key=\"eth\" />, <Tron key=\"tron\" />, <Base key=\"base\" />],\n onClick: () => {\n setRoute(ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN);\n },\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/components/Pages/SelectMethod/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { ROUTES } from \"../../../constants/routes\";\nimport { usePayContext } from \"../../../hooks/usePayContext\";\n\nimport { PageContent } from \"../../Common/Modal/styles\";\n\nimport { getAddressContraction } from \"@daimo/pay-common\";\nimport { useWallet } from \"@solana/wallet-adapter-react\";\nimport { Connector, useAccount, useDisconnect } from \"wagmi\";\nimport { Base, Ethereum, Solana, Tron } from \"../../../assets/chains\";\nimport {\n MetaMask,\n Phantom,\n Rabby,\n Rainbow,\n Trust,\n WalletIcon,\n} from \"../../../assets/logos\";\nimport useIsMobile from \"../../../hooks/useIsMobile\";\nimport useLocales from \"../../../hooks/useLocales\";\nimport { flattenChildren } from \"../../../utils\";\nimport { walletConfigs } from \"../../../wallets/walletConfigs\";\nimport { Option, OptionsList } from \"../../Common/OptionsList\";\nimport { OrderHeader } from \"../../Common/OrderHeader\";\nimport PoweredByFooter from \"../../Common/PoweredByFooter\";\nimport WalletChainLogo from \"../../Common/WalletChainLogo\";\n\nexport default function SelectMethod() {\n const locales = useLocales();\n const payWithString = flattenChildren(locales.payWith).join(\"\");\n const { isMobile, isIOS, isAndroid } = useIsMobile();\n\n const {\n address,\n chain,\n isConnected: isEthConnected,\n connector,\n } = useAccount();\n const {\n connected: isSolanaConnected,\n wallet: solanaWallet,\n disconnect: disconnectSolana,\n publicKey,\n } = useWallet();\n const { setRoute, paymentState, log, disableMobileInjector } =\n usePayContext();\n const { showSolanaPaymentMethod } = paymentState;\n const { disconnectAsync } = useDisconnect();\n\n const { externalPaymentOptions, senderEnsName } = paymentState;\n\n // Decide whether to show the connected eth account, solana account, or both.\n // Desktop: Always show connected wallets when available\n // Mobile: Only show connected wallets when mobile injector is enabled (!disableMobileInjector)\n const showConnectedEth =\n isEthConnected && (!isMobile || !disableMobileInjector);\n const showConnectedSolana =\n isSolanaConnected && (!isMobile || !disableMobileInjector);\n\n const getConnectedWalletOptions = () => {\n const showChainLogo =\n isEthConnected && isSolanaConnected && showSolanaPaymentMethod;\n\n const connectedOptions: Option[] = [];\n\n if (showConnectedEth) {\n const ethWalletDisplayName =\n senderEnsName ?? (address ? getAddressContraction(address) : \"wallet\");\n\n // Prefer icon from walletConfigs if there's a name match, otherwise fall back\n // to the connector-provided icon, and finally to the generic WalletIcon.\n let walletIcon: JSX.Element;\n\n const matchedConfig = Object.values(walletConfigs).find((cfg) => {\n if (!cfg.name || !connector?.name) return false;\n const cfgName = cfg.name.toLowerCase();\n const connName = connector.name.toLowerCase();\n return cfgName.includes(connName) || connName.includes(cfgName);\n });\n\n if (matchedConfig?.icon) {\n walletIcon =\n typeof matchedConfig.icon === \"string\" ? (\n <img src={matchedConfig.icon} alt={matchedConfig.name} />\n ) : (\n (matchedConfig.icon as JSX.Element)\n );\n } else if (connector?.icon) {\n walletIcon = (\n <div style={{ borderRadius: \"22.5%\", overflow: \"hidden\" }}>\n <img src={connector.icon} alt={connector.name} />\n </div>\n );\n } else {\n walletIcon = <WalletIcon />;\n }\n\n const connectedEthWalletOption = {\n id: \"connectedWallet\",\n title: `${payWithString} ${ethWalletDisplayName}`,\n icons: [\n <WalletChainLogo\n key=\"eth\"\n walletIcon={walletIcon}\n walletName={connector?.name || \"Wallet\"}\n chainLogo={showChainLogo ? <Ethereum /> : null}\n />,\n ],\n onClick: () => {\n paymentState.setTokenMode(\"evm\");\n setRoute(ROUTES.SELECT_TOKEN, {\n event: \"click-wallet\",\n walletId: connector?.id,\n chainId: chain?.id,\n address: address,\n });\n },\n };\n connectedOptions.push(connectedEthWalletOption);\n }\n\n if (showConnectedSolana && showSolanaPaymentMethod) {\n const solWalletDisplayName = getAddressContraction(\n publicKey?.toBase58() ?? \"\",\n );\n\n // Prefer icon from walletConfigs if available\n let solWalletIcon: React.ReactNode;\n const solMatchedConfig = Object.values(walletConfigs).find((cfg) => {\n if (!cfg.name) return false;\n const cfgName = cfg.name.toLowerCase();\n const solName = solanaWallet?.adapter.name.toLowerCase() || \"\";\n return cfgName.includes(solName) || solName.includes(cfgName);\n });\n\n if (solMatchedConfig?.icon) {\n solWalletIcon =\n typeof solMatchedConfig.icon === \"string\" ? (\n <img src={solMatchedConfig.icon} alt={solMatchedConfig.name} />\n ) : (\n (solMatchedConfig.icon as JSX.Element)\n );\n } else if (solanaWallet?.adapter.icon) {\n solWalletIcon = solanaWallet.adapter.icon;\n } else {\n solWalletIcon = <Solana />;\n }\n\n const connectedSolWalletOption = {\n id: \"connectedSolanaWallet\",\n title: `${payWithString} ${solWalletDisplayName}`,\n icons: [\n <WalletChainLogo\n key=\"sol-wallet\"\n walletIcon={solWalletIcon}\n walletName={solanaWallet?.adapter.name || \"Wallet\"}\n chainLogo={showChainLogo && <Solana />}\n />,\n ],\n onClick: () => {\n paymentState.setTokenMode(\"solana\");\n setRoute(ROUTES.SELECT_TOKEN, {\n event: \"click-wallet\",\n walletId: solanaWallet?.adapter.name,\n chainId: \"solana\",\n address: publicKey?.toBase58(),\n });\n },\n };\n\n connectedOptions.push(connectedSolWalletOption);\n }\n\n return connectedOptions;\n };\n\n const connectedWalletOptions = getConnectedWalletOptions();\n const unconnectedWalletOption = {\n id: \"unconnectedWallet\",\n title:\n isEthConnected || isSolanaConnected\n ? locales.payWithAnotherWallet\n : locales.payWithWallet,\n icons: getBestUnconnectedWalletIcons(connector, isMobile),\n onClick: async () => {\n await disconnectAsync();\n await disconnectSolana();\n setRoute(ROUTES.CONNECTORS);\n },\n };\n\n const options: {\n id: string;\n title: string;\n subtitle?: string;\n icons: (React.ReactNode | string)[];\n onClick: () => void;\n disabled?: boolean;\n }[] = [];\n options.push(...connectedWalletOptions);\n options.push(unconnectedWalletOption);\n\n log(\n `[SELECT_METHOD] loading: ${externalPaymentOptions.loading}, options: ${JSON.stringify(\n externalPaymentOptions.options,\n )}`,\n );\n\n // Pay with Exchange\n const exchangeOptions = externalPaymentOptions.options.get(\"exchange\") ?? [];\n\n const showExchangePaymentMethod = exchangeOptions.length > 0;\n if (showExchangePaymentMethod) {\n options.push({\n id: \"exchange\",\n title: locales.payWithExchange,\n icons: exchangeOptions.slice(0, 3).map((option) => option.logoURI),\n onClick: () => {\n setRoute(ROUTES.SELECT_EXCHANGE, {\n event: \"click-option\",\n option: \"exchange\",\n });\n },\n });\n }\n\n const depositAddressOption = getDepositAddressOption(setRoute, locales);\n options.push(depositAddressOption);\n\n // ZKP2P is currently only available on desktop. Check if the user is on\n // desktop and if any ZKP2P options are available.\n const zkp2pOptions = externalPaymentOptions.options.get(\"zkp2p\") ?? [];\n const showZkp2pPaymentMethod = !isMobile && zkp2pOptions.length > 0;\n if (showZkp2pPaymentMethod) {\n options.push({\n id: \"ZKP2P\",\n title: locales.payViaPaymentApp,\n icons: zkp2pOptions.slice(0, 2).map((option) => option.logoURI),\n onClick: () => {\n setRoute(ROUTES.SELECT_ZKP2P);\n },\n });\n }\n\n // Order disabled to bottom\n options.sort((a, b) => (a.disabled ? 1 : 0) - (b.disabled ? 1 : 0));\n\n return (\n <PageContent>\n <OrderHeader />\n\n <OptionsList\n requiredSkeletons={isMobile ? 4 : 3} // TODO: programmatically determine skeletons to best avoid layout shifts\n isLoading={externalPaymentOptions.loading}\n options={externalPaymentOptions.loading ? [] : options}\n />\n <PoweredByFooter />\n </PageContent>\n );\n}\n\n// Get 3 icons, skipping the one that is already connected\nfunction getBestUnconnectedWalletIcons(\n connector: Connector | undefined,\n isMobile: boolean,\n) {\n const icons: JSX.Element[] = [];\n const strippedId = connector?.id.toLowerCase(); // some connector ids can have weird casing and or suffixes and prefixes\n const [isRainbow, isPhantom, isRabby, isMetaMask] = [\n strippedId?.includes(\"rainbow\"),\n strippedId?.includes(\"trust\"),\n strippedId?.includes(\"phantom\"),\n strippedId?.includes(\"coinbase\"),\n strippedId?.includes(\"metamask\"),\n strippedId?.includes(\"rabby\"),\n strippedId?.includes(\"metamask\"),\n ];\n\n if (isMobile) {\n icons.push(<MetaMask />);\n icons.push(<Trust background />);\n icons.push(<Rainbow />);\n } else {\n if (!isMetaMask) icons.push(<MetaMask />);\n if (!isRainbow) icons.push(<Rainbow />);\n if (!isPhantom) icons.push(<Phantom />);\n if (!isRabby && icons.length < 3) icons.push(<Rabby />);\n }\n\n return icons;\n}\n\nfunction getDepositAddressOption(\n setRoute: (route: ROUTES, data?: Record<string, any>) => void,\n locales: ReturnType<typeof useLocales>,\n) {\n return {\n id: \"depositAddress\",\n title: locales.payToAddress,\n icons: [<Ethereum key=\"eth\" />, <Tron key=\"tron\" />, <Base key=\"base\" />],\n onClick: () => {\n setRoute(ROUTES.SELECT_DEPOSIT_ADDRESS_CHAIN);\n },\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paymentFsm.js","sources":["../../../src/payment/paymentFsm.ts"],"sourcesContent":["import {\n assert,\n DaimoPayHydratedOrderWithOrg,\n DaimoPayIntentStatus,\n DaimoPayOrder,\n DaimoPayOrderID,\n DaimoPayOrderMode,\n DaimoPayOrderWithOrg,\n DaimoPayUserMetadata,\n ExternalPaymentOptionsString,\n isHydrated,\n SolanaPublicKey,\n} from \"@daimo/pay-common\";\nimport { Address, Hex, parseUnits } from \"viem\";\nimport { getDisplayExpiresAt } from \"./paymentUtils\";\n\n/** Payment parameters. The payment is created only after user taps pay. */\nexport interface PayParams {\n /** App ID, for authentication. */\n appId: string;\n /** Destination chain ID. */\n toChain: number;\n /** The destination token to send. */\n toToken: Address;\n /**\n * The amount of the token to send.\n * If not provided, the user will be prompted to enter an amount.\n */\n toUnits?: string;\n /** The final address to transfer to or contract to call. */\n toAddress: Address;\n /** Calldata for final call, or empty data for transfer. */\n toCallData?: Hex;\n /** The intent verb, such as Pay, Deposit, or Purchase. Default: Pay */\n intent?: string;\n /** Payment options. By default, all are enabled. */\n paymentOptions?: ExternalPaymentOptionsString[];\n /** Preferred chain IDs. */\n preferredChains?: number[];\n /** Preferred tokens. These appear first in the token list. */\n preferredTokens?: { chain: number; address: Address }[];\n /** Only allow payments on these EVM chains. */\n evmChains?: number[];\n /** External ID. E.g. a correlation ID. */\n externalId?: string;\n /** Developer metadata. E.g. correlation ID. */\n metadata?: DaimoPayUserMetadata;\n /** The address to refund to if the payment bounces or a refund is requested. */\n refundAddress?: Address;\n /** Pass-through tokens. If the user pays via these tokens, they're sent directly without swapping. */\n passthroughTokens?: { chain: number; address: Address }[];\n}\n\nexport type PaymentState =\n // payParams and payId are set\n | { type: \"idle\" }\n // payParams are set, payId is not set. A preview order has been created\n // but not saved to the db\n | {\n type: \"preview\";\n order: DaimoPayOrderWithOrg;\n payParamsData: PayParamsData;\n }\n // payId is set, payParams are not set. An unhydrated order has been created\n // and saved to the db\n | { type: \"unhydrated\"; order: DaimoPayOrderWithOrg }\n // Order was hydrated and is waiting to be paid\n | { type: \"payment_unpaid\"; order: DaimoPayHydratedOrderWithOrg }\n // Order was paid, destination was not processed\n | { type: \"payment_started\"; order: DaimoPayHydratedOrderWithOrg }\n // Order was paid and processed successfully\n | { type: \"payment_completed\"; order: DaimoPayHydratedOrderWithOrg }\n // Order was paid but the destination failed to process\n | { type: \"payment_bounced\"; order: DaimoPayHydratedOrderWithOrg }\n // An error occurred\n | { type: \"error\"; order: DaimoPayOrder | undefined; message: string };\n\nexport type PaymentStateType = PaymentState[\"type\"];\n\nexport const initialPaymentState: PaymentState = { type: \"idle\" };\n\nexport type PaymentEvent =\n /* command events (kick off an effect) */\n | { type: \"set_pay_params\"; payParams: PayParams }\n | { type: \"set_pay_id\"; payId: DaimoPayOrderID }\n // HACK: edit the order in-memory to change the amount in deposit flow\n | { type: \"set_chosen_usd\"; usd: number }\n | { type: \"hydrate_order\"; refundAddress?: Address }\n | {\n type: \"pay_source\";\n }\n | {\n type: \"pay_ethereum_source\";\n paymentTxHash: Hex;\n sourceChainId: number;\n payerAddress: Address;\n sourceToken: Address;\n sourceAmount: bigint;\n }\n | {\n type: \"pay_solana_source\";\n paymentTxHash: string;\n sourceToken: SolanaPublicKey;\n }\n /* result events (effect finished) */\n | {\n type: \"preview_generated\";\n order: DaimoPayOrderWithOrg;\n payParamsData: PayParamsData;\n }\n | { type: \"order_loaded\"; order: DaimoPayOrderWithOrg }\n | { type: \"order_hydrated\"; order: DaimoPayHydratedOrderWithOrg }\n | {\n type: \"payment_verified\";\n order: DaimoPayHydratedOrderWithOrg;\n }\n | {\n type: \"order_refreshed\";\n order: DaimoPayOrderWithOrg | DaimoPayHydratedOrderWithOrg;\n }\n | { type: \"dest_processed\"; order: DaimoPayHydratedOrderWithOrg }\n /* failure / util */\n | {\n type: \"error\";\n order: DaimoPayOrder | undefined;\n message: string;\n }\n | { type: \"reset\" };\n\ntype PayParamsData = {\n appId: string;\n};\n\n/**\n * Master payment reducer.\n */\nexport function paymentReducer(\n state: PaymentState,\n event: PaymentEvent,\n): PaymentState {\n switch (state.type) {\n case \"idle\":\n return reduceIdle(state, event);\n case \"preview\":\n return reducePreview(state, event);\n case \"unhydrated\":\n return reduceUnhydrated(state, event);\n case \"payment_unpaid\":\n return reducePaymentUnpaid(state, event);\n case \"payment_started\":\n return reducePaymentStarted(state, event);\n case \"payment_completed\":\n case \"payment_bounced\":\n case \"error\":\n return reduceTerminal(state, event);\n /* satisfies exhaustiveness */\n default:\n // Exhaustive check: Using `never` will cause lint failure if not all\n // state types are handled\n const _exhaustive: never = state;\n return _exhaustive;\n }\n}\n\n/* --------------------------------------------------\n reducer helpers – one function per state\n---------------------------------------------------*/\n\nfunction reduceIdle(\n state: Extract<PaymentState, { type: \"idle\" }>,\n event: PaymentEvent,\n): PaymentState {\n switch (event.type) {\n case \"preview_generated\": {\n const stateFromOrder = getStateFromOrder(event.order);\n\n // If order is already hydrated or in terminal state, use that state\n if (stateFromOrder.type !== \"unhydrated\") {\n return stateFromOrder;\n }\n\n // Order is not hydrated/processed, handle as preview\n return {\n type: \"preview\",\n order: event.order,\n payParamsData: event.payParamsData,\n };\n }\n case \"order_loaded\": {\n return getStateFromOrder(event.order);\n }\n case \"error\":\n return {\n type: \"error\",\n order: event.order,\n message: event.message,\n };\n case \"reset\":\n return initialPaymentState;\n default:\n return state;\n }\n}\n\nfunction reducePreview(\n state: Extract<PaymentState, { type: \"preview\" }>,\n event: PaymentEvent,\n): PaymentState {\n assert(\n state.order.mode !== DaimoPayOrderMode.HYDRATED,\n \"reducePreview called on hydrated order\",\n );\n\n switch (event.type) {\n case \"order_hydrated\":\n return getStateFromHydratedOrder(event.order);\n case \"set_chosen_usd\": {\n const token = state.order.destFinalCallTokenAmount.token;\n const tokenUnits = (event.usd / token.priceFromUsd).toString();\n const tokenAmount = parseUnits(tokenUnits, token.decimals);\n\n // Stay in preview state, but update the order's destFinalCallTokenAmount\n return {\n type: \"preview\",\n order: {\n ...state.order,\n destFinalCallTokenAmount: {\n token,\n amount: tokenAmount.toString() as `${bigint}`,\n usd: event.usd,\n },\n },\n payParamsData: state.payParamsData,\n };\n }\n case \"error\":\n return {\n type: \"error\",\n order: event.order,\n message: event.message,\n };\n case \"reset\":\n return initialPaymentState;\n default:\n return state;\n }\n}\n\nfunction reduceUnhydrated(\n state: Extract<PaymentState, { type: \"unhydrated\" }>,\n event: PaymentEvent,\n): PaymentState {\n switch (event.type) {\n case \"order_hydrated\":\n return { type: \"payment_unpaid\", order: event.order };\n case \"error\":\n return {\n type: \"error\",\n order: event.order,\n message: event.message,\n };\n case \"reset\":\n return initialPaymentState;\n default:\n return state;\n }\n}\n\nfunction reducePaymentUnpaid(\n state: Extract<PaymentState, { type: \"payment_unpaid\" }>,\n event: PaymentEvent,\n): PaymentState {\n switch (event.type) {\n case \"payment_verified\": {\n if (event.order.intentStatus === DaimoPayIntentStatus.UNPAID) {\n // The payment was not detected on chain, or some other error occurred.\n return {\n type: \"error\",\n order: event.order,\n message: \"Payment failed\",\n };\n }\n return getStateFromHydratedOrder(event.order);\n }\n case \"order_refreshed\":\n return getStateFromHydratedOrder(event.order);\n case \"error\":\n return {\n type: \"error\",\n order: event.order,\n message: event.message,\n };\n case \"reset\":\n return initialPaymentState;\n default:\n return state;\n }\n}\n\nfunction reducePaymentStarted(\n state: Extract<PaymentState, { type: \"payment_started\" }>,\n event: PaymentEvent,\n): PaymentState {\n switch (event.type) {\n case \"order_refreshed\":\n return getStateFromHydratedOrder(event.order);\n case \"error\":\n return {\n type: \"error\",\n order: event.order,\n message: event.message,\n };\n case \"reset\":\n return initialPaymentState;\n default:\n return state;\n }\n}\n\n/**\n * Determines the appropriate payment state based on an order's status and mode.\n * Returns the appropriate payment state based on the order's mode and intent status.\n */\nfunction getStateFromOrder(order: DaimoPayOrderWithOrg): PaymentState {\n if (order.mode === DaimoPayOrderMode.HYDRATED) {\n return getStateFromHydratedOrder(order);\n } else {\n return { type: \"unhydrated\", order };\n }\n}\n\n/**\n * Determines the appropriate payment state for a hydrated order. Progresses\n * the payment through different processing states.\n */\nfunction getStateFromHydratedOrder(order: DaimoPayOrderWithOrg): PaymentState {\n assert(isHydrated(order), `[PAYMENT_REDUCER] unhydrated`);\n\n // Handle finished orders first\n switch (order.intentStatus) {\n case DaimoPayIntentStatus.COMPLETED:\n return { type: \"payment_completed\", order };\n case DaimoPayIntentStatus.BOUNCED:\n return { type: \"payment_bounced\", order };\n }\n\n // If unfinished, check if expired\n const displayExpiresAt = getDisplayExpiresAt(order);\n if (Date.now() / 1e3 > displayExpiresAt) {\n return {\n type: \"error\",\n order,\n message: \"Payment expired. Please restart.\",\n };\n }\n\n // Unfinished but not expired\n switch (order.intentStatus) {\n case DaimoPayIntentStatus.UNPAID:\n return { type: \"payment_unpaid\", order };\n case DaimoPayIntentStatus.STARTED:\n return { type: \"payment_started\", order };\n default:\n return { type: \"error\", order, message: `Status: ${order.intentStatus}` };\n }\n}\n\nfunction reduceTerminal(\n state: Extract<\n PaymentState,\n { type: \"payment_completed\" | \"payment_bounced\" | \"error\" }\n >,\n event: PaymentEvent,\n): PaymentState {\n switch (event.type) {\n case \"reset\":\n return initialPaymentState;\n // In terminal states we ignore everything except reset\n default:\n return state;\n }\n}\n"],"names":[],"mappings":";;;;AA+Ea,MAAA,mBAAA,GAAoC,EAAE,IAAA,EAAM,MAAO,GAAA;AAyDhD,SAAA,cAAA,CACd,OACA,KACc,EAAA;AACd,EAAA,QAAQ,MAAM,IAAM;AAAA,IAClB,KAAK,MAAA;AACH,MAAO,OAAA,UAAA,CAAW,OAAO,KAAK,CAAA,CAAA;AAAA,IAChC,KAAK,SAAA;AACH,MAAO,OAAA,aAAA,CAAc,OAAO,KAAK,CAAA,CAAA;AAAA,IACnC,KAAK,YAAA;AACH,MAAO,OAAA,gBAAA,CAAiB,OAAO,KAAK,CAAA,CAAA;AAAA,IACtC,KAAK,gBAAA;AACH,MAAO,OAAA,mBAAA,CAAoB,OAAO,KAAK,CAAA,CAAA;AAAA,IACzC,KAAK,iBAAA;AACH,MAAO,OAAA,oBAAA,CAAqB,OAAO,KAAK,CAAA,CAAA;AAAA,IAC1C,KAAK,mBAAA,CAAA;AAAA,IACL,KAAK,iBAAA,CAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAO,OAAA,cAAA,CAAe,OAAO,KAAK,CAAA,CAAA;AAAA;AAAA,IAEpC;AAGE,MAAA,MAAM,WAAqB,GAAA,KAAA,CAAA;AAC3B,MAAO,OAAA,WAAA,CAAA;AAAA,GACX;AACF,CAAA;AAMA,SAAS,UAAA,CACP,OACA,KACc,EAAA;AACd,EAAA,QAAQ,MAAM,IAAM;AAAA,IAClB,KAAK,mBAAqB,EAAA;AACxB,MAAM,MAAA,cAAA,GAAiB,iBAAkB,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AAGpD,MAAI,IAAA,cAAA,CAAe,SAAS,YAAc,EAAA;AACxC,QAAO,OAAA,cAAA,CAAA;AAAA,OACT;AAGA,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,SAAA;AAAA,QACN,OAAO,KAAM,CAAA,KAAA;AAAA,QACb,eAAe,KAAM,CAAA,aAAA;AAAA,OACvB,CAAA;AAAA,KACF;AAAA,IACA,KAAK,cAAgB,EAAA;AACnB,MAAO,OAAA,iBAAA,CAAkB,MAAM,KAAK,CAAA,CAAA;AAAA,KACtC;AAAA,IACA,KAAK,OAAA;AACH,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,OAAA;AAAA,QACN,OAAO,KAAM,CAAA,KAAA;AAAA,QACb,SAAS,KAAM,CAAA,OAAA;AAAA,OACjB,CAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAO,OAAA,mBAAA,CAAA;AAAA,IACT;AACE,MAAO,OAAA,KAAA,CAAA;AAAA,GACX;AACF,CAAA;AAEA,SAAS,aAAA,CACP,OACA,KACc,EAAA;AACd,EAAA,MAAA;AAAA,IACE,KAAA,CAAM,KAAM,CAAA,IAAA,KAAS,iBAAkB,CAAA,QAAA;AAAA,IACvC,wCAAA;AAAA,GACF,CAAA;AAEA,EAAA,QAAQ,MAAM,IAAM;AAAA,IAClB,KAAK,gBAAA;AACH,MAAO,OAAA,yBAAA,CAA0B,MAAM,KAAK,CAAA,CAAA;AAAA,IAC9C,KAAK,gBAAkB,EAAA;AACrB,MAAM,MAAA,KAAA,GAAQ,KAAM,CAAA,KAAA,CAAM,wBAAyB,CAAA,KAAA,CAAA;AACnD,MAAA,MAAM,UAAc,GAAA,CAAA,KAAA,CAAM,GAAM,GAAA,KAAA,CAAM,cAAc,QAAS,EAAA,CAAA;AAC7D,MAAA,MAAM,WAAc,GAAA,UAAA,CAAW,UAAY,EAAA,KAAA,CAAM,QAAQ,CAAA,CAAA;AAGzD,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,SAAA;AAAA,QACN,KAAO,EAAA;AAAA,UACL,GAAG,KAAM,CAAA,KAAA;AAAA,UACT,wBAA0B,EAAA;AAAA,YACxB,KAAA;AAAA,YACA,MAAA,EAAQ,YAAY,QAAS,EAAA;AAAA,YAC7B,KAAK,KAAM,CAAA,GAAA;AAAA,WACb;AAAA,SACF;AAAA,QACA,eAAe,KAAM,CAAA,aAAA;AAAA,OACvB,CAAA;AAAA,KACF;AAAA,IACA,KAAK,OAAA;AACH,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,OAAA;AAAA,QACN,OAAO,KAAM,CAAA,KAAA;AAAA,QACb,SAAS,KAAM,CAAA,OAAA;AAAA,OACjB,CAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAO,OAAA,mBAAA,CAAA;AAAA,IACT;AACE,MAAO,OAAA,KAAA,CAAA;AAAA,GACX;AACF,CAAA;AAEA,SAAS,gBAAA,CACP,OACA,KACc,EAAA;AACd,EAAA,QAAQ,MAAM,IAAM;AAAA,IAClB,KAAK,gBAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,gBAAkB,EAAA,KAAA,EAAO,MAAM,KAAM,EAAA,CAAA;AAAA,IACtD,KAAK,OAAA;AACH,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,OAAA;AAAA,QACN,OAAO,KAAM,CAAA,KAAA;AAAA,QACb,SAAS,KAAM,CAAA,OAAA;AAAA,OACjB,CAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAO,OAAA,mBAAA,CAAA;AAAA,IACT;AACE,MAAO,OAAA,KAAA,CAAA;AAAA,GACX;AACF,CAAA;AAEA,SAAS,mBAAA,CACP,OACA,KACc,EAAA;AACd,EAAA,QAAQ,MAAM,IAAM;AAAA,IAClB,KAAK,kBAAoB,EAAA;AACvB,MAAA,IAAI,KAAM,CAAA,KAAA,CAAM,YAAiB,KAAA,oBAAA,CAAqB,MAAQ,EAAA;AAE5D,QAAO,OAAA;AAAA,UACL,IAAM,EAAA,OAAA;AAAA,UACN,OAAO,KAAM,CAAA,KAAA;AAAA,UACb,OAAS,EAAA,gBAAA;AAAA,SACX,CAAA;AAAA,OACF;AACA,MAAO,OAAA,yBAAA,CAA0B,MAAM,KAAK,CAAA,CAAA;AAAA,KAC9C;AAAA,IACA,KAAK,iBAAA;AACH,MAAO,OAAA,yBAAA,CAA0B,MAAM,KAAK,CAAA,CAAA;AAAA,IAC9C,KAAK,OAAA;AACH,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,OAAA;AAAA,QACN,OAAO,KAAM,CAAA,KAAA;AAAA,QACb,SAAS,KAAM,CAAA,OAAA;AAAA,OACjB,CAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAO,OAAA,mBAAA,CAAA;AAAA,IACT;AACE,MAAO,OAAA,KAAA,CAAA;AAAA,GACX;AACF,CAAA;AAEA,SAAS,oBAAA,CACP,OACA,KACc,EAAA;AACd,EAAA,QAAQ,MAAM,IAAM;AAAA,IAClB,KAAK,iBAAA;AACH,MAAO,OAAA,yBAAA,CAA0B,MAAM,KAAK,CAAA,CAAA;AAAA,IAC9C,KAAK,OAAA;AACH,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,OAAA;AAAA,QACN,OAAO,KAAM,CAAA,KAAA;AAAA,QACb,SAAS,KAAM,CAAA,OAAA;AAAA,OACjB,CAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAO,OAAA,mBAAA,CAAA;AAAA,IACT;AACE,MAAO,OAAA,KAAA,CAAA;AAAA,GACX;AACF,CAAA;AAMA,SAAS,kBAAkB,KAA2C,EAAA;AACpE,EAAI,IAAA,KAAA,CAAM,IAAS,KAAA,iBAAA,CAAkB,QAAU,EAAA;AAC7C,IAAA,OAAO,0BAA0B,KAAK,CAAA,CAAA;AAAA,GACjC,MAAA;AACL,IAAO,OAAA,EAAE,IAAM,EAAA,YAAA,EAAc,KAAM,EAAA,CAAA;AAAA,GACrC;AACF,CAAA;AAMA,SAAS,0BAA0B,KAA2C,EAAA;AAC5E,EAAO,MAAA,CAAA,UAAA,CAAW,KAAK,CAAA,EAAG,CAA8B,4BAAA,CAAA,CAAA,CAAA;AAGxD,EAAA,QAAQ,MAAM,YAAc;AAAA,IAC1B,KAAK,oBAAqB,CAAA,SAAA;AACxB,MAAO,OAAA,EAAE,IAAM,EAAA,mBAAA,EAAqB,KAAM,EAAA,CAAA;AAAA,IAC5C,KAAK,oBAAqB,CAAA,OAAA;AACxB,MAAO,OAAA,EAAE,IAAM,EAAA,iBAAA,EAAmB,KAAM,EAAA,CAAA;AAAA,GAC5C;AAGA,EAAM,MAAA,gBAAA,GAAmB,oBAAoB,KAAK,CAAA,CAAA;AAClD,EAAA,IAAI,IAAK,CAAA,GAAA,EAAQ,GAAA,GAAA,GAAM,gBAAkB,EAAA;AACvC,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,OAAA;AAAA,MACN,KAAA;AAAA,MACA,OAAS,EAAA,kCAAA;AAAA,KACX,CAAA;AAAA,GACF;AAGA,EAAA,QAAQ,MAAM,YAAc;AAAA,IAC1B,KAAK,oBAAqB,CAAA,MAAA;AACxB,MAAO,OAAA,EAAE,IAAM,EAAA,gBAAA,EAAkB,KAAM,EAAA,CAAA;AAAA,IACzC,KAAK,oBAAqB,CAAA,OAAA;AACxB,MAAO,OAAA,EAAE,IAAM,EAAA,iBAAA,EAAmB,KAAM,EAAA,CAAA;AAAA,IAC1C;AACE,MAAO,OAAA,EAAE,MAAM,OAAS,EAAA,KAAA,EAAO,SAAS,CAAW,QAAA,EAAA,KAAA,CAAM,YAAY,CAAG,CAAA,EAAA,CAAA;AAAA,GAC5E;AACF,CAAA;AAEA,SAAS,cAAA,CACP,OAIA,KACc,EAAA;AACd,EAAA,QAAQ,MAAM,IAAM;AAAA,IAClB,KAAK,OAAA;AACH,MAAO,OAAA,mBAAA,CAAA;AAAA;AAAA,IAET;AACE,MAAO,OAAA,KAAA,CAAA;AAAA,GACX;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"paymentFsm.js","sources":["../../../src/payment/paymentFsm.ts"],"sourcesContent":["import {\n assert,\n DaimoPayHydratedOrderWithOrg,\n DaimoPayIntentStatus,\n DaimoPayOrder,\n DaimoPayOrderID,\n DaimoPayOrderMode,\n DaimoPayOrderWithOrg,\n DaimoPayUserMetadata,\n ExternalPaymentOptionsString,\n isHydrated,\n SolanaPublicKey,\n UniquePaymentOptionsString,\n} from \"@daimo/pay-common\";\nimport { Address, Hex, parseUnits } from \"viem\";\nimport { getDisplayExpiresAt } from \"./paymentUtils\";\n\n/** Payment parameters. The payment is created only after user taps pay. */\nexport interface PayParams {\n /** App ID, for authentication. */\n appId: string;\n /** Destination chain ID. */\n toChain: number;\n /** The destination token to send. */\n toToken: Address;\n /**\n * The amount of the token to send.\n * If not provided, the user will be prompted to enter an amount.\n */\n toUnits?: string;\n /** The final address to transfer to or contract to call. */\n toAddress: Address;\n /** Calldata for final call, or empty data for transfer. */\n toCallData?: Hex;\n /** The intent verb, such as Pay, Deposit, or Purchase. Default: Pay */\n intent?: string;\n /** Payment options. By default, all are enabled. */\n paymentOptions?: ExternalPaymentOptionsString[];\n /** Preferred chain IDs. */\n preferredChains?: number[];\n /** Preferred tokens. These appear first in the token list. */\n preferredTokens?: { chain: number; address: Address }[];\n /** Only allow payments on these EVM chains. */\n evmChains?: number[];\n /** External ID. E.g. a correlation ID. */\n externalId?: string;\n /** Developer metadata. E.g. correlation ID. */\n metadata?: DaimoPayUserMetadata;\n /** The address to refund to if the payment bounces or a refund is requested. */\n refundAddress?: Address;\n /** Pass-through tokens. If the user pays via these tokens, they're sent directly without swapping. */\n passthroughTokens?: { chain: number; address: Address }[];\n /** Only show one payment option to the user. */\n uniquePaymentOption?: UniquePaymentOptionsString;\n}\n\nexport type PaymentState =\n // payParams and payId are set\n | { type: \"idle\" }\n // payParams are set, payId is not set. A preview order has been created\n // but not saved to the db\n | {\n type: \"preview\";\n order: DaimoPayOrderWithOrg;\n payParamsData: PayParamsData;\n }\n // payId is set, payParams are not set. An unhydrated order has been created\n // and saved to the db\n | { type: \"unhydrated\"; order: DaimoPayOrderWithOrg }\n // Order was hydrated and is waiting to be paid\n | { type: \"payment_unpaid\"; order: DaimoPayHydratedOrderWithOrg }\n // Order was paid, destination was not processed\n | { type: \"payment_started\"; order: DaimoPayHydratedOrderWithOrg }\n // Order was paid and processed successfully\n | { type: \"payment_completed\"; order: DaimoPayHydratedOrderWithOrg }\n // Order was paid but the destination failed to process\n | { type: \"payment_bounced\"; order: DaimoPayHydratedOrderWithOrg }\n // An error occurred\n | { type: \"error\"; order: DaimoPayOrder | undefined; message: string };\n\nexport type PaymentStateType = PaymentState[\"type\"];\n\nexport const initialPaymentState: PaymentState = { type: \"idle\" };\n\nexport type PaymentEvent =\n /* command events (kick off an effect) */\n | { type: \"set_pay_params\"; payParams: PayParams }\n | { type: \"set_pay_id\"; payId: DaimoPayOrderID }\n // HACK: edit the order in-memory to change the amount in deposit flow\n | { type: \"set_chosen_usd\"; usd: number }\n | { type: \"hydrate_order\"; refundAddress?: Address }\n | {\n type: \"pay_source\";\n }\n | {\n type: \"pay_ethereum_source\";\n paymentTxHash: Hex;\n sourceChainId: number;\n payerAddress: Address;\n sourceToken: Address;\n sourceAmount: bigint;\n }\n | {\n type: \"pay_solana_source\";\n paymentTxHash: string;\n sourceToken: SolanaPublicKey;\n }\n /* result events (effect finished) */\n | {\n type: \"preview_generated\";\n order: DaimoPayOrderWithOrg;\n payParamsData: PayParamsData;\n }\n | { type: \"order_loaded\"; order: DaimoPayOrderWithOrg }\n | { type: \"order_hydrated\"; order: DaimoPayHydratedOrderWithOrg }\n | {\n type: \"payment_verified\";\n order: DaimoPayHydratedOrderWithOrg;\n }\n | {\n type: \"order_refreshed\";\n order: DaimoPayOrderWithOrg | DaimoPayHydratedOrderWithOrg;\n }\n | { type: \"dest_processed\"; order: DaimoPayHydratedOrderWithOrg }\n /* failure / util */\n | {\n type: \"error\";\n order: DaimoPayOrder | undefined;\n message: string;\n }\n | { type: \"reset\" };\n\ntype PayParamsData = {\n appId: string;\n};\n\n/**\n * Master payment reducer.\n */\nexport function paymentReducer(\n state: PaymentState,\n event: PaymentEvent,\n): PaymentState {\n switch (state.type) {\n case \"idle\":\n return reduceIdle(state, event);\n case \"preview\":\n return reducePreview(state, event);\n case \"unhydrated\":\n return reduceUnhydrated(state, event);\n case \"payment_unpaid\":\n return reducePaymentUnpaid(state, event);\n case \"payment_started\":\n return reducePaymentStarted(state, event);\n case \"payment_completed\":\n case \"payment_bounced\":\n case \"error\":\n return reduceTerminal(state, event);\n /* satisfies exhaustiveness */\n default:\n // Exhaustive check: Using `never` will cause lint failure if not all\n // state types are handled\n const _exhaustive: never = state;\n return _exhaustive;\n }\n}\n\n/* --------------------------------------------------\n reducer helpers – one function per state\n---------------------------------------------------*/\n\nfunction reduceIdle(\n state: Extract<PaymentState, { type: \"idle\" }>,\n event: PaymentEvent,\n): PaymentState {\n switch (event.type) {\n case \"preview_generated\": {\n const stateFromOrder = getStateFromOrder(event.order);\n\n // If order is already hydrated or in terminal state, use that state\n if (stateFromOrder.type !== \"unhydrated\") {\n return stateFromOrder;\n }\n\n // Order is not hydrated/processed, handle as preview\n return {\n type: \"preview\",\n order: event.order,\n payParamsData: event.payParamsData,\n };\n }\n case \"order_loaded\": {\n return getStateFromOrder(event.order);\n }\n case \"error\":\n return {\n type: \"error\",\n order: event.order,\n message: event.message,\n };\n case \"reset\":\n return initialPaymentState;\n default:\n return state;\n }\n}\n\nfunction reducePreview(\n state: Extract<PaymentState, { type: \"preview\" }>,\n event: PaymentEvent,\n): PaymentState {\n assert(\n state.order.mode !== DaimoPayOrderMode.HYDRATED,\n \"reducePreview called on hydrated order\",\n );\n\n switch (event.type) {\n case \"order_hydrated\":\n return getStateFromHydratedOrder(event.order);\n case \"set_chosen_usd\": {\n const token = state.order.destFinalCallTokenAmount.token;\n const tokenUnits = (event.usd / token.priceFromUsd).toString();\n const tokenAmount = parseUnits(tokenUnits, token.decimals);\n\n // Stay in preview state, but update the order's destFinalCallTokenAmount\n return {\n type: \"preview\",\n order: {\n ...state.order,\n destFinalCallTokenAmount: {\n token,\n amount: tokenAmount.toString() as `${bigint}`,\n usd: event.usd,\n },\n },\n payParamsData: state.payParamsData,\n };\n }\n case \"error\":\n return {\n type: \"error\",\n order: event.order,\n message: event.message,\n };\n case \"reset\":\n return initialPaymentState;\n default:\n return state;\n }\n}\n\nfunction reduceUnhydrated(\n state: Extract<PaymentState, { type: \"unhydrated\" }>,\n event: PaymentEvent,\n): PaymentState {\n switch (event.type) {\n case \"order_hydrated\":\n return { type: \"payment_unpaid\", order: event.order };\n case \"error\":\n return {\n type: \"error\",\n order: event.order,\n message: event.message,\n };\n case \"reset\":\n return initialPaymentState;\n default:\n return state;\n }\n}\n\nfunction reducePaymentUnpaid(\n state: Extract<PaymentState, { type: \"payment_unpaid\" }>,\n event: PaymentEvent,\n): PaymentState {\n switch (event.type) {\n case \"payment_verified\": {\n if (event.order.intentStatus === DaimoPayIntentStatus.UNPAID) {\n // The payment was not detected on chain, or some other error occurred.\n return {\n type: \"error\",\n order: event.order,\n message: \"Payment failed\",\n };\n }\n return getStateFromHydratedOrder(event.order);\n }\n case \"order_refreshed\":\n return getStateFromHydratedOrder(event.order);\n case \"error\":\n return {\n type: \"error\",\n order: event.order,\n message: event.message,\n };\n case \"reset\":\n return initialPaymentState;\n default:\n return state;\n }\n}\n\nfunction reducePaymentStarted(\n state: Extract<PaymentState, { type: \"payment_started\" }>,\n event: PaymentEvent,\n): PaymentState {\n switch (event.type) {\n case \"order_refreshed\":\n return getStateFromHydratedOrder(event.order);\n case \"error\":\n return {\n type: \"error\",\n order: event.order,\n message: event.message,\n };\n case \"reset\":\n return initialPaymentState;\n default:\n return state;\n }\n}\n\n/**\n * Determines the appropriate payment state based on an order's status and mode.\n * Returns the appropriate payment state based on the order's mode and intent status.\n */\nfunction getStateFromOrder(order: DaimoPayOrderWithOrg): PaymentState {\n if (order.mode === DaimoPayOrderMode.HYDRATED) {\n return getStateFromHydratedOrder(order);\n } else {\n return { type: \"unhydrated\", order };\n }\n}\n\n/**\n * Determines the appropriate payment state for a hydrated order. Progresses\n * the payment through different processing states.\n */\nfunction getStateFromHydratedOrder(order: DaimoPayOrderWithOrg): PaymentState {\n assert(isHydrated(order), `[PAYMENT_REDUCER] unhydrated`);\n\n // Handle finished orders first\n switch (order.intentStatus) {\n case DaimoPayIntentStatus.COMPLETED:\n return { type: \"payment_completed\", order };\n case DaimoPayIntentStatus.BOUNCED:\n return { type: \"payment_bounced\", order };\n }\n\n // If unfinished, check if expired\n const displayExpiresAt = getDisplayExpiresAt(order);\n if (Date.now() / 1e3 > displayExpiresAt) {\n return {\n type: \"error\",\n order,\n message: \"Payment expired. Please restart.\",\n };\n }\n\n // Unfinished but not expired\n switch (order.intentStatus) {\n case DaimoPayIntentStatus.UNPAID:\n return { type: \"payment_unpaid\", order };\n case DaimoPayIntentStatus.STARTED:\n return { type: \"payment_started\", order };\n default:\n return { type: \"error\", order, message: `Status: ${order.intentStatus}` };\n }\n}\n\nfunction reduceTerminal(\n state: Extract<\n PaymentState,\n { type: \"payment_completed\" | \"payment_bounced\" | \"error\" }\n >,\n event: PaymentEvent,\n): PaymentState {\n switch (event.type) {\n case \"reset\":\n return initialPaymentState;\n // In terminal states we ignore everything except reset\n default:\n return state;\n }\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@daimo/pay",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.16.
|
|
4
|
+
"version": "1.16.2",
|
|
5
5
|
"author": "Daimo",
|
|
6
6
|
"homepage": "https://pay.daimo.com",
|
|
7
7
|
"license": "BSD-2-Clause license",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"lint": "eslint 'src/**/*.{js,jsx,ts,tsx}' --max-warnings=0"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@daimo/pay-common": "1.16.
|
|
36
|
+
"@daimo/pay-common": "1.16.2",
|
|
37
37
|
"@solana/wallet-adapter-base": "^0.9.23",
|
|
38
38
|
"@solana/wallet-adapter-react": "^0.15.35",
|
|
39
39
|
"@solana/web3.js": "^1.95.4",
|
|
@@ -93,4 +93,4 @@
|
|
|
93
93
|
"payment",
|
|
94
94
|
"crypto"
|
|
95
95
|
]
|
|
96
|
-
}
|
|
96
|
+
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TODO: Move hex colors into css variables for p3 support
|
|
3
|
-
*/
|
|
4
|
-
declare const _default: {
|
|
5
|
-
Chrome: import("react/jsx-runtime").JSX.Element;
|
|
6
|
-
FireFox: import("react/jsx-runtime").JSX.Element;
|
|
7
|
-
Brave: import("react/jsx-runtime").JSX.Element;
|
|
8
|
-
Edge: import("react/jsx-runtime").JSX.Element;
|
|
9
|
-
};
|
|
10
|
-
export default _default;
|
package/build/assets/chains.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
type Logo = {
|
|
2
|
-
testnet?: boolean;
|
|
3
|
-
};
|
|
4
|
-
export declare const UnknownChain: ({ testnet, ...props }: Logo) => import("react/jsx-runtime").JSX.Element;
|
|
5
|
-
export declare const Ethereum: ({ testnet, ...props }: Logo) => import("react/jsx-runtime").JSX.Element;
|
|
6
|
-
export declare const Polygon: ({ testnet, ...props }: Logo) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
-
export declare const Optimism: ({ testnet, ...props }: Logo) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
-
export declare const Arbitrum: ({ testnet, ...props }: Logo) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
-
export declare const Telos: ({ testnet, ...props }: Logo) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
-
export declare const Solana: ({ testnet, ...props }: {
|
|
11
|
-
testnet?: boolean;
|
|
12
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
13
|
-
export declare const Bitcoin: ({ testnet, ...props }: {
|
|
14
|
-
testnet?: boolean;
|
|
15
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
16
|
-
export declare const Tron: ({ testnet, ...props }: {
|
|
17
|
-
testnet?: boolean;
|
|
18
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
19
|
-
export declare const Zcash: ({ testnet, ...props }: {
|
|
20
|
-
testnet?: boolean;
|
|
21
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
22
|
-
export declare const Base: ({ testnet, ...props }: {
|
|
23
|
-
testnet?: boolean;
|
|
24
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
25
|
-
export declare const chainToLogo: {
|
|
26
|
-
[x: number]: import("react/jsx-runtime").JSX.Element;
|
|
27
|
-
};
|
|
28
|
-
export {};
|
package/build/assets/coins.d.ts
DELETED
package/build/assets/crepe.d.ts
DELETED
package/build/assets/icons.d.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
export declare const Scan: ({ ...props }: {
|
|
2
|
-
[x: string]: any;
|
|
3
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
4
|
-
export declare const WarningIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
5
|
-
export declare const Download: ({ ...props }: {
|
|
6
|
-
[x: string]: any;
|
|
7
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
-
export declare const ExternalLinkIcon: ({ ...props }: {
|
|
9
|
-
[x: string]: any;
|
|
10
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
11
|
-
export declare const AlertIcon: ({ ...props }: {
|
|
12
|
-
[x: string]: any;
|
|
13
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
14
|
-
export declare const DisconnectIcon: ({ ...props }: {
|
|
15
|
-
[x: string]: any;
|
|
16
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
17
|
-
export declare const TickIcon: ({ ...props }: {
|
|
18
|
-
[x: string]: any;
|
|
19
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
20
|
-
export declare const LoadingCircleIcon: ({ ...props }: {
|
|
21
|
-
[x: string]: any;
|
|
22
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
23
|
-
export declare const RetryIconCircle: ({ ...props }: {
|
|
24
|
-
[x: string]: any;
|
|
25
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
26
|
-
export declare const RetryIcon: ({ ...props }: {
|
|
27
|
-
[x: string]: any;
|
|
28
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
29
|
-
export declare const CopyToClipboardIcon: ({ ...props }: {
|
|
30
|
-
[x: string]: any;
|
|
31
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
32
|
-
export declare const AuthIcon: ({ ...props }: React.HTMLAttributes<HTMLDivElement>) => import("react/jsx-runtime").JSX.Element;
|
|
33
|
-
export declare const SwitchIcon: ({ ...props }: {
|
|
34
|
-
[x: string]: any;
|
|
35
|
-
}) => import("react/jsx-runtime").JSX.Element;
|