@coinbase/cdp-hooks 0.0.73 → 0.0.75
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/README.md +231 -2
- package/dist/esm/index.js +55 -48
- package/dist/esm/index10.js +1 -1
- package/dist/esm/index100.js +9 -3
- package/dist/esm/index101.js +2 -327
- package/dist/esm/index102.js +2 -14
- package/dist/esm/index103.js +3 -5
- package/dist/esm/index104.js +299 -28
- package/dist/esm/index105.js +14 -2
- package/dist/esm/index106.js +4 -7
- package/dist/esm/index107.js +29 -188
- package/dist/esm/index108.js +2 -32
- package/dist/esm/index109.js +7 -21
- package/dist/esm/index11.js +1 -1
- package/dist/esm/index110.js +214 -5
- package/dist/esm/index111.js +30 -72
- package/dist/esm/index112.js +21 -5
- package/dist/esm/index113.js +5 -5
- package/dist/esm/index114.js +69 -31
- package/dist/esm/index115.js +5 -75
- package/dist/esm/index116.js +6 -3
- package/dist/esm/index117.js +28 -16
- package/dist/esm/index118.js +57 -433
- package/dist/esm/index119.js +3 -31
- package/dist/esm/index12.js +1 -1
- package/dist/esm/index120.js +17 -20
- package/dist/esm/index121.js +439 -21
- package/dist/esm/index122.js +28 -32
- package/dist/esm/index123.js +18 -185
- package/dist/esm/index124.js +31 -6
- package/dist/esm/index125.js +35 -2
- package/dist/esm/index126.js +189 -8
- package/dist/esm/index127.js +7 -17
- package/dist/esm/index128.js +2 -28
- package/dist/esm/index129.js +12 -8
- package/dist/esm/index13.js +1 -1
- package/dist/esm/index130.js +15 -52
- package/dist/esm/index131.js +23 -41
- package/dist/esm/index132.js +8 -8
- package/dist/esm/index133.js +55 -7
- package/dist/esm/index134.js +44 -15
- package/dist/esm/index135.js +8 -18
- package/dist/esm/index136.js +7 -24
- package/dist/esm/index137.js +16 -16
- package/dist/esm/index138.js +17 -53
- package/dist/esm/index139.js +22 -9
- package/dist/esm/index14.js +1 -1
- package/dist/esm/index140.js +15 -159
- package/dist/esm/index141.js +53 -20
- package/dist/esm/index142.js +11 -127
- package/dist/esm/index143.js +153 -31
- package/dist/esm/index144.js +21 -6
- package/dist/esm/index145.js +127 -27
- package/dist/esm/index146.js +31 -184
- package/dist/esm/index147.js +7 -4
- package/dist/esm/index148.js +26 -63
- package/dist/esm/index149.js +192 -3
- package/dist/esm/index15.js +1 -1
- package/dist/esm/index150.js +4 -21
- package/dist/esm/index151.js +61 -13
- package/dist/esm/index152.js +3 -24
- package/dist/esm/index153.js +20 -11
- package/dist/esm/index154.js +15 -33
- package/dist/esm/index155.js +24 -3
- package/dist/esm/index156.js +11 -18
- package/dist/esm/index157.js +33 -26
- package/dist/esm/index158.js +3 -36
- package/dist/esm/index159.js +18 -7
- package/dist/esm/index16.js +1 -1
- package/dist/esm/index160.js +26 -24
- package/dist/esm/index161.js +34 -27
- package/dist/esm/index162.js +7 -64
- package/dist/esm/index163.js +25 -9
- package/dist/esm/index164.js +28 -33
- package/dist/esm/index165.js +64 -27
- package/dist/esm/index166.js +9 -24
- package/dist/esm/index167.js +33 -3
- package/dist/esm/index168.js +27 -14
- package/dist/esm/index169.js +24 -103
- package/dist/esm/index170.js +3 -64
- package/dist/esm/index171.js +14 -5
- package/dist/esm/index172.js +103 -6
- package/dist/esm/index173.js +62 -25
- package/dist/esm/index174.js +5 -38
- package/dist/esm/index175.js +6 -13
- package/dist/esm/index176.js +24 -39
- package/dist/esm/index177.js +38 -5
- package/dist/esm/index178.js +13 -11
- package/dist/esm/index179.js +42 -19
- package/dist/esm/index18.js +5 -5
- package/dist/esm/index180.js +5 -78
- package/dist/esm/index181.js +12 -2
- package/dist/esm/index182.js +19 -37
- package/dist/esm/index183.js +73 -105
- package/dist/esm/index184.js +2 -49
- package/dist/esm/index185.js +36 -31
- package/dist/esm/index186.js +110 -8
- package/dist/esm/index187.js +48 -6
- package/dist/esm/index188.js +32 -6
- package/dist/esm/index189.js +8 -11
- package/dist/esm/index19.js +5 -5
- package/dist/esm/index190.js +6 -10
- package/dist/esm/index191.js +6 -13
- package/dist/esm/index192.js +11 -32
- package/dist/esm/index193.js +11 -5
- package/dist/esm/index194.js +13 -8
- package/dist/esm/index195.js +30 -17
- package/dist/esm/index196.js +5 -32
- package/dist/esm/index197.js +8 -20
- package/dist/esm/index198.js +19 -3
- package/dist/esm/index199.js +31 -17
- package/dist/esm/index2.js +2 -2
- package/dist/esm/index20.js +5 -5
- package/dist/esm/index200.js +20 -10
- package/dist/esm/index201.js +3 -21
- package/dist/esm/index202.js +16 -21
- package/dist/esm/index203.js +10 -5
- package/dist/esm/index204.js +21 -5
- package/dist/esm/index205.js +22 -8
- package/dist/esm/index206.js +5 -104
- package/dist/esm/index207.js +6 -3
- package/dist/esm/index208.js +8 -18
- package/dist/esm/index209.js +99 -166
- package/dist/esm/index21.js +5 -5
- package/dist/esm/index210.js +3 -18
- package/dist/esm/index211.js +19 -10
- package/dist/esm/index212.js +171 -38
- package/dist/esm/index213.js +18 -2
- package/dist/esm/index214.js +10 -70
- package/dist/esm/index215.js +37 -33
- package/dist/esm/index216.js +2 -15
- package/dist/esm/index217.js +69 -40
- package/dist/esm/index218.js +35 -2
- package/dist/esm/index219.js +14 -4
- package/dist/esm/index22.js +7 -8
- package/dist/esm/index220.js +2 -11
- package/dist/esm/index221.js +39 -18
- package/dist/esm/index222.js +2 -8
- package/dist/esm/index223.js +4 -11
- package/dist/esm/index224.js +9 -65
- package/dist/esm/index225.js +17 -63
- package/dist/esm/index226.js +7 -185
- package/dist/esm/index227.js +10 -21
- package/dist/esm/index228.js +66 -42
- package/dist/esm/index229.js +61 -72
- package/dist/esm/index23.js +8 -34
- package/dist/esm/index230.js +180 -35
- package/dist/esm/index231.js +21 -15
- package/dist/esm/index232.js +34 -5
- package/dist/esm/index233.js +76 -7
- package/dist/esm/index234.js +40 -6
- package/dist/esm/index235.js +16 -36
- package/dist/esm/index236.js +13 -15
- package/dist/esm/index237.js +7 -8
- package/dist/esm/index238.js +6 -12
- package/dist/esm/index239.js +36 -9
- package/dist/esm/index24.js +57 -18
- package/dist/esm/index240.js +15 -16
- package/dist/esm/index241.js +8 -22
- package/dist/esm/index242.js +8 -26
- package/dist/esm/index243.js +10 -2
- package/dist/esm/index244.js +16 -13
- package/dist/esm/index245.js +21 -11
- package/dist/esm/index246.js +30 -47
- package/dist/esm/index247.js +2 -10
- package/dist/esm/index248.js +10 -10
- package/dist/esm/index249.js +11 -13
- package/dist/esm/index25.js +8 -11
- package/dist/esm/index250.js +47 -8
- package/dist/esm/index251.js +9 -15
- package/dist/esm/index252.js +12 -23
- package/dist/esm/index253.js +14 -11
- package/dist/esm/index254.js +8 -24
- package/dist/esm/index255.js +15 -51
- package/dist/esm/index256.js +24 -17
- package/dist/esm/index257.js +11 -14
- package/dist/esm/index258.js +24 -11
- package/dist/esm/index259.js +49 -101
- package/dist/esm/index26.js +34 -12
- package/dist/esm/index260.js +17 -5
- package/dist/esm/index261.js +13 -222
- package/dist/esm/index262.js +11 -6
- package/dist/esm/index263.js +104 -7
- package/dist/esm/index264.js +5 -26
- package/dist/esm/index265.js +222 -18
- package/dist/esm/index266.js +6 -145
- package/dist/esm/index267.js +6 -12
- package/dist/esm/index268.js +26 -35
- package/dist/esm/index269.js +18 -40
- package/dist/esm/index27.js +18 -54
- package/dist/esm/index270.js +146 -2
- package/dist/esm/index271.js +13 -69
- package/dist/esm/index272.js +36 -4
- package/dist/esm/index273.js +41 -136
- package/dist/esm/index274.js +68 -16
- package/dist/esm/index275.js +3 -155
- package/dist/esm/index276.js +134 -7
- package/dist/esm/index277.js +140 -98
- package/dist/esm/index278.js +9 -134
- package/dist/esm/index279.js +16 -78
- package/dist/esm/index28.js +11 -57
- package/dist/esm/index280.js +114 -2
- package/dist/esm/index281.js +124 -687
- package/dist/esm/index282.js +73 -133
- package/dist/esm/index283.js +2 -43
- package/dist/esm/index284.js +675 -178
- package/dist/esm/index285.js +138 -3
- package/dist/esm/index286.js +40 -63
- package/dist/esm/index287.js +200 -4
- package/dist/esm/index288.js +3 -40
- package/dist/esm/index289.js +65 -7
- package/dist/esm/index29.js +12 -56
- package/dist/esm/index290.js +4 -62
- package/dist/esm/index291.js +33 -70
- package/dist/esm/index292.js +8 -4
- package/dist/esm/index293.js +55 -187
- package/dist/esm/index294.js +61 -47
- package/dist/esm/index295.js +4 -45
- package/dist/esm/index296.js +194 -4
- package/dist/esm/index297.js +64 -5
- package/dist/esm/index298.js +45 -2
- package/dist/esm/index299.js +4 -21
- package/dist/esm/index3.js +1 -1
- package/dist/esm/index30.js +54 -5
- package/dist/esm/index300.js +7 -0
- package/dist/esm/index301.js +4 -0
- package/dist/esm/index302.js +24 -0
- package/dist/esm/index31.js +57 -47
- package/dist/esm/index32.js +56 -33
- package/dist/esm/index33.js +5 -4
- package/dist/esm/index34.js +46 -8
- package/dist/esm/index35.js +31 -67
- package/dist/esm/index36.js +3 -9
- package/dist/esm/index37.js +9 -28
- package/dist/esm/index38.js +68 -70
- package/dist/esm/index39.js +9 -19
- package/dist/esm/index40.js +26 -108
- package/dist/esm/index41.js +70 -60
- package/dist/esm/index42.js +19 -24
- package/dist/esm/index43.js +110 -40
- package/dist/esm/index44.js +57 -34
- package/dist/esm/index45.js +20 -54
- package/dist/esm/index46.js +37 -160
- package/dist/esm/index47.js +36 -38
- package/dist/esm/index48.js +58 -9
- package/dist/esm/index49.js +161 -29
- package/dist/esm/index5.js +3 -3
- package/dist/esm/index50.js +39 -36
- package/dist/esm/index51.js +7 -7
- package/dist/esm/index52.js +30 -28
- package/dist/esm/index53.js +34 -44
- package/dist/esm/index54.js +9 -88
- package/dist/esm/index55.js +26 -37
- package/dist/esm/index56.js +46 -8
- package/dist/esm/index57.js +88 -6
- package/dist/esm/index58.js +40 -16
- package/dist/esm/index59.js +8 -8
- package/dist/esm/index6.js +2 -2
- package/dist/esm/index60.js +6 -13
- package/dist/esm/index61.js +16 -7
- package/dist/esm/index62.js +8 -9
- package/dist/esm/index63.js +13 -16
- package/dist/esm/index64.js +7 -46
- package/dist/esm/index65.js +9 -13
- package/dist/esm/index66.js +15 -15
- package/dist/esm/index67.js +46 -13
- package/dist/esm/index68.js +13 -6
- package/dist/esm/index69.js +15 -34
- package/dist/esm/index7.js +1 -1
- package/dist/esm/index70.js +13 -9
- package/dist/esm/index71.js +5 -7
- package/dist/esm/index72.js +35 -25
- package/dist/esm/index73.js +9 -10
- package/dist/esm/index74.js +7 -13
- package/dist/esm/index75.js +25 -11
- package/dist/esm/index76.js +10 -116
- package/dist/esm/index77.js +13 -32
- package/dist/esm/index78.js +11 -79
- package/dist/esm/index79.js +108 -169
- package/dist/esm/index8.js +2 -2
- package/dist/esm/index80.js +26 -37
- package/dist/esm/index81.js +79 -6
- package/dist/esm/index82.js +177 -13
- package/dist/esm/index83.js +44 -13
- package/dist/esm/index84.js +6 -99
- package/dist/esm/index85.js +13 -72
- package/dist/esm/index86.js +13 -87
- package/dist/esm/index87.js +93 -142
- package/dist/esm/index88.js +65 -129
- package/dist/esm/index89.js +73 -54
- package/dist/esm/index9.js +1 -1
- package/dist/esm/index90.js +148 -23
- package/dist/esm/index91.js +133 -102
- package/dist/esm/index92.js +68 -6
- package/dist/esm/index93.js +23 -131
- package/dist/esm/index94.js +101 -271
- package/dist/esm/index95.js +7 -3
- package/dist/esm/index96.js +132 -4
- package/dist/esm/index97.js +276 -9
- package/dist/esm/index98.js +3 -2
- package/dist/esm/index99.js +4 -2
- package/dist/types/index.d.ts +33 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -969,6 +969,147 @@ function MfaVerification() {
|
|
|
969
969
|
}
|
|
970
970
|
```
|
|
971
971
|
|
|
972
|
+
#### Check MFA Configuration
|
|
973
|
+
|
|
974
|
+
Use `useGetMfaConfig` to check whether MFA is enabled for your project:
|
|
975
|
+
|
|
976
|
+
```tsx lines
|
|
977
|
+
import { useGetMfaConfig } from "@coinbase/cdp-hooks";
|
|
978
|
+
import { useState, useEffect } from "react";
|
|
979
|
+
|
|
980
|
+
function MfaStatus() {
|
|
981
|
+
const { getMfaConfig } = useGetMfaConfig();
|
|
982
|
+
const [config, setConfig] = useState<{
|
|
983
|
+
enabled: boolean;
|
|
984
|
+
totpConfig: { enabled: boolean };
|
|
985
|
+
createdAt: string;
|
|
986
|
+
updatedAt: string;
|
|
987
|
+
} | null>(null);
|
|
988
|
+
|
|
989
|
+
useEffect(() => {
|
|
990
|
+
const fetchMfaConfig = async () => {
|
|
991
|
+
try {
|
|
992
|
+
const result = await getMfaConfig();
|
|
993
|
+
setConfig(result);
|
|
994
|
+
console.log("MFA enabled:", result.enabled);
|
|
995
|
+
console.log("TOTP enabled:", result.totpConfig.enabled);
|
|
996
|
+
} catch (error) {
|
|
997
|
+
console.error("Failed to fetch MFA config:", error);
|
|
998
|
+
}
|
|
999
|
+
};
|
|
1000
|
+
|
|
1001
|
+
fetchMfaConfig();
|
|
1002
|
+
}, []);
|
|
1003
|
+
|
|
1004
|
+
if (!config) {
|
|
1005
|
+
return <div>Loading MFA configuration...</div>;
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
return (
|
|
1009
|
+
<div>
|
|
1010
|
+
<h3>MFA Configuration</h3>
|
|
1011
|
+
<p>MFA Enabled: {config.enabled ? "Yes" : "No"}</p>
|
|
1012
|
+
<p>TOTP Enabled: {config.totpConfig.enabled ? "Yes" : "No"}</p>
|
|
1013
|
+
<p>Last Updated: {new Date(config.updatedAt).toLocaleDateString()}</p>
|
|
1014
|
+
</div>
|
|
1015
|
+
);
|
|
1016
|
+
}
|
|
1017
|
+
```
|
|
1018
|
+
|
|
1019
|
+
#### Track MFA Enrollment Prompts
|
|
1020
|
+
|
|
1021
|
+
Use `useRecordMfaEnrollmentPrompted` to track when users are shown the MFA enrollment prompt:
|
|
1022
|
+
|
|
1023
|
+
```tsx lines
|
|
1024
|
+
import {
|
|
1025
|
+
useRecordMfaEnrollmentPrompted,
|
|
1026
|
+
useCurrentUser
|
|
1027
|
+
} from "@coinbase/cdp-hooks";
|
|
1028
|
+
import { useState } from "react";
|
|
1029
|
+
|
|
1030
|
+
function MfaEnrollmentPrompt() {
|
|
1031
|
+
const { recordMfaEnrollmentPrompted } = useRecordMfaEnrollmentPrompted();
|
|
1032
|
+
const { currentUser } = useCurrentUser();
|
|
1033
|
+
const [showPrompt, setShowPrompt] = useState(true);
|
|
1034
|
+
|
|
1035
|
+
const handleSkip = async () => {
|
|
1036
|
+
try {
|
|
1037
|
+
// Record that the user was prompted and chose to skip
|
|
1038
|
+
const result = await recordMfaEnrollmentPrompted();
|
|
1039
|
+
|
|
1040
|
+
console.log("Enrollment prompt recorded at:", result.enrollmentPromptedAt);
|
|
1041
|
+
|
|
1042
|
+
// User's state is now updated with the timestamp
|
|
1043
|
+
console.log("Last prompted:", currentUser?.mfaMethods?.enrollmentPromptedAt);
|
|
1044
|
+
|
|
1045
|
+
setShowPrompt(false);
|
|
1046
|
+
} catch (error) {
|
|
1047
|
+
console.error("Failed to record MFA prompt:", error);
|
|
1048
|
+
}
|
|
1049
|
+
};
|
|
1050
|
+
|
|
1051
|
+
const handleEnroll = async () => {
|
|
1052
|
+
// Record the prompt before starting enrollment
|
|
1053
|
+
await recordMfaEnrollmentPrompted();
|
|
1054
|
+
|
|
1055
|
+
// Navigate to enrollment flow
|
|
1056
|
+
console.log("Starting MFA enrollment...");
|
|
1057
|
+
};
|
|
1058
|
+
|
|
1059
|
+
// Check if user was recently prompted (within last 30 days)
|
|
1060
|
+
const wasRecentlyPrompted = () => {
|
|
1061
|
+
if (!currentUser?.mfaMethods?.enrollmentPromptedAt) {
|
|
1062
|
+
return false;
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
const promptedDate = new Date(currentUser.mfaMethods.enrollmentPromptedAt);
|
|
1066
|
+
const thirtyDaysAgo = new Date();
|
|
1067
|
+
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
|
|
1068
|
+
|
|
1069
|
+
return promptedDate > thirtyDaysAgo;
|
|
1070
|
+
};
|
|
1071
|
+
|
|
1072
|
+
// Don't show prompt if user was recently prompted or already enrolled
|
|
1073
|
+
if (!showPrompt || wasRecentlyPrompted() || currentUser?.mfaMethods?.totp) {
|
|
1074
|
+
return null;
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
return (
|
|
1078
|
+
<div style={{
|
|
1079
|
+
padding: "20px",
|
|
1080
|
+
backgroundColor: "#f0f9ff",
|
|
1081
|
+
border: "1px solid #bae6fd",
|
|
1082
|
+
borderRadius: "8px"
|
|
1083
|
+
}}>
|
|
1084
|
+
<h3>🔒 Secure Your Account with MFA</h3>
|
|
1085
|
+
<p>
|
|
1086
|
+
Add an extra layer of security by enabling Multi-Factor Authentication.
|
|
1087
|
+
</p>
|
|
1088
|
+
|
|
1089
|
+
<div style={{ marginTop: "15px", display: "flex", gap: "10px" }}>
|
|
1090
|
+
<button onClick={handleEnroll}>
|
|
1091
|
+
Enable MFA
|
|
1092
|
+
</button>
|
|
1093
|
+
|
|
1094
|
+
<button onClick={handleSkip} style={{ backgroundColor: "#e5e7eb" }}>
|
|
1095
|
+
Skip for Now
|
|
1096
|
+
</button>
|
|
1097
|
+
</div>
|
|
1098
|
+
|
|
1099
|
+
<p style={{ fontSize: "12px", marginTop: "10px", color: "#6b7280" }}>
|
|
1100
|
+
You won't be prompted again for 30 days
|
|
1101
|
+
</p>
|
|
1102
|
+
</div>
|
|
1103
|
+
);
|
|
1104
|
+
}
|
|
1105
|
+
```
|
|
1106
|
+
|
|
1107
|
+
**Use Cases for Tracking Enrollment Prompts:**
|
|
1108
|
+
- Track when users skip MFA enrollment to avoid over-prompting
|
|
1109
|
+
- Implement smart re-prompting logic based on time intervals
|
|
1110
|
+
- Analyze MFA adoption rates across your user base
|
|
1111
|
+
- Identify users who need additional education about MFA benefits
|
|
1112
|
+
|
|
972
1113
|
### View User Information
|
|
973
1114
|
|
|
974
1115
|
Once the end user has signed in, you can display their information in your application:
|
|
@@ -1463,7 +1604,95 @@ function SignData() {
|
|
|
1463
1604
|
|
|
1464
1605
|
End users can export their private keys from their embedded wallet, allowing them to import them into compatible wallets of their choice.
|
|
1465
1606
|
|
|
1466
|
-
####
|
|
1607
|
+
#### Secure Iframe Export (Recommended)
|
|
1608
|
+
|
|
1609
|
+
The secure iframe hooks are the recommended way to export private keys. They create a secure iframe that copies the private key directly to the user's clipboard without ever exposing it to your application's JavaScript context.
|
|
1610
|
+
|
|
1611
|
+
##### Export EVM Private Key via Iframe
|
|
1612
|
+
|
|
1613
|
+
```tsx lines
|
|
1614
|
+
import { useEvmKeyExportIframe, useEvmAddress } from "@coinbase/cdp-hooks";
|
|
1615
|
+
import { useRef, useState } from "react";
|
|
1616
|
+
|
|
1617
|
+
function ExportEvmKey() {
|
|
1618
|
+
const { evmAddress } = useEvmAddress();
|
|
1619
|
+
const containerRef = useRef<HTMLDivElement>(null);
|
|
1620
|
+
const [isActive, setIsActive] = useState(false);
|
|
1621
|
+
|
|
1622
|
+
const { status, cleanup } = useEvmKeyExportIframe({
|
|
1623
|
+
address: isActive && evmAddress ? evmAddress : "",
|
|
1624
|
+
containerRef: isActive ? containerRef : { current: null },
|
|
1625
|
+
label: "Copy Private Key",
|
|
1626
|
+
copiedLabel: "Copied!",
|
|
1627
|
+
});
|
|
1628
|
+
|
|
1629
|
+
return (
|
|
1630
|
+
<div>
|
|
1631
|
+
{!isActive ? (
|
|
1632
|
+
<button onClick={() => setIsActive(true)} disabled={!evmAddress}>
|
|
1633
|
+
Show Export Button
|
|
1634
|
+
</button>
|
|
1635
|
+
) : (
|
|
1636
|
+
<button onClick={() => { cleanup(); setIsActive(false); }}>
|
|
1637
|
+
Hide Export Button
|
|
1638
|
+
</button>
|
|
1639
|
+
)}
|
|
1640
|
+
{isActive && (
|
|
1641
|
+
<div>
|
|
1642
|
+
<div ref={containerRef} />
|
|
1643
|
+
<p>Status: {status ?? "initializing"}</p>
|
|
1644
|
+
</div>
|
|
1645
|
+
)}
|
|
1646
|
+
</div>
|
|
1647
|
+
);
|
|
1648
|
+
}
|
|
1649
|
+
```
|
|
1650
|
+
|
|
1651
|
+
##### Export Solana Private Key via Iframe
|
|
1652
|
+
|
|
1653
|
+
```tsx lines
|
|
1654
|
+
import { useSolanaKeyExportIframe, useSolanaAddress } from "@coinbase/cdp-hooks";
|
|
1655
|
+
import { useRef, useState } from "react";
|
|
1656
|
+
|
|
1657
|
+
function ExportSolanaKey() {
|
|
1658
|
+
const { solanaAddress } = useSolanaAddress();
|
|
1659
|
+
const containerRef = useRef<HTMLDivElement>(null);
|
|
1660
|
+
const [isActive, setIsActive] = useState(false);
|
|
1661
|
+
|
|
1662
|
+
const { status, cleanup } = useSolanaKeyExportIframe({
|
|
1663
|
+
address: isActive && solanaAddress ? solanaAddress : "",
|
|
1664
|
+
containerRef: isActive ? containerRef : { current: null },
|
|
1665
|
+
label: "Copy Private Key",
|
|
1666
|
+
copiedLabel: "Copied!",
|
|
1667
|
+
});
|
|
1668
|
+
|
|
1669
|
+
return (
|
|
1670
|
+
<div>
|
|
1671
|
+
{!isActive ? (
|
|
1672
|
+
<button onClick={() => setIsActive(true)} disabled={!solanaAddress}>
|
|
1673
|
+
Show Export Button
|
|
1674
|
+
</button>
|
|
1675
|
+
) : (
|
|
1676
|
+
<button onClick={() => { cleanup(); setIsActive(false); }}>
|
|
1677
|
+
Hide Export Button
|
|
1678
|
+
</button>
|
|
1679
|
+
)}
|
|
1680
|
+
{isActive && (
|
|
1681
|
+
<div>
|
|
1682
|
+
<div ref={containerRef} />
|
|
1683
|
+
<p>Status: {status ?? "initializing"}</p>
|
|
1684
|
+
</div>
|
|
1685
|
+
)}
|
|
1686
|
+
</div>
|
|
1687
|
+
);
|
|
1688
|
+
}
|
|
1689
|
+
```
|
|
1690
|
+
|
|
1691
|
+
#### Direct Export (Deprecated)
|
|
1692
|
+
|
|
1693
|
+
> **⚠️ Deprecated:** The direct export hooks expose the private key to your application's JavaScript context and will be removed soon. Use the secure iframe hooks above instead.
|
|
1694
|
+
|
|
1695
|
+
##### Export EVM Private Key (Deprecated)
|
|
1467
1696
|
|
|
1468
1697
|
```tsx lines
|
|
1469
1698
|
import { useExportEvmAccount, useEvmAddress } from "@coinbase/cdp-hooks";
|
|
@@ -1491,7 +1720,7 @@ function ExportEvmKey() {
|
|
|
1491
1720
|
}
|
|
1492
1721
|
```
|
|
1493
1722
|
|
|
1494
|
-
|
|
1723
|
+
##### Export Solana Private Key (Deprecated)
|
|
1495
1724
|
|
|
1496
1725
|
When your application is configured with `solana: { createOnLogin: true }`, you can export Solana private keys:
|
|
1497
1726
|
|
package/dist/esm/index.js
CHANGED
|
@@ -2,76 +2,83 @@ import { APIError as i, OAuth2ProviderType as a } from "@coinbase/cdp-core";
|
|
|
2
2
|
import { Analytics as e } from "./index2.js";
|
|
3
3
|
import "react";
|
|
4
4
|
import { VERSION as o } from "./index3.js";
|
|
5
|
-
import { CDPContext as
|
|
6
|
-
import { useAuthenticateWithJWT as c, useConfig as
|
|
7
|
-
import { useCreateSpendPermission as
|
|
8
|
-
import { useListSpendPermissions as
|
|
5
|
+
import { CDPContext as f, CDPHooksProvider as p } from "./index4.js";
|
|
6
|
+
import { useAuthenticateWithJWT as c, useConfig as x, useCurrentUser as E, useEnforceAuthenticated as l, useEnforceUnauthenticated as A, useEvmAccounts as d, useEvmAddress as g, useEvmSmartAccounts as v, useExportEvmAccount as h, useExportSolanaAccount as I, useGetAccessToken as P, useIsInitialized as k, useIsSignedIn as C, useOAuthState as O, useSendEvmTransaction as T, useSendSolanaTransaction as M, useSendUserOperation as y, useSignEvmHash as L, useSignEvmMessage as V, useSignEvmTransaction as W, useSignEvmTypedData as U, useSignInWithEmail as D, useSignInWithOAuth as G, useSignInWithSms as R, useSignOut as b, useSignSolanaMessage as H, useSignSolanaTransaction as K, useSolanaAccounts as z, useSolanaAddress as F, useVerifyEmailOTP as J, useVerifySmsOTP as N, useWaitForUserOperation as X } from "./index5.js";
|
|
7
|
+
import { useCreateSpendPermission as q } from "./index6.js";
|
|
8
|
+
import { useListSpendPermissions as B } from "./index7.js";
|
|
9
9
|
import { useRevokeSpendPermission as Y } from "./index8.js";
|
|
10
10
|
import { useLinkGoogle as _ } from "./index9.js";
|
|
11
11
|
import { useLinkApple as ee } from "./index10.js";
|
|
12
|
-
import { useLinkSms as
|
|
13
|
-
import { useLinkEmail as
|
|
12
|
+
import { useLinkSms as re } from "./index11.js";
|
|
13
|
+
import { useLinkEmail as se } from "./index12.js";
|
|
14
14
|
import { useLinkOAuth as ue } from "./index13.js";
|
|
15
15
|
import { useCreateEvmEoaAccount as ae } from "./index14.js";
|
|
16
|
-
import { useCreateEvmSmartAccount as
|
|
17
|
-
import { useCreateSolanaAccount as
|
|
18
|
-
import { useX402 as
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
16
|
+
import { useCreateEvmSmartAccount as fe } from "./index15.js";
|
|
17
|
+
import { useCreateSolanaAccount as Se } from "./index16.js";
|
|
18
|
+
import { useX402 as xe } from "./index17.js";
|
|
19
|
+
import { useGetMfaConfig as le } from "./index18.js";
|
|
20
|
+
import { useRecordMfaEnrollmentPrompted as de } from "./index19.js";
|
|
21
|
+
import { useInitiateMfaEnrollment as ve } from "./index20.js";
|
|
22
|
+
import { useSubmitMfaEnrollment as Ie } from "./index21.js";
|
|
23
|
+
import { useInitiateMfaVerification as ke } from "./index22.js";
|
|
24
|
+
import { useSubmitMfaVerification as Oe } from "./index23.js";
|
|
25
|
+
import { useEvmKeyExportIframe as Me, useSolanaKeyExportIframe as ye } from "./index24.js";
|
|
23
26
|
e.registerPackageVersion("hooks", o);
|
|
24
27
|
export {
|
|
25
28
|
i as APIError,
|
|
26
|
-
|
|
27
|
-
|
|
29
|
+
f as CDPContext,
|
|
30
|
+
p as CDPHooksProvider,
|
|
28
31
|
a as OAuth2ProviderType,
|
|
29
32
|
c as useAuthenticateWithJWT,
|
|
30
|
-
|
|
33
|
+
x as useConfig,
|
|
31
34
|
ae as useCreateEvmEoaAccount,
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
fe as useCreateEvmSmartAccount,
|
|
36
|
+
Se as useCreateSolanaAccount,
|
|
37
|
+
q as useCreateSpendPermission,
|
|
38
|
+
E as useCurrentUser,
|
|
39
|
+
l as useEnforceAuthenticated,
|
|
40
|
+
A as useEnforceUnauthenticated,
|
|
38
41
|
d as useEvmAccounts,
|
|
39
42
|
g as useEvmAddress,
|
|
43
|
+
Me as useEvmKeyExportIframe,
|
|
40
44
|
v as useEvmSmartAccounts,
|
|
41
45
|
h as useExportEvmAccount,
|
|
42
46
|
I as useExportSolanaAccount,
|
|
43
47
|
P as useGetAccessToken,
|
|
44
|
-
|
|
45
|
-
ve as
|
|
48
|
+
le as useGetMfaConfig,
|
|
49
|
+
ve as useInitiateMfaEnrollment,
|
|
50
|
+
ke as useInitiateMfaVerification,
|
|
46
51
|
k as useIsInitialized,
|
|
47
|
-
|
|
52
|
+
C as useIsSignedIn,
|
|
48
53
|
ee as useLinkApple,
|
|
49
|
-
|
|
54
|
+
se as useLinkEmail,
|
|
50
55
|
_ as useLinkGoogle,
|
|
51
56
|
ue as useLinkOAuth,
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
57
|
+
re as useLinkSms,
|
|
58
|
+
B as useListSpendPermissions,
|
|
59
|
+
O as useOAuthState,
|
|
60
|
+
de as useRecordMfaEnrollmentPrompted,
|
|
55
61
|
Y as useRevokeSpendPermission,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
T as useSendEvmTransaction,
|
|
63
|
+
M as useSendSolanaTransaction,
|
|
64
|
+
y as useSendUserOperation,
|
|
65
|
+
L as useSignEvmHash,
|
|
66
|
+
V as useSignEvmMessage,
|
|
67
|
+
W as useSignEvmTransaction,
|
|
62
68
|
U as useSignEvmTypedData,
|
|
63
69
|
D as useSignInWithEmail,
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
Ie as
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
70
|
+
G as useSignInWithOAuth,
|
|
71
|
+
R as useSignInWithSms,
|
|
72
|
+
b as useSignOut,
|
|
73
|
+
H as useSignSolanaMessage,
|
|
74
|
+
K as useSignSolanaTransaction,
|
|
75
|
+
z as useSolanaAccounts,
|
|
76
|
+
F as useSolanaAddress,
|
|
77
|
+
ye as useSolanaKeyExportIframe,
|
|
78
|
+
Ie as useSubmitMfaEnrollment,
|
|
79
|
+
Oe as useSubmitMfaVerification,
|
|
80
|
+
J as useVerifyEmailOTP,
|
|
81
|
+
N as useVerifySmsOTP,
|
|
82
|
+
X as useWaitForUserOperation,
|
|
83
|
+
xe as useX402
|
|
77
84
|
};
|
package/dist/esm/index10.js
CHANGED