diff --git a/app/analytics/page.tsx b/app/analytics/page.tsx index 26b92589..d0971ec8 100644 --- a/app/analytics/page.tsx +++ b/app/analytics/page.tsx @@ -17,12 +17,12 @@ export default function Page() { const { address } = useAccount(); const [loading, setLoading] = useState(true); - const [quests, setQuests] = useState ({} as QuestList); + const [quests, setQuests] = useState({} as QuestList); const fetchQuests = useCallback(async () => { try { setLoading(true); - const res = await getQuests() || {}; + const res = (await getQuests()) || {}; setQuests(res); setLoading(false); } catch (error) { @@ -39,34 +39,42 @@ export default function Page() {
router.back()} />
- Quest Analytics + + Quest Analytics +
{loading ? ( ) : ( - (Object.keys(quests) as (keyof typeof quests)[]).map((categoryName: keyof typeof quests) => { - const categoryValue = quests[categoryName]; - if (Array.isArray(categoryValue)) { - return categoryValue.map((quest: QuestDocument) => { - return ( - router.push(`/analytics/${quest.id}`)} - imgSrc={quest.img_card} - issuer={{ - name: quest.issuer, - logoFavicon: quest.logo, - }} - reward={quest.rewards_title} - id={quest.id} - expired={false} - /> - ); - }); + (Object.keys(quests) as (keyof typeof quests)[]).map( + (categoryName: keyof typeof quests) => { + const categoryValue = quests[categoryName]; + if (Array.isArray(categoryValue)) { + return categoryValue.map((quest: QuestDocument) => { + return ( + router.push(`/analytics/${quest.id}`)} + imgSrc={quest.img_card} + issuer={{ + name: quest.issuer, + logoFavicon: quest.logo, + }} + reward={quest.rewards_title} + id={quest.id} + expired={false} + /> + ); + }); + } + return null; } - return null; - }) + ) )}
diff --git a/app/provider.tsx b/app/provider.tsx index 12aa217a..e601d4ef 100644 --- a/app/provider.tsx +++ b/app/provider.tsx @@ -1,9 +1,6 @@ "use client"; import React from "react"; -import { InjectedConnector } from "starknetkit/injected"; -import { WebWalletConnector } from "starknetkit/webwallet"; -import { ArgentMobileConnector } from "starknetkit/argentMobile"; import { Chain, mainnet, sepolia } from "@starknet-react/chains"; import { Connector, @@ -11,10 +8,9 @@ import { jsonRpcProvider, } from "@starknet-react/core"; import { StarknetIdJsProvider } from "@context/StarknetIdJsProvider"; -import { ThemeProvider, createTheme } from "@mui/material"; +import { ThemeProvider } from "@mui/material"; import { QuestsContextProvider } from "@context/QuestsProvider"; import { getCurrentNetwork } from "@utils/network"; -import { constants } from "starknet"; import { PostHogProvider } from "posthog-js/react"; import posthog from "posthog-js"; import { NotificationProvider } from "@context/NotificationProvider"; diff --git a/context/QuestsProvider.tsx b/context/QuestsProvider.tsx index 6dcfb124..e9799cad 100644 --- a/context/QuestsProvider.tsx +++ b/context/QuestsProvider.tsx @@ -138,7 +138,6 @@ export const QuestsContextProvider = ({ !quest.expired ) : undefined; - setFeaturedQuest( lastBoostedQuest || notExpired[Math.floor(Math.random() * notExpired.length)] diff --git a/jest.config.js b/jest.config.js index 4b91002b..385c7f18 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,7 +2,7 @@ module.exports = { testEnvironment: "node", transform: { - "\\.[jt]sx?$": "ts-jest", + "^.+\\.(js|jsx|ts|tsx)$": ["babel-jest", { presets: ["next/babel"] }], }, setupFilesAfterEnv: ["./jest.setup.js"], moduleNameMapper: { @@ -16,9 +16,10 @@ module.exports = { coverageThreshold: { "./utils/": { branches: 75, - functions: 90, + functions: 80, lines: 90, - statements: -10, + statements: -23, }, }, -}; \ No newline at end of file + transformIgnorePatterns: ["node_modules/(?!(@starknet-react|@starknetkit)/)"], +}; diff --git a/package.json b/package.json index 1c695cb4..e0773eed 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,8 @@ "chart.js": "^4.3.0", "dayjs": "^1.11.11", "eslint-config-next": "^14.0.1", - "get-starknet-core": "^3.2.0", + "get-starknet": "^3.3.3", + "get-starknet-core": "^3.3.3", "jotai": "^2.5.0", "jwt-decode": "^4.0.0", "lottie-react": "^2.4.0", @@ -51,7 +52,7 @@ "recharts": "^2.12.2", "starknet": "^6.11.0", "starknetid.js": "^4.0.1", - "starknetkit": "^2.3.3", + "starknetkit": "^2.6.1", "three": "^0.155.0", "twitter-api-sdk": "^1.2.1" }, diff --git a/public/visuals/braavosMobile.webp b/public/visuals/braavosMobile.webp new file mode 100644 index 00000000..c9acf4d4 Binary files /dev/null and b/public/visuals/braavosMobile.webp differ diff --git a/tests/utils/braavosMobile.test.js b/tests/utils/braavosMobile.test.js new file mode 100644 index 00000000..f7511826 --- /dev/null +++ b/tests/utils/braavosMobile.test.js @@ -0,0 +1,86 @@ +import { mainnet, sepolia } from "@starknet-react/chains"; +import { + ConnectorNotConnectedError, + UserNotConnectedError, +} from "@starknet-react/core"; +import { BraavosMobileConnector, getBraavosMobile } from "@utils/braavosMobile"; + +describe("BraavosMobileConnector class", () => { + let connector; + + beforeEach(() => { + connector = new BraavosMobileConnector(); + }); + + describe("id getter", () => { + it("should return 'braavosMobile'", () => { + expect(connector.id).toBe("braavosMobile"); + }); + }); + + describe("icon getter", () => { + it("should return the same icon for light and dark modes", () => { + expect(connector.icon.light).toBeDefined(); + expect(connector.icon.dark).toBeDefined(); + expect(connector.icon.light).toBe(connector.icon.dark); + }); + }); + + describe("name getter", () => { + it("should return 'Braavos (mobile)'", () => { + expect(connector.name).toBe("Braavos (mobile)"); + }); + }); + + describe("available method", () => { + it("should return true", () => { + expect(connector.available()).toBe(true); + }); + }); + + describe("wallet getter", () => { + it("should throw a ConnectorNotConnectedError", () => { + expect(() => connector.wallet).toThrow(ConnectorNotConnectedError); + }); + }); + + describe("disconnect method", () => { + it("should throw a UserNotConnectedError", () => { + expect(() => connector.disconnect()).toThrow(UserNotConnectedError); + }); + }); + + describe("account method", () => { + it("should throw a ConnectorNotConnectedError", () => { + expect(() => connector.account()).toThrow(ConnectorNotConnectedError); + }); + }); + + describe("chainId method", () => { + it("should return sepolia.id when NEXT_PUBLIC_IS_TESTNET is 'true'", async () => { + process.env.NEXT_PUBLIC_IS_TESTNET = "true"; + const result = await connector.chainId(); + expect(result).toBe(sepolia.id); + }); + + it("should return mainnet.id when NEXT_PUBLIC_IS_TESTNET is not 'true'", async () => { + process.env.NEXT_PUBLIC_IS_TESTNET = "false"; + const result = await connector.chainId(); + expect(result).toBe(mainnet.id); + }); + }); + + describe("ready method", () => { + it("should return true as a Promise", async () => { + const result = await connector.ready(); + expect(result).toBe(true); + }); + }); +}); + +describe("getBraavosMobile function", () => { + it("should return an instance of BraavosMobileConnector", () => { + const instance = getBraavosMobile(); + expect(instance).toBeInstanceOf(BraavosMobileConnector); + }); +}); diff --git a/tests/utils/domainService.test.js b/tests/utils/domainService.test.js index e17b5b35..ccdb6f4e 100644 --- a/tests/utils/domainService.test.js +++ b/tests/utils/domainService.test.js @@ -1,23 +1,26 @@ -import { getDomainFromAddress } from '@utils/domainService'; +import { getDomainFromAddress } from "@utils/domainService"; const API_URL = process.env.NEXT_PUBLIC_STARKNET_ID_API_LINK; describe("getDomainFromAddress function", () => { -it("should return a valid domain for a valid address", async () => { - const validAddress = "0x061b6c0a78f9edf13cea17b50719f3344533fadd470b8cb29c2b4318014f52d3"; + it("should return a valid domain for a valid address", async () => { + const validAddress = + "0x061b6c0a78f9edf13cea17b50719f3344533fadd470b8cb29c2b4318014f52d3"; const expectedDomain = "fricoben.stark"; // Mocking the fetch function to return a predefined response const mockResponse = { domain: expectedDomain }; const fetchMock = jest.fn().mockResolvedValue({ - json: jest.fn().mockResolvedValue(mockResponse), + json: jest.fn().mockResolvedValue(mockResponse), }); - (fetch as jest.Mock) = fetchMock; + fetch = fetchMock; const domain = await getDomainFromAddress(validAddress); expect(domain).toBe(expectedDomain); - expect(fetchMock).toHaveBeenCalledWith(`${API_URL}/addr_to_domain?addr=${validAddress}`); + expect(fetchMock).toHaveBeenCalledWith( + `${API_URL}/addr_to_domain?addr=${validAddress}` + ); }); it("should return an empty string for an invalid address", async () => { @@ -27,13 +30,15 @@ it("should return a valid domain for a valid address", async () => { // Mocking the fetch function to simulate an error const mockResponse = { domain: expectedDomain }; const fetchMock = jest.fn().mockResolvedValue({ - json: jest.fn().mockResolvedValue(mockResponse), - }); - (fetch as jest.Mock) = fetchMock; + json: jest.fn().mockResolvedValue(mockResponse), + }); + fetch = fetchMock; const domain = await getDomainFromAddress(invalidAddress); expect(domain).toBe(""); - expect(fetchMock).toHaveBeenCalledWith(`${API_URL}/addr_to_domain?addr=${invalidAddress}`); + expect(fetchMock).toHaveBeenCalledWith( + `${API_URL}/addr_to_domain?addr=${invalidAddress}` + ); }); -}); \ No newline at end of file +}); diff --git a/tests/utils/walletConfig.test.js b/tests/utils/walletConfig.test.js index befc29ca..871109c9 100644 --- a/tests/utils/walletConfig.test.js +++ b/tests/utils/walletConfig.test.js @@ -3,7 +3,7 @@ import { getConnectorIcon, getConnectorName, getConnectorDiscovery, -} from "../../utils/walletConfig"; +} from "@utils/walletConfig"; class MockConnector { constructor(id, name, isAvailable) { this.id = id; @@ -65,10 +65,10 @@ describe("sortConnectors function", () => { describe("getConnectorIcon function", () => { it("should return the icon for a wallet when the ID matches", () => { expect(getConnectorIcon("argentX")).toBe( - "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiByeD0iOCIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTE4LjQwMTggNy41NTU1NkgxMy41OTgyQzEzLjQzNzcgNy41NTU1NiAxMy4zMDkxIDcuNjg3NDcgMTMuMzA1NiA3Ljg1MTQzQzEzLjIwODUgMTIuNDYwMyAxMC44NDg0IDE2LjgzNDcgNi43ODYwOCAxOS45MzMxQzYuNjU3MTEgMjAuMDMxNCA2LjYyNzczIDIwLjIxNjIgNi43MjIwMiAyMC4zNDkzTDkuNTMyNTMgMjQuMzE5NkM5LjYyODE1IDI0LjQ1NDggOS44MTQ0NCAyNC40ODUzIDkuOTQ1NTggMjQuMzg2QzEyLjQ4NTYgMjIuNDYxMyAxNC41Mjg3IDIwLjEzOTUgMTYgMTcuNTY2QzE3LjQ3MTMgMjAuMTM5NSAxOS41MTQ1IDIyLjQ2MTMgMjIuMDU0NSAyNC4zODZDMjIuMTg1NiAyNC40ODUzIDIyLjM3MTkgMjQuNDU0OCAyMi40Njc2IDI0LjMxOTZMMjUuMjc4MSAyMC4zNDkzQzI1LjM3MjMgMjAuMjE2MiAyNS4zNDI5IDIwLjAzMTQgMjUuMjE0IDE5LjkzMzFDMjEuMTUxNiAxNi44MzQ3IDE4Ljc5MTUgMTIuNDYwMyAxOC42OTQ2IDcuODUxNDNDMTguNjkxMSA3LjY4NzQ3IDE4LjU2MjMgNy41NTU1NiAxOC40MDE4IDcuNTU1NTZaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMjQuNzIzNiAxMC40OTJMMjQuMjIzMSA4LjkyNDM5QzI0LjEyMTMgOC42MDYxNCAyMy44NzM0IDguMzU4MjQgMjMuNTU3NyA4LjI2MDIzTDIyLjAwMzkgNy43NzU5NUMyMS43ODk1IDcuNzA5MDYgMjEuNzg3MyA3LjQwMTc3IDIyLjAwMTEgNy4zMzIwMUwyMy41NDY5IDYuODI0NjZDMjMuODYwOSA2LjcyMTQ2IDI0LjEwNiA2LjQ2OTUyIDI0LjIwMjcgNi4xNTAxMUwyNC42Nzk4IDQuNTc1MDJDMjQuNzQ1OCA0LjM1NzA5IDI1LjA0ODkgNC4zNTQ3NyAyNS4xMTgzIDQuNTcxNTZMMjUuNjE4OCA2LjEzOTE1QzI1LjcyMDYgNi40NTc0IDI1Ljk2ODYgNi43MDUzMSAyNi4yODQyIDYuODAzOUwyNy44MzggNy4yODc2MUMyOC4wNTI0IDcuMzU0NSAyOC4wNTQ3IDcuNjYxNzkgMjcuODQwOCA3LjczMjEzTDI2LjI5NSA4LjIzOTQ4QzI1Ljk4MTEgOC4zNDIxIDI1LjczNiA4LjU5NDA0IDI1LjYzOTMgOC45MTQwMkwyNS4xNjIxIDEwLjQ4ODVDMjUuMDk2MSAxMC43MDY1IDI0Ljc5MyAxMC43MDg4IDI0LjcyMzYgMTAuNDkyWiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==", + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiByeD0iOCIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTE4LjQwMTggNy41NTU1NkgxMy41OTgyQzEzLjQzNzcgNy41NTU1NiAxMy4zMDkxIDcuNjg3NDcgMTMuMzA1NiA3Ljg1MTQzQzEzLjIwODUgMTIuNDYwMyAxMC44NDg0IDE2LjgzNDcgNi43ODYwOCAxOS45MzMxQzYuNjU3MTEgMjAuMDMxNCA2LjYyNzczIDIwLjIxNjIgNi43MjIwMiAyMC4zNDkzTDkuNTMyNTMgMjQuMzE5NkM5LjYyODE1IDI0LjQ1NDggOS44MTQ0NCAyNC40ODUzIDkuOTQ1NTggMjQuMzg2QzEyLjQ4NTYgMjIuNDYxMyAxNC41Mjg3IDIwLjEzOTUgMTYgMTcuNTY2QzE3LjQ3MTMgMjAuMTM5NSAxOS41MTQ1IDIyLjQ2MTMgMjIuMDU0NSAyNC4zODZDMjIuMTg1NiAyNC40ODUzIDIyLjM3MTkgMjQuNDU0OCAyMi40Njc2IDI0LjMxOTZMMjUuMjc4MSAyMC4zNDkzQzI1LjM3MjMgMjAuMjE2MiAyNS4zNDI5IDIwLjAzMTQgMjUuMjE0IDE5LjkzMzFDMjEuMTUxNiAxNi44MzQ3IDE4Ljc5MTUgMTIuNDYwMyAxOC42OTQ2IDcuODUxNDNDMTguNjkxMSA3LjY4NzQ3IDE4LjU2MjMgNy41NTU1NiAxOC40MDE4IDcuNTU1NTZaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMjQuNzIzNiAxMC40OTJMMjQuMjIzMSA4LjkyNDM5QzI0LjEyMTMgOC42MDYxNCAyMy44NzM0IDguMzU4MjQgMjMuNTU3NyA4LjI2MDIzTDIyLjAwMzkgNy43NzU5NUMyMS43ODk1IDcuNzA5MDYgMjEuNzg3MyA3LjQwMTc3IDIyLjAwMTEgNy4zMzIwMUwyMy41NDY5IDYuODI0NjZDMjMuODYwOSA2LjcyMTQ2IDI0LjEwNiA2LjQ2OTUyIDI0LjIwMjcgNi4xNTAxMUwyNC42Nzk4IDQuNTc1MDJDMjQuNzQ1OCA0LjM1NzA5IDI1LjA0ODkgNC4zNTQ3NyAyNS4xMTgzIDQuNTcxNTZMMjUuNjE4OCA2LjEzOTE1QzI1LjcyMDYgNi40NTc0IDI1Ljk2ODYgNi43MDUzMSAyNi4yODQyIDYuODAzOUwyNy44MzggNy4yODc2MUMyOC4wNTI0IDcuMzU0NSAyOC4wNTQ3IDcuNjYxNzkgMjcuODQwOCA3LjczMjEzTDI2LjI5NSA4LjIzOTQ4QzI1Ljk4MTEgOC4zNDIxIDI1LjczNiA4LjU5NDA0IDI1LjYzOTMgOC45MTQwMkwyNS4xNjIxIDEwLjQ4ODVDMjUuMDk2MSAxMC43MDY1IDI0Ljc5MyAxMC43MDg4IDI0LjcyMzYgMTAuNDkyWiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==" ); expect(getConnectorIcon("braavos")).toBe( - "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8cGF0aAogICAgICAgIGQ9Ik02Mi43MDUgMTMuOTExNkM2Mi44MzU5IDE0LjEzMzMgNjIuNjYyMSAxNC40MDcgNjIuNDAzOSAxNC40MDdDNTcuMTgwNyAxNC40MDcgNTIuOTM0OCAxOC41NDI3IDUyLjgzNTEgMjMuNjgxN0M1MS4wNDY1IDIzLjM0NzcgNDkuMTkzMyAyMy4zMjI2IDQ3LjM2MjYgMjMuNjMxMUM0Ny4yMzYxIDE4LjUxNTYgNDMuMDAwOSAxNC40MDcgMzcuNzk0OCAxNC40MDdDMzcuNTM2NSAxNC40MDcgMzcuMzYyNSAxNC4xMzMxIDM3LjQ5MzUgMTMuOTExMkM0MC4wMjE3IDkuNjI4MDkgNDQuNzIwNCA2Ljc1IDUwLjA5OTEgNi43NUM1NS40NzgxIDYuNzUgNjAuMTc2OSA5LjYyODI2IDYyLjcwNSAxMy45MTE2WiIKICAgICAgICBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfMzcyXzQwMjU5KSIgLz4KICAgIDxwYXRoCiAgICAgICAgZD0iTTc4Ljc2MDYgNDUuODcxOEM4MC4yNzI1IDQ2LjMyOTcgODEuNzAyNSA0NS4wMDU1IDgxLjE3MTQgNDMuNTIyMkM3Ni40MTM3IDMwLjIzMzQgNjEuMzkxMSAyNC44MDM5IDUwLjAyNzcgMjQuODAzOUMzOC42NDQyIDI0LjgwMzkgMjMuMjg2OCAzMC40MDcgMTguODc1NCA0My41OTEyQzE4LjM4MjQgNDUuMDY0NSAxOS44MDgzIDQ2LjM0NDYgMjEuMjk3OCA0NS44ODgxTDQ4Ljg3MiAzNy40MzgxQzQ5LjUzMzEgMzcuMjM1NSA1MC4yMzk5IDM3LjIzNDQgNTAuOTAxNyAzNy40MzQ4TDc4Ljc2MDYgNDUuODcxOFoiCiAgICAgICAgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzM3Ml80MDI1OSkiIC8+CiAgICA8cGF0aAogICAgICAgIGQ9Ik0xOC44MTMyIDQ4LjE3MDdMNDguODkzNSAzOS4wNDcyQzQ5LjU1MDYgMzguODQ3OCA1MC4yNTI0IDM4Ljg0NzMgNTAuOTA5OCAzOS4wNDU2TDgxLjE3ODEgNDguMTc1MkM4My42OTEyIDQ4LjkzMzIgODUuNDExIDUxLjI0ODMgODUuNDExIDUzLjg3MzVWODEuMjIzM0M4NS4yOTQ0IDg3Ljg5OTEgNzkuMjk3NyA5My4yNSA3Mi42MjQ1IDkzLjI1SDYxLjU0MDZDNjAuNDQ0OSA5My4yNSA1OS41NTc3IDkyLjM2MzcgNTkuNTU3NyA5MS4yNjhWODEuNjc4OUM1OS41NTc3IDc3LjkwMzEgNjEuNzkyMSA3NC40ODU1IDY1LjI0OTggNzIuOTcyOUM2OS44ODQ5IDcwLjk0NTQgNzUuMzY4MSA2OC4yMDI4IDc2LjM5OTQgNjIuNjk5MkM3Ni43MzIzIDYwLjkyMjkgNzUuNTc0MSA1OS4yMDk0IDczLjgwMjQgNTguODU3M0M2OS4zMjI2IDU3Ljk2NjcgNjQuMzU2MiA1OC4zMTA3IDYwLjE1NjQgNjAuMTg5M0M1NS4zODg3IDYyLjMyMTkgNTQuMTQxNSA2NS44Njk0IDUzLjY3OTcgNzAuNjMzN0w1My4xMjAxIDc1Ljc2NjJDNTIuOTQ5MSA3Ny4zMzQ5IDUxLjQ3ODUgNzguNTM2NiA0OS45MDE0IDc4LjUzNjZDNDguMjY5OSA3OC41MzY2IDQ3LjA0NjUgNzcuMjk0IDQ2Ljg2OTYgNzUuNjcxMkw0Ni4zMjA0IDcwLjYzMzdDNDUuOTI0OSA2Ni41NTI5IDQ1LjIwNzkgNjIuNTg4NyA0MC45ODk1IDYwLjcwMThDMzYuMTc3NiA1OC41NDk0IDMxLjM0MTkgNTcuODM0NyAyNi4xOTc2IDU4Ljg1NzNDMjQuNDI2IDU5LjIwOTQgMjMuMjY3OCA2MC45MjI5IDIzLjYwMDcgNjIuNjk5MkMyNC42NDEgNjguMjUwNyAzMC4wODEyIDcwLjkzMDUgMzQuNzUwMyA3Mi45NzI5QzM4LjIwOCA3NC40ODU1IDQwLjQ0MjQgNzcuOTAzMSA0MC40NDI0IDgxLjY3ODlWOTEuMjY2M0M0MC40NDI0IDkyLjM2MiAzOS41NTU1IDkzLjI1IDM4LjQ1OTkgOTMuMjVIMjcuMzc1NkMyMC43MDI0IDkzLjI1IDE0LjcwNTcgODcuODk5MSAxNC41ODkxIDgxLjIyMzNWNTMuODY2M0MxNC41ODkxIDUxLjI0NDYgMTYuMzA0NSA0OC45MzE2IDE4LjgxMzIgNDguMTcwN1oiCiAgICAgICAgZmlsbD0idXJsKCNwYWludDJfbGluZWFyXzM3Ml80MDI1OSkiIC8+CiAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMzcyXzQwMjU5IiB4MT0iNDkuMzA1NyIgeTE9IjIuMDc5IiB4Mj0iODAuMzYyNyIgeTI9IjkzLjY1OTciCiAgICAgICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0Y1RDQ1RSIgLz4KICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkY5NjAwIiAvPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDFfbGluZWFyXzM3Ml80MDI1OSIgeDE9IjQ5LjMwNTciIHkxPSIyLjA3OSIgeDI9IjgwLjM2MjciIHkyPSI5My42NTk3IgogICAgICAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGNUQ0NUUiIC8+CiAgICAgICAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0ZGOTYwMCIgLz4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQyX2xpbmVhcl8zNzJfNDAyNTkiIHgxPSI0OS4zMDU3IiB5MT0iMi4wNzkiIHgyPSI4MC4zNjI3IiB5Mj0iOTMuNjU5NyIKICAgICAgICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRjVENDVFIiAvPgogICAgICAgICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRjk2MDAiIC8+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KPC9zdmc+", + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8cGF0aAogICAgICAgIGQ9Ik02Mi43MDUgMTMuOTExNkM2Mi44MzU5IDE0LjEzMzMgNjIuNjYyMSAxNC40MDcgNjIuNDAzOSAxNC40MDdDNTcuMTgwNyAxNC40MDcgNTIuOTM0OCAxOC41NDI3IDUyLjgzNTEgMjMuNjgxN0M1MS4wNDY1IDIzLjM0NzcgNDkuMTkzMyAyMy4zMjI2IDQ3LjM2MjYgMjMuNjMxMUM0Ny4yMzYxIDE4LjUxNTYgNDMuMDAwOSAxNC40MDcgMzcuNzk0OCAxNC40MDdDMzcuNTM2NSAxNC40MDcgMzcuMzYyNSAxNC4xMzMxIDM3LjQ5MzUgMTMuOTExMkM0MC4wMjE3IDkuNjI4MDkgNDQuNzIwNCA2Ljc1IDUwLjA5OTEgNi43NUM1NS40NzgxIDYuNzUgNjAuMTc2OSA5LjYyODI2IDYyLjcwNSAxMy45MTE2WiIKICAgICAgICBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfMzcyXzQwMjU5KSIgLz4KICAgIDxwYXRoCiAgICAgICAgZD0iTTc4Ljc2MDYgNDUuODcxOEM4MC4yNzI1IDQ2LjMyOTcgODEuNzAyNSA0NS4wMDU1IDgxLjE3MTQgNDMuNTIyMkM3Ni40MTM3IDMwLjIzMzQgNjEuMzkxMSAyNC44MDM5IDUwLjAyNzcgMjQuODAzOUMzOC42NDQyIDI0LjgwMzkgMjMuMjg2OCAzMC40MDcgMTguODc1NCA0My41OTEyQzE4LjM4MjQgNDUuMDY0NSAxOS44MDgzIDQ2LjM0NDYgMjEuMjk3OCA0NS44ODgxTDQ4Ljg3MiAzNy40MzgxQzQ5LjUzMzEgMzcuMjM1NSA1MC4yMzk5IDM3LjIzNDQgNTAuOTAxNyAzNy40MzQ4TDc4Ljc2MDYgNDUuODcxOFoiCiAgICAgICAgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzM3Ml80MDI1OSkiIC8+CiAgICA8cGF0aAogICAgICAgIGQ9Ik0xOC44MTMyIDQ4LjE3MDdMNDguODkzNSAzOS4wNDcyQzQ5LjU1MDYgMzguODQ3OCA1MC4yNTI0IDM4Ljg0NzMgNTAuOTA5OCAzOS4wNDU2TDgxLjE3ODEgNDguMTc1MkM4My42OTEyIDQ4LjkzMzIgODUuNDExIDUxLjI0ODMgODUuNDExIDUzLjg3MzVWODEuMjIzM0M4NS4yOTQ0IDg3Ljg5OTEgNzkuMjk3NyA5My4yNSA3Mi42MjQ1IDkzLjI1SDYxLjU0MDZDNjAuNDQ0OSA5My4yNSA1OS41NTc3IDkyLjM2MzcgNTkuNTU3NyA5MS4yNjhWODEuNjc4OUM1OS41NTc3IDc3LjkwMzEgNjEuNzkyMSA3NC40ODU1IDY1LjI0OTggNzIuOTcyOUM2OS44ODQ5IDcwLjk0NTQgNzUuMzY4MSA2OC4yMDI4IDc2LjM5OTQgNjIuNjk5MkM3Ni43MzIzIDYwLjkyMjkgNzUuNTc0MSA1OS4yMDk0IDczLjgwMjQgNTguODU3M0M2OS4zMjI2IDU3Ljk2NjcgNjQuMzU2MiA1OC4zMTA3IDYwLjE1NjQgNjAuMTg5M0M1NS4zODg3IDYyLjMyMTkgNTQuMTQxNSA2NS44Njk0IDUzLjY3OTcgNzAuNjMzN0w1My4xMjAxIDc1Ljc2NjJDNTIuOTQ5MSA3Ny4zMzQ5IDUxLjQ3ODUgNzguNTM2NiA0OS45MDE0IDc4LjUzNjZDNDguMjY5OSA3OC41MzY2IDQ3LjA0NjUgNzcuMjk0IDQ2Ljg2OTYgNzUuNjcxMkw0Ni4zMjA0IDcwLjYzMzdDNDUuOTI0OSA2Ni41NTI5IDQ1LjIwNzkgNjIuNTg4NyA0MC45ODk1IDYwLjcwMThDMzYuMTc3NiA1OC41NDk0IDMxLjM0MTkgNTcuODM0NyAyNi4xOTc2IDU4Ljg1NzNDMjQuNDI2IDU5LjIwOTQgMjMuMjY3OCA2MC45MjI5IDIzLjYwMDcgNjIuNjk5MkMyNC42NDEgNjguMjUwNyAzMC4wODEyIDcwLjkzMDUgMzQuNzUwMyA3Mi45NzI5QzM4LjIwOCA3NC40ODU1IDQwLjQ0MjQgNzcuOTAzMSA0MC40NDI0IDgxLjY3ODlWOTEuMjY2M0M0MC40NDI0IDkyLjM2MiAzOS41NTU1IDkzLjI1IDM4LjQ1OTkgOTMuMjVIMjcuMzc1NkMyMC43MDI0IDkzLjI1IDE0LjcwNTcgODcuODk5MSAxNC41ODkxIDgxLjIyMzNWNTMuODY2M0MxNC41ODkxIDUxLjI0NDYgMTYuMzA0NSA0OC45MzE2IDE4LjgxMzIgNDguMTcwN1oiCiAgICAgICAgZmlsbD0idXJsKCNwYWludDJfbGluZWFyXzM3Ml80MDI1OSkiIC8+CiAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMzcyXzQwMjU5IiB4MT0iNDkuMzA1NyIgeTE9IjIuMDc5IiB4Mj0iODAuMzYyNyIgeTI9IjkzLjY1OTciCiAgICAgICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0Y1RDQ1RSIgLz4KICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkY5NjAwIiAvPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDFfbGluZWFyXzM3Ml80MDI1OSIgeDE9IjQ5LjMwNTciIHkxPSIyLjA3OSIgeDI9IjgwLjM2MjciIHkyPSI5My42NTk3IgogICAgICAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGNUQ0NUUiIC8+CiAgICAgICAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0ZGOTYwMCIgLz4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQyX2xpbmVhcl8zNzJfNDAyNTkiIHgxPSI0OS4zMDU3IiB5MT0iMi4wNzkiIHgyPSI4MC4zNjI3IiB5Mj0iOTMuNjU5NyIKICAgICAgICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRjVENDVFIiAvPgogICAgICAgICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRjk2MDAiIC8+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KPC9zdmc+" ); }); @@ -123,26 +123,26 @@ describe("getConnectorDiscovery function", () => { it("should return the wallet's website URL when no downloads are available", () => { expect(getConnectorDiscovery("argentWebWallet")).toBe( - "https://www.argent.xyz/argent-x/", + "https://www.argent.xyz/argent-x/" ); }); it("should return the correct download link for the user's browser if available", () => { expect(getConnectorDiscovery("braavos")).toBe( - "https://chrome.google.com/webstore/detail/braavos-wallet/jnlgamecbpmbajjfhmmmlhejkemejdma", + "https://chrome.google.com/webstore/detail/braavos-wallet/jnlgamecbpmbajjfhmmmlhejkemejdma" ); }); it("should return the ecosystem website if no wallet data is found", () => { expect(getConnectorDiscovery("wallet")).toBe( - "https://www.starknet-ecosystem.com", + "https://www.starknet-ecosystem.com" ); }); it("should return the wallet's website when navigator is undefined", () => { Object.defineProperty(global, "navigator", { value: undefined }); expect(getConnectorDiscovery("argentX")).toBe( - "https://www.argent.xyz/argent-x/", + "https://www.argent.xyz/argent-x/" ); }); }); diff --git a/utils/braavosMobile.ts b/utils/braavosMobile.ts new file mode 100644 index 00000000..f9031c6d --- /dev/null +++ b/utils/braavosMobile.ts @@ -0,0 +1,64 @@ +import { mainnet, sepolia } from "@starknet-react/chains"; +import { + Connector, + ConnectorNotConnectedError, + UserNotConnectedError, +} from "@starknet-react/core"; +import { ConnectorData } from "starknetkit"; + +export const braavosMobileIcon = + "data:image/png;base64,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"; + +// @ts-ignore +export class BraavosMobileConnector extends Connector { + get id(): string { + return "braavosMobile"; + } + + get icon(): { dark: string; light: string } { + return { + dark: braavosMobileIcon, + light: braavosMobileIcon, + }; + } + + get name(): string { + return "Braavos (mobile)"; + } + + available(): boolean { + return true; + } + + connect(): Promise { + const link = `https://link.braavos.app/dapp/${window.location.host}`; + window.open(link, "_blank"); + return null as unknown as Promise; + } + + get wallet(): never { + throw new ConnectorNotConnectedError(); + } + + disconnect(): never { + throw new UserNotConnectedError(); + } + + account(): never { + throw new ConnectorNotConnectedError(); + } + + chainId(): Promise { + return process.env.NEXT_PUBLIC_IS_TESTNET === "true" + ? Promise.resolve(sepolia.id) + : Promise.resolve(mainnet.id); + } + + ready(): Promise { + return Promise.resolve(true); + } +} + +export function getBraavosMobile(): BraavosMobileConnector { + return new BraavosMobileConnector(); +} diff --git a/utils/walletConfig.ts b/utils/walletConfig.ts index 857dd4a0..220cb7d2 100644 --- a/utils/walletConfig.ts +++ b/utils/walletConfig.ts @@ -1,10 +1,11 @@ import { constants } from "starknet"; import { InjectedConnector } from "starknetkit/injected"; import { WebWalletConnector } from "starknetkit/webwallet"; -import { Connector, StarknetWindowObject } from "starknetkit"; +import { Connector } from "starknetkit"; import { ArgentMobileConnector } from "starknetkit/argentMobile"; import { getCurrentNetwork } from "./network"; import { getBrowser } from "./browserService"; +import { braavosMobileIcon, getBraavosMobile } from "./braavosMobile"; export type WalletStore = "chrome" | "firefox" | "edge" | "safari"; type WalletDownload = Partial>; @@ -89,6 +90,18 @@ export const wallets: Wallet[] = [ }, website: "https://www.keplr.app/", }, + { + id: "braavosMobile", + name: "Braavos Mobile", + icon: braavosMobileIcon, + downloads: { + chrome: `https://link.braavos.app/dapp/starknet.quest`, + firefox: `https://link.braavos.app/dapp/starknet.quest`, + edge: `https://link.braavos.app/dapp/starknet.quest`, + safari: `https://link.braavos.app/dapp/starknet.quest`, + }, + website: `https://link.braavos.app/dapp/starknet.quest`, + }, ]; // Check if the Bitget wallet is available on the window object @@ -109,7 +122,6 @@ export const getConnectors = () => { }, }), new InjectedConnector({ options: { id: "okxwallet", name: "Okx Wallet" } }), - new WebWalletConnector({ url: getCurrentNetwork() === "TESTNET" @@ -126,7 +138,11 @@ export const getConnectors = () => { }), new InjectedConnector({ options: { id: "keplr", name: "Keplr" } }), - ]; + + typeof window === "undefined" || window.innerWidth < 768 + ? getBraavosMobile() + : [], + ].flat(); return connectors; }; @@ -140,6 +156,7 @@ export const sortConnectors = (connectors: Connector[]): Connector[] => { const notAvailable: Connector[] = []; connectors.forEach((connector) => { + console.log(connector); connector.available() ? available.push(connector) : notAvailable.push(connector);