Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,39 @@
"lint": "eslint"
},
"dependencies": {
"@aptos-labs/wallet-adapter-core": "^2.2.0",
"@kadena/client": "1.14.0",
"@kadena/pactjs": "^0.6.0",
"@magic-ext/algorand": "^26.0.0",
"@magic-ext/aptos": "14.0.0",
"@magic-ext/avalanche": "^26.0.0",
"@magic-ext/bitcoin": "^26.0.0",
"@magic-ext/cosmos": "^26.0.0",
"@magic-ext/evm": "1.0.0",
"@magic-ext/hedera": "^2.0.0",
"@magic-ext/icon": "^26.0.0",
"@magic-ext/kadena": "^3.0.0",
"@magic-ext/near": "^26.0.0",
"@magic-ext/oauth2": "^13.0.0",
"@magic-ext/polkadot": "^26.0.0",
"@magic-ext/solana": "^28.0.0",
"@metamask/eth-sig-util": "^8.2.0",
"@radix-ui/react-tabs": "^1.1.13",
"@solana/web3.js": "^1.98.4",
"@types/prismjs": "^1.26.5",
"@types/react-syntax-highlighter": "^15.5.13",
"algosdk": "^1.20.0",
"aptos": "^1.9.0",
"bitcoinjs-lib": "^5.2.0",
"clsx": "^2.1.1",
"ethers": "^6.15.0",
"icon-sdk-js": "0.0.18",
"install": "^0.13.0",
"magic-sdk": "^31.0.0",
"near-api-js": "4.0.0",
"next": "15.5.2",
"next-auth": "^4.24.11",
"npm": "^11.6.2",
"prismjs": "^1.30.0",
"react": "19.1.0",
"react-dom": "19.1.0",
Expand Down
2,088 changes: 2,088 additions & 0 deletions pnpm-lock.yaml

Large diffs are not rendered by default.

39 changes: 28 additions & 11 deletions src/app/(demo)/embedded-wallet/wallet/page.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,39 @@
"use client";

import { BackButton } from "@/components/BackButton";
import { UserInfo } from "@/components/embedded-wallet/UserInfo";
import { SignMethods } from "@/components/embedded-wallet/wallet/SignMethods";
import { HederaSignMethods } from "@/components/embedded-wallet/wallet/HederaSignMethods";
import { SolanaSignMethods } from "@/components/embedded-wallet/wallet/SolanaSignMethods";
import { useEmbeddedWallet } from "@/contexts/EmbeddedWalletContext";
import { BackButton } from "@/components/BackButton";
import { UserMethods } from "@/components/embedded-wallet/wallet/UserMethods";
import { WalletMethods } from "@/components/embedded-wallet/wallet/WalletMethods";
import BtcMethods from "@/components/embedded-wallet/wallet/multichain/BtcMethods";
import CosmosMethods from "@/components/embedded-wallet/wallet/multichain/CosmosMethods";
import { HederaSignMethods } from "@/components/embedded-wallet/wallet/multichain/HederaSignMethods";
import IconMethods from "@/components/embedded-wallet/wallet/multichain/IconMethods";
import KadenaMethods from "@/components/embedded-wallet/wallet/multichain/KadenaMethods";
import NearMethods from "@/components/embedded-wallet/wallet/multichain/NearMethods";
import PolkadotMethods from "@/components/embedded-wallet/wallet/multichain/PolkadotMethods";
import { SolanaSignMethods } from "@/components/embedded-wallet/wallet/multichain/SolanaSignMethods";
import { useEmbeddedWallet } from "@/contexts/EmbeddedWalletContext";

const componentsByNetwork = {
hedera: HederaSignMethods,
solana: SolanaSignMethods,
// algorand: AlgorandMethods,
// avalancheX: AvalancheMethods,
bitcoin: BtcMethods,
cosmos: CosmosMethods,
icon: IconMethods,
kadena: KadenaMethods,
near: NearMethods,
polkadot: PolkadotMethods,

default: SignMethods,
};
export default function WalletPage() {
const { selectedNetwork } = useEmbeddedWallet();
const SignMethodsByNetwork =
componentsByNetwork[selectedNetwork as keyof typeof componentsByNetwork] ??
componentsByNetwork.default;

return (
<div className="relative min-h-screen">
Expand All @@ -36,13 +59,7 @@ export default function WalletPage() {

{/* Right Side - Signing Methods */}
<div className="w-full lg:w-2/3 flex flex-col gap-8">
{selectedNetwork === "hedera" ? (
<HederaSignMethods />
) : selectedNetwork === "solana" ? (
<SolanaSignMethods />
) : (
<SignMethods />
)}
<SignMethodsByNetwork key={selectedNetwork} />

<UserMethods />
<WalletMethods />
Expand Down
17 changes: 15 additions & 2 deletions src/components/embedded-wallet/UserInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,30 @@ import { useEmbeddedWallet } from "@/contexts/EmbeddedWalletContext";
export function UserInfo() {
const [isDropdownOpen, setIsDropdownOpen] = useState(false);

const { publicAddress, selectedNetwork, handleNetworkChange, userInfo, handleLogout } = useEmbeddedWallet();
const {
publicAddress,
selectedNetwork,
handleNetworkChange,
userInfo,
handleLogout,
} = useEmbeddedWallet();

const networks = [
{ value: "polygon", label: "Polygon", color: "bg-purple-500" },
{ value: "ethereum", label: "Ethereum", color: "bg-blue-500" },
{ value: "optimism", label: "Optimism", color: "bg-red-500" },
{ value: "hedera", label: "Hedera", color: "bg-green-500" },
{ value: "solana", label: "Solana", color: "bg-orange-500" },
// { value: "algorand", label: "Algorand", color: "bg-blue-500" },
// { value: "avalancheX", label: "Avalanche", color: "bg-yellow-500" },
{ value: "bitcoin", label: "Bitcoin", color: "bg-yellow-500" },
// { value: "cosmos", label: "Cosmos", color: "bg-pink-500" },
{ value: "icon", label: "Icon", color: "bg-pink-500" },
{ value: "kadena", label: "Kadena", color: "bg-green-500" },
{ value: "near", label: "Near", color: "bg-blue-500" },
{ value: "polkadot", label: "Polkadot", color: "bg-purple-500" },
];


// Close dropdown when clicking outside
useEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
Expand Down
140 changes: 116 additions & 24 deletions src/components/embedded-wallet/wallet/UserMethods.tsx
Original file line number Diff line number Diff line change
@@ -1,31 +1,123 @@
import { MethodsCard } from "@/components/MethodsCard";
import { LogMethod, LogType, useConsole } from "@/contexts/ConsoleContext";
import { useEmbeddedWallet } from "@/contexts/EmbeddedWalletContext";
import { MagicService } from "@/lib/embedded-wallet/get-magic";

const tabs = [
{
value: "is-logged-in",
label: "Is Logged In",
functionName: "magic.user.isLoggedIn()",
payload: null,
handler: () => MagicService.magic.user.isLoggedIn(),
},
{
value: "get-info",
label: "Get Info",
functionName: "magic.user.getInfo()",
payload: null,
handler: () => MagicService.magic.user.getInfo(),
},
{
value: "show-settings",
label: "Show Settings",
functionName: "magic.user.showSettings()",
payload: null,
handler: () => MagicService.magic.user.showSettings(),
},
];
import { MagicUserMetadata } from "magic-sdk";
import { useRouter } from "next/navigation";

export function UserMethods() {
const router = useRouter();
const { logToConsole } = useConsole();
const { selectedNetwork } = useEmbeddedWallet();
const evmNetworks = ["polygon", "ethereum", "optimism"];
const showEvmMethods = evmNetworks.includes(selectedNetwork);
const capitalNetworkName =
selectedNetwork[0].toUpperCase() + selectedNetwork.slice(1);

const revealPrivateKeyTab = showEvmMethods
? {
value: "reveal-private-key",
label: "Reveal EVM Private Key",
functionName: "magic.user.revealEVMPrivateKey()",
payload: null,
handler: () => MagicService.magic.user.revealEVMPrivateKey(),
}
: {
value: "reveal-private-key",
label: `Reveal ${capitalNetworkName} Private Key`,
functionName: `magic.${selectedNetwork}.revealPrivateKey()`,
payload: null,
handler: () => MagicService.magic[selectedNetwork].revealPrivateKey(),
};

const tabs = [
{
value: "is-logged-in",
label: "Is Logged In",
functionName: "magic.user.isLoggedIn()",
payload: null,
handler: () => MagicService.magic.user.isLoggedIn(),
},
{
value: "get-info",
label: "Get Info",
functionName: "magic.user.getInfo()",
payload: null,
handler: () => MagicService.magic.user.getInfo(),
},
{
value: "logout",
label: "Logout",
functionName: "magic.user.logout()",
payload: null,
handler: () => MagicService.magic.user.logout(),
},
{
value: "get-id-token",
label: "Get ID Token",
functionName: "magic.user.getIdToken()",
payload: null,
handler: () => MagicService.magic.user.getIdToken(),
},
{
value: "generate-id-token",
label: "Generate ID Token",
functionName: "magic.user.generateIdToken()",
payload: null,
handler: () => MagicService.magic.user.generateIdToken(),
},
{
value: "show-settings",
label: "Show Settings",
functionName: "magic.user.showSettings()",
payload: null,
handler: () => MagicService.magic.user.showSettings(),
},
{
value: "recover-account",
label: "Recover Account",
functionName: "magic.user.recoverAccount()",
payload: null,
handler: () =>
MagicService.magic.user.getInfo().then((user: MagicUserMetadata) =>
MagicService.magic.user
.logout()
.then(() =>
MagicService.magic.user.recoverAccount({ email: user.email })
)
.catch((error: unknown) => {
logToConsole(
LogType.ERROR,
LogMethod.MAGIC_USER_RECOVER_ACCOUNT,
"Error recovering account",
error
);
logToConsole(
LogType.INFO,
LogMethod.MAGIC_USER_RECOVER_ACCOUNT,
"Redirecting to auth page"
);
router.push("/embedded-wallet");
})
),
},
revealPrivateKeyTab,
{
value: "enable-mfa",
label: "Enable MFA",
functionName: "magic.user.enableMFA({showUI: true})",
payload: null,
handler: () => MagicService.magic.user.enableMFA({showUI: true}),
},
{
value: "disable-mfa",
label: "Disable MFA",
functionName: "magic.user.disableMFA({showUI: true})",
payload: null,
handler: () => MagicService.magic.user.disableMFA({showUI: true}),
},
];

return (
<MethodsCard
title="User Methods"
Expand Down
42 changes: 42 additions & 0 deletions src/components/embedded-wallet/wallet/WalletMethods.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,55 @@ import { MethodsCard } from "@/components/MethodsCard";
import { MagicService } from "@/lib/embedded-wallet/get-magic";

const tabs = [
{
value: "connect-with-ui",
label: "Connect With UI",
functionName: "magic.wallet.connectWithUI()",
payload: null,
handler: () => MagicService.magic.wallet.connectWithUI(),
},
{
value: "show-ui",
label: "Show UI",
functionName: "magic.wallet.showUI()",
payload: null,
handler: () => MagicService.magic.wallet.showUI(),
},
{
value: "show-address",
label: "Show Address",
functionName: "magic.wallet.showAddress()",
payload: null,
handler: () => MagicService.magic.wallet.showAddress(),
},
{
value: "show-send-tokens-ui",
label: "Show Send Tokens UI",
functionName: "magic.wallet.showSendTokensUI()",
payload: null,
handler: () => MagicService.magic.wallet.showSendTokensUI(),
},
{
value: "show-nfts",
label: "Show NFTs",
functionName: "magic.wallet.showNFTs()",
payload: null,
handler: () => MagicService.magic.wallet.showNFTs(),
},
{
value: "show-on-ramp",
label: "Show On Ramp",
functionName: "magic.wallet.showOnRamp()",
payload: null,
handler: () => MagicService.magic.wallet.showOnRamp(),
},
{
value: "show-balances",
label: "Show Balances",
functionName: "magic.wallet.showBalances()",
payload: null,
handler: () => MagicService.magic.wallet.showBalances(),
},
];

export function WalletMethods() {
Expand Down
Loading