@mantle-rwa/react 0.1.1 → 0.1.3
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/dist/cjs/components/ConnectWalletPrompt.js +13 -0
- package/dist/cjs/components/ConnectWalletPrompt.js.map +1 -0
- package/dist/cjs/components/ErrorDisplay.js +42 -0
- package/dist/cjs/components/ErrorDisplay.js.map +1 -0
- package/dist/cjs/components/InvestorDashboard.js +156 -0
- package/dist/cjs/components/InvestorDashboard.js.map +1 -0
- package/dist/cjs/components/KYCFlow.js +146 -0
- package/dist/cjs/components/KYCFlow.js.map +1 -0
- package/dist/cjs/components/LoadingSpinner.js +18 -0
- package/dist/cjs/components/LoadingSpinner.js.map +1 -0
- package/dist/cjs/components/TokenMintForm.js +163 -0
- package/dist/cjs/components/TokenMintForm.js.map +1 -0
- package/dist/cjs/components/YieldCalculator.js +97 -0
- package/dist/cjs/components/YieldCalculator.js.map +1 -0
- package/dist/cjs/hooks/useRWA.js +87 -40
- package/dist/cjs/hooks/useRWA.js.map +1 -1
- package/dist/cjs/index.js +11 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/index.js +2 -2
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/esm/components/ConnectWalletPrompt.js +10 -0
- package/dist/esm/components/ConnectWalletPrompt.js.map +1 -0
- package/dist/esm/components/ErrorDisplay.js +38 -0
- package/dist/esm/components/ErrorDisplay.js.map +1 -0
- package/dist/esm/components/InvestorDashboard.js +153 -0
- package/dist/esm/components/InvestorDashboard.js.map +1 -0
- package/dist/esm/components/KYCFlow.js +143 -0
- package/dist/esm/components/KYCFlow.js.map +1 -0
- package/dist/esm/components/LoadingSpinner.js +15 -0
- package/dist/esm/components/LoadingSpinner.js.map +1 -0
- package/dist/esm/components/TokenMintForm.js +158 -0
- package/dist/esm/components/TokenMintForm.js.map +1 -0
- package/dist/esm/components/YieldCalculator.js +94 -0
- package/dist/esm/components/YieldCalculator.js.map +1 -0
- package/dist/esm/hooks/useRWA.js +86 -39
- package/dist/esm/hooks/useRWA.js.map +1 -1
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/index.js +3 -3
- package/dist/esm/types/index.js.map +1 -1
- package/dist/styles.css +3 -1
- package/dist/types/components/ConnectWalletPrompt.d.ts +15 -0
- package/dist/types/components/ConnectWalletPrompt.d.ts.map +1 -0
- package/dist/types/components/ErrorDisplay.d.ts +16 -0
- package/dist/types/components/ErrorDisplay.d.ts.map +1 -0
- package/dist/types/components/InvestorDashboard.d.ts +7 -0
- package/dist/types/components/InvestorDashboard.d.ts.map +1 -0
- package/dist/types/components/KYCFlow.d.ts +7 -0
- package/dist/types/components/KYCFlow.d.ts.map +1 -0
- package/dist/types/components/LoadingSpinner.d.ts +10 -0
- package/dist/types/components/LoadingSpinner.d.ts.map +1 -0
- package/dist/types/components/TokenMintForm.d.ts +15 -0
- package/dist/types/components/TokenMintForm.d.ts.map +1 -0
- package/dist/types/components/YieldCalculator.d.ts +7 -0
- package/dist/types/components/YieldCalculator.d.ts.map +1 -0
- package/dist/types/hooks/useRWA.d.ts +7 -19
- package/dist/types/hooks/useRWA.d.ts.map +1 -1
- package/dist/types/index.d.ts +5 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +113 -131
- package/dist/types/types/index.d.ts.map +1 -1
- package/package.json +5 -3
- package/src/components/ConnectWalletPrompt.tsx +47 -0
- package/src/components/ErrorDisplay.tsx +90 -0
- package/src/components/InvestorDashboard.tsx +315 -0
- package/src/components/KYCFlow.tsx +267 -0
- package/src/components/LoadingSpinner.tsx +33 -0
- package/src/components/TokenMintForm.tsx +291 -0
- package/src/components/YieldCalculator.tsx +250 -0
- package/src/hooks/useRWA.ts +110 -0
- package/src/index.ts +4 -0
- package/src/styles/index.css +68 -14
- package/src/types/index.ts +200 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ConnectWalletPrompt = ConnectWalletPrompt;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
/**
|
|
7
|
+
* ConnectWalletPrompt component
|
|
8
|
+
*/
|
|
9
|
+
function ConnectWalletPrompt({ message = 'Please connect your wallet to continue.', className = '', }) {
|
|
10
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-connect-wallet-prompt ${className}`, children: (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.jsxs)("div", { className: "flex items-center", children: [(0, jsx_runtime_1.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: (0, jsx_runtime_1.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" }) }), (0, jsx_runtime_1.jsx)("p", { className: "ml-3 text-sm text-yellow-700 dark:text-yellow-300", children: message })] }) }) }));
|
|
11
|
+
}
|
|
12
|
+
exports.default = ConnectWalletPrompt;
|
|
13
|
+
//# sourceMappingURL=ConnectWalletPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectWalletPrompt.js","sourceRoot":"","sources":["../../../src/components/ConnectWalletPrompt.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAgBb,kDA4BC;;AA/BD;;GAEG;AACH,SAAgB,mBAAmB,CAAC,EAChC,OAAO,GAAG,yCAAyC,EACnD,SAAS,GAAG,EAAE,GACS;IACvB,OAAO,CACH,gCAAK,SAAS,EAAE,6BAA6B,SAAS,EAAE,YACpD,gCAAK,SAAS,EAAC,mGAAmG,YAC9G,iCAAK,SAAS,EAAC,mBAAmB,aAC9B,gCACI,SAAS,EAAC,4DAA4D,EACtE,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,OAAO,EAAC,WAAW,YAEnB,iCACI,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,WAAW,EAAE,CAAC,EACd,CAAC,EAAC,sIAAsI,GAC1I,GACA,EACN,8BAAG,SAAS,EAAC,mDAAmD,YAC3D,OAAO,GACR,IACF,GACJ,GACJ,CACT,CAAC;AACN,CAAC;AAED,kBAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.formatErrorMessage = formatErrorMessage;
|
|
5
|
+
exports.ErrorDisplay = ErrorDisplay;
|
|
6
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
/**
|
|
8
|
+
* Format error message for display
|
|
9
|
+
*/
|
|
10
|
+
function formatErrorMessage(error) {
|
|
11
|
+
const message = error.message;
|
|
12
|
+
// Handle common contract errors
|
|
13
|
+
if (message.includes('user rejected')) {
|
|
14
|
+
return 'Transaction was rejected by the user.';
|
|
15
|
+
}
|
|
16
|
+
if (message.includes('insufficient funds')) {
|
|
17
|
+
return 'Insufficient funds for this transaction.';
|
|
18
|
+
}
|
|
19
|
+
if (message.includes('nonce')) {
|
|
20
|
+
return 'Transaction nonce error. Please try again.';
|
|
21
|
+
}
|
|
22
|
+
if (message.includes('gas')) {
|
|
23
|
+
return 'Gas estimation failed. The transaction may fail.';
|
|
24
|
+
}
|
|
25
|
+
if (message.includes('network')) {
|
|
26
|
+
return 'Network error. Please check your connection.';
|
|
27
|
+
}
|
|
28
|
+
if (message.includes('timeout')) {
|
|
29
|
+
return 'Request timed out. Please try again.';
|
|
30
|
+
}
|
|
31
|
+
// Return original message if no special handling
|
|
32
|
+
return message;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* ErrorDisplay component for consistent error UI
|
|
36
|
+
*/
|
|
37
|
+
function ErrorDisplay({ error, onRetry, className = '', }) {
|
|
38
|
+
const formattedMessage = formatErrorMessage(error);
|
|
39
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-error-display ${className}`, children: (0, jsx_runtime_1.jsx)("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.jsxs)("div", { className: "flex items-start", children: [(0, jsx_runtime_1.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: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }), (0, jsx_runtime_1.jsxs)("div", { className: "ml-3 flex-1", children: [(0, jsx_runtime_1.jsx)("h3", { className: "text-sm font-medium text-red-800 dark:text-red-200", children: "Error" }), (0, jsx_runtime_1.jsx)("p", { className: "mt-1 text-sm text-red-700 dark:text-red-300", children: formattedMessage }), onRetry && ((0, jsx_runtime_1.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" }))] })] }) }) }));
|
|
40
|
+
}
|
|
41
|
+
exports.default = ErrorDisplay;
|
|
42
|
+
//# sourceMappingURL=ErrorDisplay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorDisplay.js","sourceRoot":"","sources":["../../../src/components/ErrorDisplay.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAab,gDAyBC;AAKD,oCA4CC;;AA7ED;;GAEG;AACH,SAAgB,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,SAAgB,YAAY,CAAC,EACzB,KAAK,EACL,OAAO,EACP,SAAS,GAAG,EAAE,GACE;IAChB,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAEnD,OAAO,CACH,gCAAK,SAAS,EAAE,qBAAqB,SAAS,EAAE,YAC5C,gCAAK,SAAS,EAAC,uFAAuF,YAClG,iCAAK,SAAS,EAAC,kBAAkB,aAC7B,gCACI,SAAS,EAAC,6DAA6D,EACvE,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,OAAO,EAAC,WAAW,YAEnB,iCACI,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,WAAW,EAAE,CAAC,EACd,CAAC,EAAC,mDAAmD,GACvD,GACA,EACN,iCAAK,SAAS,EAAC,aAAa,aACxB,+BAAI,SAAS,EAAC,oDAAoD,sBAE7D,EACL,8BAAG,SAAS,EAAC,6CAA6C,YACrD,gBAAgB,GACjB,EACH,OAAO,IAAI,CACR,mCACI,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,8GAA8G,0BAGnH,CACZ,IACC,IACJ,GACJ,GACJ,CACT,CAAC;AACN,CAAC;AAED,kBAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.InvestorDashboard = InvestorDashboard;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
/**
|
|
7
|
+
* InvestorDashboard - Dashboard displaying investor portfolio information
|
|
8
|
+
*
|
|
9
|
+
* Shows token balance, KYC status, accreditation tier, and pending yield claims.
|
|
10
|
+
*/
|
|
11
|
+
const react_1 = require("react");
|
|
12
|
+
const wagmi_1 = require("wagmi");
|
|
13
|
+
const viem_1 = require("viem");
|
|
14
|
+
const useRWA_1 = require("../hooks/useRWA");
|
|
15
|
+
const sdk_1 = require("@mantle-rwa/sdk");
|
|
16
|
+
/**
|
|
17
|
+
* Get display name for accreditation tier
|
|
18
|
+
*/
|
|
19
|
+
function getTierName(tier) {
|
|
20
|
+
switch (tier) {
|
|
21
|
+
case sdk_1.AccreditationTier.None:
|
|
22
|
+
return 'None';
|
|
23
|
+
case sdk_1.AccreditationTier.Retail:
|
|
24
|
+
return 'Retail';
|
|
25
|
+
case sdk_1.AccreditationTier.Accredited:
|
|
26
|
+
return 'Accredited';
|
|
27
|
+
case sdk_1.AccreditationTier.Institutional:
|
|
28
|
+
return 'Institutional';
|
|
29
|
+
default:
|
|
30
|
+
return 'Unknown';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Format token amount for display
|
|
35
|
+
*/
|
|
36
|
+
function formatTokenAmount(amount, decimals, symbol) {
|
|
37
|
+
const formatted = (0, viem_1.formatUnits)(amount, decimals);
|
|
38
|
+
const num = parseFloat(formatted);
|
|
39
|
+
return `${num.toLocaleString(undefined, { maximumFractionDigits: 4 })} ${symbol}`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* InvestorDashboard component
|
|
43
|
+
*/
|
|
44
|
+
function InvestorDashboard({ tokenAddress, kycRegistryAddress, yieldDistributorAddress, investorAddress, onClaimSuccess, onError, className = '', }) {
|
|
45
|
+
const { client, isInitialized, hasSigner } = (0, useRWA_1.useRWA)();
|
|
46
|
+
const { address: connectedAddress } = (0, wagmi_1.useAccount)();
|
|
47
|
+
const targetAddress = investorAddress || connectedAddress;
|
|
48
|
+
const [tokenInfo, setTokenInfo] = (0, react_1.useState)(null);
|
|
49
|
+
const [balance, setBalance] = (0, react_1.useState)(null);
|
|
50
|
+
const [kycInfo, setKycInfo] = (0, react_1.useState)(null);
|
|
51
|
+
const [pendingClaims, setPendingClaims] = (0, react_1.useState)([]);
|
|
52
|
+
const [totalClaimable, setTotalClaimable] = (0, react_1.useState)(0n);
|
|
53
|
+
const [isLoading, setIsLoading] = (0, react_1.useState)(true);
|
|
54
|
+
const [error, setError] = (0, react_1.useState)(null);
|
|
55
|
+
const [isClaiming, setIsClaiming] = (0, react_1.useState)(false);
|
|
56
|
+
// Fetch all dashboard data
|
|
57
|
+
const fetchData = (0, react_1.useCallback)(async () => {
|
|
58
|
+
if (!client || !isInitialized || !targetAddress) {
|
|
59
|
+
setIsLoading(false);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
setIsLoading(true);
|
|
63
|
+
setError(null);
|
|
64
|
+
try {
|
|
65
|
+
// Fetch token info and balance
|
|
66
|
+
const token = client.token.connect(tokenAddress);
|
|
67
|
+
const [info, userBalance] = await Promise.all([
|
|
68
|
+
token.getInfo(),
|
|
69
|
+
token.balanceOf(targetAddress),
|
|
70
|
+
]);
|
|
71
|
+
setTokenInfo(info);
|
|
72
|
+
setBalance(userBalance);
|
|
73
|
+
// Fetch KYC info
|
|
74
|
+
const registry = client.kyc.connect(kycRegistryAddress);
|
|
75
|
+
const investorData = await registry.getInvestorInfo(targetAddress);
|
|
76
|
+
setKycInfo(investorData);
|
|
77
|
+
// Fetch pending claims
|
|
78
|
+
const distributor = client.yield.connect(yieldDistributorAddress);
|
|
79
|
+
const claims = await distributor.getPendingClaims(targetAddress);
|
|
80
|
+
setPendingClaims(claims);
|
|
81
|
+
// Calculate total claimable
|
|
82
|
+
const total = claims.reduce((sum, claim) => sum + claim.amount, 0n);
|
|
83
|
+
setTotalClaimable(total);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
const errorObj = err instanceof Error ? err : new Error('Failed to fetch dashboard data');
|
|
87
|
+
setError(errorObj);
|
|
88
|
+
onError?.(errorObj);
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
setIsLoading(false);
|
|
92
|
+
}
|
|
93
|
+
}, [client, isInitialized, targetAddress, tokenAddress, kycRegistryAddress, yieldDistributorAddress, onError]);
|
|
94
|
+
// Fetch data on mount and when dependencies change
|
|
95
|
+
(0, react_1.useEffect)(() => {
|
|
96
|
+
fetchData();
|
|
97
|
+
}, [fetchData]);
|
|
98
|
+
// Handle claim single distribution
|
|
99
|
+
const handleClaim = (0, react_1.useCallback)(async (distributionId) => {
|
|
100
|
+
if (!client || !hasSigner)
|
|
101
|
+
return;
|
|
102
|
+
setIsClaiming(true);
|
|
103
|
+
setError(null);
|
|
104
|
+
try {
|
|
105
|
+
const distributor = client.yield.connect(yieldDistributorAddress);
|
|
106
|
+
const result = await distributor.claim(distributionId);
|
|
107
|
+
onClaimSuccess?.(result);
|
|
108
|
+
await fetchData(); // Refresh data
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
const errorObj = err instanceof Error ? err : new Error('Failed to claim yield');
|
|
112
|
+
setError(errorObj);
|
|
113
|
+
onError?.(errorObj);
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
setIsClaiming(false);
|
|
117
|
+
}
|
|
118
|
+
}, [client, hasSigner, yieldDistributorAddress, onClaimSuccess, onError, fetchData]);
|
|
119
|
+
// Handle claim all
|
|
120
|
+
const handleClaimAll = (0, react_1.useCallback)(async () => {
|
|
121
|
+
if (!client || !hasSigner || pendingClaims.length === 0)
|
|
122
|
+
return;
|
|
123
|
+
setIsClaiming(true);
|
|
124
|
+
setError(null);
|
|
125
|
+
try {
|
|
126
|
+
const distributor = client.yield.connect(yieldDistributorAddress);
|
|
127
|
+
const distributionIds = pendingClaims.map(c => c.distributionId);
|
|
128
|
+
const result = await distributor.claimMultiple(distributionIds);
|
|
129
|
+
onClaimSuccess?.(result);
|
|
130
|
+
await fetchData(); // Refresh data
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
const errorObj = err instanceof Error ? err : new Error('Failed to claim yields');
|
|
134
|
+
setError(errorObj);
|
|
135
|
+
onError?.(errorObj);
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
setIsClaiming(false);
|
|
139
|
+
}
|
|
140
|
+
}, [client, hasSigner, pendingClaims, yieldDistributorAddress, onClaimSuccess, onError, fetchData]);
|
|
141
|
+
// Render loading state
|
|
142
|
+
if (isLoading) {
|
|
143
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-investor-dashboard rwa-investor-dashboard--loading ${className}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-center p-8", children: [(0, jsx_runtime_1.jsx)("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600" }), (0, jsx_runtime_1.jsx)("span", { className: "ml-3 text-gray-600 dark:text-gray-300", children: "Loading dashboard..." })] }) }));
|
|
144
|
+
}
|
|
145
|
+
// Render no wallet state
|
|
146
|
+
if (!targetAddress) {
|
|
147
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-investor-dashboard rwa-investor-dashboard--no-wallet ${className}`, children: (0, jsx_runtime_1.jsx)("div", { className: "p-6 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: "Please connect your wallet to view your dashboard." }) }) }));
|
|
148
|
+
}
|
|
149
|
+
// Render error state
|
|
150
|
+
if (error && !tokenInfo) {
|
|
151
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-investor-dashboard rwa-investor-dashboard--error ${className}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "p-6 bg-red-50 dark:bg-red-900/20 rounded-lg border border-red-200 dark:border-red-800", children: [(0, jsx_runtime_1.jsx)("h3", { className: "text-lg font-semibold text-red-800 dark:text-red-200", children: "Error" }), (0, jsx_runtime_1.jsx)("p", { className: "mt-2 text-red-700 dark:text-red-300", children: error.message }), (0, jsx_runtime_1.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" })] }) }));
|
|
152
|
+
}
|
|
153
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-investor-dashboard ${className}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "space-y-6", children: [(0, jsx_runtime_1.jsxs)("div", { className: "p-6 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-sm", children: [(0, jsx_runtime_1.jsx)("h3", { className: "text-lg font-semibold text-gray-800 dark:text-gray-200", children: "Token Balance" }), tokenInfo && balance !== null && ((0, jsx_runtime_1.jsxs)("div", { className: "mt-4", children: [(0, jsx_runtime_1.jsx)("p", { className: "text-3xl font-bold text-gray-900 dark:text-white", children: formatTokenAmount(balance, Number(tokenInfo.decimals), tokenInfo.symbol) }), (0, jsx_runtime_1.jsx)("p", { className: "mt-1 text-sm text-gray-500 dark:text-gray-400", children: tokenInfo.name })] }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "p-6 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-sm", children: [(0, jsx_runtime_1.jsx)("h3", { className: "text-lg font-semibold text-gray-800 dark:text-gray-200", children: "KYC Status" }), kycInfo && ((0, jsx_runtime_1.jsxs)("div", { className: "mt-4 space-y-3", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-gray-600 dark:text-gray-400 w-32", children: "Status:" }), (0, jsx_runtime_1.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' })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-gray-600 dark:text-gray-400 w-32", children: "Tier:" }), (0, jsx_runtime_1.jsx)("span", { className: "font-medium text-gray-900 dark:text-white", children: getTierName(kycInfo.tier) })] }), kycInfo.expiry && kycInfo.verified && ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-gray-600 dark:text-gray-400 w-32", children: "Valid Until:" }), (0, jsx_runtime_1.jsx)("span", { className: "font-medium text-gray-900 dark:text-white", children: kycInfo.expiry.toLocaleDateString() })] }))] }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "p-6 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-sm", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsx)("h3", { className: "text-lg font-semibold text-gray-800 dark:text-gray-200", children: "Pending Yields" }), pendingClaims.length > 0 && hasSigner && ((0, jsx_runtime_1.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 ? ((0, jsx_runtime_1.jsx)("p", { className: "mt-4 text-gray-500 dark:text-gray-400", children: "No pending yields to claim." })) : ((0, jsx_runtime_1.jsxs)("div", { className: "mt-4 space-y-3", children: [(0, jsx_runtime_1.jsxs)("p", { className: "text-sm text-gray-600 dark:text-gray-400", children: ["Total Claimable: ", (0, jsx_runtime_1.jsxs)("span", { className: "font-semibold", children: [(0, viem_1.formatUnits)(totalClaimable, 18), " tokens"] })] }), (0, jsx_runtime_1.jsx)("div", { className: "divide-y divide-gray-200 dark:divide-gray-700", children: pendingClaims.map((claim) => ((0, jsx_runtime_1.jsxs)("div", { className: "py-3 flex items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("p", { className: "font-medium text-gray-900 dark:text-white", children: ["Distribution #", claim.distributionId] }), (0, jsx_runtime_1.jsxs)("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: ["Amount: ", (0, viem_1.formatUnits)(claim.amount, 18), " \u2022 Deadline: ", claim.deadline.toLocaleDateString()] })] }), hasSigner && ((0, jsx_runtime_1.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 && ((0, jsx_runtime_1.jsx)("p", { className: "mt-4 text-sm text-yellow-600 dark:text-yellow-400", children: "Connect your wallet to claim yields." }))] }), error && ((0, jsx_runtime_1.jsx)("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 }) }))] }) }));
|
|
154
|
+
}
|
|
155
|
+
exports.default = InvestorDashboard;
|
|
156
|
+
//# 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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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.KYCFlow = KYCFlow;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
/**
|
|
7
|
+
* KYCFlow - Multi-step KYC verification flow component
|
|
8
|
+
*
|
|
9
|
+
* Guides users through the KYC verification process and displays
|
|
10
|
+
* their current verification status and accreditation tier.
|
|
11
|
+
*/
|
|
12
|
+
const react_1 = require("react");
|
|
13
|
+
const wagmi_1 = require("wagmi");
|
|
14
|
+
const useRWA_1 = require("../hooks/useRWA");
|
|
15
|
+
const sdk_1 = require("@mantle-rwa/sdk");
|
|
16
|
+
/**
|
|
17
|
+
* Get display name for accreditation tier
|
|
18
|
+
*/
|
|
19
|
+
function getTierName(tier) {
|
|
20
|
+
switch (tier) {
|
|
21
|
+
case sdk_1.AccreditationTier.None:
|
|
22
|
+
return 'None';
|
|
23
|
+
case sdk_1.AccreditationTier.Retail:
|
|
24
|
+
return 'Retail';
|
|
25
|
+
case sdk_1.AccreditationTier.Accredited:
|
|
26
|
+
return 'Accredited';
|
|
27
|
+
case sdk_1.AccreditationTier.Institutional:
|
|
28
|
+
return 'Institutional';
|
|
29
|
+
default:
|
|
30
|
+
return 'Unknown';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Format date for display
|
|
35
|
+
*/
|
|
36
|
+
function formatDate(date) {
|
|
37
|
+
return date.toLocaleDateString('en-US', {
|
|
38
|
+
year: 'numeric',
|
|
39
|
+
month: 'long',
|
|
40
|
+
day: 'numeric',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* KYCFlow component for guiding users through KYC verification
|
|
45
|
+
*/
|
|
46
|
+
function KYCFlow({ registryAddress, investorAddress, onStatusChange, onComplete, onError, className = '', }) {
|
|
47
|
+
const { client, isInitialized, hasSigner } = (0, useRWA_1.useRWA)();
|
|
48
|
+
const { address: connectedAddress } = (0, wagmi_1.useAccount)();
|
|
49
|
+
const targetAddress = investorAddress || connectedAddress;
|
|
50
|
+
const [status, setStatus] = (0, react_1.useState)('idle');
|
|
51
|
+
const [investorInfo, setInvestorInfo] = (0, react_1.useState)(null);
|
|
52
|
+
const [isLoading, setIsLoading] = (0, react_1.useState)(true);
|
|
53
|
+
const [error, setError] = (0, react_1.useState)(null);
|
|
54
|
+
// Update status and notify callback
|
|
55
|
+
const updateStatus = (0, react_1.useCallback)((newStatus) => {
|
|
56
|
+
setStatus(newStatus);
|
|
57
|
+
onStatusChange?.(newStatus);
|
|
58
|
+
}, [onStatusChange]);
|
|
59
|
+
// Fetch investor KYC data
|
|
60
|
+
const fetchKYCData = (0, react_1.useCallback)(async () => {
|
|
61
|
+
if (!client || !isInitialized || !registryAddress || !targetAddress) {
|
|
62
|
+
setIsLoading(false);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
setIsLoading(true);
|
|
66
|
+
setError(null);
|
|
67
|
+
try {
|
|
68
|
+
const registry = client.kyc.connect(registryAddress);
|
|
69
|
+
const info = await registry.getInvestorInfo(targetAddress);
|
|
70
|
+
setInvestorInfo(info);
|
|
71
|
+
// Determine status based on investor info
|
|
72
|
+
if (info.verified) {
|
|
73
|
+
updateStatus('completed');
|
|
74
|
+
onComplete?.(info.tier);
|
|
75
|
+
}
|
|
76
|
+
else if (info.tier !== sdk_1.AccreditationTier.None) {
|
|
77
|
+
updateStatus('in_progress');
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
updateStatus('pending');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
const errorObj = err instanceof Error ? err : new Error('Failed to fetch KYC data');
|
|
85
|
+
setError(errorObj);
|
|
86
|
+
updateStatus('failed');
|
|
87
|
+
onError?.(errorObj);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
setIsLoading(false);
|
|
91
|
+
}
|
|
92
|
+
}, [client, isInitialized, registryAddress, targetAddress, updateStatus, onComplete, onError]);
|
|
93
|
+
// Fetch data on mount and when dependencies change
|
|
94
|
+
(0, react_1.useEffect)(() => {
|
|
95
|
+
fetchKYCData();
|
|
96
|
+
}, [fetchKYCData]);
|
|
97
|
+
// Handle start verification
|
|
98
|
+
const handleStartVerification = (0, react_1.useCallback)(async () => {
|
|
99
|
+
if (!client || !targetAddress)
|
|
100
|
+
return;
|
|
101
|
+
updateStatus('in_progress');
|
|
102
|
+
try {
|
|
103
|
+
// Initiate verification through the KYC provider
|
|
104
|
+
const session = await client.kyc.verifyInvestor(targetAddress);
|
|
105
|
+
// If there's a redirect URL, open it
|
|
106
|
+
if (session.redirectUrl) {
|
|
107
|
+
window.open(session.redirectUrl, '_blank');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
const errorObj = err instanceof Error ? err : new Error('Failed to start verification');
|
|
112
|
+
setError(errorObj);
|
|
113
|
+
updateStatus('failed');
|
|
114
|
+
onError?.(errorObj);
|
|
115
|
+
}
|
|
116
|
+
}, [client, targetAddress, updateStatus, onError]);
|
|
117
|
+
// Handle retry
|
|
118
|
+
const handleRetry = (0, react_1.useCallback)(() => {
|
|
119
|
+
setError(null);
|
|
120
|
+
fetchKYCData();
|
|
121
|
+
}, [fetchKYCData]);
|
|
122
|
+
// Render loading state
|
|
123
|
+
if (isLoading) {
|
|
124
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-kyc-flow rwa-kyc-flow--loading ${className}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-center p-8", children: [(0, jsx_runtime_1.jsx)("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600" }), (0, jsx_runtime_1.jsx)("span", { className: "ml-3 text-gray-600 dark:text-gray-300", children: "Loading KYC status..." })] }) }));
|
|
125
|
+
}
|
|
126
|
+
// Render no wallet connected state
|
|
127
|
+
if (!targetAddress) {
|
|
128
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-kyc-flow rwa-kyc-flow--no-wallet ${className}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "p-6 bg-yellow-50 dark:bg-yellow-900/20 rounded-lg border border-yellow-200 dark:border-yellow-800", children: [(0, jsx_runtime_1.jsx)("h3", { className: "text-lg font-semibold text-yellow-800 dark:text-yellow-200", children: "Wallet Not Connected" }), (0, jsx_runtime_1.jsx)("p", { className: "mt-2 text-yellow-700 dark:text-yellow-300", children: "Please connect your wallet to view your KYC status." })] }) }));
|
|
129
|
+
}
|
|
130
|
+
// Render error state
|
|
131
|
+
if (status === 'failed' && error) {
|
|
132
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-kyc-flow rwa-kyc-flow--error ${className}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "p-6 bg-red-50 dark:bg-red-900/20 rounded-lg border border-red-200 dark:border-red-800", children: [(0, jsx_runtime_1.jsx)("h3", { className: "text-lg font-semibold text-red-800 dark:text-red-200", children: "Verification Failed" }), (0, jsx_runtime_1.jsx)("p", { className: "mt-2 text-red-700 dark:text-red-300", children: error.message }), (0, jsx_runtime_1.jsx)("button", { onClick: handleRetry, className: "mt-4 px-4 py-2 bg-red-600 hover:bg-red-700 text-white rounded-md transition-colors", children: "Retry" })] }) }));
|
|
133
|
+
}
|
|
134
|
+
// Render completed state
|
|
135
|
+
if (status === 'completed' && investorInfo) {
|
|
136
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-kyc-flow rwa-kyc-flow--completed ${className}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "p-6 bg-green-50 dark:bg-green-900/20 rounded-lg border border-green-200 dark:border-green-800", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center", children: [(0, jsx_runtime_1.jsx)("svg", { className: "w-8 h-8 text-green-600 dark:text-green-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" }) }), (0, jsx_runtime_1.jsx)("h3", { className: "ml-3 text-lg font-semibold text-green-800 dark:text-green-200", children: "Verification Complete" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mt-4 space-y-2", children: [(0, jsx_runtime_1.jsxs)("p", { className: "text-green-700 dark:text-green-300", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-medium", children: "Accreditation Tier:" }), " ", getTierName(investorInfo.tier)] }), investorInfo.expiry && ((0, jsx_runtime_1.jsxs)("p", { className: "text-green-700 dark:text-green-300", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-medium", children: "Valid Until:" }), " ", formatDate(investorInfo.expiry)] }))] })] }) }));
|
|
137
|
+
}
|
|
138
|
+
// Render in progress state
|
|
139
|
+
if (status === 'in_progress') {
|
|
140
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-kyc-flow rwa-kyc-flow--in-progress ${className}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "p-6 bg-blue-50 dark:bg-blue-900/20 rounded-lg border border-blue-200 dark:border-blue-800", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center", 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)("h3", { className: "ml-3 text-lg font-semibold text-blue-800 dark:text-blue-200", children: "Verification In Progress" })] }), (0, jsx_runtime_1.jsx)("p", { className: "mt-4 text-blue-700 dark:text-blue-300", children: "Your identity verification is being processed. This may take a few minutes." }), (0, jsx_runtime_1.jsx)("button", { onClick: fetchKYCData, className: "mt-4 px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-md transition-colors", children: "Check Status" })] }) }));
|
|
141
|
+
}
|
|
142
|
+
// Render pending state (default)
|
|
143
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-kyc-flow rwa-kyc-flow--pending ${className}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "p-6 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700", children: [(0, jsx_runtime_1.jsx)("h3", { className: "text-lg font-semibold text-gray-800 dark:text-gray-200", children: "KYC Verification Required" }), (0, jsx_runtime_1.jsx)("p", { className: "mt-2 text-gray-600 dark:text-gray-400", children: "Complete identity verification to participate in RWA token offerings." }), !hasSigner ? ((0, jsx_runtime_1.jsx)("p", { className: "mt-4 text-yellow-600 dark:text-yellow-400 text-sm", children: "Connect your wallet to start verification." })) : ((0, jsx_runtime_1.jsx)("button", { onClick: handleStartVerification, className: "mt-4 px-6 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-md transition-colors", children: "Start Verification" }))] }) }));
|
|
144
|
+
}
|
|
145
|
+
exports.default = KYCFlow;
|
|
146
|
+
//# sourceMappingURL=KYCFlow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KYCFlow.js","sourceRoot":"","sources":["../../../src/components/KYCFlow.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.LoadingSpinner = LoadingSpinner;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const sizeClasses = {
|
|
7
|
+
sm: 'h-4 w-4',
|
|
8
|
+
md: 'h-6 w-6',
|
|
9
|
+
lg: 'h-8 w-8',
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* LoadingSpinner component
|
|
13
|
+
*/
|
|
14
|
+
function LoadingSpinner({ size = 'md', className = '', }) {
|
|
15
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-loading-spinner ${className}`, children: (0, jsx_runtime_1.jsx)("div", { className: `animate-spin rounded-full border-b-2 border-blue-600 dark:border-blue-400 ${sizeClasses[size]}`, role: "status", "aria-label": "Loading" }) }));
|
|
16
|
+
}
|
|
17
|
+
exports.default = LoadingSpinner;
|
|
18
|
+
//# sourceMappingURL=LoadingSpinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoadingSpinner.js","sourceRoot":"","sources":["../../../src/components/LoadingSpinner.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAiBb,wCAaC;;AAtBD,MAAM,WAAW,GAAG;IAChB,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,SAAS;CAChB,CAAC;AAEF;;GAEG;AACH,SAAgB,cAAc,CAAC,EAC3B,IAAI,GAAG,IAAI,EACX,SAAS,GAAG,EAAE,GACI;IAClB,OAAO,CACH,gCAAK,SAAS,EAAE,uBAAuB,SAAS,EAAE,YAC9C,gCACI,SAAS,EAAE,6EAA6E,WAAW,CAAC,IAAI,CAAC,EAAE,EAC3G,IAAI,EAAC,QAAQ,gBACF,SAAS,GACtB,GACA,CACT,CAAC;AACN,CAAC;AAED,kBAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.isValidAddress = isValidAddress;
|
|
5
|
+
exports.isValidAmount = isValidAmount;
|
|
6
|
+
exports.TokenMintForm = TokenMintForm;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
/**
|
|
9
|
+
* TokenMintForm - Form for minting RWA tokens to verified investors
|
|
10
|
+
*
|
|
11
|
+
* Validates recipient address and KYC status before allowing mint.
|
|
12
|
+
*/
|
|
13
|
+
const react_1 = require("react");
|
|
14
|
+
const useRWA_1 = require("../hooks/useRWA");
|
|
15
|
+
const sdk_1 = require("@mantle-rwa/sdk");
|
|
16
|
+
/**
|
|
17
|
+
* Validate Ethereum address format
|
|
18
|
+
*/
|
|
19
|
+
function isValidAddress(address) {
|
|
20
|
+
return /^0x[a-fA-F0-9]{40}$/.test(address);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validate amount is positive
|
|
24
|
+
*/
|
|
25
|
+
function isValidAmount(amount) {
|
|
26
|
+
const num = parseFloat(amount);
|
|
27
|
+
return !isNaN(num) && num > 0 && isFinite(num);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get display name for accreditation tier
|
|
31
|
+
*/
|
|
32
|
+
function getTierName(tier) {
|
|
33
|
+
switch (tier) {
|
|
34
|
+
case sdk_1.AccreditationTier.None:
|
|
35
|
+
return 'None';
|
|
36
|
+
case sdk_1.AccreditationTier.Retail:
|
|
37
|
+
return 'Retail';
|
|
38
|
+
case sdk_1.AccreditationTier.Accredited:
|
|
39
|
+
return 'Accredited';
|
|
40
|
+
case sdk_1.AccreditationTier.Institutional:
|
|
41
|
+
return 'Institutional';
|
|
42
|
+
default:
|
|
43
|
+
return 'Unknown';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* TokenMintForm component
|
|
48
|
+
*/
|
|
49
|
+
function TokenMintForm({ tokenAddress, kycRegistryAddress, onSuccess, onError, className = '', }) {
|
|
50
|
+
const { client, isInitialized, hasSigner } = (0, useRWA_1.useRWA)();
|
|
51
|
+
const [form, setForm] = (0, react_1.useState)({ recipient: '', amount: '' });
|
|
52
|
+
const [validation, setValidation] = (0, react_1.useState)({ recipientError: null, amountError: null });
|
|
53
|
+
const [kycCheck, setKycCheck] = (0, react_1.useState)({ isChecking: false, isVerified: null, tier: null });
|
|
54
|
+
const [isPending, setIsPending] = (0, react_1.useState)(false);
|
|
55
|
+
const [error, setError] = (0, react_1.useState)(null);
|
|
56
|
+
const [txResult, setTxResult] = (0, react_1.useState)(null);
|
|
57
|
+
// Validate recipient address
|
|
58
|
+
const validateRecipient = (0, react_1.useCallback)((address) => {
|
|
59
|
+
if (!address)
|
|
60
|
+
return 'Recipient address is required';
|
|
61
|
+
if (!isValidAddress(address))
|
|
62
|
+
return 'Invalid Ethereum address format';
|
|
63
|
+
return null;
|
|
64
|
+
}, []);
|
|
65
|
+
// Validate amount
|
|
66
|
+
const validateAmount = (0, react_1.useCallback)((amount) => {
|
|
67
|
+
if (!amount)
|
|
68
|
+
return 'Amount is required';
|
|
69
|
+
if (!isValidAmount(amount))
|
|
70
|
+
return 'Amount must be a positive number';
|
|
71
|
+
return null;
|
|
72
|
+
}, []);
|
|
73
|
+
// Handle recipient change
|
|
74
|
+
const handleRecipientChange = (0, react_1.useCallback)((e) => {
|
|
75
|
+
const value = e.target.value;
|
|
76
|
+
setForm(prev => ({ ...prev, recipient: value }));
|
|
77
|
+
setValidation(prev => ({ ...prev, recipientError: validateRecipient(value) }));
|
|
78
|
+
setKycCheck({ isChecking: false, isVerified: null, tier: null });
|
|
79
|
+
setTxResult(null);
|
|
80
|
+
}, [validateRecipient]);
|
|
81
|
+
// Handle amount change
|
|
82
|
+
const handleAmountChange = (0, react_1.useCallback)((e) => {
|
|
83
|
+
const value = e.target.value;
|
|
84
|
+
setForm(prev => ({ ...prev, amount: value }));
|
|
85
|
+
setValidation(prev => ({ ...prev, amountError: validateAmount(value) }));
|
|
86
|
+
setTxResult(null);
|
|
87
|
+
}, [validateAmount]);
|
|
88
|
+
// Check KYC status
|
|
89
|
+
const checkKYC = (0, react_1.useCallback)(async () => {
|
|
90
|
+
if (!client || !isInitialized || !form.recipient || !isValidAddress(form.recipient)) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
setKycCheck({ isChecking: true, isVerified: null, tier: null });
|
|
94
|
+
try {
|
|
95
|
+
const registry = client.kyc.connect(kycRegistryAddress);
|
|
96
|
+
const info = await registry.getInvestorInfo(form.recipient);
|
|
97
|
+
setKycCheck({
|
|
98
|
+
isChecking: false,
|
|
99
|
+
isVerified: info.verified,
|
|
100
|
+
tier: info.tier,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
setKycCheck({ isChecking: false, isVerified: false, tier: null });
|
|
105
|
+
}
|
|
106
|
+
}, [client, isInitialized, form.recipient, kycRegistryAddress]);
|
|
107
|
+
// Handle form submission
|
|
108
|
+
const handleSubmit = (0, react_1.useCallback)(async (e) => {
|
|
109
|
+
e.preventDefault();
|
|
110
|
+
// Validate all fields
|
|
111
|
+
const recipientError = validateRecipient(form.recipient);
|
|
112
|
+
const amountError = validateAmount(form.amount);
|
|
113
|
+
setValidation({ recipientError, amountError });
|
|
114
|
+
if (recipientError || amountError) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Check KYC if not already checked
|
|
118
|
+
if (kycCheck.isVerified === null) {
|
|
119
|
+
await checkKYC();
|
|
120
|
+
return; // User needs to submit again after KYC check
|
|
121
|
+
}
|
|
122
|
+
// Block if not verified
|
|
123
|
+
if (!kycCheck.isVerified) {
|
|
124
|
+
setError(new Error('Recipient is not KYC verified. Cannot mint tokens to unverified addresses.'));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (!client || !hasSigner) {
|
|
128
|
+
setError(new Error('Wallet not connected'));
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
setIsPending(true);
|
|
132
|
+
setError(null);
|
|
133
|
+
setTxResult(null);
|
|
134
|
+
try {
|
|
135
|
+
const token = client.token.connect(tokenAddress);
|
|
136
|
+
const result = await token.mint(form.recipient, form.amount);
|
|
137
|
+
setTxResult(result);
|
|
138
|
+
onSuccess?.(result);
|
|
139
|
+
// Clear form on success
|
|
140
|
+
setForm({ recipient: '', amount: '' });
|
|
141
|
+
setKycCheck({ isChecking: false, isVerified: null, tier: null });
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
const errorObj = err instanceof Error ? err : new Error('Mint failed');
|
|
145
|
+
setError(errorObj);
|
|
146
|
+
onError?.(errorObj);
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
setIsPending(false);
|
|
150
|
+
}
|
|
151
|
+
}, [form, validation, kycCheck, client, hasSigner, tokenAddress, validateRecipient, validateAmount, checkKYC, onSuccess, onError]);
|
|
152
|
+
const isFormValid = !validation.recipientError && !validation.amountError && form.recipient && form.amount;
|
|
153
|
+
const canSubmit = isFormValid && hasSigner && !isPending && (kycCheck.isVerified === null || kycCheck.isVerified);
|
|
154
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-token-mint-form ${className}`, children: (0, jsx_runtime_1.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-6", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "recipient", className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: "Recipient Address" }), (0, jsx_runtime_1.jsx)("input", { type: "text", id: "recipient", value: form.recipient, onChange: handleRecipientChange, onBlur: checkKYC, placeholder: "0x...", className: `mt-1 block w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white ${validation.recipientError
|
|
155
|
+
? 'border-red-500 focus:border-red-500'
|
|
156
|
+
: 'border-gray-300 dark:border-gray-600 focus:border-blue-500'}` }), validation.recipientError && ((0, jsx_runtime_1.jsx)("p", { className: "mt-1 text-sm text-red-600 dark:text-red-400", children: validation.recipientError })), kycCheck.isChecking && ((0, jsx_runtime_1.jsx)("p", { className: "mt-2 text-sm text-gray-500 dark:text-gray-400", children: "Checking KYC status..." })), kycCheck.isVerified === true && ((0, jsx_runtime_1.jsxs)("p", { className: "mt-2 text-sm text-green-600 dark:text-green-400", children: ["\u2713 Verified (", getTierName(kycCheck.tier), ")"] })), kycCheck.isVerified === false && ((0, jsx_runtime_1.jsx)("p", { className: "mt-2 text-sm text-red-600 dark:text-red-400", children: "\u2717 Not KYC verified - cannot mint to this address" }))] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "amount", className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: "Amount" }), (0, jsx_runtime_1.jsx)("input", { type: "text", id: "amount", value: form.amount, onChange: handleAmountChange, placeholder: "0.00", className: `mt-1 block w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white ${validation.amountError
|
|
157
|
+
? 'border-red-500 focus:border-red-500'
|
|
158
|
+
: 'border-gray-300 dark:border-gray-600 focus:border-blue-500'}` }), validation.amountError && ((0, jsx_runtime_1.jsx)("p", { className: "mt-1 text-sm text-red-600 dark:text-red-400", children: validation.amountError }))] }), !hasSigner && ((0, jsx_runtime_1.jsx)("div", { className: "p-3 bg-yellow-50 dark:bg-yellow-900/20 rounded-md border border-yellow-200 dark:border-yellow-800", children: (0, jsx_runtime_1.jsx)("p", { className: "text-sm text-yellow-700 dark:text-yellow-300", children: "Connect your wallet to mint tokens." }) })), error && ((0, jsx_runtime_1.jsx)("div", { className: "p-3 bg-red-50 dark:bg-red-900/20 rounded-md border border-red-200 dark:border-red-800", children: (0, jsx_runtime_1.jsx)("p", { className: "text-sm text-red-700 dark:text-red-300", children: error.message }) })), txResult && ((0, jsx_runtime_1.jsx)("div", { className: "p-3 bg-green-50 dark:bg-green-900/20 rounded-md border border-green-200 dark:border-green-800", children: (0, jsx_runtime_1.jsxs)("p", { className: "text-sm text-green-700 dark:text-green-300", children: ["\u2713 Mint successful! Transaction: ", txResult.hash.slice(0, 10), "..."] }) })), (0, jsx_runtime_1.jsx)("button", { type: "submit", disabled: !canSubmit, className: `w-full py-2 px-4 rounded-md font-medium transition-colors ${canSubmit
|
|
159
|
+
? 'bg-blue-600 hover:bg-blue-700 text-white'
|
|
160
|
+
: 'bg-gray-300 dark:bg-gray-700 text-gray-500 dark:text-gray-400 cursor-not-allowed'}`, children: isPending ? 'Minting...' : kycCheck.isVerified === null && form.recipient ? 'Check KYC & Mint' : 'Mint Tokens' })] }) }));
|
|
161
|
+
}
|
|
162
|
+
exports.default = TokenMintForm;
|
|
163
|
+
//# sourceMappingURL=TokenMintForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenMintForm.js","sourceRoot":"","sources":["../../../src/components/TokenMintForm.tsx"],"names":[],"mappings":"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"}
|