From 3a8b9b716a21fed1a419ea5390373f1fcc6b1ae9 Mon Sep 17 00:00:00 2001 From: VaithiDs Date: Sat, 7 Oct 2023 12:15:28 +0530 Subject: [PATCH 1/5] Integrated lens account conversion to aa --- pages/index.tsx | 103 ++++++++++++++---------------------------------- 1 file changed, 30 insertions(+), 73 deletions(-) diff --git a/pages/index.tsx b/pages/index.tsx index 23dc71a..0d12c3a 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -114,29 +114,32 @@ export default function Home() { }); useEffect(() => { - if (loggedIn) { - console.log(profile, "profile"); - console.log(profileerror, "profileerror"); - console.log(wallet, "wallet"); - console.log(walletLoading, "walletLoading"); - console.log(profileLoading, "profileLoading"); - if (profile !== null) { - dispatch({ - type: ACTIONS.LOGGED_IN_VIA, - payload: LOGGED_IN.GOOGLE, - }); - dispatch({ - type: ACTIONS.SET_ADDRESS, - payload: address, - }); - setWalletAddress(address ?? ""); - setLoader(false); - saveToLocalStorage("address", address); - handleSteps(ESTEPS.THREE); - } else { - toast.info("Your wallet doesn't have lens account"); + async function initLens() { + if (loggedIn) { + console.log(profile, "profile"); + console.log(profileerror, "profileerror"); + console.log(wallet, "wallet"); + console.log(walletLoading, "walletLoading"); + console.log(profileLoading, "profileLoading"); + if (profile !== null) { + dispatch({ + type: ACTIONS.LOGGED_IN_VIA, + payload: LOGGED_IN.GOOGLE, + }); + dispatch({ + type: ACTIONS.SET_ADDRESS, + payload: address, + }); + setWalletAddress(address ?? ""); + setLoader(false); + saveToLocalStorage("address", address); + handleSteps(ESTEPS.THREE); + } else { + toast.info("Your wallet doesn't have lens account"); + } } } + initLens(); }, [loggedIn]); const onLoginClick = async () => { @@ -152,6 +155,7 @@ export default function Home() { await login({ address: walletClient.account.address, }); + await connectWithBiconomy(await connector?.getProvider(), "lens"); setLoggedIn(true); } }; @@ -361,7 +365,7 @@ export default function Home() { const userMetadata = await magicSdk.user.getMetadata(); saveToLocalStorage("email", userMetadata.email); - connectWithBiconomy(magicSdk.rpcProvider); + connectWithBiconomy(magicSdk.rpcProvider, "magic"); } catch (e) { console.error(e); } @@ -369,7 +373,7 @@ export default function Home() { console.log("came inside isloggedin"); const userMetadata = await magicSdk.user.getMetadata(); saveToLocalStorage("email", userMetadata.email); - connectWithBiconomy(magicSdk.rpcProvider); + connectWithBiconomy(magicSdk.rpcProvider, "magic"); } else { setLoader(false); } @@ -399,7 +403,7 @@ export default function Home() { }); }; - const connectWithBiconomy = async (rpcProvider: any) => { + const connectWithBiconomy = async (rpcProvider: any, logintype: string) => { setLoader(true); try { const web3Provider = new ethers.providers.Web3Provider( @@ -428,6 +432,7 @@ export default function Home() { accountIndex: 0, }); const scw = await wallet.getSmartAccountAddress(); + console.log(scw, "new scw"); dispatch({ type: ACTIONS.LOGGED_IN_VIA, payload: LOGGED_IN.GOOGLE, @@ -443,6 +448,7 @@ export default function Home() { setWalletAddress(scw ?? ""); setLoader(false); saveToLocalStorage("address", scw); + saveToLocalStorage("loginType", logintype); handleSteps(ESTEPS.THREE); } catch (error) { setLoader(false); @@ -453,10 +459,6 @@ export default function Home() { const connectMagicWallet = async (val: string) => { setSigninLoading(true); - // const login = magic.auth.loginWithEmailOTP({ - // email: val, - // showUI: false, - // }); const redirectURI = `${window.location.origin}`; const loginWithLink = magic.auth.loginWithMagicLink({ email: val, @@ -480,51 +482,6 @@ export default function Home() { .on("settled", () => { // is called when the Promise either resolves or rejects }); - // setLoginItem(login); - - // login - // .on("email-otp-sent", () => { - // // The email has been sent to the user - // console.log("OTP sent"); - // setSigninLoading(false); - // toast.success("OTP sent!"); - // setShowOtp(true); - // }) - // .on("invalid-email-otp", () => { - // login.emit("cancel"); - // }) - // .on("done", (result: any) => { - // // is called when the Promise resolves - // // convey login success to user - // setProvider(magic.wallet.getProvider()); - // console.log(result, "success"); - // getAccounts() - // .then((res: any) => { - // setLoader(false); - // console.log(res, "address is what"); - // dispatch({ - // type: ACTIONS.LOGGED_IN_VIA, - // payload: LOGGED_IN.GOOGLE, - // }); - // dispatch({ - // type: ACTIONS.SET_ADDRESS, - // payload: res, - // }); - // setWalletAddress(res); - // }) - // .catch((e) => { - // console.log(e, "error"); - // }); - // DID Token returned in result - // const didToken = result; - // }) - // .on("error", (reason: any) => { - // setSigninLoading(false); - // console.error(reason, "errorqw"); - // }) - // .on("settled", () => { - // // is called when the Promise either resolves or rejects - // }); }; const getUIComponent = (step: number) => { From e215c98830eb94933942de4ed3e1469609571875 Mon Sep 17 00:00:00 2001 From: Punith B M Date: Sat, 7 Oct 2023 13:00:56 +0530 Subject: [PATCH 2/5] feat: content update --- README.md | 35 +-- app/favicon.ico | Bin 15406 -> 1150 bytes constants/index.ts | 11 +- pages/[id].tsx | 68 +++-- public/assets/images/biconomy_logo.png | Bin 0 -> 84252 bytes public/assets/images/logo_micropay.png | Bin 0 -> 999 bytes ui_components/ShareLinkPage.tsx | 232 ++++-------------- ui_components/bottom-sheet/index.tsx | 6 +- ui_components/header/index.tsx | 7 +- .../loadchest/LoadChestComponent.tsx | 179 +++----------- ui_components/loadchest/ProfileCard.tsx | 8 +- ui_components/loadchest/QRComponent.tsx | 14 +- utils/images/index.ts | 8 +- 13 files changed, 142 insertions(+), 426 deletions(-) create mode 100644 public/assets/images/biconomy_logo.png create mode 100644 public/assets/images/logo_micropay.png diff --git a/README.md b/README.md index 0dcf8d5..e7086f6 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,24 @@ -# Clink Safe -Clink, the easiest way to send and receive crypto tokens. +# Micropay +Micropay, the easiest way to send and receive crypto tokens. -Using Clink, anyone can deposit and send tokens to another person whether or not they already have a crypto wallet with just a link. The kicker is… the link is a smart contract wallet! +Using Micropay, anyone can deposit and send tokens to another person whether or not they already have a crypto wallet with just a link. The kicker is… the link is a smart contract wallet! -Clink is a lightweight non custodial wallet designed to make transferring digital assets as easy as sending a link. Someone with crypto can create a Clink and send that link to anyone over any platform (text, discord, email, etc). The amazing thing is, the link is the smart contract wallet! +Micropay is a lightweight non custodial wallet designed to make transferring digital assets as easy as sending a link. Someone with crypto can create a Micropay and send that link to anyone over any platform (text, discord, email, etc). The amazing thing is, the link is the smart contract wallet! ### How it Works -1. Create a Clink Link -2. Share your Clink Link +1. Create a Micropay Link +2. Share your Micropay Link 3. Claim Reward -e.g., - -Consider Bob wants to send money to Alice But he doesn’t know Alice Address or any other details. - -![Clink Safe Infra](https://github.com/punithbm/eth-micropay-superhack/assets/13044958/3fb0dfaf-827b-4bc8-a7b3-2f7a56cf1e42) - - -Clink trying to represent the idea of 'Digital Cash' better than any other cryptocurrency, asset or tool on the market today +Micropay trying to represent the idea of 'Digital Cash' better than any other cryptocurrency, asset or tool on the market today ### Inspiration *There's still a tremendous amount of friction in crypto that holds back mainstream adoption. It's unreasonable to ask the general population to set up a 12- or 24-word seed phrase wallet, much less a hardware wallet, just to send a dollar or receive a commemorative NFT.* - ### Why Does it Matter? - Social and Email - - Send clinks at scale via email, twitter, discord etc., + - Send Micropays at scale via email, twitter, discord etc., - In Real Life - - Distribute Clinks vai QR Code or NFC Tags at in person events + - Distribute Micropays vai QR Code or NFC Tags at in person events - Web Apps - - Place a button to distribute Clinks on your Dapp - -### Working Demo -![clink_demo](https://github.com/punithbm/eth-micropay-superhack/assets/13044958/032e630e-8dd7-4146-a1b9-6bbacc81f482) - -### Complete Guide -Find the below step by step guid on how to do it -![Clink Safe Infra2](https://github.com/punithbm/eth-micropay-superhack/assets/13044958/760038db-765b-4a56-a45b-427184bd1447) + - Place a button to distribute Micropays on your Dapp diff --git a/app/favicon.ico b/app/favicon.ico index ba1b4f4aa57dc06b347734b919745610d9fb0f4b..664a619d5673d2633cb77ca37436e21defe97dbe 100644 GIT binary patch literal 1150 zcmdtiKQBX37{~GFYH6bWG^rRE5F{4DBI(pg(nUH*ya1ELXks!*Y-Zkq#6p;Bu!wXK zlZYk;gMSeu2626Vx98#ZC2*S0eV+65+;h(DJ*ip5r%*7i!?v6?>o>CrP@>YT6U_Lo zm~Tq@|KJkGu_1$=5Y=~i^6pe$^$5Mlg?a~Z4d+-z78*B>1JqE0&$&o`hF$bw6xUFD zKpAb=fwv=)E{xzZ6kmxIXy1pSrm&AH9@Po$gSdoEFAy&<2JLGOPf&YDBgtAXw{-7A z>65quf2MZw^nSyz_>JV*JE?d=u4niA6(@0nbkm&rZMB{^?Qa3ey*h%P6W8$tHSKo_ zTIUqr_DDL>a(dOrAdYbdt*iH-`aG^s$1Hx<_DQ@(EJE+z&xgipo*@iC=f`jR^HGoD awrBW@nErjFjmS)D8MB6LnZ3ZrD}DpO10LZ3 literal 15406 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 diff --git a/constants/index.ts b/constants/index.ts index 5727d9a..3d423a3 100644 --- a/constants/index.ts +++ b/constants/index.ts @@ -1,11 +1,8 @@ -export const projectId = - "BI5-250tyqwU_79yFve_chx6hiE-f8iCxPHe0oqDpv-xU9dvGJ1p3JLo1y0AqzlMKDoZ_w0NLjxIFyNhxXJ6L6Y"; -export const oauthClientId = - "97006979879-hpprsfnk927avhc0368fvbqjra6h5c4t.apps.googleusercontent.com"; +export const projectId = "BI5-250tyqwU_79yFve_chx6hiE-f8iCxPHe0oqDpv-xU9dvGJ1p3JLo1y0AqzlMKDoZ_w0NLjxIFyNhxXJ6L6Y"; +export const oauthClientId = "97006979879-hpprsfnk927avhc0368fvbqjra6h5c4t.apps.googleusercontent.com"; export const web3AuthVerifier = "micropay"; export const web3AuthLoginType = "google"; -export const web3AuthClientId = - "BFWg2RH35EKxZJtntj1l-G2XU8AY0l-yFgFIs9iDbgKAW45ZxE9_qfj6COAWwI-RhOs2pN6OHwgZHgtoHjOlMFM"; -export const productName = "Clink Safe"; +export const web3AuthClientId = "BFWg2RH35EKxZJtntj1l-G2XU8AY0l-yFgFIs9iDbgKAW45ZxE9_qfj6COAWwI-RhOs2pN6OHwgZHgtoHjOlMFM"; +export const productName = "Micropay Safe"; export const rainbowKitProjectId = "fb3037b60ba3165d90a7f1bb1a727cc5"; export const RE_DIGIT = new RegExp(/^\d+$/); diff --git a/pages/[id].tsx b/pages/[id].tsx index 9711862..2b67ad9 100644 --- a/pages/[id].tsx +++ b/pages/[id].tsx @@ -12,47 +12,39 @@ import ShareLink from "../ui_components/ShareLinkPage"; import MetaHead from "../ui_components/siteMeta"; import { BaseGoerli } from "../utils/chain/baseGoerli"; -const { chains, publicClient, webSocketPublicClient } = configureChains( - [baseGoerli], - [publicProvider()], -); +const { chains, publicClient, webSocketPublicClient } = configureChains([baseGoerli], [publicProvider()]); const config = createConfig({ - autoConnect: true, - connectors: [ - new MetaMaskConnector({ chains }), - new CoinbaseWalletConnector({ - chains, - options: { - appName: productName, - jsonRpcUrl: BaseGoerli.info.url, - chainId: BaseGoerli.coinId, - }, - }), - new InjectedConnector({ - chains, - options: { - name: "Injected", - shimDisconnect: true, - }, - }), - ], - publicClient, - webSocketPublicClient, + autoConnect: true, + connectors: [ + new MetaMaskConnector({ chains }), + new CoinbaseWalletConnector({ + chains, + options: { + appName: productName, + jsonRpcUrl: BaseGoerli.info.url, + chainId: BaseGoerli.coinId, + }, + }), + new InjectedConnector({ + chains, + options: { + name: "Injected", + shimDisconnect: true, + }, + }), + ], + publicClient, + webSocketPublicClient, }); export default function claim() { - const router = useRouter(); - const uuid = router.asPath; - return ( - - - - - ); + const router = useRouter(); + const uuid = router.asPath; + return ( + + + + + ); } diff --git a/public/assets/images/biconomy_logo.png b/public/assets/images/biconomy_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c0e1b539c281d9264ac6837850c8596b9fc36487 GIT binary patch literal 84252 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πLp?xN_Yc(1 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 literal 0 HcmV?d00001 diff --git a/public/assets/images/logo_micropay.png b/public/assets/images/logo_micropay.png new file mode 100644 index 0000000000000000000000000000000000000000..d18baa84965ebb0c308c74a4c7d81e2407dc4668 GIT binary patch literal 999 zcmVuY#WW8>}_sW@b`n;V@lvTfJ;}SA4vGkz*QfySjS@Gl?c~x+ov&# zOi0KY_L3qXZl{Tg#)voUJK}wyK#1RILJsS3&Bnxpf|J5x?QM|el*U9MAyEayJB5yM zoMaGocI@Lk;yLK4Y1@<&@=A*POrfiwZOV{PXHrOCd)H}bTd=q?$)WCu*&vT&+J=k? ziE>T6x5#Jsk_UMXtBpxPr=;mq(NG3T=vGq5v-YmzC{Wb>L=JSq9~I?y&Fyvj@1Yj| z8Q*_A4EclLL2UQbkY}?CTHIhQXgG&FkTc)TF@reekCN`UpxO9<0`LGH(fuDlQD9AV zuu0HN#G)v5v>RkSe!(;Hy04@6OlbYTf;P!|j}gBLgUFTJMR$!wJQL-t}?S zexE$h4|$v#tGSWGF?19Z13K5o4Q}5^sE}WoBM%A%y<7g}%J<4_Y>>~FHMtbf@t%Bf z=L2rPk*?YB{YS{hZHQSTojf0ZMn1UXXXtPpF>2_WcEr=V3*Y~IoICA7XBJL-;%FUW zOAUJN1@iCDkWOY}_bV^l;W^UD8Q4+(4!eM!(j%T$b#QR=d)L*8k0{+aUnw?S2-6^ykPyr2uqFo}++x8r4DnTN6l|@+Ad8`XM%@KuD_&u6%>U zF2GT*WFYOz$Wa8uR|kGO4dHLQCMA@R)EPxWe0AVLf`ndkR+IqYJFY?E!*+zP#}$Qw z|3Ip|f&u>*=H+ElM+yQ4vZ7d6%n+&PR%eO)TtoT&zK(dym=!5&cV4|=@Z|rCuD=g` zP$dH002ovPDHLkV1i#U-wXf% literal 0 HcmV?d00001 diff --git a/ui_components/ShareLinkPage.tsx b/ui_components/ShareLinkPage.tsx index 64b478e..e00a253 100644 --- a/ui_components/ShareLinkPage.tsx +++ b/ui_components/ShareLinkPage.tsx @@ -2,17 +2,9 @@ import "react-toastify/dist/ReactToastify.css"; import "tailwindcss/tailwind.css"; import AccountAbstraction from "@safe-global/account-abstraction-kit-poc"; -import { - EthersAdapter, - SafeAccountConfig, - SafeFactory, -} from "@safe-global/protocol-kit"; +import { EthersAdapter, SafeAccountConfig, SafeFactory } from "@safe-global/protocol-kit"; import { GelatoRelayPack } from "@safe-global/relay-kit"; -import { - MetaTransactionData, - MetaTransactionOptions, - OperationType, -} from "@safe-global/safe-core-sdk-types"; +import { MetaTransactionData, MetaTransactionOptions, OperationType } from "@safe-global/safe-core-sdk-types"; import { initWasm } from "@trustwallet/wallet-core"; import { BigNumber } from "bignumber.js"; import { serializeError } from "eth-rpc-errors"; @@ -27,25 +19,9 @@ import { toast } from "react-toastify"; import { ToastContainer } from "react-toastify"; import { parseEther } from "viem"; -import { - getBalance, - getEstimatedGas, - getNonce, - getRelayTransactionStatus, - getSendRawTransaction, - getSendTransactionStatus, - getUsdPrice, -} from "../apiServices"; +import { getBalance, getEstimatedGas, getNonce, getRelayTransactionStatus, getSendRawTransaction, getSendTransactionStatus, getUsdPrice } from "../apiServices"; import { GlobalContext } from "../context/GlobalContext"; -import { - decodeAddressHash, - encryptAndEncodeHexStrings, - getCurrencyFormattedNumber, - getTokenValueFormatted, - hexFormatter, - hexToNumber, - numHex, -} from "../utils"; +import { decodeAddressHash, encryptAndEncodeHexStrings, getCurrencyFormattedNumber, getTokenValueFormatted, hexFormatter, hexToNumber, numHex } from "../utils"; import { Base } from "../utils/chain/base"; import { BaseGoerli } from "../utils/chain/baseGoerli"; import { icons } from "../utils/images"; @@ -61,17 +37,8 @@ import SecondaryBtn from "./SecondaryBtn"; import { ShareBtnModal } from "./ShareBtnModal"; import { IPaymaster, BiconomyPaymaster } from "@biconomy/paymaster"; import { IBundler, Bundler } from "@biconomy/bundler"; -import { - BiconomySmartAccount, - BiconomySmartAccountV2, - DEFAULT_ENTRYPOINT_ADDRESS, - SmartAccount, -} from "@biconomy/account"; -import { - IHybridPaymaster, - PaymasterMode, - SponsorUserOperationDto, -} from "@biconomy/paymaster"; +import { BiconomySmartAccount, BiconomySmartAccountV2, DEFAULT_ENTRYPOINT_ADDRESS, SmartAccount } from "@biconomy/account"; +import { IHybridPaymaster, PaymasterMode, SponsorUserOperationDto } from "@biconomy/paymaster"; export interface IShareLink { uuid: string; @@ -90,9 +57,7 @@ const ShareLink: FC = (props) => { const [shareText, setShareText] = useState("Share"); const [showShareIcon, setShowShareIcon] = useState(true); const [tokenValue, setTokenValue] = useState(""); - const [headingText, setHeadingText] = useState( - "Your Chest is ready to claim!" - ); + const [headingText, setHeadingText] = useState("Your Chest is ready to claim!"); const [linkValueUsd, setLinkValueUsd] = useState(""); const [isRedirected, setIsRedirected] = useState(false); const [isLoading, setIsLoading] = useState(true); @@ -102,12 +67,8 @@ const ShareLink: FC = (props) => { const [showQr, setShowQr] = useState(false); const [isClaimSuccessful, setIsClaimSuccessful] = useState(false); const [txHash, setTxHash] = useState(""); - const ethersProvider = new ethers.providers.JsonRpcProvider( - BaseGoerli.info.rpc - ); - const relayPack = new GelatoRelayPack( - process.env.NEXT_PUBLIC_GELATO_RELAY_API_KEY - ); + const ethersProvider = new ethers.providers.JsonRpcProvider(BaseGoerli.info.rpc); + const relayPack = new GelatoRelayPack(process.env.NEXT_PUBLIC_GELATO_RELAY_API_KEY); const options: MetaTransactionOptions = { gasLimit: "100000", isSponsored: true, @@ -153,7 +114,7 @@ const ShareLink: FC = (props) => { const walletCore = await initWasm(); const wallet = new Wallet(walletCore); setWallet(wallet); - const chars = uuid.split("|"); + const chars = uuid.split("~"); if (chars.length < 1) { return; } @@ -182,16 +143,9 @@ const ShareLink: FC = (props) => { setTokenValue(getTokenValueFormatted(bgNum, 6, false)); setIsLoading(false); const formatBal = bgNum * res.data.ethereum.usd; - setLinkValueUsd( - getCurrencyFormattedNumber(roundDownToTenth(formatBal), 2, "USD", true) - ); - const zeroBal = - getCurrencyFormattedNumber(formatBal, 2, "USD", true) === "$0"; - setHeadingText( - zeroBal - ? "Chest have found their owner!" - : "Your Chest is ready to claim!" - ); + setLinkValueUsd(getCurrencyFormattedNumber(roundDownToTenth(formatBal), 2, "USD", true)); + const zeroBal = getCurrencyFormattedNumber(formatBal, 2, "USD", true) === "$0"; + setHeadingText(zeroBal ? "Chest have found their owner!" : "Your Chest is ready to claim!"); }); }; @@ -222,9 +176,7 @@ const ShareLink: FC = (props) => { connector: injectConnector, }); setToAddress(result.account); - toast.success( - `Please wait, wallet connected and claim initiated for the chest` - ); + toast.success(`Please wait, wallet connected and claim initiated for the chest`); handleCloseClaimModal(); sendToken(result.account); } catch (e: any) { @@ -245,7 +197,7 @@ const ShareLink: FC = (props) => { const handleSendToken = async () => { const walletCore = await initWasm(); const wallet = new Wallet(walletCore); - const chars = uuid.split("|"); + const chars = uuid.split("~"); if (chars.length < 1) { return; } @@ -258,14 +210,12 @@ const ShareLink: FC = (props) => { console.log(fromSigner, "fromSigner"); const paymaster = new BiconomyPaymaster({ - paymasterUrl: - "https://paymaster.biconomy.io/api/v1/84531/76v47JPQ6.7a881a9f-4cec-45e0-95e9-c39c71ca54f4", + paymasterUrl: "https://paymaster.biconomy.io/api/v1/84531/76v47JPQ6.7a881a9f-4cec-45e0-95e9-c39c71ca54f4", }); console.log(paymaster, "paymaster"); const bundler: IBundler = new Bundler({ - bundlerUrl: - "https://bundler.biconomy.io/api/v2/84531/nJPK7B3ru.dd7f7861-190d-41bd-af80-6877f74b8f44", + bundlerUrl: "https://bundler.biconomy.io/api/v2/84531/nJPK7B3ru.dd7f7861-190d-41bd-af80-6877f74b8f44", chainId: 84531, entryPointAddress: DEFAULT_ENTRYPOINT_ADDRESS, }); @@ -311,8 +261,7 @@ const ShareLink: FC = (props) => { let partialUserOp = await smartAccount.current?.buildUserOp([tx]); console.log(partialUserOp, "partialUserOp"); // setChestLoadingText("Setting up smart account..."); - const biconomyPaymaster = smartAccount.current - ?.paymaster as IHybridPaymaster; + const biconomyPaymaster = smartAccount.current?.paymaster as IHybridPaymaster; console.log(biconomyPaymaster, "biconomyPaymaster"); let paymasterServiceData: SponsorUserOperationDto = { mode: PaymasterMode.SPONSORED, @@ -322,31 +271,19 @@ const ShareLink: FC = (props) => { try { // setChestLoadingText("Setting up paymaster..."); - const paymasterAndDataResponse = - await biconomyPaymaster.getPaymasterAndData( - partialUserOp!, - paymasterServiceData - ); + const paymasterAndDataResponse = await biconomyPaymaster.getPaymasterAndData(partialUserOp!, paymasterServiceData); console.log(paymasterAndDataResponse, "paymasterAndDataResponse"); - partialUserOp!.paymasterAndData = - paymasterAndDataResponse.paymasterAndData; + partialUserOp!.paymasterAndData = paymasterAndDataResponse.paymasterAndData; - const userOpResponse = await smartAccount.current?.sendUserOp( - partialUserOp! - ); + const userOpResponse = await smartAccount.current?.sendUserOp(partialUserOp!); console.log(userOpResponse, "userOpResponse"); const transactionDetails = await userOpResponse?.wait(); console.log(transactionDetails, "transactionDetails"); // setExplorerUrl( // `https://goerli.basescan.org/tx/${transactionDetails.receipt.transactionHash}` // ); - console.log( - `https://goerli.basescan.org/tx/${transactionDetails?.receipt.transactionHash}`, - "tx hash" - ); - handleTransactionStatus( - transactionDetails?.receipt.transactionHash ?? "" - ); + console.log(`https://goerli.basescan.org/tx/${transactionDetails?.receipt.transactionHash}`, "tx hash"); + handleTransactionStatus(transactionDetails?.receipt.transactionHash ?? ""); // setChestLoadingText("Success! Transaction Processed"); // setIsSucceed(true); // setChestLoadingText("Operation Successful: Transaction Completed!"); @@ -497,22 +434,9 @@ const ShareLink: FC = (props) => { return (
- +
- {!processing && ( -

{headingText}

- )} + {!processing &&

{headingText}

}
@@ -527,15 +451,8 @@ const ShareLink: FC = (props) => {

{`${linkValueUsd}`}

{`~ ${tokenValue} ETH`}

- - external link + + external link = (props) => { setShowQr(!showQr); }} /> - copy address + copy address
)} -
- {isClaimSuccessful || linkValueUsd === "$0" ? ( - Chest Open - ) : ( - Chest - )} -
+
{isClaimSuccessful || linkValueUsd === "$0" ? Chest Open : Chest}
{linkValueUsd === "$0" ? ( txHash ? ( -
+

🎉 Claim successful!

{" "} The treasure is now yours to behold! - + {"View ->"}

@@ -596,9 +491,7 @@ const ShareLink: FC = (props) => { {!processing && (
{ handleShareURL(); @@ -613,9 +506,7 @@ const ShareLink: FC = (props) => { {!processing && (
{ setOpenShareModal(true); @@ -626,42 +517,18 @@ const ShareLink: FC = (props) => { />
)} - handleClaimClick()} - rightImage={processing ? undefined : icons.downloadBtnIconBlack} - btnDisable={handleDisableBtn()} - loading={isLoading || processing} - /> - {processing && ( -

- {"⏳ Hang tight! We're currently processing your claim."} -

- )} + handleClaimClick()} rightImage={processing ? undefined : icons.downloadBtnIconBlack} btnDisable={handleDisableBtn()} loading={isLoading || processing} /> + {processing &&

{"⏳ Hang tight! We're currently processing your claim."}

} ) : ( <> - handleClaimClick()} - rightImage={processing ? undefined : icons.downloadBtnIconBlack} - btnDisable={handleDisableBtn()} - loading={isLoading || processing} - /> - - {processing && ( -

- {"⏳ Hang tight! We're currently processing your claim."} -

- )} + handleClaimClick()} rightImage={processing ? undefined : icons.downloadBtnIconBlack} btnDisable={handleDisableBtn()} loading={isLoading || processing} /> + + {processing &&

{"⏳ Hang tight! We're currently processing your claim."}

} {!processing && (
{ handleShareURL(); @@ -676,9 +543,7 @@ const ShareLink: FC = (props) => { {!processing && (
{ setOpenShareModal(true); @@ -692,23 +557,10 @@ const ShareLink: FC = (props) => { )}
- + - {isClaimSuccessful && ( - - )} + {isClaimSuccessful && } {/*
*/}
diff --git a/ui_components/bottom-sheet/index.tsx b/ui_components/bottom-sheet/index.tsx index 32d6fa4..8a37316 100644 --- a/ui_components/bottom-sheet/index.tsx +++ b/ui_components/bottom-sheet/index.tsx @@ -158,11 +158,11 @@ const BottomSheet: FC = (props) => { >
login with google

- Login with Google + Login with Lens

{
logo

- Clink + Micropay

) : ( @@ -209,8 +209,9 @@ const Header = (props: IHeader) => { >
login with google

Login with Lens diff --git a/ui_components/loadchest/LoadChestComponent.tsx b/ui_components/loadchest/LoadChestComponent.tsx index ecd5ed4..a3452b1 100644 --- a/ui_components/loadchest/LoadChestComponent.tsx +++ b/ui_components/loadchest/LoadChestComponent.tsx @@ -4,11 +4,7 @@ import AccountAbstraction from "@safe-global/account-abstraction-kit-poc"; import { EthersAdapter } from "@safe-global/protocol-kit"; import { SafeAccountConfig, SafeFactory } from "@safe-global/protocol-kit"; import { GelatoRelayPack } from "@safe-global/relay-kit"; -import { - MetaTransactionData, - MetaTransactionOptions, - OperationType, -} from "@safe-global/safe-core-sdk-types"; +import { MetaTransactionData, MetaTransactionOptions, OperationType } from "@safe-global/safe-core-sdk-types"; import { initWasm } from "@trustwallet/wallet-core"; import { serializeError } from "eth-rpc-errors"; import { ethers } from "ethers"; @@ -22,22 +18,11 @@ import { ToastContainer } from "react-toastify"; import ReactTyped from "react-typed"; import { parseEther } from "viem"; -import { - getBalance, - getRelayTransactionStatus, - getSendTransactionStatus, - getUsdPrice, -} from "../../apiServices"; +import { getBalance, getRelayTransactionStatus, getSendTransactionStatus, getUsdPrice } from "../../apiServices"; import { GlobalContext } from "../../context/GlobalContext"; import { LOGGED_IN, THandleStep } from "../../pages"; import * as loaderAnimation from "../../public/lottie/loader.json"; -import { - encodeAddress, - getCurrencyFormattedNumber, - getTokenFormattedNumber, - getTokenValueFormatted, - hexToNumber, -} from "../../utils"; +import { encodeAddress, getCurrencyFormattedNumber, getTokenFormattedNumber, getTokenValueFormatted, hexToNumber } from "../../utils"; import { BaseGoerli } from "../../utils/chain/baseGoerli"; import { icons } from "../../utils/images"; import { useWagmi } from "../../utils/wagmi/WagmiContext"; @@ -46,23 +31,11 @@ import PrimaryBtn from "../PrimaryBtn"; import SecondaryBtn from "../SecondaryBtn"; import DepositAmountModal from "./DepositAmountModal"; import { ProfileCard } from "./ProfileCard"; -import { - GateFiEventTypes, - GateFiDisplayModeEnum, - GateFiSDK, -} from "@gatefi/js-sdk"; +import { GateFiEventTypes, GateFiDisplayModeEnum, GateFiSDK } from "@gatefi/js-sdk"; import { IPaymaster, BiconomyPaymaster } from "@biconomy/paymaster"; import { IBundler, Bundler } from "@biconomy/bundler"; -import { - BiconomySmartAccount, - BiconomySmartAccountV2, - DEFAULT_ENTRYPOINT_ADDRESS, -} from "@biconomy/account"; -import { - IHybridPaymaster, - PaymasterMode, - SponsorUserOperationDto, -} from "@biconomy/paymaster"; +import { BiconomySmartAccount, BiconomySmartAccountV2, DEFAULT_ENTRYPOINT_ADDRESS } from "@biconomy/account"; +import { IHybridPaymaster, PaymasterMode, SponsorUserOperationDto } from "@biconomy/paymaster"; export interface ILoadChestComponent { provider?: any; @@ -91,12 +64,8 @@ export const LoadChestComponent: FC = (props) => { const [balanceInUsd, setBalanceInUsd] = useState(""); const [showActivity, setShowActivity] = useState(false); const [chestLoadingText, setChestLoadingText] = useState(""); - const ethersProvider = new ethers.providers.JsonRpcProvider( - BaseGoerli.info.rpc - ); - const relayPack = new GelatoRelayPack( - process.env.NEXT_PUBLIC_GELATO_RELAY_API_KEY - ); + const ethersProvider = new ethers.providers.JsonRpcProvider(BaseGoerli.info.rpc); + const relayPack = new GelatoRelayPack(process.env.NEXT_PUBLIC_GELATO_RELAY_API_KEY); const isRelayInitiated = useRef(false); const handleToggle = () => { setToggle(!toggle); @@ -128,16 +97,8 @@ export const LoadChestComponent: FC = (props) => { setTokenPrice(res.data.ethereum.usd); setFromAddress(address); const balance = (await getBalance(address)) as any; - setTokenValue( - getTokenFormattedNumber( - hexToNumber(balance.result) as unknown as string, - 18 - ) - ); - const formatBal = ( - (hexToNumber(balance.result) / Math.pow(10, 18)) * - res.data.ethereum.usd - ).toFixed(3); + setTokenValue(getTokenFormattedNumber(hexToNumber(balance.result) as unknown as string, 18)); + const formatBal = ((hexToNumber(balance.result) / Math.pow(10, 18)) * res.data.ethereum.usd).toFixed(3); setPrice(getCurrencyFormattedNumber(formatBal)); setBalanceInUsd(formatBal); setLoading(false); @@ -187,13 +148,11 @@ export const LoadChestComponent: FC = (props) => { setChestLoadingText("Setting up destination signer and address"); const paymaster = new BiconomyPaymaster({ - paymasterUrl: - "https://paymaster.biconomy.io/api/v1/84531/76v47JPQ6.7a881a9f-4cec-45e0-95e9-c39c71ca54f4", + paymasterUrl: "https://paymaster.biconomy.io/api/v1/84531/76v47JPQ6.7a881a9f-4cec-45e0-95e9-c39c71ca54f4", }); const bundler: IBundler = new Bundler({ - bundlerUrl: - "https://bundler.biconomy.io/api/v2/84531/nJPK7B3ru.dd7f7861-190d-41bd-af80-6877f74b8f44", + bundlerUrl: "https://bundler.biconomy.io/api/v2/84531/nJPK7B3ru.dd7f7861-190d-41bd-af80-6877f74b8f44", chainId: 84531, entryPointAddress: DEFAULT_ENTRYPOINT_ADDRESS, }); @@ -208,7 +167,7 @@ export const LoadChestComponent: FC = (props) => { }); const scw = await biWallet.getSmartAccountAddress(); const destinatinoHash = encodeAddress(scw); - const fullHash = payData.link + "|" + destinatinoHash; + const fullHash = payData.link + "~" + destinatinoHash; setLinkHash(fullHash); setDestinationAddress(scw); console.log(scw, "smart address"); @@ -232,7 +191,7 @@ export const LoadChestComponent: FC = (props) => { // ); // setDestinationAddress(destinationAdd); // const destinatinoHash = encodeAddress(destinationAdd); - // const fullHash = payData.link + "|" + destinatinoHash; + // const fullHash = payData.link + "~" + destinatinoHash; // setLinkHash(fullHash); // setChestLoadingText("Safe contract created"); // const fromEthProvider = new ethers.providers.Web3Provider(provider); @@ -260,8 +219,7 @@ export const LoadChestComponent: FC = (props) => { let partialUserOp = await smartAccount.buildUserOp([tx]); console.log(partialUserOp, "partialUserOp"); setChestLoadingText("Setting up smart account..."); - const biconomyPaymaster = - smartAccount.paymaster as IHybridPaymaster; + const biconomyPaymaster = smartAccount.paymaster as IHybridPaymaster; console.log(biconomyPaymaster, "biconomyPaymaster"); let paymasterServiceData: SponsorUserOperationDto = { mode: PaymasterMode.SPONSORED, @@ -271,29 +229,19 @@ export const LoadChestComponent: FC = (props) => { try { setChestLoadingText("Setting up paymaster..."); - const paymasterAndDataResponse = - await biconomyPaymaster.getPaymasterAndData( - partialUserOp, - paymasterServiceData - ); + const paymasterAndDataResponse = await biconomyPaymaster.getPaymasterAndData(partialUserOp, paymasterServiceData); console.log(paymasterAndDataResponse, "paymasterAndDataResponse"); - partialUserOp.paymasterAndData = - paymasterAndDataResponse.paymasterAndData; + partialUserOp.paymasterAndData = paymasterAndDataResponse.paymasterAndData; const userOpResponse = await smartAccount.sendUserOp(partialUserOp); console.log(userOpResponse, "userOpResponse"); const transactionDetails = await userOpResponse.wait(); console.log(transactionDetails, "transactionDetails"); - setExplorerUrl( - `https://goerli.basescan.org/tx/${transactionDetails.receipt.transactionHash}` - ); + setExplorerUrl(`https://goerli.basescan.org/tx/${transactionDetails.receipt.transactionHash}`); console.log(transactionDetails.receipt.transactionHash, "tx hash"); setChestLoadingText("Success! Transaction Processed"); setIsSucceed(true); - handleTransactionStatus( - transactionDetails.receipt.transactionHash, - linkHash - ); + handleTransactionStatus(transactionDetails.receipt.transactionHash, linkHash); setChestLoadingText("Transaction Submitted!"); // router.push(linkHash); @@ -499,11 +447,7 @@ export const LoadChestComponent: FC = (props) => {

{!transactionLoading ? (
- + {!showActivity ? ( <> @@ -512,12 +456,7 @@ export const LoadChestComponent: FC = (props) => {

YOUR BALANCE

- transferIcon + transferIcon {toggle ? ( loading || loader ? (
@@ -526,12 +465,8 @@ export const LoadChestComponent: FC = (props) => {
) : (
-

- {price} -

-

- {tokenValue} ETH -

+

{price}

+

{tokenValue} ETH

) ) : loading ? ( @@ -541,31 +476,15 @@ export const LoadChestComponent: FC = (props) => {
) : (
-

- ~ {tokenValue} ETH -

-

- {price} -

+

~ {tokenValue} ETH

+

{price}

)}
- transferIcon - {!loading && !loader ? ( -

- ETH -

- ) : ( -
- )} + transferIcon + {!loading && !loader ?

ETH

:
}
= (props) => { setOpen(true); }} > -

- + Add funds to your account -

+

+ Add funds to your account

@@ -598,16 +515,10 @@ export const LoadChestComponent: FC = (props) => { handleInputChange(e.target.value); }} disabled={loading} - onWheel={() => - (document.activeElement as HTMLElement).blur() - } + onWheel={() => (document.activeElement as HTMLElement).blur()} />
- {Number(inputValue) > 0 && ( -

- ~ {inputValue} ETH -

- )} + {Number(inputValue) > 0 &&

~ {inputValue} ETH

}
@@ -643,20 +554,9 @@ export const LoadChestComponent: FC = (props) => {
- +
- +
@@ -665,22 +565,11 @@ export const LoadChestComponent: FC = (props) => { ) : (
- +
)} - + {/*
*/} ); diff --git a/ui_components/loadchest/ProfileCard.tsx b/ui_components/loadchest/ProfileCard.tsx index 667d541..17ab952 100644 --- a/ui_components/loadchest/ProfileCard.tsx +++ b/ui_components/loadchest/ProfileCard.tsx @@ -80,11 +80,11 @@ export const ProfileCard: FC = (props) => {

Powered by:

- {/* safe logo */} + className="w-20 inline-block" + /> {/* {showActivity ? ( diff --git a/ui_components/loadchest/QRComponent.tsx b/ui_components/loadchest/QRComponent.tsx index 05debe8..bb6ca5d 100644 --- a/ui_components/loadchest/QRComponent.tsx +++ b/ui_components/loadchest/QRComponent.tsx @@ -87,7 +87,7 @@ export const QRComponent: FC = (props) => { }, dotsOptions: { type: "extra-rounded", - color: "#FFFFFF", + color: "#000000", }, // imageOptions: { // hideBackgroundDots: true, @@ -96,7 +96,7 @@ export const QRComponent: FC = (props) => { // crossOrigin: "anonymous", // }, backgroundOptions: { - color: "#2B2D30", + color: "#FFFF", }, }); const [showcopyText, setShowCopyText] = useState(false); @@ -123,7 +123,7 @@ export const QRComponent: FC = (props) => { }; return (
-

+

{!isShareQr ? "You can deposit crypto into your account via address" : null} @@ -133,13 +133,13 @@ export const QRComponent: FC = (props) => { {!isShareQr ? (

-
-
+
+
{trimAddress(walletAddress)}
{showcopyText && ( -

Copied!

+

Copied!

)}
) : null} diff --git a/utils/images/index.ts b/utils/images/index.ts index b1aae87..4456f93 100644 --- a/utils/images/index.ts +++ b/utils/images/index.ts @@ -15,10 +15,10 @@ import linkWhite from "../../public/assets/images/link_white.svg"; import linkedinBlue from "../../public/assets/images/linkedin_blue.svg"; import loadAvatar from "../../public/assets/images/load_avatar.png"; import logo from "../../public/assets/images/logo.svg"; -import logo2 from "../../public/assets/images/logo_clink.png"; +import logo2 from "../../public/assets/images/logo_micropay.png"; import logoutIcon from "../../public/assets/images/logout_icon.svg"; import qrWhite from "../../public/assets/images/qr_white.svg"; -import safeLogo from "../../public/assets/images/safe_logo.svg"; +import bicoLogo from "../../public/assets/images/biconomy_logo.png"; import shareBtnIcon from "../../public/assets/images/share_btn_icon.svg"; import shareBtnIconWhite from "../../public/assets/images/share_btn_icon_white.svg"; import tchest from "../../public/assets/images/tchest.png"; @@ -54,7 +54,7 @@ export type TImages = | "x" | "telegramBlue" | "linkedinBlue" - | "safeLogo" + | "bicoLogo" | "baseLogo" | "copyIconWhite" | "linkWhite" @@ -95,7 +95,7 @@ export const icons: Record = { x, linkedinBlue, telegramBlue, - safeLogo, + bicoLogo, baseLogo, copyIconWhite, linkWhite, From cce5ef7cccab43283011c9d4e1cd9f1651637b87 Mon Sep 17 00:00:00 2001 From: VaithiDs Date: Sat, 7 Oct 2023 13:19:48 +0530 Subject: [PATCH 3/5] Added logout function for Lens --- pages/index.tsx | 77 ++-- ui_components/header/index.tsx | 460 +++++++++++------------- ui_components/loadchest/ProfileCard.tsx | 95 ++--- 3 files changed, 321 insertions(+), 311 deletions(-) diff --git a/pages/index.tsx b/pages/index.tsx index 0d12c3a..8e4f4cb 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -53,7 +53,7 @@ import { DEFAULT_ENTRYPOINT_ADDRESS, } from "@biconomy/account"; import { ethers } from "ethers"; -import { saveToLocalStorage } from "../utils"; +import { getFromLocalStorage, saveToLocalStorage } from "../utils"; import { useRouter } from "next/router"; export type THandleStep = { @@ -68,6 +68,8 @@ export enum ESTEPS { export enum LOGGED_IN { GOOGLE = "google", EXTERNAL_WALLET = "external_wallet", + MAGIC = "magic", + LENS = "lens", } export default function Home() { @@ -122,18 +124,18 @@ export default function Home() { console.log(walletLoading, "walletLoading"); console.log(profileLoading, "profileLoading"); if (profile !== null) { - dispatch({ - type: ACTIONS.LOGGED_IN_VIA, - payload: LOGGED_IN.GOOGLE, - }); - dispatch({ - type: ACTIONS.SET_ADDRESS, - payload: address, - }); - setWalletAddress(address ?? ""); - setLoader(false); - saveToLocalStorage("address", address); - handleSteps(ESTEPS.THREE); + // dispatch({ + // type: ACTIONS.LOGGED_IN_VIA, + // payload: LOGGED_IN.LENS, + // }); + // dispatch({ + // type: ACTIONS.SET_ADDRESS, + // payload: address, + // }); + // setWalletAddress(address ?? ""); + // setLoader(false); + // saveToLocalStorage("address", address); + // handleSteps(ESTEPS.THREE); } else { toast.info("Your wallet doesn't have lens account"); } @@ -155,11 +157,38 @@ export default function Home() { await login({ address: walletClient.account.address, }); - await connectWithBiconomy(await connector?.getProvider(), "lens"); + const prov = await connector?.getProvider(); + saveToLocalStorage("lensProvider", prov); + await connectWithBiconomy(prov, LOGGED_IN.LENS); setLoggedIn(true); } }; + const handleDisconnect = async () => { + if (isConnected) { + await disconnectAsync(); + } + // await logout(); + await disconnect(); + saveToLocalStorage("loginType", ""); + localStorage.removeItem("isGoogleLogin"); + localStorage.removeItem("isConnected"); + handleSteps(ESTEPS.ONE); + setWalletAddress(""); + dispatch({ + type: ACTIONS.LOGOUT, + payload: "", + }); + dispatch({ + type: ACTIONS.LOGGED_IN_VIA, + payload: "", + }); + dispatch({ + type: ACTIONS.SET_ADDRESS, + payload: "", + }); + }; + useEffect(() => { const item = localStorage.getItem("isGoogleLogin"); if (item) { @@ -347,6 +376,8 @@ export default function Home() { useEffect(() => { async function initMagic() { + const loggedInVia = getFromLocalStorage("loginType"); + const add = getFromLocalStorage("address"); if (window !== undefined) { console.log(window.location.origin, "window.location.origin"); console.log("came inside if"); @@ -362,10 +393,9 @@ export default function Home() { console.log("came inside callback"); try { await magicSdk.auth.loginWithCredential(); - const userMetadata = await magicSdk.user.getMetadata(); saveToLocalStorage("email", userMetadata.email); - connectWithBiconomy(magicSdk.rpcProvider, "magic"); + connectWithBiconomy(magicSdk.rpcProvider, LOGGED_IN.MAGIC); } catch (e) { console.error(e); } @@ -373,7 +403,10 @@ export default function Home() { console.log("came inside isloggedin"); const userMetadata = await magicSdk.user.getMetadata(); saveToLocalStorage("email", userMetadata.email); - connectWithBiconomy(magicSdk.rpcProvider, "magic"); + connectWithBiconomy(magicSdk.rpcProvider, LOGGED_IN.MAGIC); + } else if (loggedInVia && loggedInVia === LOGGED_IN.LENS && add) { + const { connector } = await connectAsync(); + connectWithBiconomy(await connector?.getProvider(), LOGGED_IN.LENS); } else { setLoader(false); } @@ -403,7 +436,10 @@ export default function Home() { }); }; - const connectWithBiconomy = async (rpcProvider: any, logintype: string) => { + const connectWithBiconomy = async ( + rpcProvider: any, + logintype: LOGGED_IN + ) => { setLoader(true); try { const web3Provider = new ethers.providers.Web3Provider( @@ -435,7 +471,7 @@ export default function Home() { console.log(scw, "new scw"); dispatch({ type: ACTIONS.LOGGED_IN_VIA, - payload: LOGGED_IN.GOOGLE, + payload: logintype, }); dispatch({ type: ACTIONS.SET_ADDRESS, @@ -551,7 +587,7 @@ export default function Home() { <>
Promise; - handleSteps: (step: number) => void; - step: number; - onHamburgerClick: () => void; - signOut: () => Promise; - setWalletAddress: (val: string) => void; - loader?: boolean; - initLoader?: boolean; + walletAddress: string; + signIn: () => Promise; + handleSteps: (step: number) => void; + step: number; + onHamburgerClick: () => void; + signOut: () => Promise; + setWalletAddress: (val: string) => void; + handleDisconnect: () => Promise; + loader?: boolean; + initLoader?: boolean; } const Header = (props: IHeader) => { - const menuRef = useRef(null); - const { - walletAddress, - signIn, - step, - handleSteps, - onHamburgerClick, - signOut, - setWalletAddress, - loader, - initLoader, - } = props; - const { - dispatch, - state: { googleUserInfo, address, isConnected, loggedInVia }, - } = useContext(GlobalContext); - const [copyText, setCopyText] = useState("Copy Address"); - const [opacity, setOpacity] = useState(false); - const { disconnect } = useWagmi(); + const menuRef = useRef(null); + const { + walletAddress, + signIn, + step, + handleSteps, + onHamburgerClick, + signOut, + setWalletAddress, + loader, + initLoader, + handleDisconnect, + } = props; + const { + dispatch, + state: { googleUserInfo, address, isConnected, loggedInVia }, + } = useContext(GlobalContext); + const [copyText, setCopyText] = useState("Copy Address"); + const [opacity, setOpacity] = useState(false); + const { disconnect } = useWagmi(); + const { execute: logout } = useWalletLogout(); + const { disconnectAsync } = useDisconnect(); - const copyToClipBoard = (e: any) => { - e.preventDefault(); - e.stopPropagation(); - navigator.clipboard.writeText(address); - setCopyText("Address copied"); - setTimeout(() => { - setCopyText("Copy Address"); - }, 4000); - }; + const copyToClipBoard = (e: any) => { + e.preventDefault(); + e.stopPropagation(); + navigator.clipboard.writeText(address); + setCopyText("Address copied"); + setTimeout(() => { + setCopyText("Copy Address"); + }, 4000); + }; - const handleLogout = () => { - signOut(); - setOpacity(false); - }; + const handleLogout = () => { + signOut(); + setOpacity(false); + }; - const handleClick = () => { - setOpacity(!opacity); - onHamburgerClick(); - }; + const handleClick = () => { + setOpacity(!opacity); + onHamburgerClick(); + }; + + const handleClickOutside = (e: any) => { + if (menuRef.current && !menuRef?.current?.contains(e.target)) { + setOpacity(false); + } + }; - const handleClickOutside = (e: any) => { - if (menuRef.current && !menuRef?.current?.contains(e.target)) { - setOpacity(false); - } + useEffect(() => { + document.addEventListener("click", handleClickOutside); + return () => { + document.removeEventListener("click", handleClickOutside); }; + }, []); - useEffect(() => { - document.addEventListener("click", handleClickOutside); - return () => { - document.removeEventListener("click", handleClickOutside); - }; - }, []); + return ( +
+
+
+
+ {step === 1 ? ( +
+ logo +

+ Micropay +

+
+ ) : ( +
+ handleSteps(step === 3 ? 1 : step - 1)} /> +
+ )} - const handleDisConnect = async () => { - await disconnect(); - localStorage.removeItem("isGoogleLogin"); - localStorage.removeItem("isConnected"); - handleSteps(ESTEPS.ONE); - setWalletAddress(""); - dispatch({ - type: ACTIONS.LOGOUT, - payload: "", - }); - dispatch({ - type: ACTIONS.LOGGED_IN_VIA, - payload: "", - }); - dispatch({ - type: ACTIONS.SET_ADDRESS, - payload: "", - }); - }; +
+ +
+ -
- -
+

Logout

+
+ logout +
+ ) : null} +
-
+
+ ) : null} +
- - ); +
+ + + + ); }; export default Header; diff --git a/ui_components/loadchest/ProfileCard.tsx b/ui_components/loadchest/ProfileCard.tsx index 17ab952..fc098b2 100644 --- a/ui_components/loadchest/ProfileCard.tsx +++ b/ui_components/loadchest/ProfileCard.tsx @@ -6,51 +6,60 @@ import Link from "next/link"; import { FC, useContext, useState } from "react"; import { GlobalContext } from "../../context/GlobalContext"; -import { trimAddress } from "../../utils"; +import { getFromLocalStorage, trimAddress } from "../../utils"; import { icons } from "../../utils/images"; import QrModal from "../QrModal"; +import { useActiveProfile } from "@lens-protocol/react-web"; +import { LOGGED_IN } from "../../pages"; export interface IProfileCard { - profileImage?: string; - balance: string; - showActivity: boolean; - transactionLoading: boolean; + profileImage?: string; + balance: string; + showActivity: boolean; + transactionLoading: boolean; } export const ProfileCard: FC = (props) => { - const { transactionLoading } = props; - const { - state: { address }, - } = useContext(GlobalContext); - const [showQr, setShowQr] = useState(false); + const { transactionLoading } = props; + const { + state: { address, loggedInVia }, + } = useContext(GlobalContext); + const { + data: profile, + error: profileerror, + loading: profileLoading, + } = useActiveProfile(); + const [showQr, setShowQr] = useState(false); - const copyToClipBoard = (e: any) => { - e.preventDefault(); - e.stopPropagation(); - navigator.clipboard.writeText(address); - }; + const copyToClipBoard = (e: any) => { + e.preventDefault(); + e.stopPropagation(); + navigator.clipboard.writeText(address); + }; - return ( - <> -
-
- profile image -
-

My Smart Wallet

- {transactionLoading ? ( -
- ) : ( -

{`${trimAddress(address)}`}

- )} + return ( + <> +
+
+ profile image +
+

+ {loggedInVia === LOGGED_IN.LENS + ? `@${profile?.handle}` + : "My Smart Account"} +

+ {transactionLoading ? ( +
+ ) : ( +

{`${trimAddress(address)}`}

+ )}
= (props) => { /> - {/* {showActivity ? ( + {/* {showActivity ? (
= (props) => { />
) : null} */} -
- {/* {showActivity ? ( +
+ {/* {showActivity ? (

Activity

) : null} */} - - - ); + + + ); }; From f2a23c3e356459c91e19eacda41dd71ed066640b Mon Sep 17 00:00:00 2001 From: Punith B M Date: Sat, 7 Oct 2023 18:52:15 +0530 Subject: [PATCH 4/5] fix: logs removed --- pages/index.tsx | 183 +++++------------- ui_components/ShareLinkPage.tsx | 100 ---------- ui_components/connect_wallet/index.tsx | 5 - .../loadchest/LoadChestComponent.tsx | 159 --------------- ui_components/loadchest/ProfileCard.tsx | 82 +++----- 5 files changed, 70 insertions(+), 459 deletions(-) diff --git a/pages/index.tsx b/pages/index.tsx index 8e4f4cb..e7bdf29 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -2,16 +2,8 @@ import "react-toastify/dist/ReactToastify.css"; import "./globals.css"; import { useConnectModal } from "@rainbow-me/rainbowkit"; -import { - EthersAdapter, - SafeAccountConfig, - SafeFactory, -} from "@safe-global/protocol-kit"; -import { - CHAIN_NAMESPACES, - SafeEventEmitterProvider, - WALLET_ADAPTERS, -} from "@web3auth/base"; +import { EthersAdapter, SafeAccountConfig, SafeFactory } from "@safe-global/protocol-kit"; +import { CHAIN_NAMESPACES, SafeEventEmitterProvider, WALLET_ADAPTERS } from "@web3auth/base"; import { EthereumPrivateKeyProvider } from "@web3auth/ethereum-provider"; import { Web3AuthNoModal } from "@web3auth/no-modal"; import { OpenloginAdapter } from "@web3auth/openlogin-adapter"; @@ -20,13 +12,7 @@ import React, { useContext, useEffect, useState } from "react"; import { ToastContainer } from "react-toastify"; import { toast } from "react-toastify"; -import { - oauthClientId, - productName, - web3AuthClientId, - web3AuthLoginType, - web3AuthVerifier, -} from "../constants"; +import { oauthClientId, productName, web3AuthClientId, web3AuthLoginType, web3AuthVerifier } from "../constants"; import { ACTIONS, GlobalContext } from "../context/GlobalContext"; import BottomSheet from "../ui_components/bottom-sheet"; import ConnectWallet from "../ui_components/connect_wallet/"; @@ -36,22 +22,13 @@ import HomePage from "../ui_components/home/HomePage"; import { LoadChestComponent } from "../ui_components/loadchest/LoadChestComponent"; import { BaseGoerli } from "../utils/chain/baseGoerli"; import { useWagmi } from "../utils/wagmi/WagmiContext"; -import { - useWalletLogin, - useWalletLogout, - useActiveProfile, - useActiveWallet, -} from "@lens-protocol/react-web"; +import { useWalletLogin, useWalletLogout, useActiveProfile } from "@lens-protocol/react-web"; import { useAccount, useConnect, useDisconnect } from "wagmi"; import { InjectedConnector } from "wagmi/connectors/injected"; import { Magic } from "magic-sdk"; import { IPaymaster, BiconomyPaymaster } from "@biconomy/paymaster"; import { IBundler, Bundler } from "@biconomy/bundler"; -import { - BiconomySmartAccount, - BiconomySmartAccountV2, - DEFAULT_ENTRYPOINT_ADDRESS, -} from "@biconomy/account"; +import { BiconomySmartAccount, BiconomySmartAccountV2, DEFAULT_ENTRYPOINT_ADDRESS } from "@biconomy/account"; import { ethers } from "ethers"; import { getFromLocalStorage, saveToLocalStorage } from "../utils"; import { useRouter } from "next/router"; @@ -90,23 +67,11 @@ export default function Home() { const { getAccount, disconnect } = useWagmi(); const { address, isConnecting, isConnected } = useAccount(); const [web3auth, setWeb3auth] = useState(null); - const [provider, setProvider] = useState( - null - ); + const [provider, setProvider] = useState(null); const [loggedIn, setLoggedIn] = useState(false); - const { - execute: login, - error: loginError, - isPending: isLoginPending, - } = useWalletLogin(); + const { execute: login, error: loginError, isPending: isLoginPending } = useWalletLogin(); const { execute: logout } = useWalletLogout(); - const { data: wallet, loading: walletLoading } = useActiveWallet(); - const { - data: profile, - error: profileerror, - loading: profileLoading, - } = useActiveProfile(); const { disconnectAsync } = useDisconnect(); const router = useRouter(); @@ -118,26 +83,16 @@ export default function Home() { useEffect(() => { async function initLens() { if (loggedIn) { - console.log(profile, "profile"); - console.log(profileerror, "profileerror"); - console.log(wallet, "wallet"); - console.log(walletLoading, "walletLoading"); - console.log(profileLoading, "profileLoading"); - if (profile !== null) { - // dispatch({ - // type: ACTIONS.LOGGED_IN_VIA, - // payload: LOGGED_IN.LENS, - // }); - // dispatch({ - // type: ACTIONS.SET_ADDRESS, - // payload: address, - // }); - // setWalletAddress(address ?? ""); - // setLoader(false); - // saveToLocalStorage("address", address); - // handleSteps(ESTEPS.THREE); - } else { - toast.info("Your wallet doesn't have lens account"); + try { + const activeProfile = useActiveProfile(); + const { data: profile } = activeProfile; + if (profile == null) { + await disconnect(); + toast.info("Your wallet doesn't have lens account"); + } + } catch(e){ + await disconnect(); + toast.info("Your wallet doesn't have lens account"); } } } @@ -145,22 +100,26 @@ export default function Home() { }, [loggedIn]); const onLoginClick = async () => { - if (isConnected) { - await disconnectAsync(); - } + try { + if (isConnected) { + await disconnectAsync(); + } - const { connector } = await connectAsync(); + const { connector } = await connectAsync(); - if (connector instanceof InjectedConnector) { - const walletClient = await connector.getWalletClient(); + if (connector instanceof InjectedConnector) { + const walletClient = await connector.getWalletClient(); - await login({ - address: walletClient.account.address, - }); - const prov = await connector?.getProvider(); - saveToLocalStorage("lensProvider", prov); - await connectWithBiconomy(prov, LOGGED_IN.LENS); - setLoggedIn(true); + const resp = await login({ + address: walletClient.account.address, + }); + const prov = await connector?.getProvider(); + saveToLocalStorage("lensProvider", prov); + setLoggedIn(true); + await connectWithBiconomy(prov, LOGGED_IN.LENS); + } + } catch (error) { + toast.error("Something went wrong!"); } }; @@ -278,12 +237,9 @@ export default function Home() { if (web3auth.connected) { return; } - const web3authProvider = await web3auth.connectTo( - WALLET_ADAPTERS.OPENLOGIN, - { - loginProvider: "google", - } - ); + const web3authProvider = await web3auth.connectTo(WALLET_ADAPTERS.OPENLOGIN, { + loginProvider: "google", + }); setProvider(web3authProvider); const acc = (await getAccounts()) as any; const email = await (await web3auth.getUserInfo()).email; @@ -332,9 +288,7 @@ export default function Home() { owners: [await signer.getAddress()], threshold: 1, }; - const safeSdkOwnerPredicted = await safeFactory.predictSafeAddress( - safeAccountConfig - ); + const safeSdkOwnerPredicted = await safeFactory.predictSafeAddress(safeAccountConfig); return safeSdkOwnerPredicted; }; @@ -379,18 +333,13 @@ export default function Home() { const loggedInVia = getFromLocalStorage("loginType"); const add = getFromLocalStorage("address"); if (window !== undefined) { - console.log(window.location.origin, "window.location.origin"); - console.log("came inside if"); setLoader(true); const magicSdk = new Magic("pk_live_8A226AACC0D8D290"); const prov = await magicSdk.wallet.getProvider(); setProvider(prov); setMagic(magicSdk); const isLoggedIn = await magicSdk.user.isLoggedIn(); - console.log(isLoggedIn, "isloggedin"); - console.log(router.query, "query"); if (router && router.query.magic_credential) { - console.log("came inside callback"); try { await magicSdk.auth.loginWithCredential(); const userMetadata = await magicSdk.user.getMetadata(); @@ -400,7 +349,6 @@ export default function Home() { console.error(e); } } else if (isLoggedIn) { - console.log("came inside isloggedin"); const userMetadata = await magicSdk.user.getMetadata(); saveToLocalStorage("email", userMetadata.email); connectWithBiconomy(magicSdk.rpcProvider, LOGGED_IN.MAGIC); @@ -436,25 +384,17 @@ export default function Home() { }); }; - const connectWithBiconomy = async ( - rpcProvider: any, - logintype: LOGGED_IN - ) => { + const connectWithBiconomy = async (rpcProvider: any, logintype: LOGGED_IN) => { setLoader(true); try { - const web3Provider = new ethers.providers.Web3Provider( - rpcProvider, - "any" - ); + const web3Provider = new ethers.providers.Web3Provider(rpcProvider, "any"); const paymaster = new BiconomyPaymaster({ - paymasterUrl: - "https://paymaster.biconomy.io/api/v1/84531/76v47JPQ6.7a881a9f-4cec-45e0-95e9-c39c71ca54f4", + paymasterUrl: "https://paymaster.biconomy.io/api/v1/84531/76v47JPQ6.7a881a9f-4cec-45e0-95e9-c39c71ca54f4", }); const bundler: IBundler = new Bundler({ - bundlerUrl: - "https://bundler.biconomy.io/api/v2/84531/nJPK7B3ru.dd7f7861-190d-41bd-af80-6877f74b8f44", + bundlerUrl: "https://bundler.biconomy.io/api/v2/84531/nJPK7B3ru.dd7f7861-190d-41bd-af80-6877f74b8f44", chainId: 84531, entryPointAddress: DEFAULT_ENTRYPOINT_ADDRESS, }); @@ -468,7 +408,6 @@ export default function Home() { accountIndex: 0, }); const scw = await wallet.getSmartAccountAddress(); - console.log(scw, "new scw"); dispatch({ type: ACTIONS.LOGGED_IN_VIA, payload: logintype, @@ -525,17 +464,7 @@ export default function Home() { case ESTEPS.ONE: return ; case ESTEPS.TWO: - return ( - - ); + return ; case ESTEPS.THREE: return ; default: @@ -585,31 +514,9 @@ export default function Home() { return ( <> -
+
- + {getUIComponent(step)} = (props) => { }; const handlePublicAddressTransaction = (toAdd: string) => { - console.log(toAdd, "to add"); handleCloseClaimModal(); sendToken(toAdd); }; @@ -207,119 +206,61 @@ const ShareLink: FC = (props) => { // from signer address const fromSigner = new ethers.Wallet(fromKey.key, ethersProvider); - console.log(fromSigner, "fromSigner"); - const paymaster = new BiconomyPaymaster({ paymasterUrl: "https://paymaster.biconomy.io/api/v1/84531/76v47JPQ6.7a881a9f-4cec-45e0-95e9-c39c71ca54f4", }); - console.log(paymaster, "paymaster"); const bundler: IBundler = new Bundler({ bundlerUrl: "https://bundler.biconomy.io/api/v2/84531/nJPK7B3ru.dd7f7861-190d-41bd-af80-6877f74b8f44", chainId: 84531, entryPointAddress: DEFAULT_ENTRYPOINT_ADDRESS, }); - console.log(bundler, "bundler"); let biWallet = new BiconomySmartAccount({ signer: fromSigner, chainId: 84531, bundler: bundler, paymaster: paymaster, }); - console.log(biWallet, "biWallet"); biWallet = await biWallet.init({ accountIndex: 0, }); - console.log("biWallet initiated"); bicomomySmartAcc.current = biWallet; - // const safeAccountAbs = new AccountAbstraction(fromSigner); - // await safeAccountAbs.init({ relayPack }); - // safeAccountAbstraction.current = safeAccountAbs; - // isRelayInitiated.current = true; }; const sendToken = async (toAdd: string) => { setProcessing(true); try { if (bicomomySmartAcc.current) { - // setTransactionLoading(true); - // setChestLoadingText("Initializing wallet and creating link..."); const amountValue = hexToNumber(walletBalanceHex) / Math.pow(10, 18); - // const amount = ethers.utils.parseEther( - // amountValue as unknown as string - // ); - // console.log(amount, "amount"); - console.log(amountValue, "amountValue"); const data = "0x"; const tx = { to: toAdd, value: parseEther(amountValue.toString()).toString(), data, }; - console.log(tx, "tx"); const smartAccount = bicomomySmartAcc; let partialUserOp = await smartAccount.current?.buildUserOp([tx]); - console.log(partialUserOp, "partialUserOp"); - // setChestLoadingText("Setting up smart account..."); const biconomyPaymaster = smartAccount.current?.paymaster as IHybridPaymaster; - console.log(biconomyPaymaster, "biconomyPaymaster"); let paymasterServiceData: SponsorUserOperationDto = { mode: PaymasterMode.SPONSORED, // optional params... }; - console.log(paymasterServiceData, "paymasterServiceData"); try { // setChestLoadingText("Setting up paymaster..."); const paymasterAndDataResponse = await biconomyPaymaster.getPaymasterAndData(partialUserOp!, paymasterServiceData); - console.log(paymasterAndDataResponse, "paymasterAndDataResponse"); partialUserOp!.paymasterAndData = paymasterAndDataResponse.paymasterAndData; const userOpResponse = await smartAccount.current?.sendUserOp(partialUserOp!); - console.log(userOpResponse, "userOpResponse"); const transactionDetails = await userOpResponse?.wait(); - console.log(transactionDetails, "transactionDetails"); - // setExplorerUrl( - // `https://goerli.basescan.org/tx/${transactionDetails.receipt.transactionHash}` - // ); - console.log(`https://goerli.basescan.org/tx/${transactionDetails?.receipt.transactionHash}`, "tx hash"); handleTransactionStatus(transactionDetails?.receipt.transactionHash ?? ""); - // setChestLoadingText("Success! Transaction Processed"); - // setIsSucceed(true); - // setChestLoadingText("Operation Successful: Transaction Completed!"); - - // router.push(linkHash); } catch (error) { console.error("Error executing transaction:", error); } } - // if (isRelayInitiated.current) { - // const amountValue = hexToNumber(walletBalanceHex) / Math.pow(10, 18); - - // const safeTransactionData: MetaTransactionData = { - // to: toAdd, - // data: "0x", - // value: parseEther(amountValue.toString()).toString(), - // operation: OperationType.Call, - // }; - - // const gelatoTaskId = - // await safeAccountAbstraction?.current?.relayTransaction( - // [safeTransactionData], - // options - // ); - // if (gelatoTaskId) { - // handleTransactionStatus(gelatoTaskId); - // } - // } else { - // await handleSendToken(); - // sendToken(toAdd); - // return; - // } } catch (e: any) { setProcessing(false); toast.error(e.message); - console.log(e, "e"); } }; @@ -354,47 +295,6 @@ const ShareLink: FC = (props) => { }, intervalInMilliseconds); }; - // const handleTransactionStatus = (hash: string) => { - // const intervalInMilliseconds = 1000; - // const interval = setInterval(() => { - // getRelayTransactionStatus(hash) - // .then((res: any) => { - // if (res) { - // const task = res.data.task; - // if (task) { - // if ( - // task.taskState === "WaitingForConfirmation" || - // task.taskState === "ExecSuccess" - // ) { - // setLinkValueUsd("$0"); - // setTokenValue("0"); - // setTxHash(task.transactionHash); - // setHeadingText("Chest have found their owner!"); - // handleClaimSuccess(); - // if (interval !== null) { - // clearInterval(interval); - // } - // } - // } else { - // setProcessing(false); - // const err = serializeError("Failed to Claim!"); - // toast.error(err.message); - // if (interval !== null) { - // clearInterval(interval); - // } - // } - // } - // }) - // .catch((e) => { - // setProcessing(false); - // toast.error(e.message); - // console.log(e, "e"); - // if (interval !== null) { - // clearInterval(interval); - // } - // }); - // }, intervalInMilliseconds); - // }; const handleClaimSuccess = () => { setIsClaimSuccessful(true); diff --git a/ui_components/connect_wallet/index.tsx b/ui_components/connect_wallet/index.tsx index 236e65a..35d61db 100644 --- a/ui_components/connect_wallet/index.tsx +++ b/ui_components/connect_wallet/index.tsx @@ -23,20 +23,15 @@ export default function ConnectWallet(props: IConnectWallet) { const [enableVerifyBtn, setEnableVerifyBtn] = useState(false); const onChange = (val: string) => { - console.log(val, "value"); setOtp(val); }; useEffect(() => { - // This effect runs after each render when 'otp' changes. - console.log(otp.length, "otp"); // Check the length and set 'enableVerifyBtn' accordingly. if (otp.trim().length === 6) { - console.log("came to if"); setEnableVerifyBtn(true); } else { - console.log("came to else"); setEnableVerifyBtn(false); } }, [otp]); diff --git a/ui_components/loadchest/LoadChestComponent.tsx b/ui_components/loadchest/LoadChestComponent.tsx index a3452b1..9d7c573 100644 --- a/ui_components/loadchest/LoadChestComponent.tsx +++ b/ui_components/loadchest/LoadChestComponent.tsx @@ -170,36 +170,6 @@ export const LoadChestComponent: FC = (props) => { const fullHash = payData.link + "~" + destinatinoHash; setLinkHash(fullHash); setDestinationAddress(scw); - console.log(scw, "smart address"); - - // const destinationSigner = new ethers.Wallet(payData.key, ethersProvider); - // const destinationEOAAddress = await destinationSigner.getAddress(); - // const ethAdapter = new EthersAdapter({ - // ethers, - // signerOrProvider: destinationSigner, - // }); - // setChestLoadingText("Creating safe contract for chest"); - // const safeFactory = await SafeFactory.create({ - // ethAdapter: ethAdapter, - // }); - // const safeAccountConfig: SafeAccountConfig = { - // owners: [destinationEOAAddress], - // threshold: 1, - // }; - // const destinationAdd = await safeFactory.predictSafeAddress( - // safeAccountConfig - // ); - // setDestinationAddress(destinationAdd); - // const destinatinoHash = encodeAddress(destinationAdd); - // const fullHash = payData.link + "~" + destinatinoHash; - // setLinkHash(fullHash); - // setChestLoadingText("Safe contract created"); - // const fromEthProvider = new ethers.providers.Web3Provider(provider); - // const fromSigner = await fromEthProvider.getSigner(); - // const safeAccountAbs = new AccountAbstraction(fromSigner); - // await safeAccountAbs.init({ relayPack }); - // safeAccountAbstraction.current = safeAccountAbs; - // isRelayInitiated.current = true; }; const createWallet = async () => { @@ -214,31 +184,23 @@ export const LoadChestComponent: FC = (props) => { value: amount, data, }; - console.log(tx, "tx"); const smartAccount = biconomyWallet; let partialUserOp = await smartAccount.buildUserOp([tx]); - console.log(partialUserOp, "partialUserOp"); setChestLoadingText("Setting up smart account..."); const biconomyPaymaster = smartAccount.paymaster as IHybridPaymaster; - console.log(biconomyPaymaster, "biconomyPaymaster"); let paymasterServiceData: SponsorUserOperationDto = { mode: PaymasterMode.SPONSORED, // optional params... }; - console.log(paymasterServiceData, "paymasterServiceData"); try { setChestLoadingText("Setting up paymaster..."); const paymasterAndDataResponse = await biconomyPaymaster.getPaymasterAndData(partialUserOp, paymasterServiceData); - console.log(paymasterAndDataResponse, "paymasterAndDataResponse"); partialUserOp.paymasterAndData = paymasterAndDataResponse.paymasterAndData; const userOpResponse = await smartAccount.sendUserOp(partialUserOp); - console.log(userOpResponse, "userOpResponse"); const transactionDetails = await userOpResponse.wait(); - console.log(transactionDetails, "transactionDetails"); setExplorerUrl(`https://goerli.basescan.org/tx/${transactionDetails.receipt.transactionHash}`); - console.log(transactionDetails.receipt.transactionHash, "tx hash"); setChestLoadingText("Success! Transaction Processed"); setIsSucceed(true); handleTransactionStatus(transactionDetails.receipt.transactionHash, linkHash); @@ -248,59 +210,6 @@ export const LoadChestComponent: FC = (props) => { } catch (error) { console.error("Error executing transaction:", error); } - // try { - // if (loggedInVia === LOGGED_IN.GOOGLE) { - // if (isRelayInitiated.current) { - // setChestLoadingText("Transaction process has begun..."); - - // const safeTransactionData: MetaTransactionData = { - // to: destinationAddress, - // data: "0x", - // value: parseEther(inputValue).toString(), - // operation: OperationType.Call, - // }; - - // const options: MetaTransactionOptions = { - // gasLimit: "100000", - // isSponsored: true, - // }; - - // const gelatoTaskId = - // await safeAccountAbstraction?.current?.relayTransaction( - // [safeTransactionData], - // options - // ); - // if (gelatoTaskId) { - // setChestLoadingText( - // "Transaction on its way! Awaiting confirmation..." - // ); - // handleTransactionStatus(gelatoTaskId, linkHash); - // } - // } else { - // await handleInitWallet(); - // createWallet(); - // return; - // } - // } else { - // try { - // const sendAmount = await sendTransaction({ - // to: destinationAddress, - // value: parseEther(inputValue), - // }); - // handleTransactionStatus(sendAmount.hash, linkHash); - // } catch (e: any) { - // setTransactionLoading(false); - // const err = serializeError(e); - // toast.error(err.message); - // console.log(e, "error"); - // } - // } - // } catch (e: any) { - // setTransactionLoading(false); - // const err = serializeError(e); - // toast.error(err.message); - // console.log(e, "e"); - // } } }; @@ -371,74 +280,6 @@ export const LoadChestComponent: FC = (props) => { }, intervalInMilliseconds); }; - // const handleTransactionStatus = (hash: string, link: string) => { - // const intervalInMilliseconds = 1000; - // const interval = setInterval(() => { - // if (loggedInVia === LOGGED_IN.GOOGLE) { - // getRelayTransactionStatus(hash) - // .then((res: any) => { - // if (res) { - // console.log(res, "res"); - // const task = res.data.task; - // if (task) { - // setChestLoadingText("Verifying Transaction Status..."); - // if (task.taskState === "ExecSuccess") { - // setChestLoadingText( - // "Operation Successful: Transaction Completed!" - // ); - // router.push(link); - // if (interval !== null) { - // clearInterval(interval); - // } - // } - // } else { - // setTransactionLoading(false); - // toast.error("Failed to Load Chest. Try Again"); - // if (interval !== null) { - // clearInterval(interval); - // } - // } - // } - // }) - // .catch((e) => { - // setTransactionLoading(false); - // toast.error(e.message); - // console.log(e, "e"); - // if (interval !== null) { - // clearInterval(interval); - // } - // }); - // } else { - // getSendTransactionStatus(hash) - // .then((res: any) => { - // if (res.result) { - // const status = Number(res.result.status); - // if (status === 1) { - // router.push(link); - // if (interval !== null) { - // clearInterval(interval); - // } - // } else { - // setTransactionLoading(false); - // toast.error("Failed to Load Chest. Try Again"); - // if (interval !== null) { - // clearInterval(interval); - // } - // } - // } - // }) - // .catch((e) => { - // setTransactionLoading(false); - // toast.error(e.message); - // console.log(e, "e"); - // if (interval !== null) { - // clearInterval(interval); - // } - // }); - // } - // }, intervalInMilliseconds); - // }; - const handleShowActivity = () => { setShowActivity(!showActivity); }; diff --git a/ui_components/loadchest/ProfileCard.tsx b/ui_components/loadchest/ProfileCard.tsx index fc098b2..5c556d2 100644 --- a/ui_components/loadchest/ProfileCard.tsx +++ b/ui_components/loadchest/ProfileCard.tsx @@ -23,11 +23,11 @@ export const ProfileCard: FC = (props) => { const { state: { address, loggedInVia }, } = useContext(GlobalContext); - const { - data: profile, - error: profileerror, - loading: profileLoading, - } = useActiveProfile(); + let handle = "My Smart Account"; + try { + const { data: profile } = useActiveProfile(); + handle = `@` + profile?.handle; + } catch (e) {} const [showQr, setShowQr] = useState(false); const copyToClipBoard = (e: any) => { @@ -40,61 +40,29 @@ export const ProfileCard: FC = (props) => { <>
+ profile image +
+

{loggedInVia === LOGGED_IN.LENS ? `${handle}` : "My Smart Account"}

+ {transactionLoading ?
:

{`${trimAddress(address)}`}

} + +
+ copy address profile image { + setShowQr(!showQr); + }} /> + + external link +
-

- {loggedInVia === LOGGED_IN.LENS - ? `@${profile?.handle}` - : "My Smart Account"} -

- {transactionLoading ? ( -
- ) : ( -

{`${trimAddress(address)}`}

- )} - -
- copy address - show qr code { - setShowQr(!showQr); - }} - /> - - external link - -
- -

Powered by:

- safe logo - + +

Powered by:

+ safe logo + {/* {showActivity ? (
From 6a46fa5422664090fb11624e29e98d334de84796 Mon Sep 17 00:00:00 2001 From: Punith B M Date: Sat, 7 Oct 2023 19:12:12 +0530 Subject: [PATCH 5/5] fix: lens account title --- ui_components/loadchest/ProfileCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui_components/loadchest/ProfileCard.tsx b/ui_components/loadchest/ProfileCard.tsx index 5c556d2..f3acd8e 100644 --- a/ui_components/loadchest/ProfileCard.tsx +++ b/ui_components/loadchest/ProfileCard.tsx @@ -23,7 +23,7 @@ export const ProfileCard: FC = (props) => { const { state: { address, loggedInVia }, } = useContext(GlobalContext); - let handle = "My Smart Account"; + let handle = "Lens Smart Account"; try { const { data: profile } = useActiveProfile(); handle = `@` + profile?.handle;