@gardenfi/swap 0.0.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +65 -0
  2. package/dist/index.cjs +1 -0
  3. package/dist/index.js +5 -0
  4. package/dist/index10.cjs +1 -0
  5. package/dist/index10.js +33 -0
  6. package/dist/index11.cjs +1 -0
  7. package/dist/index11.js +36 -0
  8. package/dist/index12.cjs +1 -0
  9. package/dist/index12.js +65 -0
  10. package/dist/index13.cjs +1 -0
  11. package/dist/index13.js +33 -0
  12. package/dist/index14.cjs +1 -0
  13. package/dist/index14.js +190 -0
  14. package/dist/index15.cjs +1 -0
  15. package/dist/index15.js +51 -0
  16. package/dist/index16.cjs +1 -0
  17. package/dist/index16.js +313 -0
  18. package/dist/index17.cjs +1 -0
  19. package/dist/index17.js +29 -0
  20. package/dist/index18.cjs +1 -0
  21. package/dist/index18.js +17 -0
  22. package/dist/index19.cjs +1 -0
  23. package/dist/index19.js +229 -0
  24. package/dist/index20.cjs +1 -0
  25. package/dist/index20.js +15 -0
  26. package/dist/index21.cjs +1 -0
  27. package/dist/index21.js +92 -0
  28. package/dist/index22.cjs +1 -0
  29. package/dist/index22.js +143 -0
  30. package/dist/index23.cjs +1 -0
  31. package/dist/index23.js +22 -0
  32. package/dist/index24.cjs +1 -0
  33. package/dist/index24.js +20 -0
  34. package/dist/index25.cjs +1 -0
  35. package/dist/index25.js +108 -0
  36. package/dist/index26.cjs +1 -0
  37. package/dist/index26.js +85 -0
  38. package/dist/index27.cjs +1 -0
  39. package/dist/index27.js +15 -0
  40. package/dist/index28.cjs +1 -0
  41. package/dist/index28.js +54 -0
  42. package/dist/index29.cjs +1 -0
  43. package/dist/index29.js +63 -0
  44. package/dist/index3.cjs +1 -0
  45. package/dist/index3.js +7 -0
  46. package/dist/index30.cjs +1 -0
  47. package/dist/index30.js +44 -0
  48. package/dist/index31.cjs +1 -0
  49. package/dist/index31.js +43 -0
  50. package/dist/index4.cjs +1 -0
  51. package/dist/index4.js +26 -0
  52. package/dist/index5.cjs +1 -0
  53. package/dist/index5.js +250 -0
  54. package/dist/index6.cjs +1 -0
  55. package/dist/index6.js +98 -0
  56. package/dist/index7.cjs +1 -0
  57. package/dist/index7.js +51 -0
  58. package/dist/index8.cjs +1 -0
  59. package/dist/index8.js +51 -0
  60. package/dist/index9.cjs +1 -0
  61. package/dist/index9.js +101 -0
  62. package/dist/src/index.d.ts +2 -0
  63. package/dist/src/lib/GardenComponent.d.ts +6 -0
  64. package/dist/src/lib/common/AddressDetails.d.ts +8 -0
  65. package/dist/src/lib/common/ChainsToolTip.d.ts +8 -0
  66. package/dist/src/lib/common/Modal.d.ts +9 -0
  67. package/dist/src/lib/common/ModalComponent.d.ts +7 -0
  68. package/dist/src/lib/common/Navbar.d.ts +10 -0
  69. package/dist/src/lib/common/SwapInput.d.ts +17 -0
  70. package/dist/src/lib/components/CreateSwap.d.ts +4 -0
  71. package/dist/src/lib/components/SwapSavingsAndAddresses.d.ts +10 -0
  72. package/dist/src/lib/components/SwapWidget.d.ts +7 -0
  73. package/dist/src/lib/components/assetSelection/AssetModal.d.ts +8 -0
  74. package/dist/src/lib/components/assetSelection/AvailableChainsSidebar.d.ts +11 -0
  75. package/dist/src/lib/components/feesAndRateDetails/FeeAndRateDetails.d.ts +3 -0
  76. package/dist/src/lib/components/feesAndRateDetails/InputAddress.d.ts +3 -0
  77. package/dist/src/lib/components/feesAndRateDetails/InputAddressAndFeeRateDetails.d.ts +3 -0
  78. package/dist/src/lib/components/transactions/SwapInfo.d.ts +12 -0
  79. package/dist/src/lib/components/transactions/TransactionHistory.d.ts +7 -0
  80. package/dist/src/lib/components/transactions/TransactionRow.d.ts +11 -0
  81. package/dist/src/lib/components/transactions/TransactionSkeleton.d.ts +3 -0
  82. package/dist/src/lib/components/transactions/Transactions.d.ts +4 -0
  83. package/dist/src/lib/constants/animations.d.ts +7 -0
  84. package/dist/src/lib/constants/constants.d.ts +29 -0
  85. package/dist/src/lib/constants/network.d.ts +0 -0
  86. package/dist/src/lib/hooks/useSwap.d.ts +29 -0
  87. package/dist/src/lib/store/assetStore.d.ts +23 -0
  88. package/dist/src/lib/store/swapStore.d.ts +79 -0
  89. package/dist/src/lib/store/transactionHistoryStore.d.ts +17 -0
  90. package/dist/src/lib/store/viewPortStore.d.ts +17 -0
  91. package/dist/src/lib/types/types.d.ts +54 -0
  92. package/dist/src/lib/utils/utils.d.ts +14 -0
  93. package/dist/style.css +1 -0
  94. package/package.json +62 -0
