Skip to content

Commit

Permalink
feat: update recovery route
Browse files Browse the repository at this point in the history
  • Loading branch information
ieow committed Jan 20, 2025
1 parent 91362fd commit 9e180e1
Show file tree
Hide file tree
Showing 11 changed files with 79 additions and 39 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { ScrollView } from "react-native";

import { RecoveryView } from "@/components/mpc/RecoveryView";
import { useMPCCoreKitStore } from "@/hooks/useMPCCoreKit";

export default function Index() {
const { coreKitInstance, coreKitStatus, setCoreKitStatus } = useMPCCoreKitStore();
return (
<ScrollView>
<RecoveryView coreKitInstance={coreKitInstance} coreKitStatus={coreKitStatus} setCoreKitStatus={setCoreKitStatus} />
</ScrollView>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { ScrollView } from "react-native";

import { RecoveryView } from "@/components/mpc/RecoveryView";
import { useMPCCoreKitStore } from "@/hooks/useMPCCoreKit";

export default function Index() {
const { coreKitEd25519Instance, coreKitEd25519Status, setCoreKitEd25519Status } = useMPCCoreKitStore();
return (
<ScrollView>
<RecoveryView coreKitInstance={coreKitEd25519Instance} coreKitStatus={coreKitEd25519Status} setCoreKitStatus={setCoreKitEd25519Status} />
</ScrollView>
);
}
35 changes: 22 additions & 13 deletions mpc-core-kit-react-native/mpc-core-kit-expo-ed25519/app/_layout.tsx
Original file line number Diff line number Diff line change
@@ -1,37 +1,41 @@
import "../global";

import { Bridge, COREKIT_STATUS } from "@web3auth/react-native-mpc-core-kit";
import { COREKIT_STATUS } from "@web3auth/mpc-core-kit";
import { Bridge } from "@web3auth/react-native-mpc-core-kit";
import { router, Stack, usePathname } from "expo-router";
import { useEffect } from "react";
import { useEffect, useState } from "react";

import { useMPCCoreKitStore } from "@/hooks/useMPCCoreKit";

export default function RootLayout() {
const { coreKitStatus, coreKitInit, coreKitEd25519Status, coreKitEd25519Init } = useMPCCoreKitStore();
const { coreKitInstance, coreKitStatus, coreKitInit, coreKitEd25519Status, coreKitEd25519Init } = useMPCCoreKitStore();
const pathname = usePathname();
console.log(pathname);

const [bridgeReady, setBridgeReady] = useState(false);

useEffect(() => {
if (coreKitStatus === COREKIT_STATUS.NOT_INITIALIZED) {
if (coreKitStatus === COREKIT_STATUS.NOT_INITIALIZED && bridgeReady) {
coreKitInit();
coreKitInstance.init();
}
}, [coreKitStatus]);
}, [coreKitStatus, bridgeReady]);

useEffect(() => {
if (coreKitEd25519Status === COREKIT_STATUS.NOT_INITIALIZED) {
if (coreKitEd25519Status === COREKIT_STATUS.NOT_INITIALIZED && bridgeReady) {
coreKitEd25519Init();
}
}, [coreKitEd25519Status]);
}, [coreKitEd25519Status, bridgeReady]);

useEffect(() => {
console.log(coreKitStatus);
if (coreKitStatus === COREKIT_STATUS.LOGGED_IN) {
router.navigate({ pathname: "/(mpc-demo)/evm" });
router.replace({ pathname: "/(mpc-demo)/evm" });
} else if (coreKitStatus === COREKIT_STATUS.REQUIRED_SHARE) {
router.navigate({ pathname: "/recovery" });
router.replace({ pathname: "/(recovery)/evm" });
} else if (coreKitEd25519Status === COREKIT_STATUS.LOGGED_IN) {
router.navigate({ pathname: "/solana" });
router.replace({ pathname: "/solana" });
} else if (coreKitEd25519Status === COREKIT_STATUS.REQUIRED_SHARE) {
router.navigate({ pathname: "/recovery" });
router.replace({ pathname: "/(recovery)/solana" });
} else if (router.canDismiss()) {
router.dismissAll();
} else if (pathname !== "/") {
Expand All @@ -50,7 +54,12 @@ export default function RootLayout() {
/>
<Stack.Screen name="index" />
</Stack>
<Bridge logLevel={"DEBUG"} />
<Bridge
logLevel={"DEBUG"}
resolveReady={(ready) => {
setBridgeReady(ready);
}}
/>
</>
);
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export const LoginView = () => {

const login = async () => {
if (coreKitStatus !== COREKIT_STATUS.INITIALIZED) {
throw new Error("Corekit not initialized");
throw new Error(`Corekit not initialized - status:${coreKitStatus}`);
}
try {
uiConsole("Logging in...");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,21 @@ export default function MPCAccoutFunction(props: {
logout();
};

const recoverKey = async () => {
try {
const fac1 = coreKitInstance.getCurrentFactorKey().factorKey.toString("hex");
uiConsole("current factor: ", fac1);
const fac2 = await coreKitInstance.createFactor({
shareType: TssShareType.RECOVERY,
});
const finalKey = await coreKitInstance._UNSAFE_recoverTssKey([fac1, fac2]);
uiConsole("final key: ", finalKey);
// uiConsole("key recovered");
} catch (error: any) {
uiConsole(error.message);
}
};

const loggedInView = (
<View style={styles.compressedButtons}>
<Text style={styles.heading}>MPC Core Kit RN Account Function</Text>
Expand All @@ -121,6 +136,7 @@ export default function MPCAccoutFunction(props: {
<Button title="Get Device Factor" onPress={() => getDeviceFactor()} />
<Button title="store Device Factor" onPress={() => storeDeviceFactor()} />
{/* <Button title="Store Device Factor" onPress={() => storeDeviceFactor()} /> */}
<Button title="Recover Tss Key" onPress={recoverKey} />
<Button title="Log Out" onPress={logout} />
<Button title="[CRITICAL] Reset Account" onPress={criticalResetAccount} />
</View>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
import { COREKIT_STATUS, mnemonicToKey } from "@web3auth/react-native-mpc-core-kit";
import { Web3AuthMPCCoreKitRN } from "@web3auth/react-native-mpc-core-kit/dist/mpclib";
import BN from "bn.js";
import { router } from "expo-router";
import { useState } from "react";
import { Button, Text, TextInput, View } from "react-native";

import { useConsoleUI } from "@/hooks/useConsoleUI";
import { useMPCCoreKitStore } from "@/hooks/useMPCCoreKit";

import { ConsoleUI } from "./ConsoleUI";
import { mpcViewStyles as styles } from "./styles";

export const RecoveryView = () => {
export const RecoveryView = (props: {
coreKitInstance: Web3AuthMPCCoreKitRN;
coreKitStatus: COREKIT_STATUS;
setCoreKitStatus: (status: COREKIT_STATUS) => void;
}) => {
const { consoleUI, loading, setLoading, uiConsole } = useConsoleUI();
const { coreKitInstance, coreKitStatus, setCoreKitStatus } = useMPCCoreKitStore();
const { coreKitInstance, coreKitStatus, setCoreKitStatus } = props;

const [mnemonicFactor, setMnemonicFactor] = useState("");
const [backupFactorKey, setBackupFactorKey] = useState("");
Expand Down Expand Up @@ -52,17 +55,13 @@ export const RecoveryView = () => {
const factorKey = new BN(factorkey, "hex");
await coreKitInstance.inputFactorKey(factorKey);

setCoreKitStatus(coreKitInstance.status);
setLoading(false);
if (coreKitInstance.status === COREKIT_STATUS.REQUIRED_SHARE) {
uiConsole(
"required more shares even after inputing backup factor key, please enter your backup/ device factor key, or reset account [unrecoverable once reset, please use it with caution]"
);
}

if (coreKitInstance.status === COREKIT_STATUS.LOGGED_IN) {
router.push({ pathname: "./mpc-demo" });
}
setCoreKitStatus(coreKitInstance.status);
};

const criticalResetAccount = async () => {
Expand All @@ -76,7 +75,7 @@ export const RecoveryView = () => {
await coreKitInstance._UNSAFE_resetAccount();
setLoading(false);

router.push("/");
setCoreKitStatus(coreKitInstance.status);
};

return (
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import "../global";

import { CustomChainConfig, EthereumSigningProvider } from "@web3auth/ethereum-mpc-provider";
import { COREKIT_STATUS, makeEthereumSigner, parseToken, WEB3AUTH_NETWORK, Web3AuthOptions } from "@web3auth/mpc-core-kit";
import { COREKIT_STATUS, IAsyncStorage, makeEthereumSigner, parseToken, WEB3AUTH_NETWORK, Web3AuthOptions } from "@web3auth/mpc-core-kit";
import mpclib, { TssDklsLib, TssFrostLib } from "@web3auth/react-native-mpc-core-kit";
import * as SecureStore from "expo-secure-store";
import { create } from "zustand";
export const Verifier = "torus-test-health";

// // setup async storage for react native
const asyncStorageKey = {
const asyncStorageKey: IAsyncStorage = {
getItem: async (key: string) => {
return SecureStore.getItemAsync(key);
},
Expand Down Expand Up @@ -43,7 +43,7 @@ const chainConfig: CustomChainConfig = {
};
const evmProvider = new EthereumSigningProvider({ config: { chainConfig } });

const asyncEd25519StorageKey = {
const asyncEd25519StorageKey: IAsyncStorage = {
getItem: async (key: string) => {
return SecureStore.getItemAsync(`ed25519-${key}`);
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)com.torus.reactnativeexpo</string>
<string>$(AppIdentifierPrefix)com.torus.reactnativeexpo 1</string>
</array>
</dict>
</plist>

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file not shown.

0 comments on commit 9e180e1

Please sign in to comment.