diff --git a/apps/daimo-mobile/src/logic/note.ts b/apps/daimo-mobile/src/logic/note.ts index 97bc49fbf..8d638b09e 100644 --- a/apps/daimo-mobile/src/logic/note.ts +++ b/apps/daimo-mobile/src/logic/note.ts @@ -107,7 +107,6 @@ export function useEphemeralSignature( account: ephemeralAccount, chain: baseGoerli, transport: http(), - // TODO: webSocket("wss://base-goerli.public.blastapi.io") }); const message = keccak256(recipient); const signature = await ephemeralClient.signMessage({ diff --git a/apps/daimo-mobile/src/view/HomeStack.tsx b/apps/daimo-mobile/src/view/HomeStack.tsx index cc7aae4bf..1b6d7dbd0 100644 --- a/apps/daimo-mobile/src/view/HomeStack.tsx +++ b/apps/daimo-mobile/src/view/HomeStack.tsx @@ -2,15 +2,15 @@ import { tokenMetadata } from "@daimo/contract"; import { createNativeStackNavigator } from "@react-navigation/native-stack"; import { useMemo } from "react"; -import { AccountScreen } from "./screen/AccountScreen"; import { HistoryScreen } from "./screen/History"; import { HistoryOpScreen } from "./screen/HistoryOpScreen"; import HomeScreen from "./screen/HomeScreen"; import OnboardingScreen from "./screen/OnboardingScreen"; -import ClaimNoteScreen from "./screen/receive/ClaimNoteScreen"; +import { SettingsScreen } from "./screen/SettingsScreen"; +import NoteScreen from "./screen/link/NoteScreen"; +import CreateRequestScreen from "./screen/receive/CreateRequestScreen"; import DepositScreen from "./screen/receive/DepositScreen"; -import RequestScreen from "./screen/receive/RequestScreen"; -import RequestSendScreen from "./screen/receive/RequestSendScreen"; +import SendRequestScreen from "./screen/receive/SendRequestScreen"; import SendScreen from "./screen/send/SendScreen"; import WithdrawScreen from "./screen/send/WithdrawScreen"; import { HomeStackParamList } from "./shared/nav"; @@ -30,7 +30,7 @@ export function HomeStackNav() { options={useMemo(() => ({ headerShown: !!account }), [account])} /> - + - + - + diff --git a/apps/daimo-mobile/src/view/screen/AccountScreen.tsx b/apps/daimo-mobile/src/view/screen/SettingsScreen.tsx similarity index 99% rename from apps/daimo-mobile/src/view/screen/AccountScreen.tsx rename to apps/daimo-mobile/src/view/screen/SettingsScreen.tsx index fdae1c0f5..81545a885 100644 --- a/apps/daimo-mobile/src/view/screen/AccountScreen.tsx +++ b/apps/daimo-mobile/src/view/screen/SettingsScreen.tsx @@ -29,7 +29,7 @@ import { useNav } from "../shared/nav"; import { color, ss } from "../shared/style"; import { TextBody, TextBold, TextH2, TextH3, TextLight } from "../shared/text"; -export function AccountScreen() { +export function SettingsScreen() { const [account, setAccount] = useAccount(); const nav = useNav(); diff --git a/apps/daimo-mobile/src/view/screen/receive/ClaimNoteScreen.tsx b/apps/daimo-mobile/src/view/screen/link/NoteScreen.tsx similarity index 93% rename from apps/daimo-mobile/src/view/screen/receive/ClaimNoteScreen.tsx rename to apps/daimo-mobile/src/view/screen/link/NoteScreen.tsx index ceb09c0bd..11202024a 100644 --- a/apps/daimo-mobile/src/view/screen/receive/ClaimNoteScreen.tsx +++ b/apps/daimo-mobile/src/view/screen/link/NoteScreen.tsx @@ -10,7 +10,6 @@ import { NativeStackScreenProps } from "@react-navigation/native-stack"; import { ReactNode, useEffect, useState } from "react"; import { ActivityIndicator, ScrollView, StyleSheet, View } from "react-native"; import { Address } from "viem"; -import { privateKeyToAccount } from "viem/accounts"; import { SendOpFn, useSendAsync } from "../../../action/useSendAsync"; import { @@ -28,17 +27,14 @@ import { TextCenter, TextError, TextLight } from "../../shared/text"; type Props = NativeStackScreenProps; -export default function ClaimNoteScreen({ route }: Props) { +export default function NoteScreen({ route }: Props) { const [account] = useAccount(); assert(account != null); - const { ephemeralPrivateKey, ephemeralOwner: passedEphemeralOwner } = - route.params || {}; - const ephemeralOwner = - passedEphemeralOwner || privateKeyToAccount(ephemeralPrivateKey!).address; - + const { ephemeralPrivateKey, ephemeralOwner } = route.params; console.log(`[NOTE] rendering note ${ephemeralOwner}`); + // TODO: delete useFetchNote etc, use rpcFunc.getLinkStatus const [note, loadState] = useFetchNote(ephemeralOwner); return ( diff --git a/apps/daimo-mobile/src/view/screen/receive/RequestScreen.tsx b/apps/daimo-mobile/src/view/screen/receive/CreateRequestScreen.tsx similarity index 97% rename from apps/daimo-mobile/src/view/screen/receive/RequestScreen.tsx rename to apps/daimo-mobile/src/view/screen/receive/CreateRequestScreen.tsx index 22bceb5f4..dc13cbe8d 100644 --- a/apps/daimo-mobile/src/view/screen/receive/RequestScreen.tsx +++ b/apps/daimo-mobile/src/view/screen/receive/CreateRequestScreen.tsx @@ -12,7 +12,7 @@ import { useNav } from "../../shared/nav"; import { ss } from "../../shared/style"; import { TextLight } from "../../shared/text"; -export default function RequestScreen() { +export default function CreateRequestScreen() { const nav = useNav(); const send = useCallback(() => nav.navigate("RequestSend"), [nav]); diff --git a/apps/daimo-mobile/src/view/screen/receive/RequestSendScreen.tsx b/apps/daimo-mobile/src/view/screen/receive/SendRequestScreen.tsx similarity index 98% rename from apps/daimo-mobile/src/view/screen/receive/RequestSendScreen.tsx rename to apps/daimo-mobile/src/view/screen/receive/SendRequestScreen.tsx index 6e25a9a0b..14313775c 100644 --- a/apps/daimo-mobile/src/view/screen/receive/RequestSendScreen.tsx +++ b/apps/daimo-mobile/src/view/screen/receive/SendRequestScreen.tsx @@ -15,7 +15,7 @@ import { AmountInput } from "../../shared/Input"; import { useNav } from "../../shared/nav"; import { color } from "../../shared/style"; -export default function RequestSendScreen() { +export default function SendRequestScreen() { const [account] = useAccount(); assert(account != null); const [dollars, setDollars] = useState(0); diff --git a/apps/daimo-mobile/src/view/shared/Header.tsx b/apps/daimo-mobile/src/view/shared/Header.tsx index 420b8dd1e..74125f9b6 100644 --- a/apps/daimo-mobile/src/view/shared/Header.tsx +++ b/apps/daimo-mobile/src/view/shared/Header.tsx @@ -10,7 +10,7 @@ import { useAccount } from "../../model/account"; export function Header() { const nav = useNav(); - const goToAccount = useCallback(() => nav.navigate("Account"), [nav]); + const goToAccount = useCallback(() => nav.navigate("Settings"), [nav]); const [account] = useAccount(); diff --git a/apps/daimo-mobile/src/view/shared/nav.ts b/apps/daimo-mobile/src/view/shared/nav.ts index 67bb9b7aa..041a3bb21 100644 --- a/apps/daimo-mobile/src/view/shared/nav.ts +++ b/apps/daimo-mobile/src/view/shared/nav.ts @@ -1,26 +1,25 @@ -import { DaimoLink, parseDaimoLink, OpEvent } from "@daimo/common"; +import { + DaimoLink, + DaimoLinkNote, + OpEvent, + parseDaimoLink, +} from "@daimo/common"; import { useNavigation } from "@react-navigation/native"; import type { NativeStackNavigationProp } from "@react-navigation/native-stack"; import { useURL } from "expo-linking"; import { useEffect } from "react"; -import { Address } from "viem"; import { Recipient, getRecipient } from "../../sync/recipients"; export type HomeStackParamList = { Home: undefined; - Account: undefined; + Settings: undefined; Chain: undefined; Send: undefined | { recipient: Recipient; dollars?: number }; Withdraw: undefined; Request: undefined; Deposit: undefined; - Note: - | undefined - | { - ephemeralPrivateKey: `0x${string}` | undefined; - ephemeralOwner: Address | undefined; - }; + Note: DaimoLinkNote; RequestSend: undefined; History: undefined; HistoryOp: { op: OpEvent }; @@ -62,10 +61,7 @@ async function goTo(nav: ReturnType, link: DaimoLink) { break; } case "note": { - nav.navigate("Note", { - ephemeralPrivateKey: link.ephemeralPrivateKey, - ephemeralOwner: link.ephemeralOwner, - }); + nav.navigate("Note", link); break; } default: diff --git a/packages/daimo-api/src/router.ts b/packages/daimo-api/src/router.ts index d0a63b500..6ddf9e6c9 100644 --- a/packages/daimo-api/src/router.ts +++ b/packages/daimo-api/src/router.ts @@ -131,30 +131,8 @@ export function createRouter( }) ) .query(async (opts) => { + const ret = null as DAccount | null; // TODO: lookup account by signing key - // Doing this efficiently likely requires an AddKey event - // Alternately, an indexer contract thru which all accounts are deployed - let ret = null as DAccount | null; - - // Stub to test client - if ( - opts.input.pubKeyHex === - "0x3059301306072a8648ce3d020106082a8648ce3d03010703420004fea4465280cfcb1e1b77a91525ca90dfdd213705b6eac7bc7a79931af4e0cfe7464564a11e15252f840d73da0d34fddb74ebe806e93840f3c208e68d620d7376" - ) { - ret = { - name: "test", - addr: "0xa3449c3f57af6d39bc9eb41d6e0b75d3723210cd", - }; - } else if ( - opts.input.pubKeyHex === - `0x3059301306072a8648ce3d020106082a8648ce3d0301070342000436dff9029e718c4c7da071077a53a987569ecc780f92203e26afc7b91e1362582ce0bfc65b7cef65dff64768978e691eca8576da6f9d387fe77c70eeaed26f33` - ) { - ret = { - name: "jules", - addr: "0xbfbff790707f8a9bddae662985270df58011cd9c", - }; - } - console.log( `[API] lookup found ${ret?.name || ""} for pubkey ${ opts.input.pubKeyHex diff --git a/packages/daimo-common/src/daimoLink.ts b/packages/daimo-common/src/daimoLink.ts index 7c3b5aa3a..befdbf6b6 100644 --- a/packages/daimo-common/src/daimoLink.ts +++ b/packages/daimo-common/src/daimoLink.ts @@ -31,15 +31,17 @@ export type DaimoLinkNote = { export function formatDaimoLink(link: DaimoLink) { switch (link.type) { - case "account": + case "account": { return `${daimoLinkBase}/account/${link.addr}`; - case "request": + } + case "request": { return `${daimoLinkBase}/request/${link.recipient}/${link.dollars}`; - case "note": - if (link.ephemeralPrivateKey == null) { - return `${daimoLinkBase}/note/${link.ephemeralOwner}`; - } - return `${daimoLinkBase}/note/${link.ephemeralOwner}#${link.ephemeralPrivateKey}`; + } + case "note": { + const base = `${daimoLinkBase}/note/${link.ephemeralOwner}`; + const hash = link.ephemeralPrivateKey && `#${link.ephemeralPrivateKey}`; + return `${base}${hash || ""}`; + } } }