@mantle-rwa/react 0.1.0 → 0.1.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.
Files changed (80) hide show
  1. package/LICENSE +0 -0
  2. package/dist/cjs/components/ConnectWalletPrompt.js +13 -0
  3. package/dist/cjs/components/ConnectWalletPrompt.js.map +1 -0
  4. package/dist/cjs/components/ErrorDisplay.js +42 -0
  5. package/dist/cjs/components/ErrorDisplay.js.map +1 -0
  6. package/dist/cjs/components/InvestorDashboard.js +156 -0
  7. package/dist/cjs/components/InvestorDashboard.js.map +1 -0
  8. package/dist/cjs/components/KYCFlow.js +146 -0
  9. package/dist/cjs/components/KYCFlow.js.map +1 -0
  10. package/dist/cjs/components/LoadingSpinner.js +18 -0
  11. package/dist/cjs/components/LoadingSpinner.js.map +1 -0
  12. package/dist/cjs/components/TokenMintForm.js +163 -0
  13. package/dist/cjs/components/TokenMintForm.js.map +1 -0
  14. package/dist/cjs/components/YieldCalculator.js +97 -0
  15. package/dist/cjs/components/YieldCalculator.js.map +1 -0
  16. package/dist/cjs/hooks/useRWA.js +87 -40
  17. package/dist/cjs/hooks/useRWA.js.map +1 -1
  18. package/dist/cjs/index.js +11 -1
  19. package/dist/cjs/index.js.map +1 -1
  20. package/dist/cjs/types/index.js +2 -2
  21. package/dist/cjs/types/index.js.map +1 -1
  22. package/dist/esm/components/ConnectWalletPrompt.js +10 -0
  23. package/dist/esm/components/ConnectWalletPrompt.js.map +1 -0
  24. package/dist/esm/components/ErrorDisplay.js +38 -0
  25. package/dist/esm/components/ErrorDisplay.js.map +1 -0
  26. package/dist/esm/components/InvestorDashboard.js +153 -0
  27. package/dist/esm/components/InvestorDashboard.js.map +1 -0
  28. package/dist/esm/components/KYCFlow.js +143 -0
  29. package/dist/esm/components/KYCFlow.js.map +1 -0
  30. package/dist/esm/components/LoadingSpinner.js +15 -0
  31. package/dist/esm/components/LoadingSpinner.js.map +1 -0
  32. package/dist/esm/components/TokenMintForm.js +158 -0
  33. package/dist/esm/components/TokenMintForm.js.map +1 -0
  34. package/dist/esm/components/YieldCalculator.js +94 -0
  35. package/dist/esm/components/YieldCalculator.js.map +1 -0
  36. package/dist/esm/hooks/useRWA.js +86 -39
  37. package/dist/esm/hooks/useRWA.js.map +1 -1
  38. package/dist/esm/index.js +4 -0
  39. package/dist/esm/index.js.map +1 -1
  40. package/dist/esm/types/index.js +3 -3
  41. package/dist/esm/types/index.js.map +1 -1
  42. package/dist/styles.css +3 -1
  43. package/dist/types/components/ConnectWalletPrompt.d.ts +15 -0
  44. package/dist/types/components/ConnectWalletPrompt.d.ts.map +1 -0
  45. package/dist/types/components/ErrorDisplay.d.ts +16 -0
  46. package/dist/types/components/ErrorDisplay.d.ts.map +1 -0
  47. package/dist/types/components/InvestorDashboard.d.ts +7 -0
  48. package/dist/types/components/InvestorDashboard.d.ts.map +1 -0
  49. package/dist/types/components/KYCFlow.d.ts +7 -0
  50. package/dist/types/components/KYCFlow.d.ts.map +1 -0
  51. package/dist/types/components/LoadingSpinner.d.ts +10 -0
  52. package/dist/types/components/LoadingSpinner.d.ts.map +1 -0
  53. package/dist/types/components/TokenMintForm.d.ts +15 -0
  54. package/dist/types/components/TokenMintForm.d.ts.map +1 -0
  55. package/dist/types/components/YieldCalculator.d.ts +7 -0
  56. package/dist/types/components/YieldCalculator.d.ts.map +1 -0
  57. package/dist/types/hooks/useRWA.d.ts +7 -19
  58. package/dist/types/hooks/useRWA.d.ts.map +1 -1
  59. package/dist/types/index.d.ts +5 -1
  60. package/dist/types/index.d.ts.map +1 -1
  61. package/dist/types/types/index.d.ts +113 -131
  62. package/dist/types/types/index.d.ts.map +1 -1
  63. package/package.json +65 -63
  64. package/src/components/ConnectWalletPrompt.tsx +47 -0
  65. package/src/components/ErrorDisplay.tsx +90 -0
  66. package/src/components/InvestorDashboard.tsx +315 -0
  67. package/src/components/KYCFlow.tsx +267 -0
  68. package/src/components/LoadingSpinner.tsx +33 -0
  69. package/src/components/TokenMintForm.tsx +291 -0
  70. package/src/components/YieldCalculator.tsx +250 -0
  71. package/src/hooks/useRWA.ts +90 -50
  72. package/src/index.ts +5 -17
  73. package/src/styles/index.css +60 -175
  74. package/src/types/index.ts +142 -135
  75. package/src/components/InvestorDashboard/index.tsx +0 -359
  76. package/src/components/KYCFlow/index.tsx +0 -434
  77. package/src/components/TokenMintForm/index.tsx +0 -590
  78. package/src/components/YieldCalculator/index.tsx +0 -541
  79. package/src/components/index.ts +0 -8
  80. package/src/hooks/index.ts +0 -5
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.YieldCalculator = YieldCalculator;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ /**
7
+ * YieldCalculator - Calculator for previewing yield distributions
8
+ *
9
+ * Shows how yields will be allocated to token holders before creating a distribution.
10
+ */
11
+ const react_1 = require("react");
12
+ const viem_1 = require("viem");
13
+ const useRWA_1 = require("../hooks/useRWA");
14
+ /**
15
+ * Format address for display
16
+ */
17
+ function formatAddress(address) {
18
+ return `${address.slice(0, 6)}...${address.slice(-4)}`;
19
+ }
20
+ /**
21
+ * Format token amount for display
22
+ */
23
+ function formatAmount(amount, decimals = 18) {
24
+ const formatted = (0, viem_1.formatUnits)(amount, decimals);
25
+ const num = parseFloat(formatted);
26
+ return num.toLocaleString(undefined, { maximumFractionDigits: 4 });
27
+ }
28
+ /**
29
+ * YieldCalculator component
30
+ */
31
+ function YieldCalculator({ tokenAddress, yieldDistributorAddress: _yieldDistributorAddress, holderAddresses, onCalculate, onError, className = '', }) {
32
+ const { client, isInitialized } = (0, useRWA_1.useRWA)();
33
+ const [amount, setAmount] = (0, react_1.useState)('');
34
+ const [preview, setPreview] = (0, react_1.useState)(null);
35
+ const [isLoading, setIsLoading] = (0, react_1.useState)(false);
36
+ const [error, setError] = (0, react_1.useState)(null);
37
+ // Debounce timer ref
38
+ const debounceRef = (0, react_1.useRef)(null);
39
+ // Calculate preview
40
+ const calculatePreview = (0, react_1.useCallback)(async (distributionAmount) => {
41
+ if (!client || !isInitialized || !distributionAmount || parseFloat(distributionAmount) <= 0) {
42
+ setPreview(null);
43
+ return;
44
+ }
45
+ setIsLoading(true);
46
+ setError(null);
47
+ try {
48
+ const result = await client.yield.previewDistribution(tokenAddress, distributionAmount, undefined, // snapshotId
49
+ holderAddresses);
50
+ setPreview(result);
51
+ onCalculate?.(result);
52
+ }
53
+ catch (err) {
54
+ const errorObj = err instanceof Error ? err : new Error('Failed to calculate preview');
55
+ setError(errorObj);
56
+ onError?.(errorObj);
57
+ setPreview(null);
58
+ }
59
+ finally {
60
+ setIsLoading(false);
61
+ }
62
+ }, [client, isInitialized, tokenAddress, holderAddresses, onCalculate, onError]);
63
+ // Handle amount change with debounce
64
+ const handleAmountChange = (0, react_1.useCallback)((e) => {
65
+ const value = e.target.value;
66
+ setAmount(value);
67
+ // Clear previous debounce
68
+ if (debounceRef.current) {
69
+ clearTimeout(debounceRef.current);
70
+ }
71
+ // Debounce the calculation
72
+ debounceRef.current = setTimeout(() => {
73
+ calculatePreview(value);
74
+ }, 500);
75
+ }, [calculatePreview]);
76
+ // Cleanup debounce on unmount
77
+ (0, react_1.useEffect)(() => {
78
+ return () => {
79
+ if (debounceRef.current) {
80
+ clearTimeout(debounceRef.current);
81
+ }
82
+ };
83
+ }, []);
84
+ // Recalculate when holder addresses change
85
+ (0, react_1.useEffect)(() => {
86
+ if (amount && parseFloat(amount) > 0) {
87
+ calculatePreview(amount);
88
+ }
89
+ }, [holderAddresses]); // eslint-disable-line react-hooks/exhaustive-deps
90
+ // Handle manual calculate button
91
+ const handleCalculate = (0, react_1.useCallback)(() => {
92
+ calculatePreview(amount);
93
+ }, [amount, calculatePreview]);
94
+ return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-yield-calculator ${className}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "space-y-6", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "distribution-amount", className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: "Total Distribution Amount" }), (0, jsx_runtime_1.jsxs)("div", { className: "mt-1 flex rounded-md shadow-sm", children: [(0, jsx_runtime_1.jsx)("input", { type: "text", id: "distribution-amount", value: amount, onChange: handleAmountChange, placeholder: "Enter amount to distribute", className: "flex-1 block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-l-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-800 dark:text-white" }), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: handleCalculate, disabled: isLoading || !amount, className: "px-4 py-2 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-r-md transition-colors", children: isLoading ? 'Calculating...' : 'Calculate' })] })] }), isLoading && ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-center p-4", children: [(0, jsx_runtime_1.jsx)("div", { className: "animate-spin rounded-full h-6 w-6 border-b-2 border-blue-600" }), (0, jsx_runtime_1.jsx)("span", { className: "ml-2 text-gray-600 dark:text-gray-300", children: "Calculating distribution..." })] })), error && ((0, jsx_runtime_1.jsxs)("div", { className: "p-4 bg-red-50 dark:bg-red-900/20 rounded-lg border border-red-200 dark:border-red-800", children: [(0, jsx_runtime_1.jsx)("p", { className: "text-red-700 dark:text-red-300", children: error.message }), (0, jsx_runtime_1.jsx)("button", { onClick: handleCalculate, className: "mt-2 text-sm text-red-600 dark:text-red-400 underline hover:no-underline", children: "Retry" })] })), preview && !isLoading && ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "p-4 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700", children: [(0, jsx_runtime_1.jsx)("h4", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: "Distribution Summary" }), (0, jsx_runtime_1.jsxs)("div", { className: "mt-2 grid grid-cols-2 gap-4", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: "Total Holders" }), (0, jsx_runtime_1.jsx)("p", { className: "text-lg font-semibold text-gray-900 dark:text-white", children: preview.totalHolders })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: "Total Supply" }), (0, jsx_runtime_1.jsx)("p", { className: "text-lg font-semibold text-gray-900 dark:text-white", children: formatAmount(preview.totalSupplyAtSnapshot) })] })] })] }), preview.distributions.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700", children: (0, jsx_runtime_1.jsxs)("table", { className: "min-w-full divide-y divide-gray-200 dark:divide-gray-700", children: [(0, jsx_runtime_1.jsx)("thead", { className: "bg-gray-50 dark:bg-gray-800", children: (0, jsx_runtime_1.jsxs)("tr", { children: [(0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider", children: "Address" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider", children: "Balance" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider", children: "Yield Amount" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider", children: "Share" })] }) }), (0, jsx_runtime_1.jsx)("tbody", { className: "bg-white dark:bg-gray-900 divide-y divide-gray-200 dark:divide-gray-700", children: preview.distributions.map((dist) => ((0, jsx_runtime_1.jsxs)("tr", { children: [(0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3 whitespace-nowrap text-sm font-mono text-gray-900 dark:text-white", children: formatAddress(dist.address) }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3 whitespace-nowrap text-sm text-right text-gray-600 dark:text-gray-300", children: formatAmount(dist.balance) }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3 whitespace-nowrap text-sm text-right font-medium text-green-600 dark:text-green-400", children: formatAmount(dist.yieldAmount) }), (0, jsx_runtime_1.jsxs)("td", { className: "px-4 py-3 whitespace-nowrap text-sm text-right text-gray-600 dark:text-gray-300", children: [dist.percentage.toFixed(2), "%"] })] }, dist.address))) })] }) })), preview.distributions.length === 0 && ((0, jsx_runtime_1.jsx)("div", { className: "p-4 bg-yellow-50 dark:bg-yellow-900/20 rounded-lg border border-yellow-200 dark:border-yellow-800", children: (0, jsx_runtime_1.jsx)("p", { className: "text-yellow-700 dark:text-yellow-300", children: "No holder addresses provided or no holders have balances." }) }))] })), !preview && !isLoading && !error && ((0, jsx_runtime_1.jsx)("div", { className: "p-6 text-center text-gray-500 dark:text-gray-400", children: (0, jsx_runtime_1.jsx)("p", { children: "Enter a distribution amount to preview how yields will be allocated." }) }))] }) }));
95
+ }
96
+ exports.default = YieldCalculator;
97
+ //# sourceMappingURL=YieldCalculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YieldCalculator.js","sourceRoot":"","sources":["../../../src/components/YieldCalculator.tsx"],"names":[],"mappings":"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"}
@@ -1,54 +1,101 @@
1
1
  "use strict";
2
- /**
3
- * useRWA hook for accessing RWA SDK functionality in React components
4
- */
2
+ 'use client';
5
3
  Object.defineProperty(exports, "__esModule", { value: true });
6
4
  exports.useRWA = useRWA;
5
+ /**
6
+ * useRWA - Core hook for accessing the RWA SDK client
7
+ *
8
+ * Provides access to the @mantle-rwa/sdk RWAClient instance with
9
+ * automatic wagmi wallet integration.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import { useRWA } from '@mantle-rwa/react';
14
+ *
15
+ * function MyComponent() {
16
+ * const { client, isInitialized, hasSigner } = useRWA();
17
+ *
18
+ * if (!isInitialized) return <div>Loading...</div>;
19
+ *
20
+ * // Use client.token, client.kyc, client.yield, client.compliance
21
+ * }
22
+ * ```
23
+ */
7
24
  const react_1 = require("react");
25
+ const wagmi_1 = require("wagmi");
26
+ const ethers_1 = require("ethers");
27
+ const sdk_1 = require("@mantle-rwa/sdk");
28
+ // Default contract addresses (can be overridden via config)
29
+ const DEFAULT_CONTRACTS = {
30
+ token: undefined,
31
+ kycRegistry: undefined,
32
+ yieldDistributor: undefined,
33
+ assetVault: undefined,
34
+ factory: undefined,
35
+ };
8
36
  /**
9
- * Hook for accessing RWA SDK functionality
10
- * Provides connection status and SDK client access
37
+ * Hook for initializing and managing the RWA SDK client
38
+ *
39
+ * @param config - Optional configuration for network and contract addresses
40
+ * @returns UseRWAReturn object with client, state, and utilities
11
41
  */
12
- function useRWA() {
13
- const [isInitialized, setIsInitialized] = (0, react_1.useState)(false);
14
- const [chainId, setChainId] = (0, react_1.useState)(undefined);
15
- const [address, setAddress] = (0, react_1.useState)(undefined);
16
- const [isConnected, setIsConnected] = (0, react_1.useState)(false);
42
+ function useRWA(config) {
43
+ const { isConnected } = (0, wagmi_1.useAccount)();
44
+ const { data: walletClient } = (0, wagmi_1.useWalletClient)();
45
+ const [client, setClient] = (0, react_1.useState)(null);
46
+ const [isLoading, setIsLoading] = (0, react_1.useState)(true);
17
47
  const [error, setError] = (0, react_1.useState)(null);
18
- (0, react_1.useEffect)(() => {
19
- // Initialize SDK client
20
- const initializeSDK = async () => {
21
- try {
22
- // Check if window.ethereum is available (browser wallet)
23
- if (typeof window !== 'undefined' && window.ethereum) {
24
- const accounts = await window.ethereum.request?.({
25
- method: 'eth_accounts',
26
- });
27
- if (accounts && accounts.length > 0) {
28
- setAddress(accounts[0]);
29
- setIsConnected(true);
30
- }
31
- const chainIdHex = await window.ethereum.request?.({
32
- method: 'eth_chainId',
33
- });
34
- if (chainIdHex) {
35
- setChainId(parseInt(chainIdHex, 16));
36
- }
37
- }
38
- setIsInitialized(true);
48
+ const network = config?.network ?? 'mantle-sepolia';
49
+ // Initialize or reinitialize the client
50
+ const initializeClient = (0, react_1.useCallback)(async () => {
51
+ setIsLoading(true);
52
+ setError(null);
53
+ try {
54
+ let rwaClient;
55
+ if (walletClient && isConnected) {
56
+ // Create client with wallet signer for write operations
57
+ const provider = new ethers_1.BrowserProvider(walletClient.transport);
58
+ const signer = await provider.getSigner();
59
+ rwaClient = new sdk_1.RWAClient({
60
+ network,
61
+ signer,
62
+ });
39
63
  }
40
- catch (err) {
41
- setError(err instanceof Error ? err : new Error('Failed to initialize RWA SDK'));
64
+ else {
65
+ // Create read-only client (no signer)
66
+ rwaClient = new sdk_1.RWAClient({
67
+ network,
68
+ });
42
69
  }
43
- };
44
- initializeSDK();
45
- }, []);
70
+ setClient(rwaClient);
71
+ }
72
+ catch (err) {
73
+ const errorMessage = err instanceof Error ? err.message : 'Failed to initialize RWA client';
74
+ setError(new Error(errorMessage));
75
+ setClient(null);
76
+ }
77
+ finally {
78
+ setIsLoading(false);
79
+ }
80
+ }, [walletClient, isConnected, network]);
81
+ // Initialize client on mount and when wallet changes
82
+ (0, react_1.useEffect)(() => {
83
+ initializeClient();
84
+ }, [initializeClient]);
85
+ // Memoized contract addresses
86
+ const contracts = (0, react_1.useMemo)(() => ({
87
+ ...DEFAULT_CONTRACTS,
88
+ ...config?.contracts,
89
+ }), [config?.contracts]);
46
90
  return {
47
- isInitialized,
48
- chainId,
49
- address,
50
- isConnected,
91
+ client,
92
+ isInitialized: client !== null && !isLoading,
93
+ isLoading,
51
94
  error,
95
+ hasSigner: client?.hasSigner ?? false,
96
+ contracts,
97
+ reinitialize: initializeClient,
52
98
  };
53
99
  }
100
+ exports.default = useRWA;
54
101
  //# sourceMappingURL=useRWA.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useRWA.js","sourceRoot":"","sources":["../../../src/hooks/useRWA.ts"],"names":[],"mappings":";AAAA;;GAEG;;AASH,wBA+CC;AAtDD,iCAA4C;AAG5C;;;GAGG;AACH,SAAgB,MAAM;IAClB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAAqB,SAAS,CAAC,CAAC;IACtE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAAqB,SAAS,CAAC,CAAC;IACtE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAe,IAAI,CAAC,CAAC;IAEvD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACX,wBAAwB;QACxB,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;YAC7B,IAAI,CAAC;gBACD,yDAAyD;gBACzD,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACnD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;wBAC7C,MAAM,EAAE,cAAc;qBACzB,CAAyB,CAAC;oBAE3B,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAClC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;wBACxB,cAAc,CAAC,IAAI,CAAC,CAAC;oBACzB,CAAC;oBAED,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;wBAC/C,MAAM,EAAE,aAAa;qBACxB,CAAuB,CAAC;oBAEzB,IAAI,UAAU,EAAE,CAAC;wBACb,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;oBACzC,CAAC;gBACL,CAAC;gBAED,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACrF,CAAC;QACL,CAAC,CAAC;QAEF,aAAa,EAAE,CAAC;IACpB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACH,aAAa;QACb,OAAO;QACP,OAAO;QACP,WAAW;QACX,KAAK;KACR,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"useRWA.js","sourceRoot":"","sources":["../../../src/hooks/useRWA.ts"],"names":[],"mappings":"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"}
package/dist/cjs/index.js CHANGED
@@ -4,7 +4,7 @@
4
4
  * React components for Real-World Asset tokenization on Mantle Network
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.useRWA = exports.YieldCalculator = exports.TokenMintForm = exports.InvestorDashboard = exports.KYCFlow = void 0;
7
+ exports.useRWA = exports.ConnectWalletPrompt = exports.LoadingSpinner = exports.formatErrorMessage = exports.ErrorDisplay = exports.YieldCalculator = exports.isValidAmount = exports.isValidAddress = exports.TokenMintForm = exports.InvestorDashboard = exports.KYCFlow = void 0;
8
8
  // Components
9
9
  var KYCFlow_1 = require("./components/KYCFlow");
10
10
  Object.defineProperty(exports, "KYCFlow", { enumerable: true, get: function () { return KYCFlow_1.KYCFlow; } });
@@ -12,8 +12,18 @@ var InvestorDashboard_1 = require("./components/InvestorDashboard");
12
12
  Object.defineProperty(exports, "InvestorDashboard", { enumerable: true, get: function () { return InvestorDashboard_1.InvestorDashboard; } });
13
13
  var TokenMintForm_1 = require("./components/TokenMintForm");
14
14
  Object.defineProperty(exports, "TokenMintForm", { enumerable: true, get: function () { return TokenMintForm_1.TokenMintForm; } });
15
+ var TokenMintForm_2 = require("./components/TokenMintForm");
16
+ Object.defineProperty(exports, "isValidAddress", { enumerable: true, get: function () { return TokenMintForm_2.isValidAddress; } });
17
+ Object.defineProperty(exports, "isValidAmount", { enumerable: true, get: function () { return TokenMintForm_2.isValidAmount; } });
15
18
  var YieldCalculator_1 = require("./components/YieldCalculator");
16
19
  Object.defineProperty(exports, "YieldCalculator", { enumerable: true, get: function () { return YieldCalculator_1.YieldCalculator; } });
20
+ var ErrorDisplay_1 = require("./components/ErrorDisplay");
21
+ Object.defineProperty(exports, "ErrorDisplay", { enumerable: true, get: function () { return ErrorDisplay_1.ErrorDisplay; } });
22
+ Object.defineProperty(exports, "formatErrorMessage", { enumerable: true, get: function () { return ErrorDisplay_1.formatErrorMessage; } });
23
+ var LoadingSpinner_1 = require("./components/LoadingSpinner");
24
+ Object.defineProperty(exports, "LoadingSpinner", { enumerable: true, get: function () { return LoadingSpinner_1.LoadingSpinner; } });
25
+ var ConnectWalletPrompt_1 = require("./components/ConnectWalletPrompt");
26
+ Object.defineProperty(exports, "ConnectWalletPrompt", { enumerable: true, get: function () { return ConnectWalletPrompt_1.ConnectWalletPrompt; } });
17
27
  // Hooks
18
28
  var useRWA_1 = require("./hooks/useRWA");
19
29
  Object.defineProperty(exports, "useRWA", { enumerable: true, get: function () { return useRWA_1.useRWA; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,aAAa;AACb,gDAA+C;AAAtC,kGAAA,OAAO,OAAA;AAChB,oEAAmE;AAA1D,sHAAA,iBAAiB,OAAA;AAC1B,4DAA2D;AAAlD,8GAAA,aAAa,OAAA;AACtB,gEAA+D;AAAtD,kHAAA,eAAe,OAAA;AAExB,QAAQ;AACR,yCAAwC;AAA/B,gGAAA,MAAM,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,aAAa;AACb,gDAA+C;AAAtC,kGAAA,OAAO,OAAA;AAChB,oEAAmE;AAA1D,sHAAA,iBAAiB,OAAA;AAC1B,4DAA2D;AAAlD,8GAAA,aAAa,OAAA;AACtB,4DAA2E;AAAlE,+GAAA,cAAc,OAAA;AAAE,8GAAA,aAAa,OAAA;AACtC,gEAA+D;AAAtD,kHAAA,eAAe,OAAA;AACxB,0DAA6E;AAApE,4GAAA,YAAY,OAAA;AAAE,kHAAA,kBAAkB,OAAA;AACzC,8DAA6D;AAApD,gHAAA,cAAc,OAAA;AACvB,wEAAuE;AAA9D,0HAAA,mBAAmB,OAAA;AAE5B,QAAQ;AACR,yCAAwC;AAA/B,gGAAA,MAAM,OAAA"}
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  /**
3
- * Type definitions for @mantle-rwa/react components
3
+ * Type definitions for @mantle-rwa/react
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.AccreditationTier = void 0;
7
- // Re-export SDK types that are commonly used
7
+ // Re-export relevant types from SDK
8
8
  var sdk_1 = require("@mantle-rwa/sdk");
9
9
  Object.defineProperty(exports, "AccreditationTier", { enumerable: true, get: function () { return sdk_1.AccreditationTier; } });
10
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,6CAA6C;AAC7C,uCAAoD;AAA3C,wGAAA,iBAAiB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,oCAAoC;AACpC,uCAWyB;AAVrB,wGAAA,iBAAiB,OAAA"}
@@ -0,0 +1,10 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * ConnectWalletPrompt component
5
+ */
6
+ export function ConnectWalletPrompt({ message = 'Please connect your wallet to continue.', className = '', }) {
7
+ return (_jsx("div", { className: `rwa-connect-wallet-prompt ${className}`, children: _jsx("div", { className: "p-4 bg-yellow-50 dark:bg-yellow-900/20 rounded-lg border border-yellow-200 dark:border-yellow-800", children: _jsxs("div", { className: "flex items-center", children: [_jsx("svg", { className: "w-5 h-5 text-yellow-600 dark:text-yellow-400 flex-shrink-0", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" }) }), _jsx("p", { className: "ml-3 text-sm text-yellow-700 dark:text-yellow-300", children: message })] }) }) }));
8
+ }
9
+ export default ConnectWalletPrompt;
10
+ //# sourceMappingURL=ConnectWalletPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectWalletPrompt.js","sourceRoot":"","sources":["../../../src/components/ConnectWalletPrompt.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAab;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAChC,OAAO,GAAG,yCAAyC,EACnD,SAAS,GAAG,EAAE,GACS;IACvB,OAAO,CACH,cAAK,SAAS,EAAE,6BAA6B,SAAS,EAAE,YACpD,cAAK,SAAS,EAAC,mGAAmG,YAC9G,eAAK,SAAS,EAAC,mBAAmB,aAC9B,cACI,SAAS,EAAC,4DAA4D,EACtE,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,OAAO,EAAC,WAAW,YAEnB,eACI,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,WAAW,EAAE,CAAC,EACd,CAAC,EAAC,sIAAsI,GAC1I,GACA,EACN,YAAG,SAAS,EAAC,mDAAmD,YAC3D,OAAO,GACR,IACF,GACJ,GACJ,CACT,CAAC;AACN,CAAC;AAED,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * Format error message for display
5
+ */
6
+ export function formatErrorMessage(error) {
7
+ const message = error.message;
8
+ // Handle common contract errors
9
+ if (message.includes('user rejected')) {
10
+ return 'Transaction was rejected by the user.';
11
+ }
12
+ if (message.includes('insufficient funds')) {
13
+ return 'Insufficient funds for this transaction.';
14
+ }
15
+ if (message.includes('nonce')) {
16
+ return 'Transaction nonce error. Please try again.';
17
+ }
18
+ if (message.includes('gas')) {
19
+ return 'Gas estimation failed. The transaction may fail.';
20
+ }
21
+ if (message.includes('network')) {
22
+ return 'Network error. Please check your connection.';
23
+ }
24
+ if (message.includes('timeout')) {
25
+ return 'Request timed out. Please try again.';
26
+ }
27
+ // Return original message if no special handling
28
+ return message;
29
+ }
30
+ /**
31
+ * ErrorDisplay component for consistent error UI
32
+ */
33
+ export function ErrorDisplay({ error, onRetry, className = '', }) {
34
+ const formattedMessage = formatErrorMessage(error);
35
+ return (_jsx("div", { className: `rwa-error-display ${className}`, children: _jsx("div", { className: "p-4 bg-red-50 dark:bg-red-900/20 rounded-lg border border-red-200 dark:border-red-800", children: _jsxs("div", { className: "flex items-start", children: [_jsx("svg", { className: "w-5 h-5 text-red-600 dark:text-red-400 mt-0.5 flex-shrink-0", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }), _jsxs("div", { className: "ml-3 flex-1", children: [_jsx("h3", { className: "text-sm font-medium text-red-800 dark:text-red-200", children: "Error" }), _jsx("p", { className: "mt-1 text-sm text-red-700 dark:text-red-300", children: formattedMessage }), onRetry && (_jsx("button", { onClick: onRetry, className: "mt-3 text-sm font-medium text-red-600 dark:text-red-400 hover:text-red-500 dark:hover:text-red-300 underline", children: "Try again" }))] })] }) }) }));
36
+ }
37
+ export default ErrorDisplay;
38
+ //# sourceMappingURL=ErrorDisplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorDisplay.js","sourceRoot":"","sources":["../../../src/components/ErrorDisplay.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAUb;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAY;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAE9B,gCAAgC;IAChC,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,OAAO,uCAAuC,CAAC;IACnD,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACzC,OAAO,0CAA0C,CAAC;IACtD,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,4CAA4C,CAAC;IACxD,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,kDAAkD,CAAC;IAC9D,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,8CAA8C,CAAC;IAC1D,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,sCAAsC,CAAC;IAClD,CAAC;IAED,iDAAiD;IACjD,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,EACzB,KAAK,EACL,OAAO,EACP,SAAS,GAAG,EAAE,GACE;IAChB,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAEnD,OAAO,CACH,cAAK,SAAS,EAAE,qBAAqB,SAAS,EAAE,YAC5C,cAAK,SAAS,EAAC,uFAAuF,YAClG,eAAK,SAAS,EAAC,kBAAkB,aAC7B,cACI,SAAS,EAAC,6DAA6D,EACvE,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,OAAO,EAAC,WAAW,YAEnB,eACI,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,WAAW,EAAE,CAAC,EACd,CAAC,EAAC,mDAAmD,GACvD,GACA,EACN,eAAK,SAAS,EAAC,aAAa,aACxB,aAAI,SAAS,EAAC,oDAAoD,sBAE7D,EACL,YAAG,SAAS,EAAC,6CAA6C,YACrD,gBAAgB,GACjB,EACH,OAAO,IAAI,CACR,iBACI,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,8GAA8G,0BAGnH,CACZ,IACC,IACJ,GACJ,GACJ,CACT,CAAC;AACN,CAAC;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,153 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * InvestorDashboard - Dashboard displaying investor portfolio information
5
+ *
6
+ * Shows token balance, KYC status, accreditation tier, and pending yield claims.
7
+ */
8
+ import { useState, useEffect, useCallback } from 'react';
9
+ import { useAccount } from 'wagmi';
10
+ import { formatUnits } from 'viem';
11
+ import { useRWA } from '../hooks/useRWA';
12
+ import { AccreditationTier } from '@mantle-rwa/sdk';
13
+ /**
14
+ * Get display name for accreditation tier
15
+ */
16
+ function getTierName(tier) {
17
+ switch (tier) {
18
+ case AccreditationTier.None:
19
+ return 'None';
20
+ case AccreditationTier.Retail:
21
+ return 'Retail';
22
+ case AccreditationTier.Accredited:
23
+ return 'Accredited';
24
+ case AccreditationTier.Institutional:
25
+ return 'Institutional';
26
+ default:
27
+ return 'Unknown';
28
+ }
29
+ }
30
+ /**
31
+ * Format token amount for display
32
+ */
33
+ function formatTokenAmount(amount, decimals, symbol) {
34
+ const formatted = formatUnits(amount, decimals);
35
+ const num = parseFloat(formatted);
36
+ return `${num.toLocaleString(undefined, { maximumFractionDigits: 4 })} ${symbol}`;
37
+ }
38
+ /**
39
+ * InvestorDashboard component
40
+ */
41
+ export function InvestorDashboard({ tokenAddress, kycRegistryAddress, yieldDistributorAddress, investorAddress, onClaimSuccess, onError, className = '', }) {
42
+ const { client, isInitialized, hasSigner } = useRWA();
43
+ const { address: connectedAddress } = useAccount();
44
+ const targetAddress = investorAddress || connectedAddress;
45
+ const [tokenInfo, setTokenInfo] = useState(null);
46
+ const [balance, setBalance] = useState(null);
47
+ const [kycInfo, setKycInfo] = useState(null);
48
+ const [pendingClaims, setPendingClaims] = useState([]);
49
+ const [totalClaimable, setTotalClaimable] = useState(0n);
50
+ const [isLoading, setIsLoading] = useState(true);
51
+ const [error, setError] = useState(null);
52
+ const [isClaiming, setIsClaiming] = useState(false);
53
+ // Fetch all dashboard data
54
+ const fetchData = useCallback(async () => {
55
+ if (!client || !isInitialized || !targetAddress) {
56
+ setIsLoading(false);
57
+ return;
58
+ }
59
+ setIsLoading(true);
60
+ setError(null);
61
+ try {
62
+ // Fetch token info and balance
63
+ const token = client.token.connect(tokenAddress);
64
+ const [info, userBalance] = await Promise.all([
65
+ token.getInfo(),
66
+ token.balanceOf(targetAddress),
67
+ ]);
68
+ setTokenInfo(info);
69
+ setBalance(userBalance);
70
+ // Fetch KYC info
71
+ const registry = client.kyc.connect(kycRegistryAddress);
72
+ const investorData = await registry.getInvestorInfo(targetAddress);
73
+ setKycInfo(investorData);
74
+ // Fetch pending claims
75
+ const distributor = client.yield.connect(yieldDistributorAddress);
76
+ const claims = await distributor.getPendingClaims(targetAddress);
77
+ setPendingClaims(claims);
78
+ // Calculate total claimable
79
+ const total = claims.reduce((sum, claim) => sum + claim.amount, 0n);
80
+ setTotalClaimable(total);
81
+ }
82
+ catch (err) {
83
+ const errorObj = err instanceof Error ? err : new Error('Failed to fetch dashboard data');
84
+ setError(errorObj);
85
+ onError?.(errorObj);
86
+ }
87
+ finally {
88
+ setIsLoading(false);
89
+ }
90
+ }, [client, isInitialized, targetAddress, tokenAddress, kycRegistryAddress, yieldDistributorAddress, onError]);
91
+ // Fetch data on mount and when dependencies change
92
+ useEffect(() => {
93
+ fetchData();
94
+ }, [fetchData]);
95
+ // Handle claim single distribution
96
+ const handleClaim = useCallback(async (distributionId) => {
97
+ if (!client || !hasSigner)
98
+ return;
99
+ setIsClaiming(true);
100
+ setError(null);
101
+ try {
102
+ const distributor = client.yield.connect(yieldDistributorAddress);
103
+ const result = await distributor.claim(distributionId);
104
+ onClaimSuccess?.(result);
105
+ await fetchData(); // Refresh data
106
+ }
107
+ catch (err) {
108
+ const errorObj = err instanceof Error ? err : new Error('Failed to claim yield');
109
+ setError(errorObj);
110
+ onError?.(errorObj);
111
+ }
112
+ finally {
113
+ setIsClaiming(false);
114
+ }
115
+ }, [client, hasSigner, yieldDistributorAddress, onClaimSuccess, onError, fetchData]);
116
+ // Handle claim all
117
+ const handleClaimAll = useCallback(async () => {
118
+ if (!client || !hasSigner || pendingClaims.length === 0)
119
+ return;
120
+ setIsClaiming(true);
121
+ setError(null);
122
+ try {
123
+ const distributor = client.yield.connect(yieldDistributorAddress);
124
+ const distributionIds = pendingClaims.map(c => c.distributionId);
125
+ const result = await distributor.claimMultiple(distributionIds);
126
+ onClaimSuccess?.(result);
127
+ await fetchData(); // Refresh data
128
+ }
129
+ catch (err) {
130
+ const errorObj = err instanceof Error ? err : new Error('Failed to claim yields');
131
+ setError(errorObj);
132
+ onError?.(errorObj);
133
+ }
134
+ finally {
135
+ setIsClaiming(false);
136
+ }
137
+ }, [client, hasSigner, pendingClaims, yieldDistributorAddress, onClaimSuccess, onError, fetchData]);
138
+ // Render loading state
139
+ if (isLoading) {
140
+ return (_jsx("div", { className: `rwa-investor-dashboard rwa-investor-dashboard--loading ${className}`, children: _jsxs("div", { className: "flex items-center justify-center p-8", children: [_jsx("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600" }), _jsx("span", { className: "ml-3 text-gray-600 dark:text-gray-300", children: "Loading dashboard..." })] }) }));
141
+ }
142
+ // Render no wallet state
143
+ if (!targetAddress) {
144
+ return (_jsx("div", { className: `rwa-investor-dashboard rwa-investor-dashboard--no-wallet ${className}`, children: _jsx("div", { className: "p-6 bg-yellow-50 dark:bg-yellow-900/20 rounded-lg border border-yellow-200 dark:border-yellow-800", children: _jsx("p", { className: "text-yellow-700 dark:text-yellow-300", children: "Please connect your wallet to view your dashboard." }) }) }));
145
+ }
146
+ // Render error state
147
+ if (error && !tokenInfo) {
148
+ return (_jsx("div", { className: `rwa-investor-dashboard rwa-investor-dashboard--error ${className}`, children: _jsxs("div", { className: "p-6 bg-red-50 dark:bg-red-900/20 rounded-lg border border-red-200 dark:border-red-800", children: [_jsx("h3", { className: "text-lg font-semibold text-red-800 dark:text-red-200", children: "Error" }), _jsx("p", { className: "mt-2 text-red-700 dark:text-red-300", children: error.message }), _jsx("button", { onClick: fetchData, className: "mt-4 px-4 py-2 bg-red-600 hover:bg-red-700 text-white rounded-md transition-colors", children: "Retry" })] }) }));
149
+ }
150
+ return (_jsx("div", { className: `rwa-investor-dashboard ${className}`, children: _jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "p-6 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-sm", children: [_jsx("h3", { className: "text-lg font-semibold text-gray-800 dark:text-gray-200", children: "Token Balance" }), tokenInfo && balance !== null && (_jsxs("div", { className: "mt-4", children: [_jsx("p", { className: "text-3xl font-bold text-gray-900 dark:text-white", children: formatTokenAmount(balance, tokenInfo.decimals, tokenInfo.symbol) }), _jsx("p", { className: "mt-1 text-sm text-gray-500 dark:text-gray-400", children: tokenInfo.name })] }))] }), _jsxs("div", { className: "p-6 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-sm", children: [_jsx("h3", { className: "text-lg font-semibold text-gray-800 dark:text-gray-200", children: "KYC Status" }), kycInfo && (_jsxs("div", { className: "mt-4 space-y-3", children: [_jsxs("div", { className: "flex items-center", children: [_jsx("span", { className: "text-gray-600 dark:text-gray-400 w-32", children: "Status:" }), _jsx("span", { className: `font-medium ${kycInfo.verified ? 'text-green-600 dark:text-green-400' : 'text-yellow-600 dark:text-yellow-400'}`, children: kycInfo.verified ? 'Verified' : 'Not Verified' })] }), _jsxs("div", { className: "flex items-center", children: [_jsx("span", { className: "text-gray-600 dark:text-gray-400 w-32", children: "Tier:" }), _jsx("span", { className: "font-medium text-gray-900 dark:text-white", children: getTierName(kycInfo.tier) })] }), kycInfo.expiry && kycInfo.verified && (_jsxs("div", { className: "flex items-center", children: [_jsx("span", { className: "text-gray-600 dark:text-gray-400 w-32", children: "Valid Until:" }), _jsx("span", { className: "font-medium text-gray-900 dark:text-white", children: kycInfo.expiry.toLocaleDateString() })] }))] }))] }), _jsxs("div", { className: "p-6 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-sm", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("h3", { className: "text-lg font-semibold text-gray-800 dark:text-gray-200", children: "Pending Yields" }), pendingClaims.length > 0 && hasSigner && (_jsx("button", { onClick: handleClaimAll, disabled: isClaiming, className: "px-4 py-2 bg-green-600 hover:bg-green-700 disabled:bg-gray-400 text-white rounded-md transition-colors text-sm", children: isClaiming ? 'Claiming...' : 'Claim All' }))] }), pendingClaims.length === 0 ? (_jsx("p", { className: "mt-4 text-gray-500 dark:text-gray-400", children: "No pending yields to claim." })) : (_jsxs("div", { className: "mt-4 space-y-3", children: [_jsxs("p", { className: "text-sm text-gray-600 dark:text-gray-400", children: ["Total Claimable: ", _jsxs("span", { className: "font-semibold", children: [formatUnits(totalClaimable, 18), " tokens"] })] }), _jsx("div", { className: "divide-y divide-gray-200 dark:divide-gray-700", children: pendingClaims.map((claim) => (_jsxs("div", { className: "py-3 flex items-center justify-between", children: [_jsxs("div", { children: [_jsxs("p", { className: "font-medium text-gray-900 dark:text-white", children: ["Distribution #", claim.distributionId] }), _jsxs("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: ["Amount: ", formatUnits(claim.amount, 18), " \u2022 Deadline: ", claim.deadline.toLocaleDateString()] })] }), hasSigner && (_jsx("button", { onClick: () => handleClaim(claim.distributionId), disabled: isClaiming, className: "px-3 py-1 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded text-sm transition-colors", children: "Claim" }))] }, claim.distributionId))) })] })), !hasSigner && pendingClaims.length > 0 && (_jsx("p", { className: "mt-4 text-sm text-yellow-600 dark:text-yellow-400", children: "Connect your wallet to claim yields." }))] }), error && (_jsx("div", { className: "p-4 bg-red-50 dark:bg-red-900/20 rounded-lg border border-red-200 dark:border-red-800", children: _jsx("p", { className: "text-red-700 dark:text-red-300", children: error.message }) }))] }) }));
151
+ }
152
+ export default InvestorDashboard;
153
+ //# sourceMappingURL=InvestorDashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvestorDashboard.js","sourceRoot":"","sources":["../../../src/components/InvestorDashboard.tsx"],"names":[],"mappings":"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"}