package/dist/index9.js ADDED
@@ -0,0 +1,101 @@
1
+ import t, { useState as D, useMemo as s, useEffect as h } from "react";
2
+ import { ExchangeIcon as T, Button as W } from "@gardenfi/garden-book";
3
+ import { SwapInput as b } from "./index14.js";
4
+ import { getTimeEstimates as z, IOType as S } from "./index11.js";
5
+ import { InputAddressAndFeeRateDetails as L } from "./index15.js";
6
+ import { isBitcoin as M, isStarknet as O, isSolana as R, isEVM as V, isSui as $ } from "@gardenfi/orderbook";
7
+ import { useSwap as F } from "./index16.js";
8
+ import { capitalizeChain as v } from "./index17.js";
9
+ const X = () => {
10
+ const [w, m] = D(!1), {
11
+ outputAmount: C,
12
+ inputAmount: y,
13
+ inputAsset: e,
14
+ outputAsset: o,
15
+ handleInputAmountChange: A,
16
+ handleOutputAmountChange: x,
17
+ loading: l,
18
+ error: n,
19
+ validSwap: u,
20
+ // inputTokenBalance,
21
+ tokenPrices: d,
22
+ isApproving: f,
23
+ isSwapping: i,
24
+ handleSwapClick: I,
25
+ needsWalletConnection: r,
26
+ controller: E,
27
+ clearSwapState: g,
28
+ swapAssets: N
29
+ } = F(), c = s(() => (!e || !o || M(e.chain) || O(e.chain) || R(e.chain) || V(e.chain) || $(e.chain), !0), [e, o]), k = s(() => r ? `Connect ${v(r)} Wallet` : n.liquidityError ? "Insufficient liquidity" : c ? n.insufficientBalanceError ? "Insufficient balance" : r ? `Connect ${v(r)} Wallet` : f ? "Approving..." : i ? "Signing" : "Swap" : "Wallet does not support the chain", [
30
+ c,
31
+ n.liquidityError,
32
+ f,
33
+ i,
34
+ r,
35
+ n.insufficientBalanceError
36
+ ]), p = s(() => n.liquidityError ? !0 : r ? !1 : !c || i ? !0 : !u, [
37
+ c,
38
+ i,
39
+ u,
40
+ n.liquidityError,
41
+ r
42
+ ]), q = s(() => p ? "disabled" : i ? "ternary" : r || u ? "primary" : "disabled", [p, i, u, r]), B = s(() => !e || !o ? "" : z(e), [e, o]);
43
+ return h(() => {
44
+ let a;
45
+ return l.input || l.output ? a = setTimeout(() => {
46
+ m(!0);
47
+ }, 300) : m(!1), () => {
48
+ a && clearTimeout(a);
49
+ };
50
+ }, [l]), h(() => {
51
+ const a = E.current;
52
+ return () => {
53
+ a && a.abort(), g();
54
+ };
55
+ }, [g, E]), /* @__PURE__ */ t.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ t.createElement("div", { className: "relative flex flex-col gap-3" }, /* @__PURE__ */ t.createElement("div", { className: "w-full" }, /* @__PURE__ */ t.createElement(
56
+ b,
57
+ {
58
+ type: S.input,
59
+ amount: y,
60
+ onChange: A,
61
+ asset: e,
62
+ loading: l.input,
63
+ price: d.input,
64
+ error: n.inputError,
65
+ balance: void 0
66
+ }
67
+ )), /* @__PURE__ */ t.createElement(
68
+ "div",
69
+ {
70
+ className: "absolute left-1/2 top-1/2 -translate-x-[8px] -translate-y-[8px] cursor-pointer",
71
+ onClick: N
72
+ },
73
+ /* @__PURE__ */ t.createElement("div", { className: "h-8 w-8 origin-center rounded-full border border-light-grey bg-white p-1.5 transition-transform hover:scale-[1.05]" }),
74
+ /* @__PURE__ */ t.createElement(T, { className: "pointer-events-none absolute bottom-1.5 left-1.5" })
75
+ ), /* @__PURE__ */ t.createElement("div", { className: "w-full" }, /* @__PURE__ */ t.createElement(
76
+ b,
77
+ {
78
+ type: S.output,
79
+ amount: C,
80
+ onChange: x,
81
+ asset: o,
82
+ loading: l.output,
83
+ price: d.output,
84
+ error: n.outputError,
85
+ timeEstimate: B
86
+ }
87
+ ))), /* @__PURE__ */ t.createElement(L, null), /* @__PURE__ */ t.createElement(
88
+ W,
89
+ {
90
+ className: "w-full mt-3 transition-colors duration-500",
91
+ variant: q,
92
+ size: "lg",
93
+ disabled: p || w,
94
+ onClick: I
95
+ },
96
+ k
97
+ ));
98
+ };
99
+ export {
100
+ X as default
101
+ };
@@ -0,0 +1,2 @@
1
+
2
+ export { GardenComponent } from './lib/GardenComponent';
@@ -0,0 +1,6 @@
1
+ import { default as React } from 'react';
2
+ import { GardenProvider } from '@gardenfi/react-hooks';
3
+
4
+ type Props = Omit<React.ComponentProps<typeof GardenProvider>, 'children'>;
5
+ declare const GardenComponent: React.FC<Props>;
6
+ export { GardenComponent };
@@ -0,0 +1,8 @@
1
+ import { FC } from 'react';
2
+
3
+ type AddressDetailsProps = {
4
+ isRefund?: boolean;
5
+ address: string;
6
+ };
7
+ export declare const AddressDetails: FC<AddressDetailsProps>;
8
+ export {};
@@ -0,0 +1,8 @@
1
+ import { default as React } from 'react';
2
+
3
+ type TooltipProps = {
4
+ chain: string;
5
+ className?: string;
6
+ };
7
+ export declare const ChainsTooltip: ({ chain, className }: TooltipProps) => React.JSX.Element;
8
+ export {};
@@ -0,0 +1,9 @@
1
+ import { OpacityVariants } from '@gardenfi/garden-book';
2
+ import { FC, ReactNode } from 'react';
3
+
4
+ export declare const ResponsiveModal: FC<{
5
+ open: boolean;
6
+ onClose?: () => void;
7
+ children: ReactNode;
8
+ opacityLevel?: OpacityVariants;
9
+ }>;
@@ -0,0 +1,7 @@
1
+ import { default as React } from 'react';
2
+
3
+ export type ModalProps = {
4
+ open: boolean;
5
+ onClose?: () => void;
6
+ };
7
+ export declare const Modal: () => React.JSX.Element;
@@ -0,0 +1,10 @@
1
+ import { default as React } from 'react';
2
+ import { TabKey } from '../types/types';
3
+
4
+ type NavbarProps = {
5
+ active?: TabKey;
6
+ onChange?: (key: TabKey) => void;
7
+ className?: string;
8
+ };
9
+ export declare const Navbar: React.FC<NavbarProps>;
10
+ export {};
@@ -0,0 +1,17 @@
1
+ import { FC } from 'react';
2
+ import { ErrorFormat, IOType } from '../constants/constants';
3
+ import { Asset } from '@gardenfi/orderbook';
4
+
5
+ type SwapInputProps = {
6
+ type: IOType;
7
+ amount: string;
8
+ onChange: (amount: string) => void;
9
+ asset?: Asset;
10
+ loading: boolean;
11
+ price: string;
12
+ error?: ErrorFormat;
13
+ balance?: number;
14
+ timeEstimate?: string;
15
+ };
16
+ export declare const SwapInput: FC<SwapInputProps>;
17
+ export {};
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+
3
+ declare const CreateSwap: () => React.JSX.Element;
4
+ export default CreateSwap;
@@ -0,0 +1,10 @@
1
+ import { default as React } from 'react';
2
+
3
+ type SwapSavingsProps = {
4
+ refundAddress: string | undefined;
5
+ receiveAddress: string | undefined;
6
+ showComparison: (type: 'time' | 'fees') => void;
7
+ networkFeesValue: number;
8
+ };
9
+ export declare const SwapSavingsAndAddresses: ({ refundAddress, receiveAddress, showComparison, networkFeesValue, }: SwapSavingsProps) => React.JSX.Element;
10
+ export {};
@@ -0,0 +1,7 @@
1
+ import { default as React } from 'react';
2
+ import { ApiConfig } from '@gardenfi/core';
3
+
4
+ declare const SwapWidget: ({ network }: {
5
+ network: ApiConfig;
6
+ }) => React.JSX.Element;
7
+ export default SwapWidget;
@@ -0,0 +1,8 @@
1
+ import { default as React } from 'react';
2
+ import { ParsedAsset } from '../../types/types';
3
+
4
+ type Props = {
5
+ onSelect: (asset: ParsedAsset) => void;
6
+ };
7
+ declare const AssetModal: React.FC<Props>;
8
+ export default AssetModal;
@@ -0,0 +1,11 @@
1
+ import { default as React } from 'react';
2
+ import { ParsedChainInfo } from '../../types/types';
3
+
4
+ type SidebarProps = {
5
+ show: boolean;
6
+ chains: ParsedChainInfo[];
7
+ hide: () => void;
8
+ onClick: (chain: ParsedChainInfo) => void;
9
+ };
10
+ export declare const AvailableChainsSidebar: ({ show, chains, hide, onClick, }: SidebarProps) => React.JSX.Element;
11
+ export {};
@@ -0,0 +1,3 @@
1
+ import { default as React } from 'react';
2
+
3
+ export declare const FeesAndRateDetails: () => React.JSX.Element;
@@ -0,0 +1,3 @@
1
+ import { default as React } from 'react';
2
+
3
+ export declare const InputAddress: () => React.JSX.Element;
@@ -0,0 +1,3 @@
1
+ import { default as React } from 'react';
2
+
3
+ export declare const InputAddressAndFeeRateDetails: () => React.JSX.Element;
@@ -0,0 +1,12 @@
1
+ import { FC } from 'react';
2
+ import { Asset } from '@gardenfi/orderbook';
3
+
4
+ type SwapInfoProps = {
5
+ sendAsset: Asset;
6
+ receiveAsset: Asset;
7
+ sendAmount: string | number;
8
+ receiveAmount: string | number;
9
+ equalSplit?: boolean;
10
+ };
11
+ export declare const SwapInfo: FC<SwapInfoProps>;
12
+ export {};
@@ -0,0 +1,7 @@
1
+ import { default as React } from 'react';
2
+
3
+ type TransactionHistoryProps = {
4
+ isOpen?: boolean;
5
+ };
6
+ declare const TransactionHistory: React.FC<TransactionHistoryProps>;
7
+ export default TransactionHistory;
@@ -0,0 +1,11 @@
1
+ import { FC } from 'react';
2
+ import { Order, OrderStatus } from '@gardenfi/orderbook';
3
+
4
+ type TransactionProps = {
5
+ order: Order;
6
+ status?: OrderStatus;
7
+ isLast: boolean;
8
+ isFirst: boolean;
9
+ };
10
+ export declare const TransactionRow: FC<TransactionProps>;
11
+ export {};
@@ -0,0 +1,3 @@
1
+ import { FC } from 'react';
2
+
3
+ export declare const TransactionsSkeleton: FC;
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+
3
+ declare const Transactions: () => React.JSX.Element;
4
+ export default Transactions;
@@ -0,0 +1,7 @@
1
+ import { Variants } from 'motion/react';
2
+
3
+ export declare const delayedFadeAnimation: Variants;
4
+ export declare const expandWithDelayAnimation: Variants;
5
+ export declare const detailsExpandAnimation: Variants;
6
+ export declare const addressExpandAnimation: Variants;
7
+ export declare const expandAnimation: Variants;
@@ -0,0 +1,29 @@
1
+ import { Asset } from '@gardenfi/orderbook';
2
+ import { Network } from '@gardenfi/utils';
3
+
4
+ export type ErrorFormat = `Minimum amount is ${string} ${string}` | `Maximum amount is ${string} ${string}` | 'Output amount too high' | 'Output amount too less' | 'Invalid From Asset' | 'Invalid To Asset' | true | '';
5
+ export declare const Errors: {
6
+ readonly minError: (amount: string, asset: string) => ErrorFormat;
7
+ readonly maxError: (amount: string, asset: string) => ErrorFormat;
8
+ readonly outHigh: "Output amount too high";
9
+ readonly outLow: "Output amount too less";
10
+ readonly insufficientLiquidity: true;
11
+ readonly insufficientBalance: true;
12
+ readonly none: "";
13
+ readonly invalidFomAssset: "Invalid From Asset";
14
+ readonly invalidToAsset: "Invalid To Asset";
15
+ };
16
+ export declare enum IOType {
17
+ input = "input",
18
+ output = "output"
19
+ }
20
+ export declare const API_ENDPOINTS: Record<Network, {
21
+ api: string;
22
+ explorer: string;
23
+ }>;
24
+ export declare const DEFAULT_NETWORK = Network.TESTNET;
25
+ export declare const getApiEndpoint: (network: Network) => {
26
+ api: string;
27
+ explorer: string;
28
+ };
29
+ export declare const getTimeEstimates: (inputAsset: Asset) => "" | "~30s" | "~10m";
File without changes
@@ -0,0 +1,29 @@
1
+ import { IOType } from '../constants/constants';
2
+
3
+ export declare const useSwap: () => {
4
+ inputAmount: string;
5
+ outputAmount: string;
6
+ inputAsset: import('../types/types').ParsedAsset | undefined;
7
+ outputAsset: import('../types/types').ParsedAsset | undefined;
8
+ tokenPrices: import('../store/swapStore').TokenPrices;
9
+ rate: number;
10
+ error: import('../store/swapStore').SwapErrors;
11
+ isEditBTCAddress: boolean;
12
+ loading: import('../store/swapStore').FetchingQuote;
13
+ validSwap: boolean;
14
+ isSwapping: boolean;
15
+ isApproving: boolean;
16
+ isBitcoinSwap: boolean;
17
+ needsWalletConnection: string | null;
18
+ btcAddress: string;
19
+ controller: import('react').MutableRefObject<AbortController | null>;
20
+ isComparisonVisible: boolean;
21
+ setBtcAddress: (btcAddress: string) => void;
22
+ swapAssets: () => void;
23
+ handleInputAmountChange: (amount: string) => Promise<void>;
24
+ handleOutputAmountChange: (amount: string) => Promise<void>;
25
+ handleSwapClick: () => Promise<void>;
26
+ setAsset: (ioType: IOType, asset: import('../types/types').ParsedAsset | undefined) => void;
27
+ clearSwapState: () => void;
28
+ setIsComparisonVisible: (isComparisonVisible: boolean) => void;
29
+ };
@@ -0,0 +1,23 @@
1
+ import { ParsedChainInfo, ParsedAsset } from '../types/types';
2
+ import { IOType } from '../constants/constants';
3
+ import { Network } from '@gardenfi/utils';
4
+
5
+ type AssetStoreState = {
6
+ filter: string;
7
+ chains: ParsedChainInfo[];
8
+ allAssets: ParsedAsset[];
9
+ isLoading: boolean;
10
+ error: string | null;
11
+ currentNetwork: Network;
12
+ openAssetModal: () => void;
13
+ closeAssetModal: () => void;
14
+ modalOpenFor: IOType | null;
15
+ isAssetModalOpen: boolean;
16
+ openModal: (side: IOType) => void;
17
+ closeModal: () => void;
18
+ setFilter: (filter: string) => void;
19
+ fetchAssets: (network?: Network) => Promise<void>;
20
+ setCurrentNetwork: (network: Network) => void;
21
+ };
22
+ export declare const assetInfoStore: import('zustand').UseBoundStore<import('zustand').StoreApi<AssetStoreState>>;
23
+ export {};
@@ -0,0 +1,79 @@
1
+ import { IOType, ErrorFormat } from '../constants/constants';
2
+ import { Network } from '@gardenfi/utils';
3
+ import { ParsedAsset } from '../types/types';
4
+
5
+ export type TokenPrices = {
6
+ input: string;
7
+ output: string;
8
+ };
9
+ export type FetchingQuote = {
10
+ input: boolean;
11
+ output: boolean;
12
+ };
13
+ export type SwapErrors = {
14
+ inputError?: ErrorFormat;
15
+ outputError?: ErrorFormat;
16
+ liquidityError?: ErrorFormat;
17
+ insufficientBalanceError?: ErrorFormat;
18
+ };
19
+ type SwapState = {
20
+ inputAsset?: ParsedAsset;
21
+ outputAsset?: ParsedAsset;
22
+ inputAmount: string;
23
+ outputAmount: string;
24
+ rate: number;
25
+ networkFees: number;
26
+ btcAddress: string;
27
+ isSwapping: boolean;
28
+ isApproving: boolean;
29
+ tokenPrices: TokenPrices;
30
+ error: SwapErrors;
31
+ isNetworkFeesLoading: boolean;
32
+ isFetchingQuote: FetchingQuote;
33
+ isEditBTCAddress: boolean;
34
+ isComparisonVisible: boolean;
35
+ isValidBitcoinAddress: boolean;
36
+ showComparison: {
37
+ isTime: boolean;
38
+ isFees: boolean;
39
+ };
40
+ maxTimeSaved: number;
41
+ maxCostSaved: number;
42
+ currentNetwork: Network;
43
+ setCurrentNetwork: (network: Network) => void;
44
+ setTokenPrices: (tokenPrices: TokenPrices) => void;
45
+ setIsSwapping: (isSwapping: boolean) => void;
46
+ setIsApproving: (isApproving: boolean) => void;
47
+ setAsset: (ioType: IOType, asset: ParsedAsset | undefined) => void;
48
+ setAmount: (ioType: IOType, amount: string) => void;
49
+ setRate: (rate: number) => void;
50
+ setNetworkFees: (networkFees: number) => void;
51
+ setIsNetworkFeesLoading: (isNetworkFeesLoading: boolean) => void;
52
+ setBtcAddress: (btcAddress: string) => void;
53
+ swapAssets: () => void;
54
+ setError: (error: SwapErrors) => void;
55
+ setIsFetchingQuote: (isFetchingQuote: FetchingQuote) => void;
56
+ setIsEditBTCAddress: (isEditBTCAddress: boolean) => void;
57
+ setIsComparisonVisible: (isComparisonVisible: boolean) => void;
58
+ setIsValidBitcoinAddress: (isValidBitcoinAddress: boolean) => void;
59
+ showComparisonHandler: (type: 'time' | 'fees') => void;
60
+ hideComparison: () => void;
61
+ updateComparisonSavings: (time: number, cost: number) => void;
62
+ clearSwapState: () => void;
63
+ clear: () => void;
64
+ clearSwapInputState: () => void;
65
+ };
66
+ export declare const BTC: {
67
+ name: string;
68
+ decimals: number;
69
+ symbol: string;
70
+ logo: string;
71
+ tokenAddress: string;
72
+ atomicSwapAddress: string;
73
+ chain: "solana_localnet" | "arbitrum_localnet" | "ethereum_localnet" | "bitcoin_regtest" | "starknet_devnet" | "solana_testnet" | "bitcoin_testnet" | "ethereum_sepolia" | "arbitrum_sepolia" | "base_sepolia" | "bera_testnet" | "citrea_testnet" | "monad_testnet" | "starknet_sepolia" | "sui_testnet" | "hyperliquid_testnet" | "bnbchain_testnet" | "bitcoin" | "base" | "arbitrum" | "ethereum" | "solana" | "bera" | "starknet" | "sui" | "hyperliquid" | "unichain" | "corn" | "botanix" | "bnbchain" | "core";
74
+ price: number;
75
+ min_amount: string;
76
+ max_amount: string;
77
+ };
78
+ export declare const swapStore: import('zustand').UseBoundStore<import('zustand').StoreApi<SwapState>>;
79
+ export {};
@@ -0,0 +1,17 @@
1
+ import { BlockchainType, OrderWithStatus } from '@gardenfi/orderbook';
2
+ import { IGardenJS } from '@gardenfi/core';
3
+
4
+ type TransactionHistoryStoreState = {
5
+ transactions: OrderWithStatus[];
6
+ isLoading: boolean;
7
+ perPage: number;
8
+ totalItems: number;
9
+ fetchTransactions: (garden: IGardenJS, connectedWallets: {
10
+ [key in BlockchainType]: string;
11
+ }, append?: boolean) => Promise<void>;
12
+ loadMore: (garden: IGardenJS, connectedWallets: {
13
+ [key in BlockchainType]: string;
14
+ }) => Promise<void>;
15
+ };
16
+ declare const transactionHistoryStore: import('zustand').UseBoundStore<import('zustand').StoreApi<TransactionHistoryStoreState>>;
17
+ export default transactionHistoryStore;
@@ -0,0 +1,17 @@
1
+ export declare const BREAKPOINTS: {
2
+ xs: number;
3
+ sm: number;
4
+ md: number;
5
+ lg: number;
6
+ xl: number;
7
+ '2xl': number;
8
+ };
9
+ type ViewPortStore = {
10
+ width: number;
11
+ height: number;
12
+ isMobile: boolean;
13
+ isTab: boolean;
14
+ updateViewport: () => void;
15
+ };
16
+ export declare const viewPortStore: import('zustand').UseBoundStore<import('zustand').StoreApi<ViewPortStore>>;
17
+ export {};
@@ -0,0 +1,54 @@
1
+ import { Asset, Chain } from '@gardenfi/orderbook';
2
+
3
+ export type TabKey = 'swap' | 'history';
4
+ export interface AssetFromResponse {
5
+ id: string;
6
+ chain: string;
7
+ icon: string;
8
+ htlc: {
9
+ address: string;
10
+ schema: string;
11
+ } | null;
12
+ token: {
13
+ address: string;
14
+ schema: string | null;
15
+ } | null;
16
+ decimals: number;
17
+ min_amount: string;
18
+ max_amount: string;
19
+ price: number;
20
+ }
21
+ export interface ChainInfo {
22
+ chain: string;
23
+ id: string;
24
+ icon: string;
25
+ explorer_url: string;
26
+ confirmation_target: number;
27
+ source_timelock: string;
28
+ destination_timelock: string;
29
+ supported_htlc_schemas: string[];
30
+ supported_token_schemas: string[];
31
+ assets: AssetFromResponse[];
32
+ }
33
+ export interface ChainsApiResponse {
34
+ status: string;
35
+ result: ChainInfo[];
36
+ }
37
+ export interface ParsedChainInfo {
38
+ chain: Chain;
39
+ chainName: string;
40
+ chainId: string;
41
+ iconUrl: string;
42
+ explorerUrl: string;
43
+ confirmationTarget: number;
44
+ sourceTimelock: number;
45
+ destinationTimelock: number;
46
+ supportedHtlcSchemas: string[];
47
+ supportedTokenSchemas: string[];
48
+ assets: ParsedAsset[];
49
+ }
50
+ export interface ParsedAsset extends Asset {
51
+ price: number;
52
+ min_amount: string;
53
+ max_amount: string;
54
+ }
@@ -0,0 +1,14 @@
1
+ import { Swap } from '@gardenfi/orderbook';
2
+ import { ParsedAsset } from '../types/types';
3
+
4
+ export declare const getDayDifference: (date: string) => string;
5
+ export declare const getAssetFromSwap: (swap: Swap, assets: ParsedAsset[] | null) => ParsedAsset | null | undefined;
6
+ export declare const formatAmount: (amount: string | number | bigint, decimals: number, toFixed?: number) => number;
7
+ export declare const getTrimmedAddress: (address: string, start?: number, end?: number) => string;
8
+ export declare const formatTime: (totalSeconds: number | string) => string;
9
+ export declare const capitalizeChain: (chainKey: string) => string;
10
+ export declare function parseAssetId(assetId: string): {
11
+ chainKey: string;
12
+ symbol: string;
13
+ };
14
+ export declare function formatChainName(chainKey: string): string;
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.absolute{position:absolute}.relative{position:relative}.bottom-1\.5{bottom:.375rem}.left-0{left:0}.left-1\.5{left:.375rem}.left-1\/2{left:50%}.left-auto{left:auto}.top-0{top:0}.top-1\/2{top:50%}.top-60{top:15rem}.z-0{z-index:0}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.m-1{margin:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.-mr-3\.5{margin-right:-.875rem}.-mt-\[84px\]{margin-top:-84px}.ml-auto{margin-left:auto}.mt-3{margin-top:.75rem}.mt-6{margin-top:1.5rem}.inline-block{display:inline-block}.\!flex{display:flex!important}.flex{display:flex}.hidden{display:none}.h-12{height:3rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-\[316px\]{height:316px}.h-full{height:100%}.h-px{height:1px}.max-h-0{max-height:0px}.max-h-4{max-height:1rem}.max-h-7{max-height:1.75rem}.max-h-\[388px\]{max-height:388px}.max-h-\[496px\]{max-height:496px}.min-h-0{min-height:0px}.min-h-10{min-height:2.5rem}.min-h-\[274px\]{min-height:274px}.min-h-\[334px\]{min-height:334px}.w-1\/4{width:25%}.w-10{width:2.5rem}.w-12{width:3rem}.w-2\.5{width:.625rem}.w-2\/3{width:66.666667%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[150px\]{width:150px}.w-\[424px\]{width:424px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-32{min-width:8rem}.min-w-fit{min-width:-moz-fit-content;min-width:fit-content}.max-w-0{max-width:0px}.max-w-24{max-width:6rem}.max-w-4{max-width:1rem}.max-w-\[150px\]{max-width:150px}.max-w-\[424px\]{max-width:424px}.max-w-\[560px\]{max-width:560px}.flex-1{flex:1 1 0%}.flex-grow{flex-grow:1}.origin-center{transform-origin:center}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-4{--tw-translate-x: -1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-\[8px\]{--tw-translate-x: -8px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-\[8px\]{--tw-translate-y: -8px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-7{--tw-translate-x: 1.75rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-45{--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.\!cursor-pointer{cursor:pointer!important}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-end{align-items:flex-end}.\!items-center{align-items:center!important}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.\!gap-2{gap:.5rem!important}.gap-0{gap:0px}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-y-auto{overflow-y:auto}.\!text-nowrap{text-wrap:nowrap!important}.text-nowrap{text-wrap:nowrap}.rounded-2xl{border-radius:1rem}.rounded-\[16px\]{border-radius:16px}.rounded-\[20px\]{border-radius:20px}.rounded-\[38px\]{border-radius:38px}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.border{border-width:1px}.border-light-grey{--tw-border-opacity: 1;border-color:rgb(227 224 235 / var(--tw-border-opacity, 1))}.\!bg-white{--tw-bg-opacity: 1 !important;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))!important}.\!bg-white\/50{background-color:#ffffff80!important}.bg-garden-grey{--tw-bg-opacity: 1;background-color:rgb(228 235 242 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/30{background-color:#ffffff4d}.bg-white\/50{background-color:#ffffff80}.\!fill-mid-grey{fill:#908aad!important}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-\[3px\]{padding:3px}.\!px-4{padding-left:1rem!important;padding-right:1rem!important}.\!py-1\.5{padding-top:.375rem!important;padding-bottom:.375rem!important}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-\[14px\]{padding-left:14px;padding-right:14px}.py-0{padding-top:0;padding-bottom:0}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-\[10px\]{padding-top:10px;padding-bottom:10px}.py-\[1px\]{padding-top:1px;padding-bottom:1px}.py-\[3px\]{padding-top:3px;padding-bottom:3px}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pl-1{padding-left:.25rem}.pr-2{padding-right:.5rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-7{padding-top:1.75rem}.\!text-center{text-align:center!important}.text-center{text-align:center}.\!text-start{text-align:start!important}.text-start{text-align:start}.font-\[inherit\]{font-family:inherit}.text-xs{font-size:.75rem;line-height:1rem}.\!leading-none{line-height:1!important}.tracking-normal{letter-spacing:0em}.\!text-dark-grey{--tw-text-opacity: 1 !important;color:rgb(71 60 117 / var(--tw-text-opacity, 1))!important}.\!text-mid-grey{--tw-text-opacity: 1 !important;color:rgb(144 138 173 / var(--tw-text-opacity, 1))!important}.text-dark-grey{--tw-text-opacity: 1;color:rgb(71 60 117 / var(--tw-text-opacity, 1))}.text-mid-grey{--tw-text-opacity: 1;color:rgb(144 138 173 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-75{opacity:.75}.outline-none{outline:2px solid transparent;outline-offset:2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-700{transition-duration:.7s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}body{overscroll-behavior:none;color:#473c75}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.placeholder\:text-mid-grey::-moz-placeholder{--tw-text-opacity: 1;color:rgb(144 138 173 / var(--tw-text-opacity, 1))}.placeholder\:text-mid-grey::placeholder{--tw-text-opacity: 1;color:rgb(144 138 173 / var(--tw-text-opacity, 1))}.hover\:scale-\[1\.05\]:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:bg-\[\#f4f0fc\]:hover{--tw-bg-opacity: 1;background-color:rgb(244 240 252 / var(--tw-bg-opacity, 1))}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-white\/50:hover{background-color:#ffffff80}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}@media (min-width: 640px){.sm\:visible{visibility:visible}.sm\:block{display:block}.sm\:h-7{height:1.75rem}.sm\:min-w-\[468px\]{min-width:468px}.sm\:max-w-\[424px\]{max-width:424px}}@media (min-width: 768px){.md\:w-\[200px\]{width:200px}.md\:max-w-\[200px\]{max-width:200px}}