diff --git a/apps/demo-identity-app/index.html b/apps/demo-identity-app/index.html index 23aa79b..b8f982d 100644 --- a/apps/demo-identity-app/index.html +++ b/apps/demo-identity-app/index.html @@ -10,4 +10,4 @@
- + \ No newline at end of file diff --git a/apps/demo-identity-app/package.json b/apps/demo-identity-app/package.json index 66cc7a7..8ecaf41 100644 --- a/apps/demo-identity-app/package.json +++ b/apps/demo-identity-app/package.json @@ -51,5 +51,8 @@ "sass": "^1.85.1", "typescript": "^5.8.2", "vite": "6.3.5" + }, + "peerDependencies": { + "@farcaster/miniapp-sdk": "^0.1.8" } } diff --git a/apps/demo-identity-app/src/App.tsx b/apps/demo-identity-app/src/App.tsx index 8d30e72..f6408e0 100644 --- a/apps/demo-identity-app/src/App.tsx +++ b/apps/demo-identity-app/src/App.tsx @@ -72,6 +72,7 @@ const App: React.FC = () => { setIsVerified(isWhitelisted ?? false) } catch (error) { console.error("Error checking whitelist:", error) + setIsWhitelisted(false) } finally { setLoadingWhitelist(false) } @@ -87,10 +88,6 @@ const App: React.FC = () => { } }, [address, identitySDK, isWhitelisted, connectedAccount]) - const handleVerificationSuccess = () => { - setIsVerified(true) - } - return ( { !isWhitelisted && !error ? ( - + You need to verify your identity via GoodDollar to continue. diff --git a/apps/demo-identity-app/src/components/ClaimButton.tsx b/apps/demo-identity-app/src/components/ClaimButton.tsx index 89d7483..ed6cd32 100644 --- a/apps/demo-identity-app/src/components/ClaimButton.tsx +++ b/apps/demo-identity-app/src/components/ClaimButton.tsx @@ -72,25 +72,21 @@ export const ClaimButton: React.FC = () => { setError("ClaimSDK is not initialized.") return } - console.log("handleClaim called") setIsClaiming(true) setError(null) setTxHash(null) try { - const callBackExample = async () => { - console.log("waiting for claim for 2 seconds...") - await new Promise((resolve) => setTimeout(resolve, 2000)) // wait 2 seconds - console.log("tx start") + const txConfirm = async () => { + await new Promise((resolve) => setTimeout(resolve, 2000)) } - const tx = await sdk.claim(callBackExample) + const tx = await sdk.claim(txConfirm) if (!tx) return setTxHash(tx.transactionHash) } catch (err: any) { - console.error("Claim failed:", err) setError(err.message || "An unexpected error occurred.") } finally { setIsClaiming(false) diff --git a/apps/demo-identity-app/src/components/VerifyButton.tsx b/apps/demo-identity-app/src/components/VerifyButton.tsx index 9a556de..c9a6d9b 100644 --- a/apps/demo-identity-app/src/components/VerifyButton.tsx +++ b/apps/demo-identity-app/src/components/VerifyButton.tsx @@ -3,6 +3,9 @@ import { Button } from "tamagui" import { useIdentitySDK } from "@goodsdks/react-hooks" import { useAccount } from "wagmi" +import { isInFarcasterMiniApp } from "@goodsdks/citizen-sdk" +import { FARCASTER_CONFIG } from "../App" + interface VerifyButtonProps { onVerificationSuccess: () => void } @@ -17,16 +20,16 @@ export const VerifyButton: React.FC = ({ if (!identitySDK || !address) return try { - const fvLink = await identitySDK.generateFVLink( - false, - window.location.href, - 42220, - ) + let callbackUrl = window.location.href + + const isFarcaster = await isInFarcasterMiniApp() + if (isFarcaster) { + callbackUrl = identitySDK.generateFarcasterCallback(FARCASTER_CONFIG) + } - window.location.href = fvLink + await identitySDK.navigateToFaceVerification(callbackUrl, 42220) } catch (error) { console.error("Verification failed:", error) - // Handle error (e.g., show toast) } } diff --git a/apps/demo-identity-app/src/config.tsx b/apps/demo-identity-app/src/config.tsx index 213c098..55163ed 100644 --- a/apps/demo-identity-app/src/config.tsx +++ b/apps/demo-identity-app/src/config.tsx @@ -7,12 +7,11 @@ import React, { ReactNode } from "react" const queryClient = new QueryClient() -const projectId = "71dd03d057d89d0af68a4c627ec59694" - +const projectId = "71dd03d057d89d0af68a4c627ec59694" const metadata = { name: "AppKit", description: "AppKit Example", - url: "https://example.com", // origin must match your domain & subdomain + url: "http://localhost:3000", icons: ["https://avatars.githubusercontent.com/u/179229932"], } @@ -43,6 +42,11 @@ createAppKit({ "--w3m-color-mix-strength": 40, "--w3m-accent": "#00BB7F", }, + allowUnsupportedChain: false, + enableWalletConnect: true, + enableInjected: true, + enableEIP6963: true, + enableCoinbase: true, }) type ComponentProps = { diff --git a/apps/demo-identity-app/src/globals.d.ts b/apps/demo-identity-app/src/globals.d.ts index bb3ab73..12760d0 100644 --- a/apps/demo-identity-app/src/globals.d.ts +++ b/apps/demo-identity-app/src/globals.d.ts @@ -1,3 +1,5 @@ +import React from "react" + declare namespace JSX { interface IntrinsicElements { "claim-button": React.DetailedHTMLProps< diff --git a/apps/demo-identity-app/vite.config.mts b/apps/demo-identity-app/vite.config.mts index 2252121..507daac 100644 --- a/apps/demo-identity-app/vite.config.mts +++ b/apps/demo-identity-app/vite.config.mts @@ -31,4 +31,4 @@ export default defineConfig({ "process.browser": true, "process.env": process.env, }, -}); +}); \ No newline at end of file diff --git a/apps/demo-webcomponents/vite.config.mts b/apps/demo-webcomponents/vite.config.mts index 3227f7f..2e738f9 100644 --- a/apps/demo-webcomponents/vite.config.mts +++ b/apps/demo-webcomponents/vite.config.mts @@ -25,4 +25,4 @@ export default defineConfig({ "process.browser": true, "process.env": process.env, }, -}) +}) \ No newline at end of file diff --git a/packages/citizen-sdk/README.md b/packages/citizen-sdk/README.md index a16e151..fb4f09b 100644 --- a/packages/citizen-sdk/README.md +++ b/packages/citizen-sdk/README.md @@ -103,6 +103,32 @@ For Wagmi-based React projects, use the hooks exposed from `@goodsdks/react-hook Explore the generated TypeScript definitions in `dist/` for the complete surface, including helper enums (`contractEnv`, `SupportedChains`, etc.). +## Farcaster MiniApp Support + +The SDK includes support for Farcaster miniapps, which enables proper navigation and callback handling when running inside a Farcaster miniapp environment. + +### Configuration + +**Important**: The `FarcasterAppConfigs` in `constants.ts` are placeholder values. If you're integrating the SDK into a Farcaster miniapp, you must provide your Farcaster app ID and slug when initializing the SDK. + +1. Go to the [Farcaster Developer Portal](https://warpcast.com/~/developers) +2. Register your Mini App and obtain your `appId` and `appSlug` +3. Pass these values to `IdentitySDK.init`: + +```ts +const identitySDK = await IdentitySDK.init({ + publicClient, + walletClient, + env: "production", + farcasterConfig: { + appId: "YOUR_APP_ID", + appSlug: "YOUR_APP_SLUG" + } +}) +``` + +The SDK will automatically detect if it's running in a Farcaster miniapp and use Universal Links for callbacks, which ensures proper navigation back to your miniapp after face verification. + ## References - [Demo Identity App](https://demo-identity-app.vercel.app/) diff --git a/packages/citizen-sdk/package.json b/packages/citizen-sdk/package.json index cfe80fd..9c024ae 100644 --- a/packages/citizen-sdk/package.json +++ b/packages/citizen-sdk/package.json @@ -25,12 +25,14 @@ "src" ], "devDependencies": { + "@farcaster/miniapp-sdk": "^0.1.8", "@repo/typescript-config": "workspace:*", "typescript": "latest", "viem": "latest", "wagmi": "latest" }, "peerDependencies": { + "@farcaster/miniapp-sdk": "^0.1.8", "viem": "*", "wagmi": "*" }, diff --git a/packages/citizen-sdk/src/constants.ts b/packages/citizen-sdk/src/constants.ts index cfc8897..ed4e671 100644 --- a/packages/citizen-sdk/src/constants.ts +++ b/packages/citizen-sdk/src/constants.ts @@ -27,6 +27,7 @@ export const Envs: Record> = { }, } + export interface ContractAddresses { identityContract: `0x${string}` ubiContract: `0x${string}` diff --git a/packages/citizen-sdk/src/index.ts b/packages/citizen-sdk/src/index.ts index 0fd1613..28b11a0 100644 --- a/packages/citizen-sdk/src/index.ts +++ b/packages/citizen-sdk/src/index.ts @@ -1,2 +1,4 @@ export * from "./sdks" export * from "./constants" +export * from "./utils/auth" + diff --git a/packages/citizen-sdk/src/sdks/index.ts b/packages/citizen-sdk/src/sdks/index.ts index fee273b..b4c09a5 100644 --- a/packages/citizen-sdk/src/sdks/index.ts +++ b/packages/citizen-sdk/src/sdks/index.ts @@ -1,4 +1,3 @@ export * from "./viem-identity-sdk" export * from "./viem-claim-sdk" export * from "./viem-custodial-claim-sdk" -export * from "./viem-custodial-identity-sdk" diff --git a/packages/citizen-sdk/src/sdks/viem-claim-sdk.ts b/packages/citizen-sdk/src/sdks/viem-claim-sdk.ts index 84a2500..4ae8520 100644 --- a/packages/citizen-sdk/src/sdks/viem-claim-sdk.ts +++ b/packages/citizen-sdk/src/sdks/viem-claim-sdk.ts @@ -7,21 +7,15 @@ import { type WalletClient, ContractFunctionExecutionError, TransactionReceipt, + zeroAddress, } from "viem" import { waitForTransactionReceipt } from "viem/actions" import { IdentitySDK } from "./viem-identity-sdk" -import { - contractEnv, - chainConfigs, - FALLBACK_CHAIN_PRIORITY, - SupportedChains, - faucetABI, - isSupportedChain, - ubiSchemeV2ABI, -} from "../constants" +import { contractEnv, chainConfigs, FALLBACK_CHAIN_PRIORITY, SupportedChains, faucetABI, isSupportedChain, ubiSchemeV2ABI } from "../constants" import type { ContractAddresses } from "../constants" +import { createVerificationCallbackUrl } from "../utils/auth" import { resolveChainAndContract } from "../utils/chains" import { triggerFaucet as triggerFaucetUtil } from "../utils/triggerFaucet" import { @@ -82,7 +76,7 @@ export class ClaimSDK { private readonly faucetAddress: Address private readonly account: Address private readonly env: contractEnv - public readonly rdu: string + public rdu: string constructor({ account, @@ -99,9 +93,12 @@ export class ClaimSDK { this.walletClient = walletClient this.identitySDK = identitySDK this.account = account ?? walletClient.account.address + this.env = env this.rdu = rdu - this.env = env + createVerificationCallbackUrl(rdu, { source: "gooddollar_claim_verification" }).then( + (resolvedUrl: string) => { this.rdu = resolvedUrl }, + ).catch(() => {}) const { chainId, contractEnvAddresses } = resolveChainAndContract( walletClient, @@ -142,6 +139,7 @@ export class ClaimSDK { this.faucetAddress = contractEnvAddresses.faucetContract as Address } + private getContractsForChain(chainId: SupportedChains): ContractAddresses { const contracts = this.chainContracts.get(chainId) @@ -451,15 +449,15 @@ export class ClaimSDK { /** * Redirects the user through the face-verification flow. - * @throws If face verification redirect fails. + * @throws If face verification redirect is only supported in browser environments. */ private async fvRedirect(): Promise { - const fvChainId = this.fvDefaultChain ?? this.chainId const fvLink = await this.identitySDK.generateFVLink( false, this.rdu, - fvChainId, + this.chainId ) + if (typeof window !== "undefined") { window.location.href = fvLink } else { diff --git a/packages/citizen-sdk/src/sdks/viem-identity-sdk.ts b/packages/citizen-sdk/src/sdks/viem-identity-sdk.ts index 7877c5f..ec13570 100644 --- a/packages/citizen-sdk/src/sdks/viem-identity-sdk.ts +++ b/packages/citizen-sdk/src/sdks/viem-identity-sdk.ts @@ -1,3 +1,4 @@ + import { type Account, Address, @@ -6,6 +7,7 @@ import { WalletClient, SimulateContractParameters, WalletActions, + LocalAccount, zeroAddress, } from "viem" @@ -23,6 +25,12 @@ import { } from "../constants" import { resolveChainAndContract } from "../utils/chains" +import { + navigateToUrl, + createVerificationCallbackUrl, + createFarcasterUniversalLink, + type FarcasterAppConfig, +} from "../utils/auth" import type { IdentityContract, @@ -99,6 +107,11 @@ export class IdentitySDK { ) } + /** + * Initializes the IdentitySDK with an account from the wallet client. + * @param props - SDK options without account (account is auto-detected) + * @returns A new IdentitySDK instance + */ static async init( props: Omit, ): Promise { @@ -246,7 +259,8 @@ export class IdentitySDK { } if (callbackUrl) { - params[popupMode ? "cbu" : "rdu"] = callbackUrl + const callbackUrlWithParams = await createVerificationCallbackUrl(callbackUrl); + params[popupMode ? "cbu" : "rdu"] = callbackUrlWithParams; } url.searchParams.append( @@ -262,6 +276,38 @@ export class IdentitySDK { } } + /** + * Navigates the user to Face Verification. + * In Farcaster Mini App context, uses `sdk.actions.openUrl` to open a new browser tab. + * In regular browsers, falls back to `window.location.href`. + * @param callbackUrl - The URL to return to after verification. + * @param chainId - The blockchain network ID. + * @param popupMode - Whether to use popup mode. + */ + async navigateToFaceVerification( + callbackUrl: string, + chainId?: number, + popupMode = false, + ): Promise { + const fvLink = await this.generateFVLink(popupMode, callbackUrl, chainId) + await navigateToUrl(fvLink, false) + } + + /** + * Generates a Farcaster Universal Link to be used as a callback URL. + * @param farcasterConfig - The Farcaster App config. + * @param callbackType - The callback type for Farcaster links (e.g., 'verify'). + * @returns The generated Farcaster universal link. + */ + generateFarcasterCallback( + farcasterConfig: FarcasterAppConfig, + callbackType: "verify" | "callback" | "claim" = "verify", + ): string { + return createFarcasterUniversalLink(farcasterConfig, callbackType, { + source: `gooddollar_${callbackType}_verification`, + }) + } + /** * Calculates the identity expiry timestamp. * @param lastAuthenticated - The timestamp of last authentication. @@ -283,4 +329,5 @@ export class IdentitySDK { expiryTimestamp, } } + } diff --git a/packages/citizen-sdk/src/utils/auth.ts b/packages/citizen-sdk/src/utils/auth.ts index 5843206..a2674c3 100644 --- a/packages/citizen-sdk/src/utils/auth.ts +++ b/packages/citizen-sdk/src/utils/auth.ts @@ -1,5 +1,156 @@ import { Account, createWalletClient, http } from "viem"; import { Envs, FV_IDENTIFIER_MSG2 } from "../constants"; +import { sdk } from "@farcaster/miniapp-sdk"; + +async function detectFarcasterContext(): Promise { + try { + const ctx = await sdk.context; + return !!(ctx.location && ctx.location.type != null); + } catch { + return false; + } +} + +export async function isInFarcasterMiniApp(): Promise { + if (typeof window === 'undefined') return false; + try { + return await sdk.isInMiniApp(); + } catch { + return detectFarcasterContext(); + } +} + +export async function canUseFarcasterNavigation(): Promise { + if (!await isInFarcasterMiniApp()) return false; + try { + const capabilities = await sdk.getCapabilities(); + return capabilities?.includes('actions.openUrl') ?? false; + } catch { + return false; + } +} + +export function isInFarcasterMiniAppSync(): boolean { + if (typeof window === "undefined") return false; + try { + return window.self !== window.top; + } catch { + return false; + } +} + +export async function navigateToUrl(url: string, fallbackToNewTab = true): Promise { + if (typeof window === 'undefined') { + throw new Error('Navigation not supported in this environment'); + } + + const isInFarcaster = await isInFarcasterMiniApp(); + + if (isInFarcaster) { + try { + await sdk.actions.openUrl(url); + return; + } catch { + window.open(url, '_blank'); + return; + } + } + + if (fallbackToNewTab) { + window.open(url, '_blank'); + } else { + window.location.href = url; + } +} + + + +export interface FarcasterAppConfig { + domain: string; + appId?: string; + appSlug?: string; +} + +export function createFarcasterUniversalLink( + config: FarcasterAppConfig, + subPath?: string, + queryParams?: Record +): string { + const hasUniversalLinkConfig = config.appId && config.appSlug; + + let baseUrl: string; + + if (hasUniversalLinkConfig) { + baseUrl = `https://farcaster.xyz/miniapps/${config.appId}/${config.appSlug}`; + if (subPath) { + const cleanSubPath = subPath.startsWith('/') ? subPath.slice(1) : subPath; + baseUrl += `/${cleanSubPath}`; + } + } else { + baseUrl = `https://farcaster.xyz/~/mini-apps/launch`; + queryParams = { domain: config.domain, ...queryParams }; + } + + if (queryParams && Object.keys(queryParams).length > 0) { + const urlObj = new URL(baseUrl); + Object.entries(queryParams).forEach(([key, value]) => { + urlObj.searchParams.set(key, value); + }); + return urlObj.toString(); + } + + return baseUrl; +} + +/** + * Appends query parameters to a callback URL for Face Verification. + * Does not modify the URL path — developers control their own routing. + * + * @param baseUrl - The callback URL provided by the developer. + * @param additionalParams - Optional query parameters to append. + * @returns The callback URL with appended parameters. + */ +export async function createVerificationCallbackUrl( + baseUrl: string, + additionalParams?: Record +): Promise { + const url = new URL(baseUrl); + if (!url.protocol.startsWith("http")) { + return baseUrl; + } + + if (additionalParams) { + Object.entries(additionalParams).forEach(([key, value]) => { + url.searchParams.set(key, value); + }); + } + + return url.toString(); +} + +/** + * Parses the `verified` query parameter from the current URL (or a provided URL/search string). + * Returns true if the user has been successfully face-verified. + * + * @param searchString - Optional URL search string to parse. Defaults to window.location.search. + * @returns Whether the verification was successful. + */ +export function parseVerificationResult(searchString?: string): boolean { + const search = searchString ?? (typeof window !== "undefined" ? window.location.search : ""); + const params = new URLSearchParams(search); + return params.get("verified") === "true"; +} + +export function createFarcasterCallbackUniversalLink( + config: FarcasterAppConfig, + callbackType: 'verify' | 'callback' | 'claim' = 'verify', + additionalParams?: Record +): string { + return createFarcasterUniversalLink(config, callbackType, { + source: "gooddollar_identity_verification", + ...additionalParams + }); +} async function signMessageWithViem( account: Account, diff --git a/packages/react-hooks/src/citizen-sdk/wagmi-claim-sdk.ts b/packages/react-hooks/src/citizen-sdk/wagmi-claim-sdk.ts index 4ffaa80..6547f68 100644 --- a/packages/react-hooks/src/citizen-sdk/wagmi-claim-sdk.ts +++ b/packages/react-hooks/src/citizen-sdk/wagmi-claim-sdk.ts @@ -1,7 +1,7 @@ import { useState, useEffect } from "react" import { usePublicClient, useWalletClient } from "wagmi" import { PublicClient } from "viem" -import { contractEnv, ClaimSDK } from "@goodsdks/citizen-sdk" +import { contractEnv, ClaimSDK, FarcasterAppConfig } from "@goodsdks/citizen-sdk" import { useIdentitySDK } from "./wagmi-identity-sdk" export const useClaimSDK = ( diff --git a/packages/ui-components/tsup.config.claim.ts b/packages/ui-components/tsup.config.claim.ts index 308f9d2..a68cf84 100644 --- a/packages/ui-components/tsup.config.claim.ts +++ b/packages/ui-components/tsup.config.claim.ts @@ -12,4 +12,5 @@ export default defineConfig({ minify: true, target: "ESNext", outDir: "dist", -}) + +}) \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index e83fe8c..48d11e3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -869,6 +869,13 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.25.0": + version: 7.28.6 + resolution: "@babel/runtime@npm:7.28.6" + checksum: 10c0/358cf2429992ac1c466df1a21c1601d595c46930a13c1d4662fde908d44ee78ec3c183aaff513ecb01ef8c55c3624afe0309eeeb34715672dbfadb7feedb2c0d + languageName: node + linkType: hard + "@babel/template@npm:^7.25.0, @babel/template@npm:^7.26.9": version: 7.26.9 resolution: "@babel/template@npm:7.26.9" @@ -1804,6 +1811,42 @@ __metadata: languageName: node linkType: hard +"@farcaster/miniapp-core@npm:0.3.9": + version: 0.3.9 + resolution: "@farcaster/miniapp-core@npm:0.3.9" + dependencies: + "@solana/web3.js": "npm:^1.98.2" + ox: "npm:^0.4.4" + zod: "npm:^3.25.0" + checksum: 10c0/2db3b3e7c69670d5f345105fd665ff82db58c3b30bf9960d5d434e44a483ce0edf806773a98d8c10fc0c23403476405901de6b9dfebeda1b2f9a9240f0421195 + languageName: node + linkType: hard + +"@farcaster/miniapp-sdk@npm:^0.1.8": + version: 0.1.10 + resolution: "@farcaster/miniapp-sdk@npm:0.1.10" + dependencies: + "@farcaster/miniapp-core": "npm:0.3.9" + "@farcaster/quick-auth": "npm:^0.0.6" + comlink: "npm:^4.4.2" + eventemitter3: "npm:^5.0.1" + ox: "npm:^0.4.4" + checksum: 10c0/cbe6c059345ab15d6d98f44e37e5be5aa7cc04f18ab8fdce1c85102664c549cc5e931bcc7ce3439c930407d2654959a314a469329f70c3bec61a45af0a164a75 + languageName: node + linkType: hard + +"@farcaster/quick-auth@npm:^0.0.6": + version: 0.0.6 + resolution: "@farcaster/quick-auth@npm:0.0.6" + dependencies: + jose: "npm:^5.2.3" + zod: "npm:^3.25.1" + peerDependencies: + typescript: 5.8.3 + checksum: 10c0/b2875c9db16419a74e2ea3f2e919c5c5156bdda4cdf386838625aa6ec7412879b02b3fdd20aa28fe32adbcbfff8cb4e4004e36f5da6b9f9c5269bcc511e9ef4c + languageName: node + linkType: hard + "@fastify/busboy@npm:^2.0.0": version: 2.1.1 resolution: "@fastify/busboy@npm:2.1.1" @@ -1879,6 +1922,7 @@ __metadata: version: 0.0.0-use.local resolution: "@goodsdks/citizen-sdk@workspace:packages/citizen-sdk" dependencies: + "@farcaster/miniapp-sdk": "npm:^0.1.8" "@repo/typescript-config": "workspace:*" lz-string: "npm:^1.5.0" tsup: "npm:^8.4.0" @@ -1886,6 +1930,7 @@ __metadata: viem: "npm:latest" wagmi: "npm:latest" peerDependencies: + "@farcaster/miniapp-sdk": ^0.1.8 viem: "*" wagmi: "*" languageName: unknown @@ -2628,6 +2673,15 @@ __metadata: languageName: node linkType: hard +"@noble/curves@npm:^1.4.2": + version: 1.9.7 + resolution: "@noble/curves@npm:1.9.7" + dependencies: + "@noble/hashes": "npm:1.8.0" + checksum: 10c0/150014751ebe8ca06a8654ca2525108452ea9ee0be23430332769f06808cddabfe84f248b6dbf836916bc869c27c2092957eec62c7506d68a1ed0a624017c2a3 + languageName: node + linkType: hard + "@noble/hashes@npm:1.2.0, @noble/hashes@npm:~1.2.0": version: 1.2.0 resolution: "@noble/hashes@npm:1.2.0" @@ -2670,6 +2724,13 @@ __metadata: languageName: node linkType: hard +"@noble/hashes@npm:1.8.0": + version: 1.8.0 + resolution: "@noble/hashes@npm:1.8.0" + checksum: 10c0/06a0b52c81a6fa7f04d67762e08b2c476a00285858150caeaaff4037356dd5e119f45b2a530f638b77a5eeca013168ec1b655db41bae3236cb2e9d511484fc77 + languageName: node + linkType: hard + "@noble/secp256k1@npm:1.7.1, @noble/secp256k1@npm:~1.7.0": version: 1.7.1 resolution: "@noble/secp256k1@npm:1.7.1" @@ -5173,6 +5234,75 @@ __metadata: languageName: node linkType: hard +"@solana/buffer-layout@npm:^4.0.1": + version: 4.0.1 + resolution: "@solana/buffer-layout@npm:4.0.1" + dependencies: + buffer: "npm:~6.0.3" + checksum: 10c0/6535f3908cf6dfc405b665795f0c2eaa0482a8c6b1811403945cf7b450e7eb7b40acce3e8af046f2fcc3eea1a15e61d48c418315d813bee4b720d56b00053305 + languageName: node + linkType: hard + +"@solana/codecs-core@npm:2.3.0": + version: 2.3.0 + resolution: "@solana/codecs-core@npm:2.3.0" + dependencies: + "@solana/errors": "npm:2.3.0" + peerDependencies: + typescript: ">=5.3.3" + checksum: 10c0/efef080b94fe572bcfeac9f1c0b222700203bd2b45c9590e77445b35335d0ed2582d1cc4e533003d2090c385c06eb93dfa05388f9766182aa60ce85eacfd8042 + languageName: node + linkType: hard + +"@solana/codecs-numbers@npm:^2.1.0": + version: 2.3.0 + resolution: "@solana/codecs-numbers@npm:2.3.0" + dependencies: + "@solana/codecs-core": "npm:2.3.0" + "@solana/errors": "npm:2.3.0" + peerDependencies: + typescript: ">=5.3.3" + checksum: 10c0/0780d60771e451cfe22ea614315fed2f37507aa62f83cddb900186f88d4d4532eea298d74796d1dbc8c34321a570b5d9ada25e8f4a5aeadd57aa4e688b4465f5 + languageName: node + linkType: hard + +"@solana/errors@npm:2.3.0": + version: 2.3.0 + resolution: "@solana/errors@npm:2.3.0" + dependencies: + chalk: "npm:^5.4.1" + commander: "npm:^14.0.0" + peerDependencies: + typescript: ">=5.3.3" + bin: + errors: bin/cli.mjs + checksum: 10c0/55bef8828b4a6bb5222d3dbfe27162684906ba90753126b9cfd1e8e39c6c29209c0f4f331cfb1d3d1cf43fd456022af92337b4234a145d8de292588197c12c71 + languageName: node + linkType: hard + +"@solana/web3.js@npm:^1.98.2": + version: 1.98.4 + resolution: "@solana/web3.js@npm:1.98.4" + dependencies: + "@babel/runtime": "npm:^7.25.0" + "@noble/curves": "npm:^1.4.2" + "@noble/hashes": "npm:^1.4.0" + "@solana/buffer-layout": "npm:^4.0.1" + "@solana/codecs-numbers": "npm:^2.1.0" + agentkeepalive: "npm:^4.5.0" + bn.js: "npm:^5.2.1" + borsh: "npm:^0.7.0" + bs58: "npm:^4.0.1" + buffer: "npm:6.0.3" + fast-stable-stringify: "npm:^1.0.0" + jayson: "npm:^4.1.1" + node-fetch: "npm:^2.7.0" + rpc-websockets: "npm:^9.0.2" + superstruct: "npm:^2.0.2" + checksum: 10c0/73bf7b6b5b65c7f264587182bbfd65327775b4f3e4831750de6356f58858e57d49213098eec671650940bb7a9bbaa1f352e0710c4075f126d903d72ddddcbdbc + languageName: node + linkType: hard + "@solidity-parser/parser@npm:^0.19.0": version: 0.19.0 resolution: "@solidity-parser/parser@npm:0.19.0" @@ -7170,6 +7300,15 @@ __metadata: languageName: node linkType: hard +"@types/connect@npm:^3.4.33": + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c + languageName: node + linkType: hard + "@types/cookie@npm:^0.6.0": version: 0.6.0 resolution: "@types/cookie@npm:0.6.0" @@ -7362,6 +7501,13 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^12.12.54": + version: 12.20.55 + resolution: "@types/node@npm:12.20.55" + checksum: 10c0/3b190bb0410047d489c49bbaab592d2e6630de6a50f00ba3d7d513d59401d279972a8f5a598b5bb8ddc1702f8a2f4ec57a65d93852f9c329639738e7053637d1 + languageName: node + linkType: hard + "@types/pbkdf2@npm:^3.0.0": version: 3.1.2 resolution: "@types/pbkdf2@npm:3.1.2" @@ -7460,6 +7606,31 @@ __metadata: languageName: node linkType: hard +"@types/uuid@npm:^8.3.4": + version: 8.3.4 + resolution: "@types/uuid@npm:8.3.4" + checksum: 10c0/b9ac98f82fcf35962317ef7dc44d9ac9e0f6fdb68121d384c88fe12ea318487d5585d3480fa003cf28be86a3bbe213ca688ba786601dce4a97724765eb5b1cf2 + languageName: node + linkType: hard + +"@types/ws@npm:^7.4.4": + version: 7.4.7 + resolution: "@types/ws@npm:7.4.7" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/f1f53febd8623a85cef2652949acd19d83967e350ea15a851593e3033501750a1e04f418552e487db90a3d48611a1cff3ffcf139b94190c10f2fd1e1dc95ff10 + languageName: node + linkType: hard + +"@types/ws@npm:^8.2.2": + version: 8.18.1 + resolution: "@types/ws@npm:8.18.1" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/61aff1129143fcc4312f083bc9e9e168aa3026b7dd6e70796276dcfb2c8211c4292603f9c4864fae702f2ed86e4abd4d38aa421831c2fd7f856c931a481afbab + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:8.26.0": version: 8.26.0 resolution: "@typescript-eslint/eslint-plugin@npm:8.26.0" @@ -8454,6 +8625,15 @@ __metadata: languageName: node linkType: hard +"agentkeepalive@npm:^4.5.0": + version: 4.6.0 + resolution: "agentkeepalive@npm:4.6.0" + dependencies: + humanize-ms: "npm:^1.2.1" + checksum: 10c0/235c182432f75046835b05f239708107138a40103deee23b6a08caee5136873709155753b394ec212e49e60e94a378189562cb01347765515cff61b692c69187 + languageName: node + linkType: hard + "aggregate-error@npm:^3.0.0": version: 3.1.0 resolution: "aggregate-error@npm:3.1.0" @@ -8929,6 +9109,17 @@ __metadata: languageName: node linkType: hard +"borsh@npm:^0.7.0": + version: 0.7.0 + resolution: "borsh@npm:0.7.0" + dependencies: + bn.js: "npm:^5.2.0" + bs58: "npm:^4.0.0" + text-encoding-utf-8: "npm:^1.0.2" + checksum: 10c0/513b3e51823d2bf5be77cec27742419d2b0427504825dd7ceb00dedb820f246a4762f04b83d5e3aa39c8e075b3cbaeb7ca3c90bd1cbeecccb4a510575be8c581 + languageName: node + linkType: hard + "bowser@npm:^2.11.0, bowser@npm:^2.9.0": version: 2.11.0 resolution: "bowser@npm:2.11.0" @@ -9038,7 +9229,7 @@ __metadata: languageName: node linkType: hard -"bs58@npm:^4.0.0": +"bs58@npm:^4.0.0, bs58@npm:^4.0.1": version: 4.0.1 resolution: "bs58@npm:4.0.1" dependencies: @@ -9083,7 +9274,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:6.0.3, buffer@npm:^6.0.3": +"buffer@npm:6.0.3, buffer@npm:^6.0.3, buffer@npm:~6.0.3": version: 6.0.3 resolution: "buffer@npm:6.0.3" dependencies: @@ -9093,6 +9284,16 @@ __metadata: languageName: node linkType: hard +"bufferutil@npm:^4.0.1": + version: 4.1.0 + resolution: "bufferutil@npm:4.1.0" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.3.0" + checksum: 10c0/12d63bbc80a3b6525bc62a28387fca0a5aed09e41b74375c500e60721b6a1ab2960b82e48f1773eddea2b14e490f129214b8b57bd6e1a5078b6235857d658508 + languageName: node + linkType: hard + "bufferutil@npm:^4.0.8": version: 4.0.9 resolution: "bufferutil@npm:4.0.9" @@ -9304,6 +9505,13 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^5.4.1": + version: 5.6.2 + resolution: "chalk@npm:5.6.2" + checksum: 10c0/99a4b0f0e7991796b1e7e3f52dceb9137cae2a9dfc8fc0784a550dc4c558e15ab32ed70b14b21b52beb2679b4892b41a0aa44249bcb996f01e125d58477c6976 + languageName: node + linkType: hard + "charenc@npm:>= 0.0.1": version: 0.0.2 resolution: "charenc@npm:0.0.2" @@ -9522,6 +9730,13 @@ __metadata: languageName: node linkType: hard +"comlink@npm:^4.4.2": + version: 4.4.2 + resolution: "comlink@npm:4.4.2" + checksum: 10c0/38aa1f455cf08e94aaa8fc494fd203cc0ef02ece6c21404b7931ce17567e8a72deacddab98aa5650cfd78332ff24c34610586f6fb27fd19dc77e753ed1980deb + languageName: node + linkType: hard + "command-exists@npm:^1.2.8": version: 1.2.9 resolution: "command-exists@npm:1.2.9" @@ -9560,6 +9775,20 @@ __metadata: languageName: node linkType: hard +"commander@npm:^14.0.0": + version: 14.0.3 + resolution: "commander@npm:14.0.3" + checksum: 10c0/755652564bbf56ff2ff083313912b326450d3f8d8c85f4b71416539c9a05c3c67dbd206821ca72635bf6b160e2afdefcb458e86b317827d5cb333b69ce7f1a24 + languageName: node + linkType: hard + +"commander@npm:^2.20.3": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 + languageName: node + linkType: hard + "commander@npm:^4.0.0": version: 4.1.1 resolution: "commander@npm:4.1.1" @@ -10022,6 +10251,13 @@ __metadata: languageName: node linkType: hard +"delay@npm:^5.0.0": + version: 5.0.0 + resolution: "delay@npm:5.0.0" + checksum: 10c0/01cdc4cd0cd35fb622518a3df848e67e09763a38e7cdada2232b6fda9ddda72eddcf74f0e24211200fbe718434f2335f2a2633875a6c96037fefa6de42896ad7 + languageName: node + linkType: hard + "delayed-stream@npm:~1.0.0": version: 1.0.0 resolution: "delayed-stream@npm:1.0.0" @@ -10071,6 +10307,8 @@ __metadata: vite: "npm:6.3.5" wagmi: "npm:^1.4.13" zod: "npm:^3.24.2" + peerDependencies: + "@farcaster/miniapp-sdk": ^0.1.8 languageName: unknown linkType: soft @@ -10542,6 +10780,22 @@ __metadata: languageName: node linkType: hard +"es6-promise@npm:^4.0.3": + version: 4.2.8 + resolution: "es6-promise@npm:4.2.8" + checksum: 10c0/2373d9c5e9a93bdd9f9ed32ff5cb6dd3dd785368d1c21e9bbbfd07d16345b3774ae260f2bd24c8f836a6903f432b4151e7816a7fa8891ccb4e1a55a028ec42c3 + languageName: node + linkType: hard + +"es6-promisify@npm:^5.0.0": + version: 5.0.0 + resolution: "es6-promisify@npm:5.0.0" + dependencies: + es6-promise: "npm:^4.0.3" + checksum: 10c0/23284c6a733cbf7842ec98f41eac742c9f288a78753c4fe46652bae826446ced7615b9e8a5c5f121a08812b1cd478ea58630f3e1c3d70835bd5dcd69c7cd75c9 + languageName: node + linkType: hard + "esbuild-plugin-es5@npm:^2.1.1": version: 2.1.1 resolution: "esbuild-plugin-es5@npm:2.1.1" @@ -11348,6 +11602,13 @@ __metadata: languageName: node linkType: hard +"eyes@npm:^0.1.8": + version: 0.1.8 + resolution: "eyes@npm:0.1.8" + checksum: 10c0/4c79a9cbf45746d8c9f48cc957e35ad8ea336add1c7b8d5a0e002efc791a7a62b27b2188184ef1a1eea7bc3cd06b161791421e0e6c5fe78309705a162c53eea8 + languageName: node + linkType: hard + "fast-base64-decode@npm:^1.0.0": version: 1.0.0 resolution: "fast-base64-decode@npm:1.0.0" @@ -11423,6 +11684,13 @@ __metadata: languageName: node linkType: hard +"fast-stable-stringify@npm:^1.0.0": + version: 1.0.0 + resolution: "fast-stable-stringify@npm:1.0.0" + checksum: 10c0/1d773440c7a9615950577665074746c2e92edafceefa789616ecb6166229e0ccc6dae206ca9b9f7da0d274ba5779162aab2d07940a0f6e52a41a4e555392eb3b + languageName: node + linkType: hard + "fast-uri@npm:^3.0.1": version: 3.0.5 resolution: "fast-uri@npm:3.0.5" @@ -12447,6 +12715,15 @@ __metadata: languageName: node linkType: hard +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: "npm:^2.0.0" + checksum: 10c0/f34a2c20161d02303c2807badec2f3b49cbfbbb409abd4f95a07377ae01cfe6b59e3d15ac609cffcd8f2521f0eb37b7e1091acf65da99aa2a4f1ad63c21e7e7a + languageName: node + linkType: hard + "hyphenate-style-name@npm:^1.0.3": version: 1.1.0 resolution: "hyphenate-style-name@npm:1.1.0" @@ -12992,6 +13269,15 @@ __metadata: languageName: node linkType: hard +"isomorphic-ws@npm:^4.0.1": + version: 4.0.1 + resolution: "isomorphic-ws@npm:4.0.1" + peerDependencies: + ws: "*" + checksum: 10c0/7cb90dc2f0eb409825558982fb15d7c1d757a88595efbab879592f9d2b63820d6bbfb5571ab8abe36c715946e165a413a99f6aafd9f40ab1f514d73487bc9996 + languageName: node + linkType: hard + "isows@npm:1.0.6": version: 1.0.6 resolution: "isows@npm:1.0.6" @@ -13035,6 +13321,28 @@ __metadata: languageName: node linkType: hard +"jayson@npm:^4.1.1": + version: 4.3.0 + resolution: "jayson@npm:4.3.0" + dependencies: + "@types/connect": "npm:^3.4.33" + "@types/node": "npm:^12.12.54" + "@types/ws": "npm:^7.4.4" + commander: "npm:^2.20.3" + delay: "npm:^5.0.0" + es6-promisify: "npm:^5.0.0" + eyes: "npm:^0.1.8" + isomorphic-ws: "npm:^4.0.1" + json-stringify-safe: "npm:^5.0.1" + stream-json: "npm:^1.9.1" + uuid: "npm:^8.3.2" + ws: "npm:^7.5.10" + bin: + jayson: bin/jayson.js + checksum: 10c0/d3d1ee1bd9d8b57eb6c13da83965e6052b030b24ee9ee6b8763ea33e986d7f161428bda8a3f5e4b30e0194867fe48ef0652db521363ccc6227b89d7998f0dbda + languageName: node + linkType: hard + "jiti@npm:^1.21.6": version: 1.21.7 resolution: "jiti@npm:1.21.7" @@ -13044,6 +13352,13 @@ __metadata: languageName: node linkType: hard +"jose@npm:^5.2.3": + version: 5.10.0 + resolution: "jose@npm:5.10.0" + checksum: 10c0/e20d9fc58d7e402f2e5f04e824b8897d5579aae60e64cb88ebdea1395311c24537bf4892f7de413fab1acf11e922797fb1b42269bc8fc65089a3749265ccb7b0 + languageName: node + linkType: hard + "joycon@npm:^3.1.1": version: 3.1.1 resolution: "joycon@npm:3.1.1" @@ -13932,7 +14247,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:^2.1.3": +"ms@npm:^2.0.0, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 @@ -14391,6 +14706,26 @@ __metadata: languageName: node linkType: hard +"ox@npm:^0.4.4": + version: 0.4.4 + resolution: "ox@npm:0.4.4" + dependencies: + "@adraffy/ens-normalize": "npm:^1.10.1" + "@noble/curves": "npm:^1.6.0" + "@noble/hashes": "npm:^1.5.0" + "@scure/bip32": "npm:^1.5.0" + "@scure/bip39": "npm:^1.4.0" + abitype: "npm:^1.0.6" + eventemitter3: "npm:5.0.1" + peerDependencies: + typescript: ">=5.4.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/ce1539ec41c97f6d8386ea8f0cdd85d4af025d3b7a6762607aa1a6545f550ca637abba8c9be4b26f6bf2136f16ccd579454e6976ee06ddde7225ac8fcfd4254d + languageName: node + linkType: hard + "oxc-transform@npm:^0.47.1": version: 0.47.1 resolution: "oxc-transform@npm:0.47.1" @@ -15766,6 +16101,28 @@ __metadata: languageName: node linkType: hard +"rpc-websockets@npm:^9.0.2": + version: 9.3.3 + resolution: "rpc-websockets@npm:9.3.3" + dependencies: + "@swc/helpers": "npm:^0.5.11" + "@types/uuid": "npm:^8.3.4" + "@types/ws": "npm:^8.2.2" + buffer: "npm:^6.0.3" + bufferutil: "npm:^4.0.1" + eventemitter3: "npm:^5.0.1" + utf-8-validate: "npm:^5.0.2" + uuid: "npm:^8.3.2" + ws: "npm:^8.5.0" + dependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/7cd17dcf0e72608567e893dc41f196f329b427ece45507089fb743df4bc50136e03c8c379d3cf9e0cb7b6d8a89d443f26a4caee94105377d3cea905788685873 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -16398,6 +16755,22 @@ __metadata: languageName: node linkType: hard +"stream-chain@npm:^2.2.5": + version: 2.2.5 + resolution: "stream-chain@npm:2.2.5" + checksum: 10c0/c512f50190d7c92d688fa64e7af540c51b661f9c2b775fc72bca38ea9bca515c64c22c2197b1be463741daacbaaa2dde8a8ea24ebda46f08391224f15249121a + languageName: node + linkType: hard + +"stream-json@npm:^1.9.1": + version: 1.9.1 + resolution: "stream-json@npm:1.9.1" + dependencies: + stream-chain: "npm:^2.2.5" + checksum: 10c0/0521e5cb3fb6b0e2561d715975e891bd81fa77d0239c8d0b1756846392bc3c7cdd7f1ddb0fe7ed77e6fdef58daab9e665d3b39f7d677bd0859e65a2bff59b92c + languageName: node + linkType: hard + "stream-shift@npm:^1.0.2": version: 1.0.3 resolution: "stream-shift@npm:1.0.3" @@ -16618,6 +16991,13 @@ __metadata: languageName: node linkType: hard +"superstruct@npm:^2.0.2": + version: 2.0.2 + resolution: "superstruct@npm:2.0.2" + checksum: 10c0/c6853db5240b4920f47b3c864dd1e23ede6819ea399ad29a65387d746374f6958c5f1c5b7e5bb152d9db117a74973e5005056d9bb83c24e26f18ec6bfae4a718 + languageName: node + linkType: hard + "supports-color@npm:^3.1.0": version: 3.2.3 resolution: "supports-color@npm:3.2.3" @@ -16819,6 +17199,13 @@ __metadata: languageName: node linkType: hard +"text-encoding-utf-8@npm:^1.0.2": + version: 1.0.2 + resolution: "text-encoding-utf-8@npm:1.0.2" + checksum: 10c0/87a64b394c850e8387c2ca7fc6929a26ce97fb598f1c55cd0fdaec4b8e2c3ed6770f65b2f3309c9175ef64ac5e403c8e48b53ceeb86d2897940c5e19cc00bb99 + languageName: node + linkType: hard + "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -18250,7 +18637,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7.4.6, ws@npm:^7.5.1": +"ws@npm:^7.4.6, ws@npm:^7.5.1, ws@npm:^7.5.10": version: 7.5.10 resolution: "ws@npm:7.5.10" peerDependencies: @@ -18265,6 +18652,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.5.0": + version: 8.19.0 + resolution: "ws@npm:8.19.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/4741d9b9bc3f9c791880882414f96e36b8b254e34d4b503279d6400d9a4b87a033834856dbdd94ee4b637944df17ea8afc4bce0ff4a1560d2166be8855da5b04 + languageName: node + linkType: hard + "xmlhttprequest-ssl@npm:~2.1.1": version: 2.1.2 resolution: "xmlhttprequest-ssl@npm:2.1.2" @@ -18436,6 +18838,13 @@ __metadata: languageName: node linkType: hard +"zod@npm:^3.25.0, zod@npm:^3.25.1": + version: 3.25.76 + resolution: "zod@npm:3.25.76" + checksum: 10c0/5718ec35e3c40b600316c5b4c5e4976f7fee68151bc8f8d90ec18a469be9571f072e1bbaace10f1e85cf8892ea12d90821b200e980ab46916a6166a4260a983c + languageName: node + linkType: hard + "zustand@npm:5.0.0": version: 5.0.0 resolution: "zustand@npm:5.0.0"